/ Hex Artifact Content
Login

Artifact 072f2907f63ca779b08a2bb97706cf0b61663fbbebdc891b882cb7d0ed21c4e5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 74  esult row with t
2400: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 68 65 6c  he result.** hel
2410: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65  d in register re
2420: 67 52 65 73 75 6c 74 2e 20 20 44 65 63 72 65 6d  gResult.  Decrem
2430: 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74 20 63  ent the result c
2440: 6f 75 6e 74 20 61 6e 64 20 68 61 6c 74 20 69 66  ount and halt if
2450: 0a 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  .** the maximum 
2460: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2470: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2480: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2490: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
24a0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24b0: 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 52 65  be *v, int regRe
24c0: 73 75 6c 74 29 7b 0a 20 20 69 6e 74 20 61 64 64  sult){.  int add
24d0: 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  r;.  sqlite3Vdbe
24e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
24f0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
2500: 74 2c 20 31 29 3b 0a 20 20 61 64 64 72 20 3d 20  t, 1);.  addr = 
2510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2520: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  3(v, OP_IfPos, 1
2530: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2540: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 31  rentAddr(v)+2, 1
2550: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
2560: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
2570: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2580: 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72  Halt, 0, 0);.  r
2590: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
25a0: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
25b0: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
25c0: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
25d0: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
25e0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
25f0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64  AGMA [schema.]id
2600: 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a   [= value].**.**
2610: 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   The identifier 
2620: 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
2630: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c  string.  The val
2640: 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  ue is a string, 
2650: 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  and.** identifie
2660: 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20  r, or a number. 
2670: 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73   If minusFlag is
2680: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
2690: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75  value is.** a nu
26a0: 6d 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72  mber that was pr
26b0: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
26c0: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  s sign..**.** If
26d0: 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 20 69   the left side i
26e0: 73 20 22 64 61 74 61 62 61 73 65 2e 69 64 22 20  s "database.id" 
26f0: 74 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65  then pId1 is the
2700: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
2710: 2a 20 61 6e 64 20 70 49 64 32 20 69 73 20 74 68  * and pId2 is th
2720: 65 20 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65  e id.  If the le
2730: 66 74 20 73 69 64 65 20 69 73 20 6a 75 73 74 20  ft side is just 
2740: 22 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69  "id" then pId1 i
2750: 73 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20  s the.** id and 
2760: 70 49 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74  pId2 is any empt
2770: 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  y string..*/.voi
2780: 64 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28  d sqlite3Pragma(
2790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27a0: 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31  , .  Token *pId1
27b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ,        /* Firs
27c0: 74 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  t part of [schem
27d0: 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20  a.]id field */. 
27e0: 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20   Token *pId2,   
27f0: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
2800: 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d  art of [schema.]
2810: 69 64 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c  id field, or NUL
2820: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56  L */.  Token *pV
2830: 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f  alue,      /* To
2840: 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c  ken for <value>,
2850: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
2860: 74 20 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20  t minusFlag     
2870: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27    /* True if a '
2880: 2d 27 20 73 69 67 6e 20 70 72 65 63 65 64 65 64  -' sign preceded
2890: 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20   <value> */.){. 
28a0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30   char *zLeft = 0
28b0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  ;       /* Nul-t
28c0: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
28d0: 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20  string <id> */. 
28e0: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
28f0: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  0;      /* Nul-t
2900: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
2910: 73 74 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20  string <value>, 
2920: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
2930: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
2940: 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
2950: 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f  ase name */.  To
2960: 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20  ken *pId;       
2970: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2980: 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f  to <id> token */
2990: 0a 20 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b  .  char *aFcntl[
29a0: 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67  4];       /* Arg
29b0: 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f  ument to SQLITE_
29c0: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a  FCNTL_PRAGMA */.
29d0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
29e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
29f0: 62 61 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c  base index for <
2a00: 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69  database> */.  i
2a10: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
2a30: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d  eturn value form
2a40: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
2a50: 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65  AGMA */.  sqlite
2a60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2a70: 64 62 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61  db;    /* The da
2a80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a90: 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  n */.  Db *pDb; 
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
2ac0: 66 69 63 20 64 61 74 61 62 61 73 65 20 62 65 69  fic database bei
2ad0: 6e 67 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20  ng pragmaed */. 
2ae0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
2af0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2b00: 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20  );  /* Prepared 
2b10: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
2b20: 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
2b30: 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54  *pPragma;   /* T
2b40: 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20  he pragma */..  
2b50: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
2b60: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
2b70: 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a  RunOnlyOnce(v);.
2b80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
2b90: 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70   2;..  /* Interp
2ba0: 72 65 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e  ret the [schema.
2bb0: 5d 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72  ] part of the pr
2bc0: 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  agma statement. 
2bd0: 69 44 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  iDb is the.  ** 
2be0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
2bf0: 61 62 61 73 65 20 74 68 69 73 20 70 72 61 67 6d  abase this pragm
2c00: 61 20 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69  a is being appli
2c10: 65 64 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b  ed to in db.aDb[
2c20: 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  ]. */.  iDb = sq
2c30: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
2c40: 28 70 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70  (pParse, pId1, p
2c50: 49 64 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66  Id2, &pId);.  if
2c60: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
2c70: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
2c80: 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49  Db[iDb];..  /* I
2c90: 66 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  f the temp datab
2ca0: 61 73 65 20 68 61 73 20 62 65 65 6e 20 65 78 70  ase has been exp
2cb0: 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73  licitly named as
2cc0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20   part of the .  
2cd0: 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20  ** pragma, make 
2ce0: 73 75 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e  sure it is open.
2cf0: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62   .  */.  if( iDb
2d00: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70  ==1 && sqlite3Op
2d10: 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
2d20: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
2d30: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65  turn;.  }..  zLe
2d40: 66 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ft = sqlite3Name
2d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49  FromToken(db, pI
2d60: 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74  d);.  if( !zLeft
2d70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2d80: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
2d90: 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74    zRight = sqlit
2da0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d  e3MPrintf(db, "-
2db0: 25 54 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  %T", pValue);.  
2dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68  }else{.    zRigh
2dd0: 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  t = sqlite3NameF
2de0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61  romToken(db, pVa
2df0: 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  lue);.  }..  ass
2e00: 65 72 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a  ert( pId2 );.  z
2e10: 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f  Db = pId2->n>0 ?
2e20: 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a   pDb->zDbSName :
2e30: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
2e40: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
2e50: 65 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e, SQLITE_PRAGMA
2e60: 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c  , zLeft, zRight,
2e70: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74   zDb) ){.    got
2e80: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
2e90: 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20  }..  /* Send an 
2ea0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2eb0: 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GMA file-control
2ec0: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
2ed0: 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e  ng VFS.  ** conn
2ee0: 65 63 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72  ection.  If it r
2ef0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2f00: 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68  , then assume th
2f10: 61 74 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20  at the VFS.  ** 
2f20: 68 61 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67  handled the prag
2f30: 6d 61 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ma and generate 
2f40: 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64  a no-op prepared
2f50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a   statement..  **
2f60: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2f70: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38  TION-OF: R-12238
2f80: 2d 35 35 31 32 30 20 57 68 65 6e 65 76 65 72 20  -55120 Whenever 
2f90: 61 20 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65  a PRAGMA stateme
2fa0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20  nt is parsed,.  
2fb0: 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e  ** an SQLITE_FCN
2fc0: 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63  TL_PRAGMA file c
2fd0: 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74  ontrol is sent t
2fe0: 6f 20 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74  o the open sqlit
2ff0: 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a  e3_file.  ** obj
3000: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3010: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
3020: 65 20 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20  e file to which 
3030: 74 68 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20  the pragma.  ** 
3040: 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73  statement refers
3050: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
3060: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
3070: 2d 32 39 38 37 35 2d 33 31 36 37 38 20 54 68 65  -29875-31678 The
3080: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3090: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
30a0: 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63  AGMA.  ** file c
30b0: 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72  ontrol is an arr
30c0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
30d0: 6f 20 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a  o strings (char*
30e0: 2a 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a  *) in which the.
30f0: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d    ** second elem
3100: 65 6e 74 20 6f 66 20 74 68 65 20 61 72 72 61 79  ent of the array
3110: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
3120: 74 68 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74  the pragma and t
3130: 68 65 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c  he third.  ** el
3140: 65 6d 65 6e 74 20 69 73 20 74 68 65 20 61 72 67  ement is the arg
3150: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61  ument to the pra
3160: 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  gma or NULL if t
3170: 68 65 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f  he pragma has no
3180: 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  .  ** argument..
3190: 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d    */.  aFcntl[0]
31a0: 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31   = 0;.  aFcntl[1
31b0: 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63  ] = zLeft;.  aFc
31c0: 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b  ntl[2] = zRight;
31d0: 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30  .  aFcntl[3] = 0
31e0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
31f0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
3200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
3210: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
3220: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
3230: 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29  _PRAGMA, (void*)
3240: 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72  aFcntl);.  if( r
3250: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3270: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
3280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3290: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c  SetColName(v, 0,
32a0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61   COLNAME_NAME, a
32b0: 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45  Fcntl[0], SQLITE
32c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
32d0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
32e0: 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b  t(v, aFcntl[0]);
32f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
3300: 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20  e(aFcntl[0]);.  
3310: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
3320: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  t;.  }.  if( rc!
3330: 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
3340: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e   ){.    if( aFcn
3350: 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  tl[0] ){.      s
3360: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3370: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63  Parse, "%s", aFc
3380: 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73  ntl[0]);.      s
3390: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e  qlite3_free(aFcn
33a0: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  tl[0]);.    }.  
33b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
33c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
33d0: 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20   = rc;.    goto 
33e0: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a  pragma_out;.  }.
33f0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
3400: 20 70 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c   pragma in the l
3410: 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20  ookup table */. 
3420: 20 70 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d   pPragma = pragm
3430: 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a  aLocate(zLeft);.
3440: 20 20 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30    if( pPragma==0
3450: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
3460: 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ut;..  /* Make s
3470: 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
3480: 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65   schema is loade
3490: 64 20 69 66 20 74 68 65 20 70 72 61 67 6d 61 20  d if the pragma 
34a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f  requires that */
34b0: 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
34c0: 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
34d0: 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21  Flg_NeedSchema)!
34e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
34f0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
3500: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
3510: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ragma_out;.  }..
3520: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
3530: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
3540: 6e 61 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61  names for pragma
3550: 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 72 65  s that return re
3560: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28  sults */.  if( (
3570: 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
3580: 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
3590: 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26  lumns)==0 .   &&
35a0: 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61   ((pPragma->mPra
35b0: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
35c0: 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c  oColumns1)==0 ||
35d0: 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b   zRight==0).  ){
35e0: 0a 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65  .    setPragmaRe
35f0: 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  sultColumnNames(
3600: 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d  v, pPragma);.  }
3610: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
3620: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
3630: 72 61 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f  ragma handler */
3640: 0a 20 20 73 77 69 74 63 68 28 20 70 50 72 61 67  .  switch( pPrag
3650: 6d 61 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a  ma->ePragTyp ){.
3660: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
3670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3680: 52 5f 50 52 41 47 4d 41 53 29 20 26 26 20 21 64  R_PRAGMAS) && !d
3690: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
36a0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20  IT_DEPRECATED). 
36b0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
36c0: 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c   [schema.]defaul
36d0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  t_cache_size.  *
36e0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
36f0: 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65  a.]default_cache
3700: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
3710: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
3720: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
3730: 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20  rent persistent 
3740: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
3750: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
3760: 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65  size.  The value
3770: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
3780: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3790: 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e  of.  ** pages in
37a0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
37b0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
37c0: 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68 65 20  m sets both the 
37d0: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67  current.  ** pag
37e0: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
37f0: 75 65 20 61 6e 64 20 74 68 65 20 70 65 72 73 69  ue and the persi
3800: 73 74 65 6e 74 20 70 61 67 65 20 63 61 63 68 65  stent page cache
3810: 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a   size value.  **
3820: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
3830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
3840: 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65  **.  ** Older ve
3850: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
3860: 20 77 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64   would set the d
3870: 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a  efault cache siz
3880: 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61  e to a.  ** nega
3890: 74 69 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69  tive number to i
38a0: 6e 64 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e  ndicate synchron
38b0: 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20  ous=OFF.  These 
38c0: 64 61 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75  days, synchronou
38d0: 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  s.  ** is always
38e0: 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72   on by default r
38f0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
3900: 20 73 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66   sign of the def
3910: 61 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20  ault cache.  ** 
3920: 73 69 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69  size.  But conti
3930: 6e 75 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  nue to take the 
3940: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
3950: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61  f the default ca
3960: 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  che.  ** size of
3970: 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
3980: 61 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a  atibility..  */.
3990: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44    case PragTyp_D
39a0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
39b0: 45 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  E: {.    static 
39c0: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
39d0: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
39e0: 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69  NO(2);.    stati
39f0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
3a00: 73 74 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  st getCacheSize[
3a10: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
3a20: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
3a30: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20         /* 0 */. 
3a60: 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f       { OP_ReadCo
3a70: 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20  okie,  0, 1,    
3a80: 20 20 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c      BTREE_DEFAUL
3a90: 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20  T_CACHE_SIZE},  
3aa0: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
3ab0: 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20  OP_IfPos,       
3ac0: 31 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 8,        0},
3ad0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
3ae0: 67 65 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  ger,     0, 2,  
3af0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3b00: 7b 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20  { OP_Subtract,  
3b10: 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31    1, 2,        1
3b20: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66  },.      { OP_If
3b30: 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c  Pos,       1, 8,
3b40: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3b50: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
3b60: 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20      0, 1,       
3b70: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b90: 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  6 */.      { OP_
3ba0: 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20  Noop,        0, 
3bb0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
3bc0: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
3bd0: 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  ow,   1, 1,     
3be0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
3bf0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
3c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
3c10: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
3c20: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
3c30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
3c40: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
3c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
3c60: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
3c70: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
3c80: 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 29  e(getCacheSize))
3c90: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
3ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3cb0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
3cc0: 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67  getCacheSize), g
3cd0: 65 74 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e  etCacheSize, iLn
3ce0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c  );.      if( ONL
3cf0: 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  Y_IF_REALLOC_STR
3d00: 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72  ESS(aOp==0) ) br
3d10: 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30  eak;.      aOp[0
3d20: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
3d30: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
3d40: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e  b;.      aOp[6].
3d50: 70 31 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  p1 = SQLITE_DEFA
3d60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a  ULT_CACHE_SIZE;.
3d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3d80: 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69   int size = sqli
3d90: 74 65 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69  te3AbsInt32(sqli
3da0: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
3db0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3dc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
3dd0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
3de0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
3df0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3e00: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
3e10: 2c 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f  , BTREE_DEFAULT_
3e20: 43 41 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65  CACHE_SIZE, size
3e30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3e40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3e50: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3e60: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62   0) );.      pDb
3e70: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
3e80: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
3e90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
3ea0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62  SetCacheSize(pDb
3eb0: 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68  ->pBt, pDb->pSch
3ec0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29  ema->cache_size)
3ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
3ee0: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
3ef0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41   !SQLITE_OMIT_PA
3f00: 47 45 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21  GER_PRAGMAS && !
3f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
3f20: 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21  ECATED */..#if !
3f30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3f40: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
3f50: 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  S).  /*.  **  PR
3f60: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f70: 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  ge_size.  **  PR
3f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f90: 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  ge_size=N.  **. 
3fa0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
3fb0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
3fc0: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
3fd0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  or the.  ** data
3fe0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69  base page size i
3ff0: 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20 73 65  n bytes.  The se
4000: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
4010: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
4020: 20 70 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65   page size value
4030: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e  .  The value can
4040: 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a   only be set if.
4050: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
4060: 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
4070: 65 6e 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  en created..  */
4080: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4090: 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  PAGE_SIZE: {.   
40a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
40b0: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
40c0: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
40d0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
40e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
40f0: 3d 20 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20  = ALWAYS(pBt) ? 
4100: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
4110: 61 67 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30  ageSize(pBt) : 0
4120: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
4130: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29  ngleInt(v, size)
4140: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4150: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79     /* Malloc may
4160: 20 66 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69   fail when setti
4170: 6e 67 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ng the page-size
4180: 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61 6e  , as there is an
4190: 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
41a0: 2a 2a 20 62 75 66 66 65 72 20 74 68 61 74 20 74  ** buffer that t
41b0: 68 65 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20  he pager module 
41c0: 72 65 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71  resizes using sq
41d0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e  lite3_realloc().
41e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
41f0: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4200: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
4210: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
4220: 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
4230: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
4240: 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
4250: 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31  >nextPagesize,-1
4260: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ,0) ){.        s
4270: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
4280: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
4290: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
42a0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
42b0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63  GMA [schema.]sec
42c0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
42d0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42e0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f  ]secure_delete=O
42f0: 4e 2f 4f 46 46 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N/OFF.  **.  ** 
4300: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
4310: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
4320: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
4330: 68 65 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f 64  he.  ** secure_d
4340: 65 6c 65 74 65 20 66 6c 61 67 2e 20 20 54 68 65  elete flag.  The
4350: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61   second form cha
4360: 6e 67 65 73 20 74 68 65 20 73 65 63 75 72 65 5f  nges the secure_
4370: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61 67  delete.  ** flag
4380: 20 73 65 74 74 69 6e 67 20 61 6e 64 20 72 65 70   setting and rep
4390: 6f 72 74 73 20 74 68 65 6e 65 77 20 76 61 6c 75  orts thenew valu
43a0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e..  */.  case P
43b0: 72 61 67 54 79 70 5f 53 45 43 55 52 45 5f 44 45  ragTyp_SECURE_DE
43c0: 4c 45 54 45 3a 20 7b 0a 20 20 20 20 42 74 72 65  LETE: {.    Btre
43d0: 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42  e *pBt = pDb->pB
43e0: 74 3b 0a 20 20 20 20 69 6e 74 20 62 20 3d 20 2d  t;.    int b = -
43f0: 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
4400: 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  Bt!=0 );.    if(
4410: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
4420: 20 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42   b = sqlite3GetB
4430: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
4440: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4450: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62   pId2->n==0 && b
4460: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
4470: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
4480: 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
4490: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
44a0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
44b0: 72 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62  reDelete(db->aDb
44c0: 5b 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20  [ii].pBt, b);.  
44d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
44e0: 62 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  b = sqlite3Btree
44f0: 53 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74  SecureDelete(pBt
4500: 2c 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , b);.    return
4510: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b  SingleInt(v, b);
4520: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4530: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4540: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f  MA [schema.]max_
4550: 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20  page_count.  ** 
4560: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4570: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
4580: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
4590: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
45a0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
45b0: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
45c0: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
45d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
45e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
45f0: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
4600: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
4610: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
4620: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
4630: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4640: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
4650: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
4660: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
4670: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
4680: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
4690: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
46a0: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
46b0: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
46c0: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
46d0: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
46e0: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
46f0: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
4700: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
4710: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4720: 61 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20  a.]page_count.  
4730: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
4740: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
4750: 65 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  es in the specif
4760: 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ied database..  
4770: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
4780: 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a  p_PAGE_COUNT: {.
4790: 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20      int iReg;.  
47a0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
47b0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
47c0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67  , iDb);.    iReg
47d0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
47e0: 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  m;.    if( sqlit
47f0: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
4800: 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20  0])=='p' ){.    
4810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4820: 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f  Op2(v, OP_Pageco
4830: 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b  unt, iDb, iReg);
4840: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4860: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63  Op3(v, OP_MaxPgc
4870: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a  nt, iDb, iReg, .
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
48a0: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
48b0: 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20  toi(zRight)));. 
48c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
48d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
48e0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67  _ResultRow, iReg
48f0: 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 1);.    break;
4900: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4910: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4920: 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20  ]locking_mode.  
4930: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4940: 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ma.]locking_mode
4950: 20 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75   = (normal|exclu
4960: 73 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73  sive).  */.  cas
4970: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e  e PragTyp_LOCKIN
4980: 47 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f  G_MODE: {.    co
4990: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
49a0: 20 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69   "normal";.    i
49b0: 6e 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f  nt eMode = getLo
49c0: 63 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74  ckingMode(zRight
49d0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32  );..    if( pId2
49e0: 2d 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d  ->n==0 && eMode=
49f0: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4a00: 44 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20  DE_QUERY ){.    
4a10: 20 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41    /* Simple "PRA
4a20: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4a30: 3b 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ;" statement. Th
4a40: 69 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f  is is a query fo
4a50: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
4a60: 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c  urrent default l
4a70: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69  ocking mode (whi
4a80: 63 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ch may be differ
4a90: 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ent to.      ** 
4aa0: 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
4ab0: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
4ac0: 61 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f  abase)..      */
4ad0: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64  .      eMode = d
4ae0: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b  b->dfltLockMode;
4af0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b00: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
4b10: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d  .      if( pId2-
4b20: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >n==0 ){.       
4b30: 20 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   /* This indicat
4b40: 65 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62  es that no datab
4b50: 61 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65  ase name was spe
4b60: 63 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20  cified as part. 
4b70: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
4b80: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e   PRAGMA command.
4b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4ba0: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d  e locking-mode m
4bb0: 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
4bc0: 2a 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74  * set on all att
4bd0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c  ached databases,
4be0: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
4bf0: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20  main db file..  
4c00: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4c10: 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71   ** Also, the sq
4c20: 6c 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f  lite3.dfltLockMo
4c30: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  de variable is s
4c40: 65 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20  et so that.     
4c50: 20 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71     ** any subseq
4c60: 75 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20  uently attached 
4c70: 64 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75  databases also u
4c80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
4c90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
4ca0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  ing mode..      
4cb0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
4cc0: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
4cd0: 65 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44  ert(pDb==&db->aD
4ce0: 62 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  b[0]);.        f
4cf0: 6f 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e  or(ii=2; ii<db->
4d00: 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
4d10: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
4d20: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4d30: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4d40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4d50: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4d60: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4d70: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  de);.        }. 
4d80: 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c         db->dfltL
4d90: 6f 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  ockMode = (u8)eM
4da0: 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
4db0: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
4dc0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
4dd0: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65  b->pBt);.      e
4de0: 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Mode = sqlite3Pa
4df0: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
4e00: 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  Pager, eMode);. 
4e10: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
4e20: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
4e30: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
4e40: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
4e50: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4e60: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
4e70: 49 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65  IVE );.    if( e
4e80: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4e90: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4ea0: 45 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20  E ){.      zRet 
4eb0: 3d 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20  = "exclusive";. 
4ec0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
4ed0: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65  ingleText(v, zRe
4ee0: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
4ef0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4f00: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
4f10: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a  ournal_mode.  **
4f20: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4f30: 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  .]journal_mode =
4f40: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
4f50: 20 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65             (dele
4f60: 74 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74  te|persist|off|t
4f70: 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77  runcate|memory|w
4f80: 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63  al|off).  */.  c
4f90: 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52  ase PragTyp_JOUR
4fa0: 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20  NAL_MODE: {.    
4fb0: 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20  int eMode;      
4fc0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
4fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
4fe0: 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f  E_XXX symbols */
4ff0: 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
5000: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5010: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69  ounter */..    i
5020: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
5030: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
5040: 65 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20  e is no "=MODE" 
5050: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
5060: 6d 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66  ma, do a query f
5070: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
5080: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a  current mode */.
5090: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41        eMode = PA
50a0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
50b0: 51 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65  QUERY;.    }else
50c0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
50d0: 61 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20  ar *zMode;.     
50e0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
50f0: 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
5100: 3b 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64  ;.      for(eMod
5110: 65 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71  e=0; (zMode = sq
5120: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
5130: 6e 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b  name(eMode))!=0;
5140: 20 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20   eMode++){.     
5150: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
5160: 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a  rNICmp(zRight, z
5170: 4d 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Mode, n)==0 ) br
5180: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5190: 20 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b     if( !zMode ){
51a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
51b0: 68 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  he "=MODE" part 
51c0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
51d0: 6e 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c  ny known journal
51e0: 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a   mode,.        *
51f0: 2a 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72  * then do a quer
5200: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f  y */.        eMo
5210: 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
5220: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20  ALMODE_QUERY;.  
5230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5240: 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
5250: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
5260: 52 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30  RY && pId2->n==0
5270: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
5280: 76 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75  vert "PRAGMA jou
5290: 72 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20  rnal_mode" into 
52a0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
52b0: 72 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20  rnal_mode" */.  
52c0: 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20      iDb = 0;.   
52d0: 20 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a     pId2->n = 1;.
52e0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
52f0: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
5300: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
5310: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  if( db->aDb[ii].
5320: 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20  pBt && (ii==iDb 
5330: 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29  || pId2->n==0) )
5340: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5350: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
5360: 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73  , ii);.        s
5370: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5380: 28 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  (v, OP_JournalMo
5390: 64 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65  de, ii, 1, eMode
53a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
53b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
53c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
53d0: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
53e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
53f0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
5400: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5410: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a  l_size_limit.  *
5420: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
5430: 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  a.]journal_size_
5440: 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  limit=N.  **.  *
5450: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
5460: 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72   size limit on r
5470: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
5480: 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  files..  */.  ca
5490: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
54a0: 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b  AL_SIZE_LIMIT: {
54b0: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
54c0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
54d0: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
54e0: 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  ;.    i64 iLimit
54f0: 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a   = -2;.    if( z
5500: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
5510: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
5520: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  I64(zRight, &iLi
5530: 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mit);.      if( 
5540: 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d  iLimit<-1 ) iLim
5550: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  it = -1;.    }. 
5560: 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
5570: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
5580: 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c  izeLimit(pPager,
5590: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65   iLimit);.    re
55a0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
55b0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72   iLimit);.    br
55c0: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  eak;.  }..#endif
55d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
55e0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
55f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5600: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5610: 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50  o_vacuum.  **  P
5620: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
5630: 75 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a  uto_vacuum=N.  *
5640: 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65  *.  ** Get or se
5650: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
5660: 68 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74  he database 'aut
5670: 6f 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65  o-vacuum' parame
5680: 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  ter..  ** The va
5690: 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20  lue is one of:  
56a0: 30 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20  0 NONE 1 FULL 2 
56b0: 49 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f  INCREMENTAL.  */
56c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
56d0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
56e0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
56f0: 55 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20  UTO_VACUUM: {.  
5700: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
5710: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  Db->pBt;.    ass
5720: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
5730: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
5740: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
5750: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
5760: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
5770: 63 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20  cuum(pBt));.    
5780: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
5790: 20 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f   eAuto = getAuto
57a0: 56 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a  Vacuum(zRight);.
57b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41        assert( eA
57c0: 75 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c  uto>=0 && eAuto<
57d0: 3d 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  =2 );.      db->
57e0: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75  nextAutovac = (u
57f0: 38 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f  8)eAuto;.      /
5800: 2a 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61  * Call SetAutoVa
5810: 63 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e  cuum() to set in
5820: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74  itialize the int
5830: 65 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20  ernal auto and. 
5840: 20 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63       ** incr-vac
5850: 75 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20  uum flags. This 
5860: 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
5870: 61 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ase this connect
5880: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65  ion.      ** cre
5890: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
58a0: 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d  e file. It is im
58b0: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20  portant that it 
58c0: 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  is created.     
58d0: 20 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76   ** as an auto-v
58e0: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62  acuum capable db
58f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5900: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5910: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
5920: 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20  pBt, eAuto);.   
5930: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5940: 45 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d  E_OK && (eAuto==
5950: 31 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29  1 || eAuto==2) )
5960: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  {.        /* Whe
5970: 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75  n setting the au
5980: 74 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to_vacuum mode t
5990: 6f 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20  o either "full" 
59a0: 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  or .        ** "
59b0: 69 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72  incremental", wr
59c0: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
59d0: 20 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20   meta[6] in the 
59e0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
59f0: 20 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65   ** file. Before
5a00: 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61   writing to meta
5a10: 5b 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20  [6], check that 
5a20: 6d 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65  meta[3] indicate
5a30: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
5a40: 74 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73  t this really is
5a50: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
5a60: 63 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65  capable database
5a70: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5a80: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5a90: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
5aa0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
5ab0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  );.        stati
5ac0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
5ad0: 73 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20  st setMeta6[] = 
5ae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  {.          { OP
5af0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
5b00: 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20   0,         1,  
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b20: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
5b30: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61          { OP_Rea
5b40: 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20  dCookie,     0, 
5b50: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5b60: 20 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54     BTREE_LARGEST
5b70: 5f 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20  _ROOT_PAGE},.   
5b80: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20              1,  
5ba0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5bb0: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5bc0: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
5bd0: 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20     { OP_Halt,   
5be0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
5bf0: 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20  K, OE_Abort,    
5c00: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c10: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  3 */.          {
5c20: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
5c30: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42      0,         B
5c40: 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d  TREE_INCR_VACUUM
5c50: 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  , 0},    /* 4 */
5c60: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
5c70: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
5c80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
5c90: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5ca0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
5cb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5cc0: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
5cd0: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
5ce0: 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29  aySize(setMeta6)
5cf0: 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d  );.        aOp =
5d00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d10: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5d20: 7a 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65  ze(setMeta6), se
5d30: 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20  tMeta6, iLn);.  
5d40: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
5d50: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
5d60: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
5d70: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  ;.        aOp[0]
5d80: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
5d90: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
5da0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
5db0: 32 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b  2].p2 = iAddr+4;
5dc0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e  .        aOp[4].
5dd0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5de0: 20 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41    aOp[4].p3 = eA
5df0: 75 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  uto - 1;.       
5e00: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
5e10: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
5e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5e30: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e40: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
5e50: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69  RAGMA [schema.]i
5e60: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
5e70: 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  m(N).  **.  ** D
5e80: 6f 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63  o N steps of inc
5e90: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69  remental vacuumi
5ea0: 6e 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ng on a database
5eb0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5ec0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5ed0: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5ee0: 67 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c  gTyp_INCREMENTAL
5ef0: 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69  _VACUUM: {.    i
5f00: 6e 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b  nt iLimit, addr;
5f10: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
5f20: 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65  =0 || !sqlite3Ge
5f30: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
5f40: 69 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69  iLimit) || iLimi
5f50: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  t<=0 ){.      iL
5f60: 69 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66  imit = 0x7ffffff
5f70: 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  f;.    }.    sql
5f80: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5f90: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5fa0: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
5fb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5fc0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c  , OP_Integer, iL
5fd0: 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  imit, 1);.    ad
5fe0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5ff0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63  AddOp1(v, OP_Inc
6000: 72 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56  rVacuum, iDb); V
6010: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6030: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp1(v, OP_Resu
6040: 6c 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73  ltRow, 1);.    s
6050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6060: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
6070: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
6080: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6090: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
60a0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
60b0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
60c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
60d0: 61 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b  addr);.    break
60e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
60f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6100: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
6110: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6120: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6130: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
6140: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6150: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
6160: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
6170: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
6180: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
6190: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
61a0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
61b0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
61c0: 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c  m sets the local
61d0: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
61e0: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66   size value.  If
61f0: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
6200: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
6210: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
6220: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
6230: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
6240: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
6250: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
6260: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
6270: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
6280: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
6290: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
62a0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
62b0: 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49  PragTyp_CACHE_SI
62c0: 5a 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE: {.    assert
62d0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
62e0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
62f0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6300: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6310: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6320: 28 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  (v, pDb->pSchema
6330: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
6340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6350: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
6360: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
6370: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
6380: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  ma->cache_size =
6390: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
63a0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
63b0: 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  eSize(pDb->pBt, 
63c0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
63d0: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
63e0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
63f0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6400: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6410: 65 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52  e_spill.  **  PR
6420: 41 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c  AGMA cache_spill
6430: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50  =BOOLEAN.  **  P
6440: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63  RAGMA [schema.]c
6450: 61 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a  ache_spill=N.  *
6460: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
6470: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
6480: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
6490: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
64a0: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
64b0: 73 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20  spill size. The 
64c0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e  second form turn
64d0: 73 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e  s cache spill on
64e0: 0a 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57  .  ** or off.  W
64f0: 68 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63  hen turnning cac
6500: 68 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65  he spill on, the
6510: 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
6520: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
6530: 20 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68   cache_size.  Th
6540: 65 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74  e third form set
6550: 73 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74  s a spill size t
6560: 68 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  hat.  ** may be 
6570: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74  different form t
6580: 68 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  he cache size.. 
6590: 20 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69   ** If N is posi
65a0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
65b0: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
65c0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
65d0: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
65e0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
65f0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6600: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6610: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6620: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6630: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6640: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20  f memory..  **. 
6650: 20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   ** If the numbe
6660: 72 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c  r of cache_spill
6670: 20 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74   pages is less t
6680: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
6690: 66 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a  f.  ** cache_siz
66a0: 65 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c  e pages, no spil
66b0: 6c 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69  ling occurs unti
66c0: 6c 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  l the page count
66d0: 20 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68   exceeds.  ** th
66e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
66f0: 65 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20  e_size pages..  
6700: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68  **.  ** The cach
6710: 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20  e_spill=BOOLEAN 
6720: 73 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20  setting applies 
6730: 74 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  to all attached 
6740: 73 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f  schemas,.  ** no
6750: 74 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d  t just the schem
6760: 61 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  a specified..  *
6770: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
6780: 5f 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a  _CACHE_SPILL: {.
6790: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
67a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
67b0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
67c0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
67d0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
67e0: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20  nSingleInt(v,.  
67f0: 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67         (db->flag
6800: 73 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65  s & SQLITE_Cache
6810: 53 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20  Spill)==0 ? 0 : 
6820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6830: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6840: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30  lSize(pDb->pBt,0
6850: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
6860: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
6870: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
6880: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
6890: 67 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20  ght, &size) ){. 
68a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
68b0: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
68c0: 70 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b  pDb->pBt, size);
68d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
68e0: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
68f0: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a  lean(zRight, siz
6900: 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  e!=0) ){.       
6910: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6920: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6930: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6940: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6950: 26 3d 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65  &= ~SQLITE_Cache
6960: 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  Spill;.      }. 
6970: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
6980: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
6990: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
69a0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
69b0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70  MA [schema.]mmap
69c0: 5f 73 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20  _size(N).  **.  
69d0: 2a 2a 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d  ** Used to set m
69e0: 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69  apping size limi
69f0: 74 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73  t. The mapping s
6a00: 69 7a 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a  ize limit is.  *
6a10: 2a 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  * used to limit 
6a20: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69  the aggregate si
6a30: 7a 65 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79  ze of all memory
6a40: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20   mapped regions 
6a50: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  of the.  ** data
6a60: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
6a70: 69 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  is parameter is 
6a80: 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  set to zero, the
6a90: 6e 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  n memory mapping
6aa0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
6ab0: 64 20 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20  d at all.  If N 
6ac0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
6ad0: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65  n the default me
6ae0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69  mory map.  ** li
6af0: 6d 69 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62  mit determined b
6b00: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
6b10: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
6b20: 4d 41 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74  MAP_SIZE) is set
6b30: 2e 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d  ..  ** The param
6b40: 65 74 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72  eter N is measur
6b50: 65 64 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a  ed in bytes..  *
6b60: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75  *.  ** This valu
6b70: 65 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20  e is advisory.  
6b80: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  The underlying V
6b90: 46 53 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65  FS is free to me
6ba0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73  mory map.  ** as
6bb0: 20 6c 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75   little or as mu
6bc0: 63 68 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20  ch as it wants. 
6bd0: 20 45 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73   Except, if N is
6be0: 20 73 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74   set to 0 then t
6bf0: 68 65 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61  he.  ** upper la
6c00: 79 65 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20  yers will never 
6c10: 69 6e 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63  invoke the xFetc
6c20: 68 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20  h interfaces to 
6c30: 74 68 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20  the VFS..  */.  
6c40: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41  case PragTyp_MMA
6c50: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71  P_SIZE: {.    sq
6c60: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
6c70: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
6c80: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61  MAP_SIZE>0.    a
6c90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
6ca0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
6cb0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
6cc0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
6cd0: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
6ce0: 20 20 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48     sqlite3DecOrH
6cf0: 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20  exToI64(zRight, 
6d00: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
6d10: 73 7a 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69  sz<0 ) sz = sqli
6d20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
6d30: 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66  szMmap;.      if
6d40: 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64  ( pId2->n==0 ) d
6d50: 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a  b->szMmap = sz;.
6d60: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d        for(ii=db-
6d70: 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69  >nDb-1; ii>=0; i
6d80: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i--){.        if
6d90: 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  ( db->aDb[ii].pB
6da0: 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c  t && (ii==iDb ||
6db0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a   pId2->n==0) ){.
6dc0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6dd0: 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
6de0: 69 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  it(db->aDb[ii].p
6df0: 42 74 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  Bt, sz);.       
6e00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6e10: 0a 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20  .    sz = -1;.  
6e20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
6e30: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
6e40: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  zDb, SQLITE_FCNT
6e50: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
6e60: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20  );.#else.    sz 
6e70: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 0;.    rc = SQ
6e80: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
6e90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6ea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6eb0: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
6ec0: 2c 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , sz);.    }else
6ed0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6ee0: 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
6ef0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6f00: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6f10: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  rc = rc;.    }. 
6f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6f30: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
6f40: 41 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a  A temp_store.  *
6f50: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
6f60: 73 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74  store = "default
6f70: 22 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65  "|"memory"|"file
6f80: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
6f90: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
6fa0: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
6fb0: 20 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67   temp_store flag
6fc0: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
6fd0: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
6fe0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63   does not make c
6ff0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69  hanges to the di
7000: 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  sk file and the 
7010: 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c  default.  ** val
7020: 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f  ue will be resto
7030: 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d  red the next tim
7040: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
7050: 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20  s opened..  **. 
7060: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74   ** Note that it
7070: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
7080: 20 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d   the library com
7090: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
70a0: 73 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69  s to.  ** overri
70b0: 64 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a  de this setting.
70c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
70d0: 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20  Typ_TEMP_STORE: 
70e0: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
70f0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
7100: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62  nSingleInt(v, db
7110: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20  ->temp_store);. 
7120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7130: 63 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67  changeTempStorag
7140: 65 28 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74  e(pParse, zRight
7150: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
7160: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
7170: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
7180: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
7190: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
71a0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
71b0: 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74  ory = ""|"direct
71c0: 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20  ory_name".  **. 
71d0: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
71e0: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
71f0: 65 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74  e of the temp_st
7200: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c  ore_directory fl
7210: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7220: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7230: 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72  s a specific dir
7240: 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65  ectory to be use
7250: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
7260: 66 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74  files..  ** Sett
7270: 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74  ing to a null st
7280: 72 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20  ring reverts to 
7290: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70  the default temp
72a0: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
72b0: 73 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20  search..  ** If 
72c0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
72d0: 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ory is changed, 
72e0: 74 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54  then invalidateT
72f0: 65 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a  empStorage..  **
7300: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7310: 67 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f  gTyp_TEMP_STORE_
7320: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7330: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7340: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7350: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
7360: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7370: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
7380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7390: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
73a0: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
73b0: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
73c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
73d0: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
73e0: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
73f0: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
7400: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
7410: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7420: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
7430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7440: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7450: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
7460: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
7470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
7480: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
7490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
74a0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
74b0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20  _TEMP_STORE==0. 
74c0: 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45        || (SQLITE
74d0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26  _TEMP_STORE==1 &
74e0: 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  & db->temp_store
74f0: 3c 3d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  <=1).       || (
7500: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7510: 45 3d 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70  E==2 && db->temp
7520: 5f 73 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20  _store==1).     
7530: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
7540: 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67  lidateTempStorag
7550: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
7560: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7570: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65  _free(sqlite3_te
7580: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
7590: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
75a0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
75b0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
75c0: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
75d0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
75e0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
75f0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7600: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7610: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7620: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7630: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7640: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7650: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7660: 57 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  WIN.  /*.  **   
7670: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
7680: 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a  e_directory.  **
7690: 20 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73     PRAGMA data_s
76a0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d  tore_directory =
76b0: 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e   ""|"directory_n
76c0: 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ame".  **.  ** R
76d0: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
76e0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
76f0: 74 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  the data_store_d
7700: 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20  irectory flag.  
7710: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7720: 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73  e value sets a s
7730: 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72  pecific director
7740: 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  y to be used for
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
7760: 74 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73  that.  ** were s
7770: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20  pecified with a 
7780: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
7790: 65 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61  e.  Setting to a
77a0: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76   null string rev
77b0: 65 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  erts.  ** to the
77c0: 20 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73   default databas
77d0: 65 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69  e directory, whi
77e0: 63 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ch for database 
77f0: 66 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20  files specified 
7800: 77 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61  with.  ** a rela
7810: 74 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70  tive path will p
7820: 72 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64  robably be based
7830: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
7840: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
7850: 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20  e.  ** process. 
7860: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   Database file s
7870: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e  pecified with an
7880: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61   absolute path a
7890: 72 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a  re not impacted.
78a0: 20 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74    ** by this set
78b0: 74 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73  ting, regardless
78c0: 20 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20   of its value.. 
78d0: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
78e0: 50 72 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f  PragTyp_DATA_STO
78f0: 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a  RE_DIRECTORY: {.
7900: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
7910: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
7920: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c  ingleText(v, sql
7930: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7940: 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ory);.    }else{
7950: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7960: 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69  OMIT_WSD.      i
7970: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
7980: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
7990: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
79a0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62  lite3OsAccess(db
79b0: 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20  ->pVfs, zRight, 
79c0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
79d0: 41 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a  ADWRITE, &res);.
79e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
79f0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73  SQLITE_OK || res
7a00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7a10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7a20: 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20  (pParse, "not a 
7a30: 77 72 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f  writable directo
7a40: 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ry");.          
7a50: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
7a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7a70: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7a80: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61  _free(sqlite3_da
7a90: 74 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  ta_directory);. 
7aa0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
7ab0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
7ac0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
7ad0: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
7ae0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
7af0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
7b00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7b10: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7b20: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7b30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7b40: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7b50: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7b60: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
7b70: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
7b80: 4e 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20  NG_STYLE.  /*.  
7b90: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
7ba0: 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ema.]lock_proxy_
7bb0: 66 69 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47  file.  **   PRAG
7bc0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
7bd0: 5f 70 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a  _proxy_file = ":
7be0: 61 75 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c  auto:"|"lock_fil
7bf0: 65 5f 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a  e_path".  **.  *
7c00: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
7c10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
7c20: 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
7c30: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
7c40: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
7c50: 73 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20  sets a specific 
7c60: 66 69 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20  file to be used 
7c70: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 63 63  for database acc
7c80: 65 73 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a  ess locks..  **.
7c90: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7ca0: 54 79 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46  Typ_LOCK_PROXY_F
7cb0: 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ILE: {.    if( !
7cc0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7cd0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7ce0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7cf0: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7d00: 20 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66     char *proxy_f
7d10: 69 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b  ile_path = NULL;
7d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7d30: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c  ile *pFile = sql
7d40: 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
7d50: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
7d60: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7d70: 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c  lHint(pFile, SQL
7d80: 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
7d90: 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  YFILE, .        
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7db0: 20 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70     &proxy_file_p
7dc0: 61 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ath);.      retu
7dd0: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
7de0: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29  proxy_file_path)
7df0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e00: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
7e10: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7e20: 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  ager(pDb->pBt);.
7e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7e40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7e50: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7e60: 67 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ger);.      int 
7e70: 72 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  res;.      if( z
7e80: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7e90: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7ea0: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7eb0: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7ec0: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20      zRight);.   
7f00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
7f10: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7f20: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7f30: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7f40: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20      NULL);.     
7f80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73   }.      if( res
7f90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7fa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7fb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7fc0: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f  failed to set lo
7fd0: 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b  ck proxy file");
7fe0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72  .        goto pr
7ff0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
8000: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
8010: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
8020: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
8030: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20  OCKING_STYLE */ 
8040: 20 20 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a       .    .  /*.
8050: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
8060: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
8070: 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  us.  **   PRAGMA
8080: 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72   [schema.]synchr
8090: 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52  onous=OFF|ON|NOR
80a0: 4d 41 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20  MAL|FULL|EXTRA. 
80b0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
80c0: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
80d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
80e0: 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20  nchronous flag. 
80f0: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
8100: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64  he local value d
8110: 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61  oes not make cha
8120: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b  nges to the disk
8130: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20   file and the.  
8140: 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
8150: 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65   will be restore
8160: 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
8170: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
8180: 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a    ** opened..  *
8190: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
81a0: 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a  _SYNCHRONOUS: {.
81b0: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
81c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
81d0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
81e0: 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29  >safety_level-1)
81f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8200: 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f     if( !db->auto
8210: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
8220: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8230: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
8240: 20 20 20 20 20 20 20 22 53 61 66 65 74 79 20 6c         "Safety l
8250: 65 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20  evel may not be 
8260: 63 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61  changed inside a
8270: 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a   transaction");.
8280: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8290: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
82a0: 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28    int iLevel = (
82b0: 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a  getSafetyLevel(z
82c0: 52 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20  Right,0,1)+1) & 
82d0: 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
82e0: 53 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20  S_MASK;.        
82f0: 69 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20  if( iLevel==0 ) 
8300: 69 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20  iLevel = 1;.    
8310: 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
8320: 6c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a  level = iLevel;.
8330: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79          pDb->bSy
8340: 6e 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  ncSet = 1;.     
8350: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
8360: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ags(db);.      }
8370: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
8380: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
83a0: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  R_PRAGMAS */..#i
83b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
83c0: 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20  T_FLAG_PRAGMAS. 
83d0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c   case PragTyp_FL
83e0: 41 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  AG: {.    if( zR
83f0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
8400: 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74   setPragmaResult
8410: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70  ColumnNames(v, p
8420: 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72  Pragma);.      r
8430: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
8440: 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70  , (db->flags & p
8450: 50 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30  Pragma->iArg)!=0
8460: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
8470: 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
8480: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20  pPragma->iArg;  
8490: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
84a0: 73 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61  s to set or clea
84b0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
84c0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
84d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
84e0: 46 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  Foreign key supp
84f0: 6f 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65  ort may not be e
8500: 6e 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c  nabled or disabl
8510: 65 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20  ed while not.   
8520: 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d       ** in auto-
8530: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f  commit mode.  */
8540: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d  .        mask &=
8550: 20 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   ~(SQLITE_Foreig
8560: 6e 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeys);.      }.
8570: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
8580: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
8590: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
85a0: 68 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55  h.authLevel==UAU
85b0: 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20  TH_User ){.     
85c0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
85d0: 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65  ow non-admin use
85e0: 72 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  rs to modify the
85f0: 20 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72   schema arbitrar
8600: 69 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ily */.        m
8610: 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ask &= ~(SQLITE_
8620: 57 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20  WriteSchema);.  
8630: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8640: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
8650: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
8660: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
8670: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73  db->flags |= mas
8680: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
8690: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
86a0: 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  s &= ~mask;.    
86b0: 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51      if( mask==SQ
86c0: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20  LITE_DeferFKs ) 
86d0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
86e0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
86f0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79  }..      /* Many
8700: 20 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61   of the flag-pra
8710: 67 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20  gmas modify the 
8720: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
8730: 79 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20  y the SQL .     
8740: 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67   ** compiler (eg
8750: 2e 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29  . count_changes)
8760: 2e 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f  . So add an opco
8770: 64 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c  de to expire all
8780: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
8790: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
87a0: 73 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e  s after modifyin
87b0: 67 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65  g a pragma value
87c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
87d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
87e0: 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29  p0(v, OP_Expire)
87f0: 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61  ;.      setAllPa
8800: 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20  gerFlags(db);.  
8810: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8820: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8830: 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52  ITE_OMIT_FLAG_PR
8840: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
8850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  f SQLITE_OMIT_SC
8860: 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f  HEMA_PRAGMAS.  /
8870: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
8880: 74 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c  table_info(<tabl
8890: 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  e>).  **.  ** Re
88a0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
88b0: 77 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  w for each colum
88c0: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  n of the named t
88d0: 61 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e  able. The column
88e0: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  s of.  ** the re
88f0: 74 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20  turned data set 
8900: 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  are:.  **.  ** c
8910: 69 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  id:        Colum
8920: 6e 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66  n id (numbered f
8930: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
8940: 74 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30  t, starting at 0
8950: 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20  ).  ** name:    
8960: 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20     Column name. 
8970: 20 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20   ** type:       
8980: 43 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  Column declarati
8990: 6f 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f  on type..  ** no
89a0: 74 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69  tnull:    True i
89b0: 66 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20  f 'NOT NULL' is 
89c0: 70 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64  part of column d
89d0: 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  eclaration.  ** 
89e0: 64 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20  dflt_value: The 
89f0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8a00: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66  r the column, if
8a10: 20 61 6e 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   any..  */.  cas
8a20: 65 20 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f  e PragTyp_TABLE_
8a30: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
8a40: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
8a50: 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  Tab;.    pTab = 
8a60: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
8a70: 6c 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54  le(pParse, LOCAT
8a80: 45 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c  E_NOERR, zRight,
8a90: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
8aa0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Tab ){.      int
8ab0: 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e 74   i, k;.      int
8ac0: 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20   nHidden = 0;.  
8ad0: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
8ae0: 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
8af0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
8b00: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
8b10: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
8b20: 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20  >nMem = 6;.     
8b30: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
8b40: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
8b50: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
8b60: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
8b70: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
8b80: 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Tab);.      for(
8b90: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
8ba0: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
8bb0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
8bc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
8bd0: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
8be0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
8bf0: 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20  nHidden++;.     
8c00: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8c10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8c20: 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46   if( (pCol->colF
8c30: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
8c40: 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20  RIMKEY)==0 ){.  
8c50: 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20          k = 0;. 
8c60: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8c70: 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPk==0 ){.     
8c80: 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20       k = 1;.    
8c90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ca0: 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
8cb0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70  =pTab->nCol && p
8cc0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31  Pk->aiColumn[k-1
8cd0: 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20  ]!=i; k++){}.   
8ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
8cf0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44 66  ssert( pCol->pDf
8d00: 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70  lt==0 || pCol->p
8d10: 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41  Dflt->op==TK_SPA
8d20: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
8d30: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
8d40: 64 28 76 2c 20 31 2c 20 22 69 73 73 69 73 69 22  d(v, 1, "issisi"
8d50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8d60: 20 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20   i-nHidden,.    
8d70: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
8d80: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
8d90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
8da0: 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22  lumnType(pCol,""
8db0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
8dc0: 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20    pCol->notNull 
8dd0: 3f 20 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  ? 1 : 0,.       
8de0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44          pCol->pD
8df0: 66 6c 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c  flt ? pCol->pDfl
8e00: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c  t->u.zToken : 0,
8e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e20: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
8e30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8e40: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
8e50: 2c 20 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 6);.      }.  
8e60: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
8e70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8e80: 44 45 42 55 47 0a 20 20 63 61 73 65 20 50 72 61  DEBUG.  case Pra
8e90: 67 54 79 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20  gTyp_STATS: {.  
8ea0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
8eb0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a     HashElem *i;.
8ec0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8ed0: 20 3d 20 35 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 5;.    sqlite
8ee0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
8ef0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
8f00: 20 20 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65      for(i=sqlite
8f10: 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
8f20: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
8f30: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
8f40: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
8f50: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8f60: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
8f70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8f80: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
8f90: 20 31 2c 20 22 73 73 69 69 69 22 2c 0a 20 20 20   1, "ssiii",.   
8fa0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
8fb0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
8fc0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  0,.           pT
8fd0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20  ab->szTabRow,.  
8fe0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
8ff0: 52 6f 77 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20  RowLogEst,.     
9000: 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
9010: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  lags);.      sql
9020: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9030: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
9040: 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 66 6f 72  1, 5);.      for
9050: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
9060: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9070: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9090: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20  MultiLoad(v, 2, 
90a0: 22 73 69 69 69 22 2c 0a 20 20 20 20 20 20 20 20  "siii",.        
90b0: 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a     pIdx->zName,.
90c0: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
90d0: 3e 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20  >szIdxRow,.     
90e0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f        pIdx->aiRo
90f0: 77 4c 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20  wLogEst[0],.    
9100: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73         pIdx->has
9110: 53 74 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20  Stat1);.        
9120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9130: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9140: 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20  w, 1, 5);.      
9150: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
9160: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63  eak;.#endif..  c
9170: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45  ase PragTyp_INDE
9180: 58 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67  X_INFO: if( zRig
9190: 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  ht ){.    Index 
91a0: 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
91b0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78   *pTab;.    pIdx
91c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
91d0: 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  dex(db, zRight, 
91e0: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49  zDb);.    if( pI
91f0: 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  dx ){.      int 
9200: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 3b  i;.      int mx;
9210: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 61 67  .      if( pPrag
9220: 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20 20  ma->iArg ){.    
9230: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
9240: 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65 72  dex_xinfo (newer
9250: 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20 6d 6f   version with mo
9260: 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75  re rows and colu
9270: 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  mns) */.        
9280: 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  mx = pIdx->nColu
9290: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  mn;.        pPar
92a0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20  se->nMem = 6;.  
92b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
92c0: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64     /* PRAGMA ind
92d0: 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79 20  ex_info (legacy 
92e0: 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  version) */.    
92f0: 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e      mx = pIdx->n
9300: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
9310: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33  pParse->nMem = 3
9320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9330: 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  pTab = pIdx->pTa
9340: 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ble;.      sqlit
9350: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
9360: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
9370: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9380: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72  Parse->nMem<=pPr
9390: 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65  agma->nPragCName
93a0: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
93b0: 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20  0; i<mx; i++){. 
93c0: 20 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20         i16 cnum 
93d0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
93e0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  [i];.        sql
93f0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9400: 64 28 76 2c 20 31 2c 20 22 69 69 73 22 2c 20 69  d(v, 1, "iis", i
9410: 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , cnum,.        
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20       cnum<0 ? 0 
9440: 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  : pTab->aCol[cnu
9450: 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m].zName);.     
9460: 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e     if( pPragma->
9470: 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iArg ){.        
9480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9490: 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73  tiLoad(v, 4, "is
94a0: 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i",.            
94b0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
94c0: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
94d0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
94e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 3c  ,.            i<
94f0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a  pIdx->nKeyCol);.
9500: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9520: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9530: 52 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  Row, 1, pParse->
9540: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nMem);.      }. 
9550: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
9560: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
9570: 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66  p_INDEX_LIST: if
9580: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
9590: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
95a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
95b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 61    int i;.    pTa
95c0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
95d0: 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c  able(db, zRight,
95e0: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
95f0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Tab ){.      pPa
9600: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20  rse->nMem = 5;. 
9610: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
9620: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
9630: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
9640: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
9650: 70 49 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49 64  pIndex, i=0; pId
9660: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9670: 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ext, i++){.     
9680: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
9690: 7a 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63  zOrigin[] = { "c
96a0: 22 2c 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a  ", "u", "pk" };.
96b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
96c0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
96d0: 31 2c 20 22 69 73 69 73 69 22 2c 0a 20 20 20 20  1, "isisi",.    
96e0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
96f0: 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65       pIdx->zName
9700: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 49 73 55  ,.           IsU
9710: 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
9720: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 4f  ,.           azO
9730: 72 69 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54  rigin[pIdx->idxT
9740: 79 70 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  ype],.          
9750: 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
9760: 68 65 72 65 21 3d 30 29 3b 0a 20 20 20 20 20 20  here!=0);.      
9770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9780: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9790: 52 6f 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20  Row, 1, 5);.    
97a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
97b0: 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50  break;..  case P
97c0: 72 61 67 54 79 70 5f 44 41 54 41 42 41 53 45 5f  ragTyp_DATABASE_
97d0: 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  LIST: {.    int 
97e0: 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  i;.    pParse->n
97f0: 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72  Mem = 3;.    for
9800: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
9810: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
9820: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
9830: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
9840: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
9850: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
9860: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
9870: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9880: 64 28 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20  d(v, 1, "iss",. 
9890: 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20          i,.     
98a0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a      db->aDb[i].z
98b0: 44 62 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  DbSName,.       
98c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
98d0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
98e0: 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20  b[i].pBt));.    
98f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9900: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9910: 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 20 20  Row, 1, 3);.    
9920: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
9930: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
9940: 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b  OLLATION_LIST: {
9950: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
9960: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
9970: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
9980: 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 70  m = 2;.    for(p
9990: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
99a0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
99b0: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
99c0: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
99d0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
99e0: 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69   (CollSeq *)sqli
99f0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
9a00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9a10: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9a20: 22 69 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c  "is", i++, pColl
9a30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
9a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9a50: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9a60: 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a  w, 1, 2);.    }.
9a70: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69    }.  break;..#i
9a80: 66 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 52  fdef SQLITE_INTR
9a90: 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41  OSPECTION_PRAGMA
9aa0: 53 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  S.  case PragTyp
9ab0: 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 3a 20  _FUNCTION_LIST: 
9ac0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
9ad0: 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20   HashElem *j;.  
9ae0: 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20    FuncDef *p;.  
9af0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
9b00: 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   2;.    for(i=0;
9b10: 20 69 3c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 48   i<SQLITE_FUNC_H
9b20: 41 53 48 5f 53 5a 3b 20 69 2b 2b 29 7b 0a 20 20  ASH_SZ; i++){.  
9b30: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
9b40: 33 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  3BuiltinFunction
9b50: 73 2e 61 5b 69 5d 3b 20 70 3b 20 70 3d 70 2d 3e  s.a[i]; p; p=p->
9b60: 75 2e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20  u.pHash ){.     
9b70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9b80: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
9b90: 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 31 29  i", p->zName, 1)
9ba0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9bb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9bc0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
9bd0: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
9be0: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69  }.    for(j=sqli
9bf0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
9c00: 3e 61 46 75 6e 63 29 3b 20 6a 3b 20 6a 3d 73 71  >aFunc); j; j=sq
9c10: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29  liteHashNext(j))
9c20: 7b 0a 20 20 20 20 20 20 70 20 3d 20 28 46 75 6e  {.      p = (Fun
9c30: 63 44 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68  cDef*)sqliteHash
9c40: 44 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73  Data(j);.      s
9c50: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9c60: 6f 61 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20  oad(v, 1, "si", 
9c70: 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  p->zName, 0);.  
9c80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9c90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
9ca0: 6c 74 52 6f 77 2c 20 31 2c 20 32 29 3b 0a 20 20  ltRow, 1, 2);.  
9cb0: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9cc0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9cd0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
9ce0: 4c 45 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  LE.  case PragTy
9cf0: 70 5f 4d 4f 44 55 4c 45 5f 4c 49 53 54 3a 20 7b  p_MODULE_LIST: {
9d00: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a  .    HashElem *j
9d10: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
9d20: 65 6d 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28  em = 1;.    for(
9d30: 6a 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  j=sqliteHashFirs
9d40: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
9d50: 20 6a 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68   j; j=sqliteHash
9d60: 4e 65 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20  Next(j)){.      
9d70: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28  Module *pMod = (
9d80: 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 48 61  Module*)sqliteHa
9d90: 73 68 44 61 74 61 28 6a 29 3b 0a 20 20 20 20 20  shData(j);.     
9da0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9db0: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 22 2c  iLoad(v, 1, "s",
9dc0: 20 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pMod->zName);. 
9dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9de0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
9df0: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
9e00: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
9e10: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
9e20: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
9e30: 41 42 4c 45 20 2a 2f 0a 0a 20 20 63 61 73 65 20  ABLE */..  case 
9e40: 50 72 61 67 54 79 70 5f 50 52 41 47 4d 41 5f 4c  PragTyp_PRAGMA_L
9e50: 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  IST: {.    int i
9e60: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
9e70: 3c 41 72 72 61 79 53 69 7a 65 28 61 50 72 61 67  <ArraySize(aPrag
9e80: 6d 61 4e 61 6d 65 29 3b 20 69 2b 2b 29 7b 0a 20  maName); i++){. 
9e90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9ea0: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9eb0: 22 73 22 2c 20 61 50 72 61 67 6d 61 4e 61 6d 65  "s", aPragmaName
9ec0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
9ed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9ee0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9ef0: 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  Row, 1, 1);.    
9f00: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
9f10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9f20: 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52  INTROSPECTION_PR
9f30: 41 47 4d 41 53 20 2a 2f 0a 0a 23 65 6e 64 69 66  AGMAS */..#endif
9f40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9f50: 53 43 48 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a  SCHEMA_PRAGMAS *
9f60: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
9f70: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
9f80: 45 59 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  EY.  case PragTy
9f90: 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49  p_FOREIGN_KEY_LI
9fa0: 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  ST: if( zRight )
9fb0: 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b  {.    FKey *pFK;
9fc0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
9fd0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
9fe0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
9ff0: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a  , zRight, zDb);.
a000: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
a010: 20 20 20 20 20 20 70 46 4b 20 3d 20 70 54 61 62        pFK = pTab
a020: 2d 3e 70 46 4b 65 79 3b 0a 20 20 20 20 20 20 69  ->pFKey;.      i
a030: 66 28 20 70 46 4b 20 29 7b 0a 20 20 20 20 20 20  f( pFK ){.      
a040: 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20    int i = 0; .  
a050: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
a060: 65 6d 20 3d 20 38 3b 0a 20 20 20 20 20 20 20 20  em = 8;.        
a070: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
a080: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
a090: 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 77 68  iDb);.        wh
a0a0: 69 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20  ile(pFK){.      
a0b0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
a0c0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
a0d0: 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  pFK->nCol; j++){
a0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a0f0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
a100: 64 28 76 2c 20 31 2c 20 22 69 69 73 73 73 73 73  d(v, 1, "iisssss
a110: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
a120: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 0a               j,.
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a150: 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20     pFK->zTo,.   
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a170: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e  pTab->aCol[pFK->
a180: 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a  aCol[j].iFrom].z
a190: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
a1a0: 20 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 61 43           pFK->aC
a1b0: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20  ol[j].zCol,.    
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
a1d0: 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61  ctionName(pFK->a
a1e0: 41 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20  Action[1]),  /* 
a1f0: 4f 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20  ON UPDATE */.   
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e  actionName(pFK->
a220: 61 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a  aAction[0]),  /*
a230: 20 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20   ON DELETE */.  
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 20 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20   "NONE");.      
a260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a270: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
a280: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 38 29 3b 0a  sultRow, 1, 8);.
a290: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a2a0: 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20        ++i;.     
a2b0: 20 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d 3e       pFK = pFK->
a2c0: 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 20  pNextFrom;.     
a2d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a2e0: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
a2f0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
a300: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
a310: 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a  OREIGN_KEY) */..
a320: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a330: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
a340: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a350: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 63 61  MIT_TRIGGER.  ca
a360: 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45 49  se PragTyp_FOREI
a370: 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20 7b 0a  GN_KEY_CHECK: {.
a380: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 20 20      FKey *pFK;  
a390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
a3a0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
a3b0: 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 54 61  traint */.    Ta
a3c0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
a3d0: 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 74 61       /* Child ta
a3e0: 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52 45 46  ble contain "REF
a3f0: 45 52 45 4e 43 45 53 22 20 6b 65 79 77 6f 72 64  ERENCES" keyword
a400: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
a410: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
a420: 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 74  * Parent table t
a430: 68 61 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73  hat child points
a440: 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78   to */.    Index
a450: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
a460: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 74 68    /* Index in th
a470: 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 2a  e parent table *
a480: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a4a0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46  Loop counter:  F
a4b0: 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d 62 65  oreign key numbe
a4c0: 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  r for pTab */.  
a4d0: 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
a4e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
a4f0: 20 63 6f 75 6e 74 65 72 3a 20 20 46 69 65 6c 64   counter:  Field
a500: 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20   of the foreign 
a510: 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61 73 68 45  key */.    HashE
a520: 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
a530: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a540: 72 3a 20 20 4e 65 78 74 20 74 61 62 6c 65 20 69  r:  Next table i
a550: 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20  n schema */.    
a560: 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20 20  int x;          
a570: 20 20 20 20 20 20 20 2f 2a 20 72 65 73 75 6c 74         /* result
a580: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
a590: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
a5a0: 20 20 20 20 20 20 20 20 2f 2a 20 33 20 72 65 67          /* 3 reg
a5b0: 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61  isters to hold a
a5c0: 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
a5d0: 20 20 20 69 6e 74 20 72 65 67 4b 65 79 3b 20 20     int regKey;  
a5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
a5f0: 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6b 65  ister to hold ke
a600: 79 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 20 74  y for checking t
a610: 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69 6e 74  he FK */.    int
a620: 20 72 65 67 52 6f 77 3b 20 20 20 20 20 20 20 20   regRow;        
a630: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
a640: 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77 20 66   to hold a row f
a650: 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20 20 20  rom pTab */.    
a660: 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
a670: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
a680: 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69 6e 67   a loop checking
a690: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 2a 2f   foreign keys */
a6a0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 6b 3b  .    int addrOk;
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
a6c0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
a6d0: 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20 20 20  key is OK */.   
a6e0: 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20 20 20   int *aiCols;   
a6f0: 20 20 20 20 20 20 20 20 2f 2a 20 63 68 69 6c 64          /* child
a700: 20 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d   to parent colum
a710: 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a 20 20  n mapping */..  
a720: 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 50    regResult = pP
a730: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
a740: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
a750: 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b 65 79 20  = 4;.    regKey 
a760: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
a770: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 2b  ;.    regRow = +
a780: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
a790: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
a7a0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
a7b0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6b 20 3d  e, iDb);.    k =
a7c0: 20 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74   sqliteHashFirst
a7d0: 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  (&db->aDb[iDb].p
a7e0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
a7f0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 20 29  ;.    while( k )
a800: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  {.      if( zRig
a810: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ht ){.        pT
a820: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
a830: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
a840: 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  0, zRight, zDb);
a850: 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  .        k = 0;.
a860: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a870: 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
a880: 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
a890: 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20 6b  ta(k);.        k
a8a0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65 78   = sqliteHashNex
a8b0: 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(k);.      }.  
a8c0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
a8d0: 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d 3d  || pTab->pFKey==
a8e0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
a8f0: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
a900: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
a910: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
a920: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
a930: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e       if( pTab->n
a940: 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50 61 72 73  Col+regRow>pPars
a950: 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65  e->nMem ) pParse
a960: 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62 2d 3e 6e  ->nMem = pTab->n
a970: 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b 0a 20 20  Col + regRow;.  
a980: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
a990: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
a9a0: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
a9b0: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 73  enRead);.      s
a9c0: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
a9d0: 72 69 6e 67 28 76 2c 20 72 65 67 52 65 73 75 6c  ring(v, regResul
a9e0: 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
a9f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  .      for(i=1, 
aa00: 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b  pFK=pTab->pFKey;
aa10: 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70   pFK; i++, pFK=p
aa20: 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  FK->pNextFrom){.
aa30: 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74 20          pParent 
aa40: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
aa50: 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c  le(db, pFK->zTo,
aa60: 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69   zDb);.        i
aa70: 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20  f( pParent==0 ) 
aa80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
aa90: 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20    pIdx = 0;.    
aaa0: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
aab0: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
aac0: 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75 6d 2c  , pParent->tnum,
aad0: 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a 4e 61   0, pParent->zNa
aae0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  me);.        x =
aaf0: 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65   sqlite3FkLocate
ab00: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 50  Index(pParse, pP
ab10: 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64  arent, pFK, &pId
ab20: 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  x, 0);.        i
ab30: 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( x==0 ){.     
ab40: 20 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30       if( pIdx==0
ab50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ab60: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
ab70: 28 70 50 61 72 73 65 2c 20 69 2c 20 69 44 62 2c  (pParse, i, iDb,
ab80: 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f 4f 70 65   pParent, OP_Ope
ab90: 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20  nRead);.        
aba0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
abb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
abc0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
abd0: 6e 52 65 61 64 2c 20 69 2c 20 70 49 64 78 2d 3e  nRead, i, pIdx->
abe0: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
abf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ac00: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
ac10: 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
ac20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ac30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ac40: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
ac50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ac60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ac70: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
ac80: 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 46  se->nErr>0 || pF
ac90: 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  K==0 );.      if
aca0: 28 20 70 46 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ( pFK ) break;. 
acb0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
acc0: 3e 6e 54 61 62 3c 69 20 29 20 70 50 61 72 73 65  >nTab<i ) pParse
acd0: 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20 20 20  ->nTab = i;.    
ace0: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
acf0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ad00: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29 3b 20   OP_Rewind, 0); 
ad10: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
ad20: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  .      for(i=1, 
ad30: 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b  pFK=pTab->pFKey;
ad40: 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70   pFK; i++, pFK=p
ad50: 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  FK->pNextFrom){.
ad60: 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74 20          pParent 
ad70: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
ad80: 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c  le(db, pFK->zTo,
ad90: 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70   zDb);.        p
ada0: 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
adb0: 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20   aiCols = 0;.   
adc0: 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74       if( pParent
add0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 20   ){.          x 
ade0: 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74  = sqlite3FkLocat
adf0: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
ae00: 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49  Parent, pFK, &pI
ae10: 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a 20 20  dx, &aiCols);.  
ae20: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ae30: 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x==0 );.        
ae40: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6b  }.        addrOk
ae50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
ae60: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
ae70: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
ae80: 20 63 6f 64 65 20 74 6f 20 72 65 61 64 20 74 68   code to read th
ae90: 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75  e child key valu
aea0: 65 73 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  es into register
aeb0: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67  s.        ** reg
aec0: 52 6f 77 2e 2e 72 65 67 52 6f 77 2b 6e 2e 20 49  Row..regRow+n. I
aed0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 63 68 69  f any of the chi
aee0: 6c 64 20 6b 65 79 20 76 61 6c 75 65 73 20 61 72  ld key values ar
aef0: 65 20 4e 55 4c 4c 2c 20 74 68 69 73 20 0a 20 20  e NULL, this .  
af00: 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 63 61 6e        ** row can
af10: 6e 6f 74 20 63 61 75 73 65 20 61 6e 20 46 4b 20  not cause an FK 
af20: 76 69 6f 6c 61 74 69 6f 6e 2e 20 4a 75 6d 70 20  violation. Jump 
af30: 64 69 72 65 63 74 6c 79 20 74 6f 20 61 64 64 72  directly to addr
af40: 4f 6b 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a  Ok in .        *
af50: 2a 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a  * this case. */.
af60: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
af70: 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b   j<pFK->nCol; j+
af80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  +){.          in
af90: 74 20 69 43 6f 6c 20 3d 20 61 69 43 6f 6c 73 20  t iCol = aiCols 
afa0: 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20 70 46  ? aiCols[j] : pF
afb0: 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d  K->aCol[j].iFrom
afc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
afd0: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
afe0: 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
aff0: 54 61 62 2c 20 30 2c 20 69 43 6f 6c 2c 20 72 65  Tab, 0, iCol, re
b000: 67 52 6f 77 2b 6a 29 3b 0a 20 20 20 20 20 20 20  gRow+j);.       
b010: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b020: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
b030: 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c 20 61 64 64  l, regRow+j, add
b040: 72 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rOk); VdbeCovera
b050: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d  ge(v);.        }
b060: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e  ..        /* Gen
b070: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 71 75  erate code to qu
b080: 65 72 79 20 74 68 65 20 70 61 72 65 6e 74 20 69  ery the parent i
b090: 6e 64 65 78 20 66 6f 72 20 61 20 6d 61 74 63 68  ndex for a match
b0a0: 69 6e 67 20 70 61 72 65 6e 74 0a 20 20 20 20 20  ing parent.     
b0b0: 20 20 20 2a 2a 20 6b 65 79 2e 20 49 66 20 61 20     ** key. If a 
b0c0: 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20  match is found, 
b0d0: 6a 75 6d 70 20 74 6f 20 61 64 64 72 4f 6b 2e 20  jump to addrOk. 
b0e0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
b0f0: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Idx ){.         
b100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b110: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
b120: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 70 46 4b  ord, regRow, pFK
b130: 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79 2c 0a  ->nCol, regKey,.
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
b150: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
b160: 74 79 53 74 72 28 64 62 2c 70 49 64 78 29 2c 20  tyStr(db,pIdx), 
b170: 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20  pFK->nCol);.    
b180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b190: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
b1a0: 5f 46 6f 75 6e 64 2c 20 69 2c 20 61 64 64 72 4f  _Found, i, addrO
b1b0: 6b 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b 0a 20  k, regKey, 0);. 
b1c0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
b1d0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
b1e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
b1f0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
b200: 20 69 6e 74 20 6a 6d 70 20 3d 20 73 71 6c 69 74   int jmp = sqlit
b210: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
b220: 72 28 76 29 2b 32 3b 0a 20 20 20 20 20 20 20 20  r(v)+2;.        
b230: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b240: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
b250: 77 69 64 2c 20 69 2c 20 6a 6d 70 2c 20 72 65 67  wid, i, jmp, reg
b260: 52 6f 77 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Row); VdbeCovera
b270: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
b280: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
b290: 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20  (v, addrOk);.   
b2a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b2b0: 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 3b 0a 20  FK->nCol==1 );. 
b2c0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
b2d0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
b2e0: 64 65 20 74 6f 20 72 65 70 6f 72 74 20 61 6e 20  de to report an 
b2f0: 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 20 74 6f 20  FK violation to 
b300: 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20  the caller. */. 
b310: 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f         if( HasRo
b320: 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
b330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b340: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
b350: 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 65 73 75  owid, 0, regResu
b360: 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  lt+1);.        }
b370: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b390: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
b3a0: 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a 20   regResult+1);. 
b3b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
b3d0: 69 4c 6f 61 64 28 76 2c 20 72 65 67 52 65 73 75  iLoad(v, regResu
b3e0: 6c 74 2b 32 2c 20 22 73 69 22 2c 20 70 46 4b 2d  lt+2, "si", pFK-
b3f0: 3e 7a 54 6f 2c 20 69 2d 31 29 3b 0a 20 20 20 20  >zTo, i-1);.    
b400: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b410: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
b420: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
b430: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 4);.        sq
b440: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
b450: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 6b 29  Label(v, addrOk)
b460: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b470: 33 44 62 46 72 65 65 28 64 62 2c 20 61 69 43 6f  3DbFree(db, aiCo
b480: 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ls);.      }.   
b490: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b4a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
b4b0: 20 30 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20   0, addrTop+1); 
b4c0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b4d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b4e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b4f0: 64 72 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  drTop);.    }.  
b500: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
b510: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
b520: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
b530: 52 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  R) */.#endif /* 
b540: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b550: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
b560: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ) */..#ifndef ND
b570: 45 42 55 47 0a 20 20 63 61 73 65 20 50 72 61 67  EBUG.  case Prag
b580: 54 79 70 5f 50 41 52 53 45 52 5f 54 52 41 43 45  Typ_PARSER_TRACE
b590: 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
b5a0: 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ht ){.      if( 
b5b0: 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
b5c0: 6e 28 7a 52 69 67 68 74 2c 20 30 29 20 29 7b 0a  n(zRight, 0) ){.
b5d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
b5e0: 61 72 73 65 72 54 72 61 63 65 28 73 74 64 6f 75  arserTrace(stdou
b5f0: 74 2c 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a  t, "parser: ");.
b600: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b610: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 72 73       sqlite3Pars
b620: 65 72 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20  erTrace(0, 0);. 
b630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b640: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
b650: 0a 0a 20 20 2f 2a 20 52 65 69 6e 73 74 61 6c 6c  ..  /* Reinstall
b660: 20 74 68 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c   the LIKE and GL
b670: 4f 42 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  OB functions.  T
b680: 68 65 20 76 61 72 69 61 6e 74 20 6f 66 20 4c 49  he variant of LI
b690: 4b 45 0a 20 20 2a 2a 20 75 73 65 64 20 77 69 6c  KE.  ** used wil
b6a0: 6c 20 62 65 20 63 61 73 65 20 73 65 6e 73 69 74  l be case sensit
b6b0: 69 76 65 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e  ive or not depen
b6c0: 64 69 6e 67 20 6f 6e 20 74 68 65 20 52 48 53 2e  ding on the RHS.
b6d0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
b6e0: 67 54 79 70 5f 43 41 53 45 5f 53 45 4e 53 49 54  gTyp_CASE_SENSIT
b6f0: 49 56 45 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20 20  IVE_LIKE: {.    
b700: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
b710: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
b720: 74 65 72 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73  terLikeFunctions
b730: 28 64 62 2c 20 73 71 6c 69 74 65 33 47 65 74 42  (db, sqlite3GetB
b740: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
b750: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
b760: 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65 66 20  break;..#ifndef 
b770: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
b780: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
b790: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
b7a0: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b7b0: 5f 45 52 52 4f 52 5f 4d 41 58 20 31 30 30 0a 23  _ERROR_MAX 100.#
b7c0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
b7d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
b7e0: 52 49 54 59 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  RITY_CHECK.  /* 
b7f0: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
b800: 69 74 79 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 20  ity_check.  **  
b810: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
b820: 74 79 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a  ty_check(N).  **
b830: 20 20 20 20 50 52 41 47 4d 41 20 71 75 69 63 6b      PRAGMA quick
b840: 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 20 20 20 50  _check.  **    P
b850: 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63  RAGMA quick_chec
b860: 6b 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  k(N).  **.  ** V
b870: 65 72 69 66 79 20 74 68 65 20 69 6e 74 65 67 72  erify the integr
b880: 69 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  ity of the datab
b890: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ase..  **.  ** T
b8a0: 68 65 20 22 71 75 69 63 6b 5f 63 68 65 63 6b 22  he "quick_check"
b8b0: 20 69 73 20 72 65 64 75 63 65 64 20 76 65 72 73   is reduced vers
b8c0: 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 69 6e 74  ion of .  ** int
b8d0: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 64 65 73  egrity_check des
b8e0: 69 67 6e 65 64 20 74 6f 20 64 65 74 65 63 74 20  igned to detect 
b8f0: 6d 6f 73 74 20 64 61 74 61 62 61 73 65 20 63 6f  most database co
b900: 72 72 75 70 74 69 6f 6e 0a 20 20 2a 2a 20 77 69  rruption.  ** wi
b910: 74 68 6f 75 74 20 74 68 65 20 6f 76 65 72 68 65  thout the overhe
b920: 61 64 20 6f 66 20 63 72 6f 73 73 2d 63 68 65 63  ad of cross-chec
b930: 6b 69 6e 67 20 69 6e 64 65 78 65 73 2e 20 20 51  king indexes.  Q
b940: 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a 20  uick_check.  ** 
b950: 69 73 20 6c 69 6e 65 61 72 20 74 69 6d 65 20 77  is linear time w
b960: 68 65 72 65 61 73 65 20 69 6e 74 65 67 72 69 74  herease integrit
b970: 79 5f 63 68 65 63 6b 20 69 73 20 4f 28 4e 6c 6f  y_check is O(Nlo
b980: 67 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  gN)..  */.  case
b990: 20 50 72 61 67 54 79 70 5f 49 4e 54 45 47 52 49   PragTyp_INTEGRI
b9a0: 54 59 5f 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20  TY_CHECK: {.    
b9b0: 69 6e 74 20 69 2c 20 6a 2c 20 61 64 64 72 2c 20  int i, j, addr, 
b9c0: 6d 78 45 72 72 3b 0a 0a 20 20 20 20 69 6e 74 20  mxErr;..    int 
b9d0: 69 73 51 75 69 63 6b 20 3d 20 28 73 71 6c 69 74  isQuick = (sqlit
b9e0: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
b9f0: 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20 20 20 20  0])=='q');..    
ba00: 2f 2a 20 49 66 20 74 68 65 20 50 52 41 47 4d 41  /* If the PRAGMA
ba10: 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 6f 66 20   command was of 
ba20: 74 68 65 20 66 6f 72 6d 20 22 50 52 41 47 4d 41  the form "PRAGMA
ba30: 20 3c 64 62 3e 2e 69 6e 74 65 67 72 69 74 79 5f   <db>.integrity_
ba40: 63 68 65 63 6b 22 2c 0a 20 20 20 20 2a 2a 20 74  check",.    ** t
ba50: 68 65 6e 20 69 44 62 20 69 73 20 73 65 74 20 74  hen iDb is set t
ba60: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
ba70: 68 65 20 64 61 74 61 62 61 73 65 20 69 64 65 6e  he database iden
ba80: 74 69 66 69 65 64 20 62 79 20 3c 64 62 3e 2e 0a  tified by <db>..
ba90: 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
baa0: 61 73 65 2c 20 74 68 65 20 69 6e 74 65 67 72 69  ase, the integri
bab0: 74 79 20 6f 66 20 64 61 74 61 62 61 73 65 20 69  ty of database i
bac0: 44 62 20 6f 6e 6c 79 20 69 73 20 76 65 72 69 66  Db only is verif
bad0: 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68  ied by.    ** th
bae0: 65 20 56 44 42 45 20 63 72 65 61 74 65 64 20 62  e VDBE created b
baf0: 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  elow..    **.   
bb00: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
bb10: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 77 61  f the command wa
bb20: 73 20 73 69 6d 70 6c 79 20 22 50 52 41 47 4d 41  s simply "PRAGMA
bb30: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
bb40: 22 20 28 6f 72 0a 20 20 20 20 2a 2a 20 22 50 52  " (or.    ** "PR
bb50: 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b  AGMA quick_check
bb60: 22 29 2c 20 74 68 65 6e 20 69 44 62 20 69 73 20  "), then iDb is 
bb70: 73 65 74 20 74 6f 20 30 2e 20 49 6e 20 74 68 69  set to 0. In thi
bb80: 73 20 63 61 73 65 2c 20 73 65 74 20 69 44 62 0a  s case, set iDb.
bb90: 20 20 20 20 2a 2a 20 74 6f 20 2d 31 20 68 65 72      ** to -1 her
bba0: 65 2c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  e, to indicate t
bbb0: 68 61 74 20 74 68 65 20 56 44 42 45 20 73 68 6f  hat the VDBE sho
bbc0: 75 6c 64 20 76 65 72 69 66 79 20 74 68 65 20 69  uld verify the i
bbd0: 6e 74 65 67 72 69 74 79 0a 20 20 20 20 2a 2a 20  ntegrity.    ** 
bbe0: 6f 66 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  of all attached 
bbf0: 64 61 74 61 62 61 73 65 73 2e 20 20 2a 2f 0a 20  databases.  */. 
bc00: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
bc10: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
bc20: 20 69 44 62 3d 3d 30 20 7c 7c 20 70 49 64 32 2d   iDb==0 || pId2-
bc30: 3e 7a 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  >z );.    if( pI
bc40: 64 32 2d 3e 7a 3d 3d 30 20 29 20 69 44 62 20 3d  d2->z==0 ) iDb =
bc50: 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69   -1;..    /* Ini
bc60: 74 69 61 6c 69 7a 65 20 74 68 65 20 56 44 42 45  tialize the VDBE
bc70: 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 20 20   program */.    
bc80: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36  pParse->nMem = 6
bc90: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
bca0: 65 20 6d 61 78 69 6d 75 6d 20 65 72 72 6f 72 20  e maximum error 
bcb0: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 6d 78 45  count */.    mxE
bcc0: 72 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rr = SQLITE_INTE
bcd0: 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f  GRITY_CHECK_ERRO
bce0: 52 5f 4d 41 58 3b 0a 20 20 20 20 69 66 28 20 7a  R_MAX;.    if( z
bcf0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
bd00: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
bd10: 52 69 67 68 74 2c 20 26 6d 78 45 72 72 29 3b 0a  Right, &mxErr);.
bd20: 20 20 20 20 20 20 69 66 28 20 6d 78 45 72 72 3c        if( mxErr<
bd30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78  =0 ){.        mx
bd40: 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  Err = SQLITE_INT
bd50: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
bd60: 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 20 20 7d 0a  OR_MAX;.      }.
bd70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bd80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bd90: 50 5f 49 6e 74 65 67 65 72 2c 20 6d 78 45 72 72  P_Integer, mxErr
bda0: 2d 31 2c 20 31 29 3b 20 2f 2a 20 72 65 67 5b 31  -1, 1); /* reg[1
bdb0: 5d 20 68 6f 6c 64 73 20 65 72 72 6f 72 73 20 6c  ] holds errors l
bdc0: 65 66 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44  eft */..    /* D
bdd0: 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63  o an integrity c
bde0: 68 65 63 6b 20 6f 6e 20 65 61 63 68 20 64 61 74  heck on each dat
bdf0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
be00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
be10: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
be20: 20 20 48 61 73 68 45 6c 65 6d 20 2a 78 3b 0a 20    HashElem *x;. 
be30: 20 20 20 20 20 48 61 73 68 20 2a 70 54 62 6c 73       Hash *pTbls
be40: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 52 6f  ;.      int *aRo
be50: 6f 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e  ot;.      int cn
be60: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
be70: 20 6d 78 49 64 78 20 3d 20 30 3b 0a 20 20 20 20   mxIdx = 0;.    
be80: 20 20 69 6e 74 20 6e 49 64 78 3b 0a 0a 20 20 20    int nIdx;..   
be90: 20 20 20 69 66 28 20 4f 4d 49 54 5f 54 45 4d 50     if( OMIT_TEMP
bea0: 44 42 20 26 26 20 69 3d 3d 31 20 29 20 63 6f 6e  DB && i==1 ) con
beb0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
bec0: 20 69 44 62 3e 3d 30 20 26 26 20 69 21 3d 69 44   iDb>=0 && i!=iD
bed0: 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  b ) continue;.. 
bee0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
bef0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
bf00: 72 73 65 2c 20 69 29 3b 0a 0a 20 20 20 20 20 20  rse, i);..      
bf10: 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69  /* Do an integri
bf20: 74 79 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20  ty check of the 
bf30: 42 2d 54 72 65 65 0a 20 20 20 20 20 20 2a 2a 0a  B-Tree.      **.
bf40: 20 20 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 62        ** Begin b
bf50: 79 20 66 69 6e 64 69 6e 67 20 74 68 65 20 72 6f  y finding the ro
bf60: 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  ot pages numbers
bf70: 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c  .      ** for al
bf80: 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64  l tables and ind
bf90: 69 63 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ices in the data
bfa0: 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
bfb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
bfc0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
bfd0: 65 6c 64 28 64 62 2c 20 69 2c 20 30 29 20 29 3b  eld(db, i, 0) );
bfe0: 0a 20 20 20 20 20 20 70 54 62 6c 73 20 3d 20 26  .      pTbls = &
bff0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65  db->aDb[i].pSche
c000: 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20  ma->tblHash;.   
c010: 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78 3d     for(cnt=0, x=
c020: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
c030: 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c  pTbls); x; x=sql
c040: 69 74 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b  iteHashNext(x)){
c050: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
c060: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
c070: 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20  hData(x);.      
c080: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
c090: 20 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f         if( HasRo
c0a0: 77 69 64 28 70 54 61 62 29 20 29 20 63 6e 74 2b  wid(pTab) ) cnt+
c0b0: 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e  +;.        for(n
c0c0: 49 64 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  Idx=0, pIdx=pTab
c0d0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
c0e0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
c0f0: 2c 20 6e 49 64 78 2b 2b 29 7b 20 63 6e 74 2b 2b  , nIdx++){ cnt++
c100: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
c110: 6e 49 64 78 3e 6d 78 49 64 78 20 29 20 6d 78 49  nIdx>mxIdx ) mxI
c120: 64 78 20 3d 20 6e 49 64 78 3b 0a 20 20 20 20 20  dx = nIdx;.     
c130: 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f 74 20 3d   }.      aRoot =
c140: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c150: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
c160: 28 69 6e 74 29 2a 28 63 6e 74 2b 31 29 29 3b 0a  (int)*(cnt+1));.
c170: 20 20 20 20 20 20 69 66 28 20 61 52 6f 6f 74 3d        if( aRoot=
c180: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
c190: 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73    for(cnt=0, x=s
c1a0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
c1b0: 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69  Tbls); x; x=sqli
c1c0: 74 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a  teHashNext(x)){.
c1d0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
c1e0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
c1f0: 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20  Data(x);.       
c200: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
c210: 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
c220: 69 64 28 70 54 61 62 29 20 29 20 61 52 6f 6f 74  id(pTab) ) aRoot
c230: 5b 63 6e 74 2b 2b 5d 20 3d 20 70 54 61 62 2d 3e  [cnt++] = pTab->
c240: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 66 6f  tnum;.        fo
c250: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
c260: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
c270: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
c280: 20 20 20 20 20 20 20 20 61 52 6f 6f 74 5b 63 6e          aRoot[cn
c290: 74 2b 2b 5d 20 3d 20 70 49 64 78 2d 3e 74 6e 75  t++] = pIdx->tnu
c2a0: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
c2b0: 20 20 20 7d 0a 20 20 20 20 20 20 61 52 6f 6f 74     }.      aRoot
c2c0: 5b 63 6e 74 5d 20 3d 20 30 3b 0a 0a 20 20 20 20  [cnt] = 0;..    
c2d0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 73    /* Make sure s
c2e0: 75 66 66 69 63 69 65 6e 74 20 6e 75 6d 62 65 72  ufficient number
c2f0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68 61   of registers ha
c300: 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
c310: 64 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73  d */.      pPars
c320: 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 20 70  e->nMem = MAX( p
c330: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 38 2b 6d  Parse->nMem, 8+m
c340: 78 49 64 78 20 29 3b 0a 0a 20 20 20 20 20 20 2f  xIdx );..      /
c350: 2a 20 44 6f 20 74 68 65 20 62 2d 74 72 65 65 20  * Do the b-tree 
c360: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 73  integrity checks
c370: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
c380: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
c390: 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 32  P_IntegrityCk, 2
c3a0: 2c 20 63 6e 74 2c 20 31 2c 20 28 63 68 61 72 2a  , cnt, 1, (char*
c3b0: 29 61 52 6f 6f 74 2c 50 34 5f 49 4e 54 41 52 52  )aRoot,P4_INTARR
c3c0: 41 59 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  AY);.      sqlit
c3d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
c3e0: 2c 20 28 75 38 29 69 29 3b 0a 20 20 20 20 20 20  , (u8)i);.      
c3f0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
c400: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
c410: 73 4e 75 6c 6c 2c 20 32 29 3b 20 56 64 62 65 43  sNull, 2); VdbeC
c420: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
c430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c440: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
c450: 38 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20 20  8, 0, 3, 0,.    
c460: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
c470: 6e 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e 20  ntf(db, "*** in 
c480: 64 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a 5c  database %s ***\
c490: 6e 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  n", db->aDb[i].z
c4a0: 44 62 53 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  DbSName),.      
c4b0: 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a     P4_DYNAMIC);.
c4c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c4d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f  eAddOp3(v, OP_Mo
c4e0: 76 65 2c 20 32 2c 20 34 2c 20 31 29 3b 0a 20 20  ve, 2, 4, 1);.  
c4f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c500: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63  ddOp3(v, OP_Conc
c510: 61 74 2c 20 34 2c 20 33 2c 20 32 29 3b 0a 20 20  at, 4, 3, 2);.  
c520: 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65      integrityChe
c530: 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 2c 20 32  ckResultRow(v, 2
c540: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c550: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c560: 61 64 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  addr);..      /*
c570: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   Make sure all t
c580: 68 65 20 69 6e 64 69 63 65 73 20 61 72 65 20 63  he indices are c
c590: 6f 6e 73 74 72 75 63 74 65 64 20 63 6f 72 72 65  onstructed corre
c5a0: 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ctly..      */. 
c5b0: 20 20 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74       for(x=sqlit
c5c0: 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73  eHashFirst(pTbls
c5d0: 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61  ); x; x=sqliteHa
c5e0: 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20  shNext(x)){.    
c5f0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c600: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
c610: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64  (x);.        Ind
c620: 65 78 20 2a 70 49 64 78 2c 20 2a 70 50 6b 3b 0a  ex *pIdx, *pPk;.
c630: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
c640: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
c650: 20 20 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b 0a     int loopTop;.
c660: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 61 74          int iDat
c670: 61 43 75 72 2c 20 69 49 64 78 43 75 72 3b 0a 20  aCur, iIdxCur;. 
c680: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
c690: 2d 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  -1;..        if(
c6a0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3c 31 20 29 20   pTab->tnum<1 ) 
c6b0: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b  continue;  /* Sk
c6c0: 69 70 20 56 49 45 57 73 20 6f 72 20 56 49 52 54  ip VIEWs or VIRT
c6d0: 55 41 4c 20 54 41 42 4c 45 73 20 2a 2f 0a 20 20  UAL TABLEs */.  
c6e0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
c6f0: 70 43 68 65 63 6b 3d 3d 30 0a 20 20 20 20 20 20  pCheck==0.      
c700: 20 20 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62     && (pTab->tab
c710: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 4e 6f  Flags & TF_HasNo
c720: 74 4e 75 6c 6c 29 3d 3d 30 0a 20 20 20 20 20 20  tNull)==0.      
c730: 20 20 20 26 26 20 28 70 54 61 62 2d 3e 70 49 6e     && (pTab->pIn
c740: 64 65 78 3d 3d 30 20 7c 7c 20 69 73 51 75 69 63  dex==0 || isQuic
c750: 6b 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  k).        ){.  
c760: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
c770: 3b 20 20 2f 2a 20 4e 6f 20 61 64 64 69 74 69 6f  ;  /* No additio
c780: 6e 61 6c 20 63 68 65 63 6b 73 20 6e 65 65 64 65  nal checks neede
c790: 64 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  d for this table
c7a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
c7b0: 20 20 20 20 20 20 70 50 6b 20 3d 20 48 61 73 52        pPk = HasR
c7c0: 6f 77 69 64 28 70 54 61 62 29 20 3f 20 30 20 3a  owid(pTab) ? 0 :
c7d0: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
c7e0: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
c7f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c800: 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
c810: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
c820: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e  lite3OpenTableAn
c830: 64 49 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c  dIndices(pParse,
c840: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
c850: 61 64 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ad, 0,.         
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
c880: 26 69 44 61 74 61 43 75 72 2c 20 26 69 49 64 78  &iDataCur, &iIdx
c890: 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Cur);.        sq
c8a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c8b0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
c8c0: 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  , 7);.        fo
c8d0: 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  r(j=0, pIdx=pTab
c8e0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
c8f0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
c900: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , j++){.        
c910: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c920: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
c930: 72 2c 20 30 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69  r, 0, 8+j); /* i
c940: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 63 6f 75  ndex entries cou
c950: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  nter */.        
c960: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
c970: 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3e 3d  ( pParse->nMem>=
c980: 38 2b 6a 20 29 3b 0a 20 20 20 20 20 20 20 20 61  8+j );.        a
c990: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4e 6f  ssert( sqlite3No
c9a0: 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 70 50 61  TempsInRange(pPa
c9b0: 72 73 65 2c 31 2c 37 2b 6a 29 20 29 3b 0a 20 20  rse,1,7+j) );.  
c9c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c9d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
c9e0: 77 69 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20  wind, iDataCur, 
c9f0: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
ca00: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f  (v);.        loo
ca10: 70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  pTop = sqlite3Vd
ca20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
ca30: 64 64 49 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20  ddImm, 7, 1);.  
ca40: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
ca50: 74 68 61 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c  that all NOT NUL
ca60: 4c 20 63 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c 79  L columns really
ca70: 20 61 72 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f   are NOT NULL */
ca80: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
ca90: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
caa0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
cab0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
cac0: 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 3b 0a        int jmp2;.
cad0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
cae0: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63  =pTab->iPKey ) c
caf0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
cb00: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f     if( pTab->aCo
cb10: 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  l[j].notNull==0 
cb20: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
cb30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
cb40: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
cb50: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69  Table(v, pTab, i
cb60: 44 61 74 61 43 75 72 2c 20 6a 2c 20 33 29 3b 0a  DataCur, j, 3);.
cb70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cb80: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
cb90: 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
cba0: 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d  G);.          jm
cbb0: 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
cbc0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
cbd0: 4e 75 6c 6c 2c 20 33 29 3b 20 56 64 62 65 43 6f  Null, 3); VdbeCo
cbe0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
cbf0: 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69       zErr = sqli
cc00: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
cc10: 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 25 73  NULL value in %s
cc20: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
cc30: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
cc60: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
cc70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cc80: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
cc90: 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c  , 0, 3, 0, zErr,
cca0: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
ccb0: 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74          integrit
ccc0: 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28  yCheckResultRow(
ccd0: 76 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  v, 3);.         
cce0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
ccf0: 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20  Here(v, jmp2);. 
cd00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cd10: 20 2f 2a 20 56 65 72 69 66 79 20 43 48 45 43 4b   /* Verify CHECK
cd20: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
cd30: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
cd40: 2d 3e 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d  ->pCheck && (db-
cd50: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
cd60: 49 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30  IgnoreChecks)==0
cd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
cd80: 70 72 4c 69 73 74 20 2a 70 43 68 65 63 6b 20 3d  prList *pCheck =
cd90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cda0: 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 43  Dup(db, pTab->pC
cdb0: 68 65 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  heck, 0);.      
cdc0: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
cdd0: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
cde0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61             int a
cdf0: 64 64 72 43 6b 46 61 75 6c 74 20 3d 20 73 71 6c  ddrCkFault = sql
ce00: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
ce10: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l(v);.          
ce20: 20 20 69 6e 74 20 61 64 64 72 43 6b 4f 6b 20 3d    int addrCkOk =
ce30: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
ce40: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
ce50: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
ce60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
ce70: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
ce80: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
ce90: 62 20 3d 20 69 44 61 74 61 43 75 72 3b 0a 20 20  b = iDataCur;.  
cea0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ceb0: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
cec0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
ced0: 20 20 20 20 66 6f 72 28 6b 3d 70 43 68 65 63 6b      for(k=pCheck
cee0: 2d 3e 6e 45 78 70 72 2d 31 3b 20 6b 3e 30 3b 20  ->nExpr-1; k>0; 
cef0: 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k--){.          
cf00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
cf10: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
cf20: 43 68 65 63 6b 2d 3e 61 5b 6b 5d 2e 70 45 78 70  Check->a[k].pExp
cf30: 72 2c 20 61 64 64 72 43 6b 46 61 75 6c 74 2c 20  r, addrCkFault, 
cf40: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
cf50: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
cf60: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
cf70: 70 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e  pParse, pCheck->
cf80: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 64 64 72  a[0].pExpr, addr
cf90: 43 6b 4f 6b 2c 20 0a 20 20 20 20 20 20 20 20 20  CkOk, .         
cfa0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55         SQLITE_JU
cfb0: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
cfc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cfd0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
cfe0: 2c 20 61 64 64 72 43 6b 46 61 75 6c 74 29 3b 0a  , addrCkFault);.
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 72 72              zErr
d000: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
d010: 66 28 64 62 2c 20 22 43 48 45 43 4b 20 63 6f 6e  f(db, "CHECK con
d020: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 20 69  straint failed i
d030: 6e 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  n %s",.         
d040: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
d050: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
d060: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d070: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
d080: 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c  , 0, 3, 0, zErr,
d090: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
d0a0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 67 72            integr
d0b0: 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f  ityCheckResultRo
d0c0: 77 28 76 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  w(v, 3);.       
d0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d0e0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
d0f0: 61 64 64 72 43 6b 4f 6b 29 3b 0a 20 20 20 20 20  addrCkOk);.     
d100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d110: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
d120: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
d130: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d140: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
d150: 64 62 2c 20 70 43 68 65 63 6b 29 3b 0a 20 20 20  db, pCheck);.   
d160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
d170: 2a 20 56 61 6c 69 64 61 74 65 20 69 6e 64 65 78  * Validate index
d180: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
d190: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a   current row */.
d1a0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
d1b0: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
d1c0: 65 78 3b 20 70 49 64 78 20 26 26 20 21 69 73 51  ex; pIdx && !isQ
d1d0: 75 69 63 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d  uick; pIdx=pIdx-
d1e0: 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20  >pNext, j++){.  
d1f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 32          int jmp2
d200: 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a 6d  , jmp3, jmp4, jm
d210: 70 35 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  p5;.          in
d220: 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c 69 74  t ckUniq = sqlit
d230: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d240: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  v);.          if
d250: 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f  ( pPk==pIdx ) co
d260: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
d270: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
d280: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
d290: 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 44 61  Parse, pIdx, iDa
d2a0: 74 61 43 75 72 2c 20 30 2c 20 30 2c 20 26 6a 6d  taCur, 0, 0, &jm
d2b0: 70 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p3,.            
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
d2e0: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  r, r1);.        
d2f0: 20 20 70 50 72 69 6f 72 20 3d 20 70 49 64 78 3b    pPrior = pIdx;
d300: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d310: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d320: 4f 50 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a 2c 20  OP_AddImm, 8+j, 
d330: 31 29 3b 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e  1);  /* incremen
d340: 74 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f  t entry count */
d350: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65  .          /* Ve
d360: 72 69 66 79 20 74 68 61 74 20 61 6e 20 69 6e 64  rify that an ind
d370: 65 78 20 65 6e 74 72 79 20 65 78 69 73 74 73 20  ex entry exists 
d380: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
d390: 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 20  table row */.   
d3a0: 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71         jmp2 = sq
d3b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
d3c0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
d3d0: 69 49 64 78 43 75 72 2b 6a 2c 20 63 6b 55 6e 69  iIdxCur+j, ckUni
d3e0: 71 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20  q, r1,.         
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
d410: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64 62  x->nColumn); Vdb
d420: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d430: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d440: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
d450: 20 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20 20 20   3, "row ");.   
d460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d470: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d480: 6f 6e 63 61 74 2c 20 37 2c 20 33 2c 20 33 29 3b  oncat, 7, 3, 3);
d490: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d4a0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
d4b0: 28 76 2c 20 34 2c 20 22 20 6d 69 73 73 69 6e 67  (v, 4, " missing
d4c0: 20 66 72 6f 6d 20 69 6e 64 65 78 20 22 29 3b 0a   from index ");.
d4d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d4e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d4f0: 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20  P_Concat, 4, 3, 
d500: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d  3);.          jm
d510: 70 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p5 = sqlite3Vdbe
d520: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c  LoadString(v, 4,
d530: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pIdx->zName);. 
d540: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d550: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d560: 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33  _Concat, 4, 3, 3
d570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70  );.          jmp
d580: 34 20 3d 20 69 6e 74 65 67 72 69 74 79 43 68 65  4 = integrityChe
d590: 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 2c 20 33  ckResultRow(v, 3
d5a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d5b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
d5c0: 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20  (v, jmp2);.     
d5d0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 51       /* For UNIQ
d5e0: 55 45 20 69 6e 64 65 78 65 73 2c 20 76 65 72 69  UE indexes, veri
d5f0: 66 79 20 74 68 61 74 20 6f 6e 6c 79 20 6f 6e 65  fy that only one
d600: 20 65 6e 74 72 79 20 65 78 69 73 74 73 20 77 69   entry exists wi
d610: 74 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  th the.         
d620: 20 2a 2a 20 63 75 72 72 65 6e 74 20 6b 65 79 2e   ** current key.
d630: 20 20 54 68 65 20 65 6e 74 72 79 20 69 73 20 75    The entry is u
d640: 6e 69 71 75 65 20 69 66 20 28 31 29 20 61 6e 79  nique if (1) any
d650: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 0a   column is NULL.
d660: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
d670: 28 32 29 20 74 68 65 20 6e 65 78 74 20 65 6e 74  (2) the next ent
d680: 72 79 20 68 61 73 20 61 20 64 69 66 66 65 72 65  ry has a differe
d690: 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  nt key */.      
d6a0: 20 20 20 20 69 66 28 20 49 73 55 6e 69 71 75 65      if( IsUnique
d6b0: 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20  Index(pIdx) ){. 
d6c0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 75             int u
d6d0: 6e 69 71 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  niqOk = sqlite3V
d6e0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
d6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d700: 20 6a 6d 70 36 3b 0a 20 20 20 20 20 20 20 20 20   jmp6;.         
d710: 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20 20 20 20     int kk;.     
d720: 20 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d 30 3b         for(kk=0;
d730: 20 6b 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   kk<pIdx->nKeyCo
d740: 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  l; kk++){.      
d750: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
d760: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
d770: 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  n[kk];.         
d780: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
d790: 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 69  l!=XN_ROWID && i
d7a0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
d7b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d7c0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70  if( iCol>=0 && p
d7d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
d7e0: 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74 69 6e  notNull ) contin
d7f0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
d800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d810: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
d820: 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f 6b 29  , r1+kk, uniqOk)
d830: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d840: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d860: 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 36 20             jmp6 
d870: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d880: 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op1(v, OP_Next, 
d890: 69 49 64 78 43 75 72 2b 6a 29 3b 20 56 64 62 65  iIdxCur+j); Vdbe
d8a0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
d8b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d8c0: 56 64 62 65 47 6f 74 6f 28 76 2c 20 75 6e 69 71  VdbeGoto(v, uniq
d8d0: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Ok);.           
d8e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d8f0: 48 65 72 65 28 76 2c 20 6a 6d 70 36 29 3b 0a 20  Here(v, jmp6);. 
d900: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d910: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
d920: 76 2c 20 4f 50 5f 49 64 78 47 54 2c 20 69 49 64  v, OP_IdxGT, iId
d930: 78 43 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c 20  xCur+j, uniqOk, 
d940: 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65 79 43       pIdx->nKeyC
d970: 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
d980: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
d990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
d9a0: 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 6e  dString(v, 3, "n
d9b0: 6f 6e 2d 75 6e 69 71 75 65 20 65 6e 74 72 79 20  on-unique entry 
d9c0: 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20 20 20  in index ");.   
d9d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d9e0: 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 6d 70 35  VdbeGoto(v, jmp5
d9f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
da00: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
da10: 65 4c 61 62 65 6c 28 76 2c 20 75 6e 69 71 4f 6b  eLabel(v, uniqOk
da20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
da30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
da40: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
da50: 6a 6d 70 34 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp4);.         
da60: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50   sqlite3ResolveP
da70: 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72  artIdxLabel(pPar
da80: 73 65 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20 20  se, jmp3);.     
da90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
daa0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dab0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 44 61 74 61  , OP_Next, iData
dac0: 43 75 72 2c 20 6c 6f 6f 70 54 6f 70 29 3b 20 56  Cur, loopTop); V
dad0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
dae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
daf0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6c  dbeJumpHere(v, l
db00: 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23 69 66 6e 64  oopTop-1);.#ifnd
db10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
db20: 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
db30: 20 20 69 66 28 20 21 69 73 51 75 69 63 6b 20 29    if( !isQuick )
db40: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
db50: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
db60: 67 28 76 2c 20 32 2c 20 22 77 72 6f 6e 67 20 23  g(v, 2, "wrong #
db70: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 69   of entries in i
db80: 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20  ndex ");.       
db90: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78     for(j=0, pIdx
dba0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
dbb0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
dbc0: 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20  pNext, j++){.   
dbd0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6b           if( pPk
dbe0: 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75  ==pIdx ) continu
dbf0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
dc00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dc10: 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49  (v, OP_Count, iI
dc20: 64 78 43 75 72 2b 6a 2c 20 33 29 3b 0a 20 20 20  dxCur+j, 3);.   
dc30: 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
dc40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dc50: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38 2b 6a 2c  3(v, OP_Eq, 8+j,
dc60: 20 30 2c 20 33 29 3b 20 56 64 62 65 43 6f 76 65   0, 3); VdbeCove
dc70: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
dc80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc90: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
dca0: 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TE_NOTNULL);.   
dcb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dcc0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
dcd0: 2c 20 33 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  , 3, pIdx->zName
dce0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
dcf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
dd00: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 33  (v, OP_Concat, 3
dd10: 2c 20 32 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  , 2, 7);.       
dd20: 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68       integrityCh
dd30: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 2c 20  eckResultRow(v, 
dd40: 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  7);.            
dd50: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
dd60: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
dd70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dd80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
dd90: 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
dda0: 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7d 20  OUNT */.      } 
ddb0: 0a 20 20 20 20 7d 0a 20 20 20 20 7b 0a 20 20 20  .    }.    {.   
ddc0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
ddd0: 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f  int iLn = VDBE_O
dde0: 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b  FFSET_LINENO(2);
ddf0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
de00: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 65  nst VdbeOpList e
de10: 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  ndCode[] = {.   
de20: 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d       { OP_AddImm
de30: 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ,      1, 0,    
de40: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20      0},    /* 0 
de50: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
de60: 49 66 4e 6f 74 5a 65 72 6f 2c 20 20 20 31 2c 20  IfNotZero,   1, 
de70: 34 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  4,        0},   
de80: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20   /* 1 */.       
de90: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20   { OP_String8,  
dea0: 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20     0, 3,        
deb0: 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20  0},    /* 2 */. 
dec0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75         { OP_Resu
ded0: 6c 74 52 6f 77 2c 20 20 20 33 2c 20 31 2c 20 20  ltRow,   3, 1,  
dee0: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
def0: 33 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20  3 */.      };.  
df00: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
df10: 0a 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ..      aOp = sq
df20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
df30: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
df40: 65 6e 64 43 6f 64 65 29 2c 20 65 6e 64 43 6f 64  endCode), endCod
df50: 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69  e, iLn);.      i
df60: 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 20 20  f( aOp ){.      
df70: 20 20 61 4f 70 5b 30 5d 2e 70 32 20 3d 20 31 2d    aOp[0].p2 = 1-
df80: 6d 78 45 72 72 3b 0a 20 20 20 20 20 20 20 20 61  mxErr;.        a
df90: 4f 70 5b 32 5d 2e 70 34 74 79 70 65 20 3d 20 50  Op[2].p4type = P
dfa0: 34 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 20 20  4_STATIC;.      
dfb0: 20 20 61 4f 70 5b 32 5d 2e 70 34 2e 7a 20 3d 20    aOp[2].p4.z = 
dfc0: 22 6f 6b 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  "ok";.      }.  
dfd0: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
dfe0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
dff0: 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
e000: 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
e010: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
e020: 54 46 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  TF16.  /*.  **  
e030: 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67   PRAGMA encoding
e040: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65  .  **   PRAGMA e
e050: 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74 66 2d 38  ncoding = "utf-8
e060: 22 7c 22 75 74 66 2d 31 36 22 7c 22 75 74 66 2d  "|"utf-16"|"utf-
e070: 31 36 6c 65 22 7c 22 75 74 66 2d 31 36 62 65 22  16le"|"utf-16be"
e080: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 69 74  .  **.  ** In it
e090: 73 20 66 69 72 73 74 20 66 6f 72 6d 2c 20 74 68  s first form, th
e0a0: 69 73 20 70 72 61 67 6d 61 20 72 65 74 75 72 6e  is pragma return
e0b0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  s the encoding o
e0c0: 66 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20  f the main.  ** 
e0d0: 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
e0e0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
e0f0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 69 74   initialized, it
e100: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
e110: 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  now..  **.  ** T
e120: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6f  he second form o
e130: 66 20 74 68 69 73 20 70 72 61 67 6d 61 20 69 73  f this pragma is
e140: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
e150: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
e160: 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  le.  ** has not 
e170: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 69  already been ini
e180: 74 69 61 6c 69 7a 65 64 2e 20 49 6e 20 74 68 69  tialized. In thi
e190: 73 20 63 61 73 65 20 69 74 20 73 65 74 73 20 74  s case it sets t
e1a0: 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20  he default.  ** 
e1b0: 65 6e 63 6f 64 69 6e 67 20 74 68 61 74 20 77 69  encoding that wi
e1c0: 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ll be used for t
e1d0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e1e0: 20 66 69 6c 65 20 69 66 20 61 20 6e 65 77 20 66   file if a new f
e1f0: 69 6c 65 0a 20 20 2a 2a 20 69 73 20 63 72 65 61  ile.  ** is crea
e200: 74 65 64 2e 20 49 66 20 61 6e 20 65 78 69 73 74  ted. If an exist
e210: 69 6e 67 20 6d 61 69 6e 20 64 61 74 61 62 61 73  ing main databas
e220: 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
e230: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
e240: 64 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e 63  default text enc
e250: 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 65 78  oding for the ex
e260: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
e270: 69 73 20 75 73 65 64 2e 0a 20 20 2a 2a 20 0a 20  is used..  ** . 
e280: 20 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73   ** In all cases
e290: 20 6e 65 77 20 64 61 74 61 62 61 73 65 73 20 63   new databases c
e2a0: 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
e2b0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 20   ATTACH command 
e2c0: 61 72 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  are.  ** created
e2d0: 20 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65   to use the same
e2e0: 20 64 65 66 61 75 6c 74 20 74 65 78 74 20 65 6e   default text en
e2f0: 63 6f 64 69 6e 67 20 61 73 20 74 68 65 20 6d 61  coding as the ma
e300: 69 6e 20 64 61 74 61 62 61 73 65 2e 20 49 66 0a  in database. If.
e310: 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61    ** the main da
e320: 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 62  tabase has not b
e330: 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
e340: 61 6e 64 2f 6f 72 20 63 72 65 61 74 65 64 20 77  and/or created w
e350: 68 65 6e 20 41 54 54 41 43 48 0a 20 20 2a 2a 20  hen ATTACH.  ** 
e360: 69 73 20 65 78 65 63 75 74 65 64 2c 20 74 68 69  is executed, thi
e370: 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
e380: 20 74 68 65 20 41 54 54 41 43 48 20 6f 70 65 72   the ATTACH oper
e390: 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ation..  **.  **
e3a0: 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 66   In the second f
e3b0: 6f 72 6d 20 74 68 69 73 20 70 72 61 67 6d 61 20  orm this pragma 
e3c0: 73 65 74 73 20 74 68 65 20 74 65 78 74 20 65 6e  sets the text en
e3d0: 63 6f 64 69 6e 67 20 74 6f 20 62 65 20 75 73 65  coding to be use
e3e0: 64 20 69 6e 0a 20 20 2a 2a 20 6e 65 77 20 64 61  d in.  ** new da
e3f0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65  tabase files cre
e400: 61 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  ated using this 
e410: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
e420: 20 49 74 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a   It is only.  **
e430: 20 75 73 65 66 75 6c 20 69 66 20 69 6e 76 6f 6b   useful if invok
e440: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
e450: 66 74 65 72 20 74 68 65 20 6d 61 69 6e 20 64 61  fter the main da
e460: 74 61 62 61 73 65 20 69 0a 20 20 2a 2f 0a 20 20  tabase i.  */.  
e470: 63 61 73 65 20 50 72 61 67 54 79 70 5f 45 4e 43  case PragTyp_ENC
e480: 4f 44 49 4e 47 3a 20 7b 0a 20 20 20 20 73 74 61  ODING: {.    sta
e490: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
e4a0: 20 45 6e 63 4e 61 6d 65 20 7b 0a 20 20 20 20 20   EncName {.     
e4b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
e4c0: 20 20 20 20 75 38 20 65 6e 63 3b 0a 20 20 20 20      u8 enc;.    
e4d0: 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b  } encnames[] = {
e4e0: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 38 22 2c  .      { "UTF8",
e4f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
e500: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
e510: 20 7b 20 22 55 54 46 2d 38 22 2c 20 20 20 20 53   { "UTF-8",    S
e520: 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20 20  QLITE_UTF8      
e530: 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65    },  /* Must be
e540: 20 65 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a 2f 0a   element [1] */.
e550: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 6c        { "UTF-16l
e560: 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  e", SQLITE_UTF16
e570: 4c 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75  LE     },  /* Mu
e580: 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 32  st be element [2
e590: 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54  ] */.      { "UT
e5a0: 46 2d 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f  F-16be", SQLITE_
e5b0: 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c 20 20  UTF16BE     },  
e5c0: 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65  /* Must be eleme
e5d0: 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20 20 20 20 20  nt [3] */.      
e5e0: 7b 20 22 55 54 46 31 36 6c 65 22 2c 20 20 53 51  { "UTF16le",  SQ
e5f0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20  LITE_UTF16LE    
e600: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46   },.      { "UTF
e610: 31 36 62 65 22 2c 20 20 53 51 4c 49 54 45 5f 55  16be",  SQLITE_U
e620: 54 46 31 36 42 45 20 20 20 20 20 7d 2c 0a 20 20  TF16BE     },.  
e630: 20 20 20 20 7b 20 22 55 54 46 2d 31 36 22 2c 20      { "UTF-16", 
e640: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
e650: 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54       }, /* SQLIT
e660: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 2a 2f  E_UTF16NATIVE */
e670: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 22  .      { "UTF16"
e680: 2c 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20  ,    0          
e690: 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51          }, /* SQ
e6a0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
e6b0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 30 2c 20 30   */.      { 0, 0
e6c0: 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 6f   }.    };.    co
e6d0: 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61  nst struct EncNa
e6e0: 6d 65 20 2a 70 45 6e 63 3b 0a 20 20 20 20 69 66  me *pEnc;.    if
e6f0: 28 20 21 7a 52 69 67 68 74 20 29 7b 20 20 20 20  ( !zRight ){    
e700: 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64  /* "PRAGMA encod
e710: 69 6e 67 22 20 2a 2f 0a 20 20 20 20 20 20 69 66  ing" */.      if
e720: 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
e730: 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
e740: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
e750: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63       assert( enc
e760: 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46  names[SQLITE_UTF
e770: 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  8].enc==SQLITE_U
e780: 54 46 38 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TF8 );.      ass
e790: 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51  ert( encnames[SQ
e7a0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 5d 2e 65 6e  LITE_UTF16LE].en
e7b0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
e7c0: 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
e7d0: 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49  t( encnames[SQLI
e7e0: 54 45 5f 55 54 46 31 36 42 45 5d 2e 65 6e 63 3d  TE_UTF16BE].enc=
e7f0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
e800: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  );.      returnS
e810: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 65 6e 63  ingleText(v, enc
e820: 6e 61 6d 65 73 5b 45 4e 43 28 70 50 61 72 73 65  names[ENC(pParse
e830: 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->db)].zName);. 
e840: 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20     }else{       
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f   /* "PRAGMA enco
e870: 64 69 6e 67 20 3d 20 58 58 58 22 20 2a 2f 0a 20  ding = XXX" */. 
e880: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 68 61       /* Only cha
e890: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
e8a0: 20 73 71 6c 69 74 65 2e 65 6e 63 20 69 66 20 74   sqlite.enc if t
e8b0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
e8c0: 6c 65 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  le is not.      
e8d0: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  ** initialized. 
e8e0: 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
e8f0: 62 61 73 65 20 65 78 69 73 74 73 2c 20 74 68 65  base exists, the
e900: 20 6e 65 77 20 73 71 6c 69 74 65 2e 65 6e 63 20   new sqlite.enc 
e910: 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 77  value.      ** w
e920: 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
e930: 65 6e 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  en when the sche
e940: 6d 61 20 69 73 20 6e 65 78 74 20 6c 6f 61 64 65  ma is next loade
e950: 64 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  d. If it does no
e960: 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  t.      ** alrea
e970: 64 79 20 65 78 69 73 74 73 2c 20 69 74 20 77 69  dy exists, it wi
e980: 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f  ll be created to
e990: 20 75 73 65 20 74 68 65 20 6e 65 77 20 65 6e 63   use the new enc
e9a0: 6f 64 69 6e 67 20 76 61 6c 75 65 2e 0a 20 20 20  oding value..   
e9b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
e9c0: 0a 20 20 20 20 20 20 20 20 21 28 44 62 48 61 73  .        !(DbHas
e9d0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20  Property(db, 0, 
e9e0: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
e9f0: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 44 62  ) || .        Db
ea00: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
ea10: 30 2c 20 44 42 5f 45 6d 70 74 79 29 20 0a 20 20  0, DB_Empty) .  
ea20: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66      ){.        f
ea30: 6f 72 28 70 45 6e 63 3d 26 65 6e 63 6e 61 6d 65  or(pEnc=&encname
ea40: 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e 61 6d  s[0]; pEnc->zNam
ea50: 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a 20 20 20 20  e; pEnc++){.    
ea60: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
ea70: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67  ite3StrICmp(zRig
ea80: 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29  ht, pEnc->zName)
ea90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
eaa0: 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 20 3d  SCHEMA_ENC(db) =
eab0: 20 45 4e 43 28 64 62 29 20 3d 0a 20 20 20 20 20   ENC(db) =.     
eac0: 20 20 20 20 20 20 20 20 20 20 20 70 45 6e 63 2d             pEnc-
ead0: 3e 65 6e 63 20 3f 20 70 45 6e 63 2d 3e 65 6e 63  >enc ? pEnc->enc
eae0: 20 3a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   : SQLITE_UTF16N
eaf0: 41 54 49 56 45 3b 0a 20 20 20 20 20 20 20 20 20  ATIVE;.         
eb00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
eb10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
eb20: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 45 6e          if( !pEn
eb30: 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  c->zName ){.    
eb40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
eb50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
eb60: 6e 73 75 70 70 6f 72 74 65 64 20 65 6e 63 6f 64  nsupported encod
eb70: 69 6e 67 3a 20 25 73 22 2c 20 7a 52 69 67 68 74  ing: %s", zRight
eb80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
eb90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
eba0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
ebb0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
ebc0: 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  F16 */..#ifndef 
ebd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45  SQLITE_OMIT_SCHE
ebe0: 4d 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d  MA_VERSION_PRAGM
ebf0: 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  AS.  /*.  **   P
ec00: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73  RAGMA [schema.]s
ec10: 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 0a 20 20  chema_version.  
ec20: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
ec30: 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73  ema.]schema_vers
ec40: 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a  ion = <integer>.
ec50: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    **.  **   PRAG
ec60: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72  MA [schema.]user
ec70: 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20  _version.  **   
ec80: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
ec90: 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d 20 3c  user_version = <
eca0: 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20  integer>.  **.  
ecb0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
ecc0: 65 6d 61 2e 5d 66 72 65 65 6c 69 73 74 5f 63 6f  ema.]freelist_co
ecd0: 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  unt.  **.  **   
ece0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
ecf0: 64 61 74 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a  data_version.  *
ed00: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
ed10: 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61  [schema.]applica
ed20: 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a 20 20 20 50  tion_id.  **   P
ed30: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
ed40: 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 20 3d 20  pplication_id = 
ed50: 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20  <integer>.  **. 
ed60: 20 2a 2a 20 54 68 65 20 70 72 61 67 6d 61 27 73   ** The pragma's
ed70: 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20   schema_version 
ed80: 61 6e 64 20 75 73 65 72 5f 76 65 72 73 69 6f 6e  and user_version
ed90: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 65 74   are used to set
eda0: 20 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74 68 65   or get.  ** the
edb0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63   value of the sc
edc0: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64  hema-version and
edd0: 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c 20 72   user-version, r
ede0: 65 73 70 65 63 74 69 76 65 6c 79 2e 20 42 6f 74  espectively. Bot
edf0: 68 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  h.  ** the schem
ee00: 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 74 68  a-version and th
ee10: 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 61  e user-version a
ee20: 72 65 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64  re 32-bit signed
ee30: 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 73   integers.  ** s
ee40: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
ee50: 61 62 61 73 65 20 68 65 61 64 65 72 2e 0a 20 20  abase header..  
ee60: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63 68 65  **.  ** The sche
ee70: 6d 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75 73 75  ma-cookie is usu
ee80: 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69 70 75  ally only manipu
ee90: 6c 61 74 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79  lated internally
eea0: 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74 0a 20   by SQLite. It. 
eeb0: 20 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65 6e 74   ** is increment
eec0: 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
eed0: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
eee0: 73 65 20 73 63 68 65 6d 61 20 69 73 20 6d 6f 64  se schema is mod
eef0: 69 66 69 65 64 20 28 62 79 0a 20 20 2a 2a 20 63  ified (by.  ** c
ef00: 72 65 61 74 69 6e 67 20 6f 72 20 64 72 6f 70 70  reating or dropp
ef10: 69 6e 67 20 61 20 74 61 62 6c 65 20 6f 72 20 69  ing a table or i
ef20: 6e 64 65 78 29 2e 20 54 68 65 20 73 63 68 65 6d  ndex). The schem
ef30: 61 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65  a version is use
ef40: 64 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69 74 65  d by.  ** SQLite
ef50: 20 65 61 63 68 20 74 69 6d 65 20 61 20 71 75 65   each time a que
ef60: 72 79 20 69 73 20 65 78 65 63 75 74 65 64 20 74  ry is executed t
ef70: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
ef80: 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65  e internal cache
ef90: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 68  .  ** of the sch
efa0: 65 6d 61 20 75 73 65 64 20 77 68 65 6e 20 63 6f  ema used when co
efb0: 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20  mpiling the SQL 
efc0: 71 75 65 72 79 20 6d 61 74 63 68 65 73 20 74 68  query matches th
efd0: 65 20 73 63 68 65 6d 61 20 6f 66 0a 20 20 2a 2a  e schema of.  **
efe0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 67   the database ag
eff0: 61 69 6e 73 74 20 77 68 69 63 68 20 74 68 65 20  ainst which the 
f000: 63 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20 69  compiled query i
f010: 73 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  s actually execu
f020: 74 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76 65 72  ted..  ** Subver
f030: 74 69 6e 67 20 74 68 69 73 20 6d 65 63 68 61 6e  ting this mechan
f040: 69 73 6d 20 62 79 20 75 73 69 6e 67 20 22 50 52  ism by using "PR
f050: 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73  AGMA schema_vers
f060: 69 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79 0a 20  ion" to modify. 
f070: 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76   ** the schema-v
f080: 65 72 73 69 6f 6e 20 69 73 20 70 6f 74 65 6e 74  ersion is potent
f090: 69 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75 73 20  ially dangerous 
f0a0: 61 6e 64 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  and may lead to 
f0b0: 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63 72 61  program.  ** cra
f0c0: 73 68 65 73 20 6f 72 20 64 61 74 61 62 61 73 65  shes or database
f0d0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55 73 65   corruption. Use
f0e0: 20 77 69 74 68 20 63 61 75 74 69 6f 6e 21 0a 20   with caution!. 
f0f0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75 73 65   **.  ** The use
f100: 72 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e 6f 74  r-version is not
f110: 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
f120: 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74 20 6d   by SQLite. It m
f130: 61 79 20 62 65 20 75 73 65 64 20 62 79 0a 20 20  ay be used by.  
f140: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  ** applications 
f150: 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e  for any purpose.
f160: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
f170: 67 54 79 70 5f 48 45 41 44 45 52 5f 56 41 4c 55  gTyp_HEADER_VALU
f180: 45 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  E: {.    int iCo
f190: 6f 6b 69 65 20 3d 20 70 50 72 61 67 6d 61 2d 3e  okie = pPragma->
f1a0: 69 41 72 67 3b 20 20 2f 2a 20 57 68 69 63 68 20  iArg;  /* Which 
f1b0: 63 6f 6f 6b 69 65 20 74 6f 20 72 65 61 64 20 6f  cookie to read o
f1c0: 72 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 73  r write */.    s
f1d0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
f1e0: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
f1f0: 20 69 66 28 20 7a 52 69 67 68 74 20 26 26 20 28   if( zRight && (
f200: 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
f210: 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65 61 64  g & PragFlg_Read
f220: 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Only)==0 ){.    
f230: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73    /* Write the s
f240: 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20  pecified cookie 
f250: 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73  value */.      s
f260: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
f270: 4f 70 4c 69 73 74 20 73 65 74 43 6f 6f 6b 69 65  OpList setCookie
f280: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
f290: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
f2a0: 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20      0,  1,  0}, 
f2b0: 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20     /* 0 */.     
f2c0: 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69     { OP_SetCooki
f2d0: 65 2c 20 20 20 20 20 20 30 2c 20 20 30 2c 20 20  e,      0,  0,  
f2e0: 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20  0},    /* 1 */. 
f2f0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64       };.      Vd
f300: 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20  beOp *aOp;.     
f310: 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
f320: 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72  fyNoMallocRequir
f330: 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  ed(v, ArraySize(
f340: 73 65 74 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20  setCookie));.   
f350: 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33     aOp = sqlite3
f360: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
f370: 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f   ArraySize(setCo
f380: 6f 6b 69 65 29 2c 20 73 65 74 43 6f 6f 6b 69 65  okie), setCookie
f390: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
f3a0: 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f  ONLY_IF_REALLOC_
f3b0: 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20 29  STRESS(aOp==0) )
f3c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f   break;.      aO
f3d0: 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[0].p1 = iDb;. 
f3e0: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d       aOp[1].p1 =
f3f0: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
f400: 31 5d 2e 70 32 20 3d 20 69 43 6f 6f 6b 69 65 3b  1].p2 = iCookie;
f410: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33  .      aOp[1].p3
f420: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
f430: 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65 6c 73  Right);.    }els
f440: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64  e{.      /* Read
f450: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63   the specified c
f460: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
f470: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
f480: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 72 65 61  t VdbeOpList rea
f490: 64 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20  dCookie[] = {.  
f4a0: 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73        { OP_Trans
f4b0: 61 63 74 69 6f 6e 2c 20 20 20 20 20 30 2c 20 20  action,     0,  
f4c0: 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20  0,  0},    /* 0 
f4d0: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
f4e0: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20  ReadCookie,     
f4f0: 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20   0,  1,  0},    
f500: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 1 */.        
f510: 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  { OP_ResultRow, 
f520: 20 20 20 20 20 20 31 2c 20 20 31 2c 20 20 30 7d        1,  1,  0}
f530: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
f540: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20  VdbeOp *aOp;.   
f550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
f560: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
f570: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
f580: 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 29 3b 0a  e(readCookie));.
f590: 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69        aOp = sqli
f5a0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
f5b0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65  (v, ArraySize(re
f5c0: 61 64 43 6f 6f 6b 69 65 29 2c 72 65 61 64 43 6f  adCookie),readCo
f5d0: 6f 6b 69 65 2c 30 29 3b 0a 20 20 20 20 20 20 69  okie,0);.      i
f5e0: 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c  f( ONLY_IF_REALL
f5f0: 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30  OC_STRESS(aOp==0
f600: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
f610: 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62   aOp[0].p1 = iDb
f620: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70  ;.      aOp[1].p
f630: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61  1 = iDb;.      a
f640: 4f 70 5b 31 5d 2e 70 33 20 3d 20 69 43 6f 6f 6b  Op[1].p3 = iCook
f650: 69 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ie;.      sqlite
f660: 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 76 29  3VdbeReusable(v)
f670: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
f680: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  eak;.#endif /* S
f690: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
f6a0: 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41  A_VERSION_PRAGMA
f6b0: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
f6c0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
f6d0: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20  EOPTION_DIAGS.  
f6e0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
f6f0: 20 63 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f 6e 73   compile_options
f700: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
f710: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  n the names of a
f720: 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ll compile-time 
f730: 6f 70 74 69 6f 6e 73 20 75 73 65 64 20 69 6e 20  options used in 
f740: 74 68 69 73 20 62 75 69 6c 64 2c 0a 20 20 2a 2a  this build,.  **
f750: 20 6f 6e 65 20 6f 70 74 69 6f 6e 20 70 65 72 20   one option per 
f760: 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  row..  */.  case
f770: 20 50 72 61 67 54 79 70 5f 43 4f 4d 50 49 4c 45   PragTyp_COMPILE
f780: 5f 4f 50 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  _OPTIONS: {.    
f790: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 63  int i = 0;.    c
f7a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b  onst char *zOpt;
f7b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
f7c0: 6d 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65  m = 1;.    while
f7d0: 28 20 28 7a 4f 70 74 20 3d 20 73 71 6c 69 74 65  ( (zOpt = sqlite
f7e0: 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
f7f0: 67 65 74 28 69 2b 2b 29 29 21 3d 30 20 29 7b 0a  get(i++))!=0 ){.
f800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f810: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 31  eLoadString(v, 1
f820: 2c 20 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 73  , zOpt);.      s
f830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f840: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
f850: 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
f860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
f870: 75 73 61 62 6c 65 28 76 29 3b 0a 20 20 7d 0a 20  usable(v);.  }. 
f880: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
f890: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
f8a0: 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
f8b0: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
f8c0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
f8d0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
f8e0: 20 5b 73 63 68 65 6d 61 2e 5d 77 61 6c 5f 63 68   [schema.]wal_ch
f8f0: 65 63 6b 70 6f 69 6e 74 20 3d 20 70 61 73 73 69  eckpoint = passi
f900: 76 65 7c 66 75 6c 6c 7c 72 65 73 74 61 72 74 7c  ve|full|restart|
f910: 74 72 75 6e 63 61 74 65 0a 20 20 2a 2a 0a 20 20  truncate.  **.  
f920: 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 74 68  ** Checkpoint th
f930: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
f940: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
f950: 57 41 4c 5f 43 48 45 43 4b 50 4f 49 4e 54 3a 20  WAL_CHECKPOINT: 
f960: 7b 0a 20 20 20 20 69 6e 74 20 69 42 74 20 3d 20  {.    int iBt = 
f970: 28 70 49 64 32 2d 3e 7a 3f 69 44 62 3a 53 51 4c  (pId2->z?iDb:SQL
f980: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
f990: 29 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65  );.    int eMode
f9a0: 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50   = SQLITE_CHECKP
f9b0: 4f 49 4e 54 5f 50 41 53 53 49 56 45 3b 0a 20 20  OINT_PASSIVE;.  
f9c0: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
f9d0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
f9e0: 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c  3StrICmp(zRight,
f9f0: 20 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20   "full")==0 ){. 
fa00: 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53         eMode = S
fa10: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
fa20: 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  _FULL;.      }el
fa30: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
fa40: 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 72  rICmp(zRight, "r
fa50: 65 73 74 61 72 74 22 29 3d 3d 30 20 29 7b 0a 20  estart")==0 ){. 
fa60: 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53         eMode = S
fa70: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
fa80: 5f 52 45 53 54 41 52 54 3b 0a 20 20 20 20 20 20  _RESTART;.      
fa90: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
faa0: 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c  3StrICmp(zRight,
fab0: 20 22 74 72 75 6e 63 61 74 65 22 29 3d 3d 30 20   "truncate")==0 
fac0: 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
fad0: 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50   = SQLITE_CHECKP
fae0: 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3b 0a 20  OINT_TRUNCATE;. 
faf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
fb00: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
fb10: 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  3;.    sqlite3Vd
fb20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
fb30: 68 65 63 6b 70 6f 69 6e 74 2c 20 69 42 74 2c 20  heckpoint, iBt, 
fb40: 65 4d 6f 64 65 2c 20 31 29 3b 0a 20 20 20 20 73  eMode, 1);.    s
fb50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fb60: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
fb70: 2c 20 31 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 62  , 1, 3);.  }.  b
fb80: 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  reak;..  /*.  **
fb90: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75     PRAGMA wal_au
fba0: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 2a  tocheckpoint.  *
fbb0: 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61  *   PRAGMA wal_a
fbc0: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20  utocheckpoint = 
fbd0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66  N.  **.  ** Conf
fbe0: 69 67 75 72 65 20 61 20 64 61 74 61 62 61 73 65  igure a database
fbf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
fc00: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65  utomatically che
fc10: 63 6b 70 6f 69 6e 74 20 61 20 64 61 74 61 62 61  ckpoint a databa
fc20: 73 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 63  se.  ** after ac
fc30: 63 75 6d 75 6c 61 74 69 6e 67 20 4e 20 66 72 61  cumulating N fra
fc40: 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 2e 20  mes in the log. 
fc50: 4f 72 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  Or query for the
fc60: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 0a 20   current value. 
fc70: 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20 2a 2f 0a 20   ** of N..  */. 
fc80: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 57 41   case PragTyp_WA
fc90: 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54  L_AUTOCHECKPOINT
fca0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
fcb0: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
fcc0: 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
fcd0: 6b 70 6f 69 6e 74 28 64 62 2c 20 73 71 6c 69 74  kpoint(db, sqlit
fce0: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b  e3Atoi(zRight));
fcf0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
fd00: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 0a 20  nSingleInt(v, . 
fd10: 20 20 20 20 20 20 64 62 2d 3e 78 57 61 6c 43 61        db->xWalCa
fd20: 6c 6c 62 61 63 6b 3d 3d 73 71 6c 69 74 65 33 57  llback==sqlite3W
fd30: 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 20 3f 20  alDefaultHook ? 
fd40: 0a 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  .           SQLI
fd50: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 64 62  TE_PTR_TO_INT(db
fd60: 2d 3e 70 57 61 6c 41 72 67 29 20 3a 20 30 29 3b  ->pWalArg) : 0);
fd70: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
fd80: 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
fd90: 20 50 52 41 47 4d 41 20 73 68 72 69 6e 6b 5f 6d   PRAGMA shrink_m
fda0: 65 6d 6f 72 79 0a 20 20 2a 2a 0a 20 20 2a 2a 20  emory.  **.  ** 
fdb0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
fdc0: 46 3a 20 52 2d 32 33 34 34 35 2d 34 36 31 30 39  F: R-23445-46109
fdd0: 20 54 68 69 73 20 70 72 61 67 6d 61 20 63 61 75   This pragma cau
fde0: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
fdf0: 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  .  ** connection
fe00: 20 6f 6e 20 77 68 69 63 68 20 69 74 20 69 73 20   on which it is 
fe10: 69 6e 76 6f 6b 65 64 20 74 6f 20 66 72 65 65 20  invoked to free 
fe20: 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  up as much memor
fe30: 79 20 61 73 20 69 74 0a 20 20 2a 2a 20 63 61 6e  y as it.  ** can
fe40: 2c 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  , by calling sql
fe50: 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
fe60: 6d 65 6d 6f 72 79 28 29 2e 0a 20 20 2a 2f 0a 20  memory()..  */. 
fe70: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 48   case PragTyp_SH
fe80: 52 49 4e 4b 5f 4d 45 4d 4f 52 59 3a 20 7b 0a 20  RINK_MEMORY: {. 
fe90: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65     sqlite3_db_re
fea0: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29  lease_memory(db)
feb0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
fec0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
fed0: 47 4d 41 20 6f 70 74 69 6d 69 7a 65 0a 20 20 2a  GMA optimize.  *
fee0: 2a 20 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69  *  PRAGMA optimi
fef0: 7a 65 28 4d 41 53 4b 29 0a 20 20 2a 2a 20 20 50  ze(MASK).  **  P
ff00: 52 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f 70 74  RAGMA schema.opt
ff10: 69 6d 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  imize.  **  PRAG
ff20: 4d 41 20 73 63 68 65 6d 61 2e 6f 70 74 69 6d 69  MA schema.optimi
ff30: 7a 65 28 4d 41 53 4b 29 0a 20 20 2a 2a 0a 20 20  ze(MASK).  **.  
ff40: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
ff50: 74 69 6d 69 7a 65 20 74 68 65 20 64 61 74 61 62  timize the datab
ff60: 61 73 65 2e 20 20 41 6c 6c 20 73 63 68 65 6d 61  ase.  All schema
ff70: 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20  s are optimized 
ff80: 69 6e 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  in the first.  *
ff90: 2a 20 74 77 6f 20 66 6f 72 6d 73 2c 20 61 6e 64  * two forms, and
ffa0: 20 6f 6e 6c 79 20 74 68 65 20 73 70 65 63 69 66   only the specif
ffb0: 69 65 64 20 73 63 68 65 6d 61 20 69 73 20 6f 70  ied schema is op
ffc0: 74 69 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 6c  timized in the l
ffd0: 61 74 74 65 72 20 74 77 6f 2e 0a 20 20 2a 2a 0a  atter two..  **.
ffe0: 20 20 2a 2a 20 54 68 65 20 64 65 74 61 69 6c 73    ** The details
fff0: 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   of optimization
10000 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
10010 68 69 73 20 70 72 61 67 6d 61 20 61 72 65 20 65  his pragma are e
10020 78 70 65 63 74 65 64 0a 20 20 2a 2a 20 74 6f 20  xpected.  ** to 
10030 63 68 61 6e 67 65 20 61 6e 64 20 69 6d 70 72 6f  change and impro
10040 76 65 20 6f 76 65 72 20 74 69 6d 65 2e 20 20 41  ve over time.  A
10050 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75  pplications shou
10060 6c 64 20 61 6e 74 69 63 69 70 61 74 65 20 74 68  ld anticipate th
10070 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 70 72 61  at.  ** this pra
10080 67 6d 61 20 77 69 6c 6c 20 70 65 72 66 6f 72 6d  gma will perform
10090 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f   new optimizatio
100a0 6e 73 20 69 6e 20 66 75 74 75 72 65 20 72 65 6c  ns in future rel
100b0 65 61 73 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eases..  **.  **
100c0 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 20 61 72   The optional ar
100d0 67 75 6d 65 6e 74 20 69 73 20 61 20 62 69 74 6d  gument is a bitm
100e0 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74  ask of optimizat
100f0 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d 3a  ions to perform:
10100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78  .  **.  **    0x
10110 30 30 30 31 20 20 20 20 44 65 62 75 67 67 69 6e  0001    Debuggin
10120 67 20 6d 6f 64 65 2e 20 20 44 6f 20 6e 6f 74 20  g mode.  Do not 
10130 61 63 74 75 61 6c 6c 79 20 70 65 72 66 6f 72 6d  actually perform
10140 20 61 6e 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f   any optimizatio
10150 6e 73 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  ns.  **         
10160 20 20 20 20 20 62 75 74 20 69 6e 73 74 65 61 64       but instead
10170 20 72 65 74 75 72 6e 20 6f 6e 65 20 6c 69 6e 65   return one line
10180 20 6f 66 20 74 65 78 74 20 66 6f 72 20 65 61 63   of text for eac
10190 68 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  h optimization. 
101a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
101b0 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65   that would have
101c0 20 62 65 65 6e 20 64 6f 6e 65 2e 20 20 4f 66 66   been done.  Off
101d0 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a   by default..  *
101e0 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 32  *.  **    0x0002
101f0 20 20 20 20 52 75 6e 20 41 4e 41 4c 59 5a 45 20      Run ANALYZE 
10200 6f 6e 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  on tables that m
10210 69 67 68 74 20 62 65 6e 65 66 69 74 2e 20 20 4f  ight benefit.  O
10220 6e 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 20 20  n by default..  
10230 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10240 53 65 65 20 62 65 6c 6f 77 20 66 6f 72 20 61 64  See below for ad
10250 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
10260 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion..  **.  ** 
10270 20 20 20 30 78 30 30 30 34 20 20 20 20 28 4e 6f     0x0004    (No
10280 74 20 79 65 74 20 69 6d 70 6c 65 6d 65 6e 74 65  t yet implemente
10290 64 29 20 52 65 63 6f 72 64 20 75 73 61 67 65 20  d) Record usage 
102a0 61 6e 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  and performance 
102b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
102c0 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66     information f
102d0 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
102e0 73 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20  session in the. 
102f0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
10300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
10310 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
10320 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 22  e available to "
10330 6f 70 74 69 6d 69 7a 65 22 0a 20 20 2a 2a 20 20  optimize".  **  
10340 20 20 20 20 20 20 20 20 20 20 20 20 70 72 61 67              prag
10350 6d 61 73 20 72 75 6e 20 62 79 20 66 75 74 75 72  mas run by futur
10360 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
10370 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ctions..  **.  *
10380 2a 20 20 20 20 30 78 30 30 30 38 20 20 20 20 28  *    0x0008    (
10390 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d 65 6e  Not yet implemen
103a0 74 65 64 29 20 43 72 65 61 74 65 20 69 6e 64 65  ted) Create inde
103b0 78 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 68  xes that might h
103c0 61 76 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ave.  **        
103d0 20 20 20 20 20 20 62 65 65 6e 20 68 65 6c 70 66        been helpf
103e0 75 6c 20 74 6f 20 72 65 63 65 6e 74 20 71 75 65  ul to recent que
103f0 72 69 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ries.  **.  ** T
10400 68 65 20 64 65 66 61 75 6c 74 20 4d 41 53 4b 20  he default MASK 
10410 69 73 20 61 6e 64 20 61 6c 77 61 79 73 20 73 68  is and always sh
10420 61 6c 6c 20 62 65 20 30 78 66 66 66 65 2e 20 20  all be 0xfffe.  
10430 30 78 66 66 66 65 20 6d 65 61 6e 73 20 70 65 72  0xfffe means per
10440 66 6f 72 6d 20 61 6c 6c 20 20 20 20 2a 2a 20 6f  form all    ** o
10450 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
10460 6f 6e 73 20 6c 69 73 74 65 64 20 61 62 6f 76 65  ons listed above
10470 20 65 78 63 65 70 74 20 44 65 62 75 67 20 4d 6f   except Debug Mo
10480 64 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6e 65  de, including ne
10490 77 0a 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  w.  ** optimizat
104a0 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 6e  ions that have n
104b0 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e 76 65  ot yet been inve
104c0 6e 74 65 64 2e 20 20 49 66 20 6e 65 77 20 6f 70  nted.  If new op
104d0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61 72 65 0a  timizations are.
104e0 20 20 2a 2a 20 65 76 65 72 20 61 64 64 65 64 20    ** ever added 
104f0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6f  that should be o
10500 66 66 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74  ff by default, t
10510 68 6f 73 65 20 6f 66 66 2d 62 79 2d 64 65 66 61  hose off-by-defa
10520 75 6c 74 20 0a 20 20 2a 2a 20 6f 70 74 69 6d 69  ult .  ** optimi
10530 7a 61 74 69 6f 6e 73 20 77 69 6c 6c 20 68 61 76  zations will hav
10540 65 20 62 69 74 6d 61 73 6b 73 20 6f 66 20 30 78  e bitmasks of 0x
10550 31 30 30 30 30 20 6f 72 20 6c 61 72 67 65 72 2e  10000 or larger.
10560 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 45 54 45 52  .  **.  ** DETER
10570 4d 49 4e 41 54 49 4f 4e 20 4f 46 20 57 48 45 4e  MINATION OF WHEN
10580 20 54 4f 20 52 55 4e 20 41 4e 41 4c 59 5a 45 0a   TO RUN ANALYZE.
10590 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65    **.  ** In the
105a0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
105b0 6e 74 61 74 69 6f 6e 2c 20 61 20 74 61 62 6c 65  ntation, a table
105c0 20 69 73 20 61 6e 61 6c 79 7a 65 64 20 69 66 20   is analyzed if 
105d0 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 6f 66 0a 20  only if all of. 
105e0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
105f0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  g are true:.  **
10600 0a 20 20 2a 2a 20 28 31 29 20 4d 41 53 4b 20 62  .  ** (1) MASK b
10610 69 74 20 30 78 30 32 20 69 73 20 73 65 74 2e 0a  it 0x02 is set..
10620 20 20 2a 2a 0a 20 20 2a 2a 20 28 32 29 20 54 68    **.  ** (2) Th
10630 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
10640 75 73 65 64 20 73 71 6c 69 74 65 5f 73 74 61 74  used sqlite_stat
10650 31 2d 73 74 79 6c 65 20 73 74 61 74 69 73 74 69  1-style statisti
10660 63 73 20 66 6f 72 20 6f 6e 65 20 6f 72 0a 20 20  cs for one or.  
10670 2a 2a 20 20 20 20 20 6d 6f 72 65 20 69 6e 64 65  **     more inde
10680 78 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  xes of the table
10690 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 64   at some point d
106a0 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69  uring the lifeti
106b0 6d 65 20 6f 66 0a 20 20 2a 2a 20 20 20 20 20 74  me of.  **     t
106c0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65  he current conne
106d0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ction..  **.  **
106e0 20 28 33 29 20 4f 6e 65 20 6f 72 20 6d 6f 72 65   (3) One or more
106f0 20 69 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20   indexes of the 
10700 74 61 62 6c 65 20 61 72 65 20 63 75 72 72 65 6e  table are curren
10710 74 6c 79 20 75 6e 61 6e 61 6c 79 7a 65 64 20 4f  tly unanalyzed O
10720 52 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20 6e  R.  **     the n
10730 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
10740 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 69   the table has i
10750 6e 63 72 65 61 73 65 64 20 62 79 20 32 35 20 74  ncreased by 25 t
10760 69 6d 65 73 20 6f 72 20 6d 6f 72 65 0a 20 20 2a  imes or more.  *
10770 2a 20 20 20 20 20 73 69 6e 63 65 20 74 68 65 20  *     since the 
10780 6c 61 73 74 20 74 69 6d 65 20 41 4e 41 4c 59 5a  last time ANALYZ
10790 45 20 77 61 73 20 72 75 6e 2e 0a 20 20 2a 2a 0a  E was run..  **.
107a0 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 73 20 66    ** The rules f
107b0 6f 72 20 77 68 65 6e 20 74 61 62 6c 65 73 20 61  or when tables a
107c0 72 65 20 61 6e 61 6c 79 7a 65 64 20 61 72 65 20  re analyzed are 
107d0 6c 69 6b 65 6c 79 20 74 6f 20 63 68 61 6e 67 65  likely to change
107e0 20 69 6e 0a 20 20 2a 2a 20 66 75 74 75 72 65 20   in.  ** future 
107f0 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2f 0a 20  releases..  */. 
10800 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4f 50   case PragTyp_OP
10810 54 49 4d 49 5a 45 3a 20 7b 0a 20 20 20 20 69 6e  TIMIZE: {.    in
10820 74 20 69 44 62 4c 61 73 74 3b 20 20 20 20 20 20  t iDbLast;      
10830 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 65 72       /* Loop ter
10840 6d 69 6e 61 74 69 6f 6e 20 70 6f 69 6e 74 20 66  mination point f
10850 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 6c 6f  or the schema lo
10860 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54  op */.    int iT
10870 61 62 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  abCur;          
10880 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 61   /* Cursor for a
10890 20 74 61 62 6c 65 20 77 68 6f 73 65 20 73 69 7a   table whose siz
108a0 65 20 6e 65 65 64 73 20 63 68 65 63 6b 69 6e 67  e needs checking
108b0 20 2a 2f 0a 20 20 20 20 48 61 73 68 45 6c 65 6d   */.    HashElem
108c0 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f   *k;           /
108d0 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 61 62 6c  * Loop over tabl
108e0 65 73 20 6f 66 20 61 20 73 63 68 65 6d 61 20 2a  es of a schema *
108f0 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  /.    Schema *pS
10900 63 68 65 6d 61 3b 20 20 20 20 20 20 20 2f 2a 20  chema;       /* 
10910 54 68 65 20 63 75 72 72 65 6e 74 20 73 63 68 65  The current sche
10920 6d 61 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  ma */.    Table 
10930 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
10940 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
10950 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  he schema */.   
10960 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
10970 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
10980 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
10990 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 73   */.    LogEst s
109a0 7a 54 68 72 65 73 68 6f 6c 64 3b 20 20 20 20 2f  zThreshold;    /
109b0 2a 20 53 69 7a 65 20 74 68 72 65 73 68 6f 6c 64  * Size threshold
109c0 20 61 62 6f 76 65 20 77 68 69 63 68 20 72 65 61   above which rea
109d0 6e 61 6c 79 73 69 73 20 69 73 20 6e 65 65 64 64  nalysis is needd
109e0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
109f0 75 62 53 71 6c 3b 20 20 20 20 20 20 20 20 20 2f  ubSql;         /
10a00 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
10a10 66 6f 72 20 74 68 65 20 4f 50 5f 53 71 6c 45 78  for the OP_SqlEx
10a20 65 63 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  ec opcode */.   
10a30 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20 20 20   u32 opMask;    
10a40 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
10a50 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
10a60 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 0a 20 20 20   perform */..   
10a70 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
10a80 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 28 75       opMask = (u
10a90 33 32 29 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  32)sqlite3Atoi(z
10aa0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
10ab0 28 20 28 6f 70 4d 61 73 6b 20 26 20 30 78 30 32  ( (opMask & 0x02
10ac0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
10ad0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f    }else{.      o
10ae0 70 4d 61 73 6b 20 3d 20 30 78 66 66 66 65 3b 0a  pMask = 0xfffe;.
10af0 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62 43 75      }.    iTabCu
10b00 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
10b10 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 69 44 62 4c  ++;.    for(iDbL
10b20 61 73 74 20 3d 20 7a 44 62 3f 69 44 62 3a 64 62  ast = zDb?iDb:db
10b30 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3c 3d 69 44  ->nDb-1; iDb<=iD
10b40 62 4c 61 73 74 3b 20 69 44 62 2b 2b 29 7b 0a 20  bLast; iDb++){. 
10b50 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20       if( iDb==1 
10b60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
10b70 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
10b80 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
10b90 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 70 53  , iDb);.      pS
10ba0 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
10bb0 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
10bc0 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
10bd0 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
10be0 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b  ma->tblHash); k;
10bf0 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
10c00 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 20 20 70  t(k)){.        p
10c10 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
10c20 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
10c30 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
10c40 74 61 62 6c 65 20 70 54 61 62 20 68 61 73 20 6e  table pTab has n
10c50 6f 74 20 62 65 65 6e 20 75 73 65 64 20 69 6e 20  ot been used in 
10c60 61 20 77 61 79 20 74 68 61 74 20 77 6f 75 6c 64  a way that would
10c70 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 0a 20 20   benefit from.  
10c80 20 20 20 20 20 20 2a 2a 20 68 61 76 69 6e 67 20        ** having 
10c90 61 6e 61 6c 79 73 69 73 20 73 74 61 74 69 73 74  analysis statist
10ca0 69 63 73 20 64 75 72 69 6e 67 20 74 68 65 20 63  ics during the c
10cb0 75 72 72 65 6e 74 20 73 65 73 73 69 6f 6e 2c 20  urrent session, 
10cc0 74 68 65 6e 20 73 6b 69 70 20 69 74 2e 0a 20 20  then skip it..  
10cd0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c        ** This al
10ce0 73 6f 20 68 61 73 20 74 68 65 20 65 66 66 65 63  so has the effec
10cf0 74 20 6f 66 20 73 6b 69 70 70 69 6e 67 20 76 69  t of skipping vi
10d00 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61 6e 64  rtual tables and
10d10 20 76 69 65 77 73 20 2a 2f 0a 20 20 20 20 20 20   views */.      
10d20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
10d30 46 6c 61 67 73 20 26 20 54 46 5f 53 74 61 74 73  Flags & TF_Stats
10d40 55 73 65 64 29 3d 3d 30 20 29 20 63 6f 6e 74 69  Used)==0 ) conti
10d50 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  nue;..        /*
10d60 20 52 65 61 6e 61 6c 79 7a 65 20 69 66 20 74 68   Reanalyze if th
10d70 65 20 74 61 62 6c 65 20 69 73 20 32 35 20 74 69  e table is 25 ti
10d80 6d 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  mes larger than 
10d90 74 68 65 20 6c 61 73 74 20 61 6e 61 6c 79 73 69  the last analysi
10da0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 7a 54  s */.        szT
10db0 68 72 65 73 68 6f 6c 64 20 3d 20 70 54 61 62 2d  hreshold = pTab-
10dc0 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 2b 20 34 36  >nRowLogEst + 46
10dd0 3b 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65  ; assert( sqlite
10de0 33 4c 6f 67 45 73 74 28 32 35 29 3d 3d 34 36 20  3LogEst(25)==46 
10df0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
10e00 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
10e10 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
10e20 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
10e30 20 20 20 20 20 69 66 28 20 21 70 49 64 78 2d 3e       if( !pIdx->
10e40 68 61 73 53 74 61 74 31 20 29 7b 0a 20 20 20 20  hasStat1 ){.    
10e50 20 20 20 20 20 20 20 20 73 7a 54 68 72 65 73 68          szThresh
10e60 6f 6c 64 20 3d 20 30 3b 20 2f 2a 20 41 6c 77 61  old = 0; /* Alwa
10e70 79 73 20 61 6e 61 6c 79 7a 65 20 69 66 20 61 6e  ys analyze if an
10e80 79 20 69 6e 64 65 78 20 6c 61 63 6b 73 20 73 74  y index lacks st
10e90 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  atistics */.    
10ea0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10eb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10ed0 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 29 7b 0a   szThreshold ){.
10ee0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10ef0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
10f00 65 2c 20 69 54 61 62 43 75 72 2c 20 69 44 62 2c  e, iTabCur, iDb,
10f10 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
10f20 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ad);.          s
10f30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10f40 28 76 2c 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72  (v, OP_IfSmaller
10f50 2c 20 69 54 61 62 43 75 72 2c 20 0a 20 20 20 20  , iTabCur, .    
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10f80 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
10f90 2b 28 6f 70 4d 61 73 6b 26 31 29 2c 20 73 7a 54  +(opMask&1), szT
10fa0 68 72 65 73 68 6f 6c 64 29 3b 0a 20 20 20 20 20  hreshold);.     
10fb0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
10fc0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  e(v);.        }.
10fd0 20 20 20 20 20 20 20 20 7a 53 75 62 53 71 6c 20          zSubSql 
10fe0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10ff0 28 64 62 2c 20 22 41 4e 41 4c 59 5a 45 20 5c 22  (db, "ANALYZE \"
11000 25 77 5c 22 2e 5c 22 25 77 5c 22 22 2c 0a 20 20  %w\".\"%w\"",.  
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
11030 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
11040 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
11050 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
11060 6f 70 4d 61 73 6b 20 26 20 30 78 30 31 20 29 7b  opMask & 0x01 ){
11070 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
11080 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
11090 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
110a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
110b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
110c0 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 31 2c  _String8, 0, r1,
110d0 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50 34 5f   0, zSubSql, P4_
110e0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
110f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11100 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
11110 6c 74 52 6f 77 2c 20 72 31 2c 20 31 29 3b 0a 20  ltRow, r1, 1);. 
11120 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11140 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
11150 53 71 6c 45 78 65 63 2c 20 30 2c 20 30 2c 20 30  SqlExec, 0, 0, 0
11160 2c 20 7a 53 75 62 53 71 6c 2c 20 50 34 5f 44 59  , zSubSql, P4_DY
11170 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
11180 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
111a0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70 69  ddOp0(v, OP_Expi
111b0 72 65 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  re);.    break;.
111c0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
111d0 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d   PRAGMA busy_tim
111e0 65 6f 75 74 0a 20 20 2a 2a 20 20 20 50 52 41 47  eout.  **   PRAG
111f0 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 20  MA busy_timeout 
11200 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 61  = N.  **.  ** Ca
11210 6c 6c 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  ll sqlite3_busy_
11220 74 69 6d 65 6f 75 74 28 64 62 2c 20 4e 29 2e 20  timeout(db, N). 
11230 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
11240 65 6e 74 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  ent timeout valu
11250 65 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 69 73  e.  ** if one is
11260 20 73 65 74 2e 20 20 49 66 20 6e 6f 20 62 75 73   set.  If no bus
11270 79 20 68 61 6e 64 6c 65 72 20 6f 72 20 61 20 64  y handler or a d
11280 69 66 66 65 72 65 6e 74 20 62 75 73 79 20 68 61  ifferent busy ha
11290 6e 64 6c 65 72 20 69 73 20 73 65 74 0a 20 20 2a  ndler is set.  *
112a0 2a 20 74 68 65 6e 20 30 20 69 73 20 72 65 74 75  * then 0 is retu
112b0 72 6e 65 64 2e 20 20 53 65 74 74 69 6e 67 20 74  rned.  Setting t
112c0 68 65 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 20  he busy_timeout 
112d0 74 6f 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  to 0 or negative
112e0 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 73 20 74  .  ** disables t
112f0 68 65 20 74 69 6d 65 6f 75 74 2e 0a 20 20 2a 2f  he timeout..  */
11300 0a 20 20 2f 2a 63 61 73 65 20 50 72 61 67 54 79  .  /*case PragTy
11310 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54 2a 2f  p_BUSY_TIMEOUT*/
11320 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
11330 61 73 73 65 72 74 28 20 70 50 72 61 67 6d 61 2d  assert( pPragma-
11340 3e 65 50 72 61 67 54 79 70 3d 3d 50 72 61 67 54  >ePragTyp==PragT
11350 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f 55 54 20  yp_BUSY_TIMEOUT 
11360 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
11370 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
11380 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
11390 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28  db, sqlite3Atoi(
113a0 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a  zRight));.    }.
113b0 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
113c0 49 6e 74 28 76 2c 20 64 62 2d 3e 62 75 73 79 54  Int(v, db->busyT
113d0 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20 62 72 65  imeout);.    bre
113e0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
113f0 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66 74  **   PRAGMA soft
11400 5f 68 65 61 70 5f 6c 69 6d 69 74 0a 20 20 2a 2a  _heap_limit.  **
11410 20 20 20 50 52 41 47 4d 41 20 73 6f 66 74 5f 68     PRAGMA soft_h
11420 65 61 70 5f 6c 69 6d 69 74 20 3d 20 4e 0a 20 20  eap_limit = N.  
11430 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
11440 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 36 33  TATION-OF: R-263
11450 34 33 2d 34 35 39 33 30 20 54 68 69 73 20 70 72  43-45930 This pr
11460 61 67 6d 61 20 69 6e 76 6f 6b 65 73 20 74 68 65  agma invokes the
11470 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f  .  ** sqlite3_so
11480 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
11490 29 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  ) interface with
114a0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 4e 2c   the argument N,
114b0 20 69 66 20 4e 20 69 73 0a 20 20 2a 2a 20 73 70   if N is.  ** sp
114c0 65 63 69 66 69 65 64 20 61 6e 64 20 69 73 20 61  ecified and is a
114d0 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
114e0 74 65 67 65 72 2e 0a 20 20 2a 2a 20 49 4d 50 4c  teger..  ** IMPL
114f0 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
11500 2d 36 34 34 35 31 2d 30 37 31 36 33 20 54 68 65  -64451-07163 The
11510 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74   soft_heap_limit
11520 20 70 72 61 67 6d 61 20 61 6c 77 61 79 73 0a 20   pragma always. 
11530 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20   ** returns the 
11540 73 61 6d 65 20 69 6e 74 65 67 65 72 20 74 68 61  same integer tha
11550 74 20 77 6f 75 6c 64 20 62 65 20 72 65 74 75 72  t would be retur
11560 6e 65 64 20 62 79 20 74 68 65 0a 20 20 2a 2a 20  ned by the.  ** 
11570 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
11580 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29 20 43 2d  p_limit64(-1) C-
11590 6c 61 6e 67 75 61 67 65 20 66 75 6e 63 74 69 6f  language functio
115a0 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  n..  */.  case P
115b0 72 61 67 54 79 70 5f 53 4f 46 54 5f 48 45 41 50  ragTyp_SOFT_HEAP
115c0 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 73 71  _LIMIT: {.    sq
115d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20  lite3_int64 N;. 
115e0 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 26 26     if( zRight &&
115f0 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
11600 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e  ToI64(zRight, &N
11610 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
11620 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f        sqlite3_so
11630 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
11640 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  N);.    }.    re
11650 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
11660 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
11670 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29 29 3b  ap_limit64(-1));
11680 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11690 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
116a0 47 4d 41 20 74 68 72 65 61 64 73 0a 20 20 2a 2a  GMA threads.  **
116b0 20 20 20 50 52 41 47 4d 41 20 74 68 72 65 61 64     PRAGMA thread
116c0 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s = N.  **.  ** 
116d0 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 6d 61  Configure the ma
116e0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
116f0 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 2e 20  worker threads. 
11700 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 0a   Return the new.
11710 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 2c 20 77 68    ** maximum, wh
11720 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 73  ich might be les
11730 73 20 74 68 61 6e 20 72 65 71 75 65 73 74 65 64  s than requested
11740 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
11750 61 67 54 79 70 5f 54 48 52 45 41 44 53 3a 20 7b  agTyp_THREADS: {
11760 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
11770 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52  64 N;.    if( zR
11780 69 67 68 74 0a 20 20 20 20 20 26 26 20 73 71 6c  ight.     && sql
11790 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
117a0 34 28 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53  4(zRight, &N)==S
117b0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26  QLITE_OK.     &&
117c0 20 4e 3e 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20   N>=0.    ){.   
117d0 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
117e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49  (db, SQLITE_LIMI
117f0 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
11800 2c 20 28 69 6e 74 29 28 4e 26 30 78 37 66 66 66  , (int)(N&0x7fff
11810 66 66 66 66 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ffff));.    }.  
11820 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
11830 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 6c 69 6d  t(v, sqlite3_lim
11840 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4c 49  it(db, SQLITE_LI
11850 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
11860 44 53 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62 72  DS, -1));.    br
11870 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65  eak;.  }..#if de
11880 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
11890 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
118a0 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 2f 2a  QLITE_TEST).  /*
118b0 0a 20 20 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  .  ** Report the
118c0 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
118d0 66 20 66 69 6c 65 20 6c 6f 67 73 20 66 6f 72 20  f file logs for 
118e0 61 6c 6c 20 64 61 74 61 62 61 73 65 73 0a 20 20  all databases.  
118f0 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
11900 70 5f 4c 4f 43 4b 5f 53 54 41 54 55 53 3a 20 7b  p_LOCK_STATUS: {
11910 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
11920 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a  t char *const az
11930 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20  LockName[] = {. 
11940 20 20 20 20 20 22 75 6e 6c 6f 63 6b 65 64 22 2c       "unlocked",
11950 20 22 73 68 61 72 65 64 22 2c 20 22 72 65 73 65   "shared", "rese
11960 72 76 65 64 22 2c 20 22 70 65 6e 64 69 6e 67 22  rved", "pending"
11970 2c 20 22 65 78 63 6c 75 73 69 76 65 22 0a 20 20  , "exclusive".  
11980 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    };.    int i;.
11990 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
119a0 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 2;.    for(i=
119b0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
119c0 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
119d0 2a 70 42 74 3b 0a 20 20 20 20 20 20 63 6f 6e 73  *pBt;.      cons
119e0 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65 20 3d  t char *zState =
119f0 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20   "unknown";.    
11a00 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
11a10 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44  f( db->aDb[i].zD
11a20 62 53 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74  bSName==0 ) cont
11a30 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 42 74 20  inue;.      pBt 
11a40 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
11a50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 3d  ;.      if( pBt=
11a60 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
11a70 65 65 50 61 67 65 72 28 70 42 74 29 3d 3d 30 20  eePager(pBt)==0 
11a80 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 74 61 74  ){.        zStat
11a90 65 20 3d 20 22 63 6c 6f 73 65 64 22 3b 0a 20 20  e = "closed";.  
11aa0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
11ab0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
11ac0 6f 6c 28 64 62 2c 20 69 20 3f 20 64 62 2d 3e 61  ol(db, i ? db->a
11ad0 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a  Db[i].zDbSName :
11ae0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11b10 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
11b20 2c 20 26 6a 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &j)==SQLITE_OK
11b30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 7a 53 74   ){.         zSt
11b40 61 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e 61 6d 65  ate = azLockName
11b50 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [j];.      }.   
11b60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
11b70 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
11b80 73 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  s", db->aDb[i].z
11b90 44 62 53 4e 61 6d 65 2c 20 7a 53 74 61 74 65 29  DbSName, zState)
11ba0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11bb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11bc0 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 32 29  ResultRow, 1, 2)
11bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
11be0 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  k;.  }.#endif..#
11bf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
11c00 5f 43 4f 44 45 43 0a 20 20 63 61 73 65 20 50 72  _CODEC.  case Pr
11c10 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20  agTyp_KEY: {.   
11c20 20 69 66 28 20 7a 52 69 67 68 74 20 29 20 73 71   if( zRight ) sq
11c30 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
11c40 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20 73 71   zDb, zRight, sq
11c50 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52  lite3Strlen30(zR
11c60 69 67 68 74 29 29 3b 0a 20 20 20 20 62 72 65 61  ight));.    brea
11c70 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20 50 72  k;.  }.  case Pr
11c80 61 67 54 79 70 5f 52 45 4b 45 59 3a 20 7b 0a 20  agTyp_REKEY: {. 
11c90 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 20     if( zRight ) 
11ca0 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32  sqlite3_rekey_v2
11cb0 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74  (db, zDb, zRight
11cc0 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
11cd0 30 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20  0(zRight));.    
11ce0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73  break;.  }.  cas
11cf0 65 20 50 72 61 67 54 79 70 5f 48 45 58 4b 45 59  e PragTyp_HEXKEY
11d00 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
11d10 68 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 69  ht ){.      u8 i
11d20 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Byte;.      int 
11d30 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4b  i;.      char zK
11d40 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f  ey[40];.      fo
11d50 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20  r(i=0, iByte=0; 
11d60 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a 32  i<sizeof(zKey)*2
11d70 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
11d80 67 69 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 20  git(zRight[i]); 
11d90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 42  i++){.        iB
11da0 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29  yte = (iByte<<4)
11db0 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49   + sqlite3HexToI
11dc0 6e 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 0a 20  nt(zRight[i]);. 
11dd0 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29         if( (i&1)
11de0 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20  !=0 ) zKey[i/2] 
11df0 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  = iByte;.      }
11e00 0a 20 20 20 20 20 20 69 66 28 20 28 7a 4c 65 66  .      if( (zLef
11e10 74 5b 33 5d 20 26 20 30 78 66 29 3d 3d 30 78 62  t[3] & 0xf)==0xb
11e20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11e30 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a  te3_key_v2(db, z
11e40 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a  Db, zKey, i/2);.
11e50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11e60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6b       sqlite3_rek
11e70 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
11e80 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20  Key, i/2);.     
11e90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
11ea0 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ak;.  }.#endif.#
11eb0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
11ec0 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20  E_HAS_CODEC) || 
11ed0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
11ee0 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a 20 20 63  NABLE_CEROD).  c
11ef0 61 73 65 20 50 72 61 67 54 79 70 5f 41 43 54 49  ase PragTyp_ACTI
11f00 56 41 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 3a  VATE_EXTENSIONS:
11f10 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 23   if( zRight ){.#
11f20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
11f30 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 73  _CODEC.    if( s
11f40 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
11f50 52 69 67 68 74 2c 20 22 73 65 65 2d 22 2c 20 34  Right, "see-", 4
11f60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
11f70 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 73  lite3_activate_s
11f80 65 65 28 26 7a 52 69 67 68 74 5b 34 5d 29 3b 0a  ee(&zRight[4]);.
11f90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
11fa0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11fb0 45 5f 43 45 52 4f 44 0a 20 20 20 20 69 66 28 20  E_CEROD.    if( 
11fc0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
11fd0 7a 52 69 67 68 74 2c 20 22 63 65 72 6f 64 2d 22  zRight, "cerod-"
11fe0 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 6)==0 ){.     
11ff0 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74   sqlite3_activat
12000 65 5f 63 65 72 6f 64 28 26 7a 52 69 67 68 74 5b  e_cerod(&zRight[
12010 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  6]);.    }.#endi
12020 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  f.  }.  break;.#
12030 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e  endif..  } /* En
12040 64 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  d of the PRAGMA 
12050 73 77 69 74 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20  switch */..  /* 
12060 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
12070 6f 63 6b 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ock is a no-op u
12080 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42  nless SQLITE_DEB
12090 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 20 49  UG is defined. I
120a0 74 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 75 72  ts only.  ** pur
120b0 70 6f 73 65 20 69 73 20 74 6f 20 65 78 65 63 75  pose is to execu
120c0 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
120d0 65 6d 65 6e 74 73 20 74 6f 20 76 65 72 69 66 79  ements to verify
120e0 20 74 68 61 74 20 69 66 20 74 68 65 0a 20 20 2a   that if the.  *
120f0 2a 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75  * PragFlg_NoColu
12100 6d 6e 73 31 20 66 6c 61 67 20 69 73 20 73 65 74  mns1 flag is set
12110 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
12120 73 70 65 63 69 66 69 65 64 20 61 6e 20 61 72 67  specified an arg
12130 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68  ument.  ** to th
12140 65 20 50 52 41 47 4d 41 2c 20 74 68 65 20 69 6d  e PRAGMA, the im
12150 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 68 61 73  plementation has
12160 20 6e 6f 74 20 61 64 64 65 64 20 61 6e 79 20 4f   not added any O
12170 50 5f 52 65 73 75 6c 74 52 6f 77 20 0a 20 20 2a  P_ResultRow .  *
12180 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  * instructions t
12190 6f 20 74 68 65 20 56 4d 2e 20 20 2a 2f 0a 20 20  o the VM.  */.  
121a0 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50  if( (pPragma->mP
121b0 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67  ragFlg & PragFlg
121c0 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 20 26 26 20  _NoColumns1) && 
121d0 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  zRight ){.    sq
121e0 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
121f0 6f 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20  oResultRow(v);. 
12200 20 7d 0a 0a 70 72 61 67 6d 61 5f 6f 75 74 3a 0a   }..pragma_out:.
12210 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12220 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20 73 71  db, zLeft);.  sq
12230 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12240 7a 52 69 67 68 74 29 3b 0a 7d 0a 23 69 66 6e 64  zRight);.}.#ifnd
12250 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12260 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a  IRTUALTABLE./***
12270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d  **********.** Im
122c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
122d0 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  an eponymous vir
122e0 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
122f0 72 75 6e 73 20 61 20 70 72 61 67 6d 61 2e 0a 2a  runs a pragma..*
12300 2a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  *.*/.typedef str
12310 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 50  uct PragmaVtab P
12320 72 61 67 6d 61 56 74 61 62 3b 0a 74 79 70 65 64  ragmaVtab;.typed
12330 65 66 20 73 74 72 75 63 74 20 50 72 61 67 6d 61  ef struct Pragma
12340 56 74 61 62 43 75 72 73 6f 72 20 50 72 61 67 6d  VtabCursor Pragm
12350 61 56 74 61 62 43 75 72 73 6f 72 3b 0a 73 74 72  aVtabCursor;.str
12360 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 20 7b  uct PragmaVtab {
12370 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
12380 62 61 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  base;        /* 
12390 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73  Base class.  Mus
123a0 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  t be first */.  
123b0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
123c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
123d0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
123e0 74 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 69 74  tion to which it
123f0 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f   belongs */.  co
12400 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
12410 70 4e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  pName;  /* Name 
12420 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 2a 2f  of the pragma */
12430 0a 20 20 75 38 20 6e 48 69 64 64 65 6e 3b 20 20  .  u8 nHidden;  
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12450 4e 75 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e  Number of hidden
12460 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
12470 20 69 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20   iHidden;       
12480 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12490 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 68 69   of the first hi
124a0 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d  dden column */.}
124b0 3b 0a 73 74 72 75 63 74 20 50 72 61 67 6d 61 56  ;.struct PragmaV
124c0 74 61 62 43 75 72 73 6f 72 20 7b 0a 20 20 73 71  tabCursor {.  sq
124d0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
124e0 72 20 62 61 73 65 3b 20 2f 2a 20 42 61 73 65 20  r base; /* Base 
124f0 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20  class.  Must be 
12500 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74  first */.  sqlit
12510 65 33 5f 73 74 6d 74 20 2a 70 50 72 61 67 6d 61  e3_stmt *pPragma
12520 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 72 61 67  ;    /* The prag
12530 6d 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ma statement to 
12540 72 75 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f  run */.  sqlite_
12550 69 6e 74 36 34 20 69 52 6f 77 69 64 3b 20 20 20  int64 iRowid;   
12560 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
12570 77 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  wid */.  char *a
12580 7a 41 72 67 5b 32 5d 3b 20 20 20 20 20 20 20 20  zArg[2];        
12590 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74     /* Value of t
125a0 68 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  he argument and 
125b0 73 63 68 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  schema */.};../*
125c0 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74   .** Pragma virt
125d0 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
125e0 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64   xConnect method
125f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12600 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63  pragmaVtabConnec
12610 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
12620 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a  ,.  void *pAux,.
12630 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73    int argc, cons
12640 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72  t char *const*ar
12650 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  gv,.  sqlite3_vt
12660 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63  ab **ppVtab,.  c
12670 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
12680 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d   const PragmaNam
12690 65 20 2a 70 50 72 61 67 6d 61 20 3d 20 28 63 6f  e *pPragma = (co
126a0 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 2a 29  nst PragmaName*)
126b0 70 41 75 78 3b 0a 20 20 50 72 61 67 6d 61 56 74  pAux;.  PragmaVt
126c0 61 62 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  ab *pTab = 0;.  
126d0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c  int rc;.  int i,
126e0 20 6a 3b 0a 20 20 63 68 61 72 20 63 53 65 70 20   j;.  char cSep 
126f0 3d 20 27 28 27 3b 0a 20 20 53 74 72 41 63 63 75  = '(';.  StrAccu
12700 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20 7a 42  m acc;.  char zB
12710 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 55 4e 55 53  uf[200];..  UNUS
12720 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
12730 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
12740 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a 20 20  AMETER(argv);.  
12750 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
12760 6e 69 74 28 26 61 63 63 2c 20 30 2c 20 7a 42 75  nit(&acc, 0, zBu
12770 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  f, sizeof(zBuf),
12780 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   0);.  sqlite3St
12790 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
127a0 26 61 63 63 2c 20 22 43 52 45 41 54 45 20 54 41  &acc, "CREATE TA
127b0 42 4c 45 20 78 22 29 3b 0a 20 20 66 6f 72 28 69  BLE x");.  for(i
127c0 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d 3e 69  =0, j=pPragma->i
127d0 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 70 50 72  PragCName; i<pPr
127e0 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65  agma->nPragCName
127f0 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
12800 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
12810 26 61 63 63 2c 20 22 25 63 5c 22 25 73 5c 22 22  &acc, "%c\"%s\""
12820 2c 20 63 53 65 70 2c 20 70 72 61 67 43 4e 61 6d  , cSep, pragCNam
12830 65 5b 6a 5d 29 3b 0a 20 20 20 20 63 53 65 70 20  e[j]);.    cSep 
12840 3d 20 27 2c 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = ',';.  }.  if(
12850 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   i==0 ){.    sql
12860 69 74 65 33 58 50 72 69 6e 74 66 28 26 61 63 63  ite3XPrintf(&acc
12870 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20 70 50 72  , "(\"%s\"", pPr
12880 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  agma->zName);.  
12890 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20    cSep = ',';.  
128a0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a 20 3d    i++;.  }.  j =
128b0 20 30 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d   0;.  if( pPragm
128c0 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72  a->mPragFlg & Pr
128d0 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 20 29 7b  agFlg_Result1 ){
128e0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
128f0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61  ccumAppendAll(&a
12900 63 63 2c 20 22 2c 61 72 67 20 48 49 44 44 45 4e  cc, ",arg HIDDEN
12910 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d  ");.    j++;.  }
12920 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e  .  if( pPragma->
12930 6d 50 72 61 67 46 6c 67 20 26 20 28 50 72 61 67  mPragFlg & (Prag
12940 46 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72  Flg_SchemaOpt|Pr
12950 61 67 46 6c 67 5f 53 63 68 65 6d 61 52 65 71 29  agFlg_SchemaReq)
12960 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
12970 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c  trAccumAppendAll
12980 28 26 61 63 63 2c 20 22 2c 73 63 68 65 6d 61 20  (&acc, ",schema 
12990 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b  HIDDEN");.    j+
129a0 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
129b0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
129c0 61 63 63 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  acc, ")", 1);.  
129d0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
129e0 69 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20 61  inish(&acc);.  a
129f0 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 42  ssert( strlen(zB
12a00 75 66 29 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75  uf) < sizeof(zBu
12a10 66 29 2d 31 20 29 3b 0a 20 20 72 63 20 3d 20 73  f)-1 );.  rc = s
12a20 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
12a30 74 61 62 28 64 62 2c 20 7a 42 75 66 29 3b 0a 20  tab(db, zBuf);. 
12a40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12a50 4f 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  OK ){.    pTab =
12a60 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 73 71   (PragmaVtab*)sq
12a70 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
12a80 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 29 29  eof(PragmaVtab))
12a90 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
12aa0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
12ab0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
12ad0 65 6d 73 65 74 28 70 54 61 62 2c 20 30 2c 20 73  emset(pTab, 0, s
12ae0 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62  izeof(PragmaVtab
12af0 29 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ));.      pTab->
12b00 70 4e 61 6d 65 20 3d 20 70 50 72 61 67 6d 61 3b  pName = pPragma;
12b10 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62 20  .      pTab->db 
12b20 3d 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61 62  = db;.      pTab
12b30 2d 3e 69 48 69 64 64 65 6e 20 3d 20 69 3b 0a 20  ->iHidden = i;. 
12b40 20 20 20 20 20 70 54 61 62 2d 3e 6e 48 69 64 64       pTab->nHidd
12b50 65 6e 20 3d 20 6a 3b 0a 20 20 20 20 7d 0a 20 20  en = j;.    }.  
12b60 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45 72  }else{.    *pzEr
12b70 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
12b80 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
12b90 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
12ba0 20 7d 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d 20   }..  *ppVtab = 
12bb0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70  (sqlite3_vtab*)p
12bc0 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Tab;.  return rc
12bd0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67  ;.}../* .** Prag
12be0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
12bf0 20 6d 6f 64 75 6c 65 20 78 44 69 73 63 6f 6e 6e   module xDisconn
12c00 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ect method..*/.s
12c10 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
12c20 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 73  VtabDisconnect(s
12c30 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
12c40 61 62 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  ab){.  PragmaVta
12c50 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
12c60 61 56 74 61 62 2a 29 70 56 74 61 62 3b 0a 20 20  aVtab*)pVtab;.  
12c70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
12c80 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
12c90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69  ITE_OK;.}../* Fi
12ca0 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 65 73  gure out the bes
12cb0 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 74  t index to use t
12cc0 6f 20 73 65 61 72 63 68 20 61 20 70 72 61 67 6d  o search a pragm
12cd0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
12ce0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
12cf0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 61 6e 79 20   not really any 
12d00 69 6e 64 65 78 20 63 68 6f 69 63 65 73 2e 20 20  index choices.  
12d10 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 65  But we want to e
12d20 6e 63 6f 75 72 61 67 65 20 74 68 65 0a 2a 2a 20  ncourage the.** 
12d30 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 74 6f  query planner to
12d40 20 67 69 76 65 20 3d 3d 20 63 6f 6e 73 74 72 61   give == constra
12d50 69 6e 74 73 20 6f 6e 20 61 73 20 6d 61 6e 79 20  ints on as many 
12d60 68 69 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72  hidden parameter
12d70 73 20 61 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  s as.** possible
12d80 2c 20 61 6e 64 20 65 73 70 65 63 69 61 6c 6c 79  , and especially
12d90 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 68 69   on the first hi
12da0 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 2e 20  dden parameter. 
12db0 20 53 6f 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20   So return a.** 
12dc0 68 69 67 68 20 63 6f 73 74 20 69 66 20 68 69 64  high cost if hid
12dd0 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61  den parameters a
12de0 72 65 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  re unconstrained
12df0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12e00 70 72 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e  pragmaVtabBestIn
12e10 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62  dex(sqlite3_vtab
12e20 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69   *tab, sqlite3_i
12e30 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
12e40 6e 66 6f 29 7b 0a 20 20 50 72 61 67 6d 61 56 74  nfo){.  PragmaVt
12e50 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
12e60 6d 61 56 74 61 62 2a 29 74 61 62 3b 0a 20 20 63  maVtab*)tab;.  c
12e70 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
12e80 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
12e90 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e  aint *pConstrain
12ea0 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  t;.  int i, j;. 
12eb0 20 69 6e 74 20 73 65 65 6e 5b 32 5d 3b 0a 0a 20   int seen[2];.. 
12ec0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
12ed0 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62  atedCost = (doub
12ee0 6c 65 29 31 3b 0a 20 20 69 66 28 20 70 54 61 62  le)1;.  if( pTab
12ef0 2d 3e 6e 48 69 64 64 65 6e 3d 3d 30 20 29 7b 20  ->nHidden==0 ){ 
12f00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12f10 3b 20 7d 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e  ; }.  pConstrain
12f20 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  t = pIdxInfo->aC
12f30 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 73 65 65  onstraint;.  see
12f40 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 73 65 65 6e  n[0] = 0;.  seen
12f50 5b 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  [1] = 0;.  for(i
12f60 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
12f70 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
12f80 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29  , pConstraint++)
12f90 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74  {.    if( pConst
12fa0 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30  raint->usable==0
12fb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12fc0 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
12fd0 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op!=SQLITE_IND
12fe0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
12ff0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13000 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
13010 2d 3e 69 43 6f 6c 75 6d 6e 20 3c 20 70 54 61 62  ->iColumn < pTab
13020 2d 3e 69 48 69 64 64 65 6e 20 29 20 63 6f 6e 74  ->iHidden ) cont
13030 69 6e 75 65 3b 0a 20 20 20 20 6a 20 3d 20 70 43  inue;.    j = pC
13040 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
13050 6d 6e 20 2d 20 70 54 61 62 2d 3e 69 48 69 64 64  mn - pTab->iHidd
13060 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
13070 6a 20 3c 20 32 20 29 3b 0a 20 20 20 20 73 65 65  j < 2 );.    see
13080 6e 5b 6a 5d 20 3d 20 69 2b 31 3b 0a 20 20 7d 0a  n[j] = i+1;.  }.
13090 20 20 69 66 28 20 73 65 65 6e 5b 30 5d 3d 3d 30    if( seen[0]==0
130a0 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   ){.    pIdxInfo
130b0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
130c0 3d 20 28 64 6f 75 62 6c 65 29 32 31 34 37 34 38  = (double)214748
130d0 33 36 34 37 3b 0a 20 20 20 20 70 49 64 78 49 6e  3647;.    pIdxIn
130e0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
130f0 73 20 3d 20 32 31 34 37 34 38 33 36 34 37 3b 0a  s = 2147483647;.
13100 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13110 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6a 20 3d 20  E_OK;.  }.  j = 
13120 73 65 65 6e 5b 30 5d 2d 31 3b 0a 20 20 70 49 64  seen[0]-1;.  pId
13130 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
13140 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49  ntUsage[j].argvI
13150 6e 64 65 78 20 3d 20 31 3b 0a 20 20 70 49 64 78  ndex = 1;.  pIdx
13160 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
13170 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d  tUsage[j].omit =
13180 20 31 3b 0a 20 20 69 66 28 20 73 65 65 6e 5b 31   1;.  if( seen[1
13190 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  ]==0 ) return SQ
131a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 49 64 78 49  LITE_OK;.  pIdxI
131b0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
131c0 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 32 30 3b  st = (double)20;
131d0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
131e0 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 30 3b  imatedRows = 20;
131f0 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 31 5d 2d 31  .  j = seen[1]-1
13200 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
13210 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
13220 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 32 3b  ].argvIndex = 2;
13230 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  .  pIdxInfo->aCo
13240 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d  nstraintUsage[j]
13250 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 72 65 74  .omit = 1;.  ret
13260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13270 0a 0a 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65  ../* Create a ne
13280 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
13290 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
132a0 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20  table */.static 
132b0 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4f 70  int pragmaVtabOp
132c0 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  en(sqlite3_vtab 
132d0 2a 70 56 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  *pVtab, sqlite3_
132e0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
132f0 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d  Cursor){.  Pragm
13300 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13310 72 3b 0a 20 20 70 43 73 72 20 3d 20 28 50 72 61  r;.  pCsr = (Pra
13320 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 73  gmaVtabCursor*)s
13330 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
13340 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20  zeof(*pCsr));.  
13350 69 66 28 20 70 43 73 72 3d 3d 30 20 29 20 72 65  if( pCsr==0 ) re
13360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13370 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72  M;.  memset(pCsr
13380 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61 67  , 0, sizeof(Prag
13390 6d 61 56 74 61 62 43 75 72 73 6f 72 29 29 3b 0a  maVtabCursor));.
133a0 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74    pCsr->base.pVt
133b0 61 62 20 3d 20 70 56 74 61 62 3b 0a 20 20 2a 70  ab = pVtab;.  *p
133c0 70 43 75 72 73 6f 72 20 3d 20 26 70 43 73 72 2d  pCursor = &pCsr-
133d0 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20  >base;.  return 
133e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
133f0 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6e 74 65   Clear all conte
13400 6e 74 20 66 72 6f 6d 20 70 72 61 67 6d 61 20 76  nt from pragma v
13410 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
13420 73 6f 72 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76  sor. */.static v
13430 6f 69 64 20 70 72 61 67 6d 61 56 74 61 62 43 75  oid pragmaVtabCu
13440 72 73 6f 72 43 6c 65 61 72 28 50 72 61 67 6d 61  rsorClear(Pragma
13450 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13460 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
13470 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13480 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20  Csr->pPragma);. 
13490 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20 3d   pCsr->pPragma =
134a0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
134b0 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d  <ArraySize(pCsr-
134c0 3e 61 7a 41 72 67 29 3b 20 69 2b 2b 29 7b 0a 20  >azArg); i++){. 
134d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
134e0 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 29 3b  pCsr->azArg[i]);
134f0 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67  .    pCsr->azArg
13500 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  [i] = 0;.  }.}..
13510 2f 2a 20 43 6c 6f 73 65 20 61 20 70 72 61 67 6d  /* Close a pragm
13520 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13530 63 75 72 73 6f 72 20 2a 2f 0a 73 74 61 74 69 63  cursor */.static
13540 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 43   int pragmaVtabC
13550 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61  lose(sqlite3_vta
13560 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a  b_cursor *cur){.
13570 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
13580 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
13590 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 63 75  maVtabCursor*)cu
135a0 72 3b 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43  r;.  pragmaVtabC
135b0 75 72 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29  ursorClear(pCsr)
135c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
135d0 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCsr);.  return
135e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
135f0 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 70 72  * Advance the pr
13600 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
13610 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  le cursor to the
13620 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 73 74 61   next row */.sta
13630 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
13640 61 62 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76  abNext(sqlite3_v
13650 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
13660 62 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67  bCursor){.  Prag
13670 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
13680 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
13690 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
136a0 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  sor;.  int rc = 
136b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
136c0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 78   Increment the x
136d0 52 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20  Rowid value */. 
136e0 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b   pCsr->iRowid++;
136f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
13700 3e 70 50 72 61 67 6d 61 20 29 3b 0a 20 20 69 66  >pPragma );.  if
13710 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71  ( SQLITE_ROW!=sq
13720 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d  lite3_step(pCsr-
13730 3e 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20 20  >pPragma) ){.   
13740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
13750 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72  nalize(pCsr->pPr
13760 61 67 6d 61 29 3b 0a 20 20 20 20 70 43 73 72 2d  agma);.    pCsr-
13770 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20  >pPragma = 0;.  
13780 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72 73    pragmaVtabCurs
13790 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20  orClear(pCsr);. 
137a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
137b0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61  }../* .** Pragma
137c0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
137d0 6f 64 75 6c 65 20 78 46 69 6c 74 65 72 20 6d 65  odule xFilter me
137e0 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
137f0 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 46 69  int pragmaVtabFi
13800 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  lter(.  sqlite3_
13810 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
13820 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74  abCursor, .  int
13830 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63   idxNum, const c
13840 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69  har *idxStr,.  i
13850 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
13860 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
13870 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13880 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13890 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
138a0 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72  VtabCursor;.  Pr
138b0 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d  agmaVtab *pTab =
138c0 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70   (PragmaVtab*)(p
138d0 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
138e0 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  b);.  int rc;.  
138f0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 53 74 72 41  int i, j;.  StrA
13900 63 63 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72  ccum acc;.  char
13910 20 2a 7a 53 71 6c 3b 0a 0a 20 20 55 4e 55 53 45   *zSql;..  UNUSE
13920 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 78 4e  D_PARAMETER(idxN
13930 75 6d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  um);.  UNUSED_PA
13940 52 41 4d 45 54 45 52 28 69 64 78 53 74 72 29 3b  RAMETER(idxStr);
13950 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 75 72  .  pragmaVtabCur
13960 73 6f 72 43 6c 65 61 72 28 70 43 73 72 29 3b 0a  sorClear(pCsr);.
13970 20 20 6a 20 3d 20 28 70 54 61 62 2d 3e 70 4e 61    j = (pTab->pNa
13980 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50  me->mPragFlg & P
13990 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 29 21  ragFlg_Result1)!
139a0 3d 30 20 3f 20 30 20 3a 20 31 3b 0a 20 20 66 6f  =0 ? 0 : 1;.  fo
139b0 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
139c0 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 61 73  ++, j++){.    as
139d0 73 65 72 74 28 20 6a 3c 41 72 72 61 79 53 69 7a  sert( j<ArraySiz
139e0 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 20 29  e(pCsr->azArg) )
139f0 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72  ;.    pCsr->azAr
13a00 67 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  g[j] = sqlite3_m
13a10 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
13a20 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
13a30 61 72 67 76 5b 69 5d 29 29 3b 0a 20 20 20 20 69  argv[i]));.    i
13a40 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a  f( pCsr->azArg[j
13a50 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  ]==0 ){.      re
13a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13a70 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  M;.    }.  }.  s
13a80 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
13a90 69 74 28 26 61 63 63 2c 20 30 2c 20 30 2c 20 30  it(&acc, 0, 0, 0
13aa0 2c 20 70 54 61 62 2d 3e 64 62 2d 3e 61 4c 69 6d  , pTab->db->aLim
13ab0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13ac0 53 51 4c 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20  SQL_LENGTH]);.  
13ad0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
13ae0 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22  ppendAll(&acc, "
13af0 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69 66 28  PRAGMA ");.  if(
13b00 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 20   pCsr->azArg[1] 
13b10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
13b20 72 69 6e 74 66 28 26 61 63 63 2c 20 22 25 51 2e  rintf(&acc, "%Q.
13b30 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31  ", pCsr->azArg[1
13b40 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
13b50 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
13b60 6c 6c 28 26 61 63 63 2c 20 70 54 61 62 2d 3e 70  ll(&acc, pTab->p
13b70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Name->zName);.  
13b80 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b  if( pCsr->azArg[
13b90 30 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  0] ){.    sqlite
13ba0 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22  3XPrintf(&acc, "
13bb0 3d 25 51 22 2c 20 70 43 73 72 2d 3e 61 7a 41 72  =%Q", pCsr->azAr
13bc0 67 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 7a 53 71  g[0]);.  }.  zSq
13bd0 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63  l = sqlite3StrAc
13be0 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b  cumFinish(&acc);
13bf0 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
13c00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13c10 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OMEM;.  rc = sql
13c20 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
13c30 70 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  pTab->db, zSql, 
13c40 2d 31 2c 20 26 70 43 73 72 2d 3e 70 50 72 61 67  -1, &pCsr->pPrag
13c50 6d 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ma, 0);.  sqlite
13c60 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
13c70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13c80 4b 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62  K ){.    pTab->b
13c90 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ase.zErrMsg = sq
13ca0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
13cb0 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
13cc0 73 67 28 70 54 61 62 2d 3e 64 62 29 29 3b 0a 20  sg(pTab->db));. 
13cd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13ce0 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 61 67 6d  }.  return pragm
13cf0 61 56 74 61 62 4e 65 78 74 28 70 56 74 61 62 43  aVtabNext(pVtabC
13d00 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ursor);.}../*.**
13d10 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
13d20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 45 6f  table module xEo
13d30 66 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  f method..*/.sta
13d40 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
13d50 61 62 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  abEof(sqlite3_vt
13d60 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
13d70 43 75 72 73 6f 72 29 7b 0a 20 20 50 72 61 67 6d  Cursor){.  Pragm
13d80 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
13d90 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
13da0 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73  ursor*)pVtabCurs
13db0 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43  or;.  return (pC
13dc0 73 72 2d 3e 70 50 72 61 67 6d 61 3d 3d 30 29 3b  sr->pPragma==0);
13dd0 0a 7d 0a 0a 2f 2a 20 54 68 65 20 78 43 6f 6c 75  .}../* The xColu
13de0 6d 6e 20 6d 65 74 68 6f 64 20 73 69 6d 70 6c 79  mn method simply
13df0 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 72   returns the cor
13e00 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
13e10 6e 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 50 52  n from.** the PR
13e20 41 47 4d 41 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  AGMA.  .*/.stati
13e30 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62  c int pragmaVtab
13e40 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65  Column(.  sqlite
13e50 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
13e60 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 73  VtabCursor, .  s
13e70 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
13e80 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 0a 29 7b  ctx, .  int i.){
13e90 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13ea0 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13eb0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
13ec0 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 50 72  VtabCursor;.  Pr
13ed0 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d  agmaVtab *pTab =
13ee0 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 28 70   (PragmaVtab*)(p
13ef0 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
13f00 62 29 3b 0a 20 20 69 66 28 20 69 3c 70 54 61 62  b);.  if( i<pTab
13f10 2d 3e 69 48 69 64 64 65 6e 20 29 7b 0a 20 20 20  ->iHidden ){.   
13f20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
13f30 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74  value(ctx, sqlit
13f40 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
13f50 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 69  pCsr->pPragma, i
13f60 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
13f70 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
13f80 74 65 78 74 28 63 74 78 2c 20 70 43 73 72 2d 3e  text(ctx, pCsr->
13f90 61 7a 41 72 67 5b 69 2d 70 54 61 62 2d 3e 69 48  azArg[i-pTab->iH
13fa0 69 64 64 65 6e 5d 2c 2d 31 2c 53 51 4c 49 54 45  idden],-1,SQLITE
13fb0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
13fc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13fd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50  _OK;.}../* .** P
13fe0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
13ff0 62 6c 65 20 6d 6f 64 75 6c 65 20 78 52 6f 77 69  ble module xRowi
14000 64 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  d method..*/.sta
14010 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74  tic int pragmaVt
14020 61 62 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f  abRowid(sqlite3_
14030 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
14040 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65  abCursor, sqlite
14050 5f 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 50 72  _int64 *p){.  Pr
14060 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
14070 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
14080 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43  abCursor*)pVtabC
14090 75 72 73 6f 72 3b 0a 20 20 2a 70 20 3d 20 70 43  ursor;.  *p = pC
140a0 73 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65  sr->iRowid;.  re
140b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
140c0 7d 0a 0a 2f 2a 20 54 68 65 20 70 72 61 67 6d 61  }../* The pragma
140d0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
140e0 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20  bject */.static 
140f0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
14100 64 75 6c 65 20 70 72 61 67 6d 61 56 74 61 62 4d  dule pragmaVtabM
14110 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20  odule = {.  0,  
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14130 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
14140 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  sion */.  0,    
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
14170 65 20 2d 20 63 72 65 61 74 65 20 61 20 74 61 62  e - create a tab
14180 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  le */.  pragmaVt
14190 61 62 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  abConnect,      
141a0 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74       /* xConnect
141b0 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61 6e   - connect to an
141c0 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
141d0 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 42  */.  pragmaVtabB
141e0 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20  estIndex,       
141f0 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20    /* xBestIndex 
14200 2d 20 44 65 74 65 72 6d 69 6e 65 20 73 65 61 72  - Determine sear
14210 63 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  ch strategy */. 
14220 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f   pragmaVtabDisco
14230 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  nnect,        /*
14240 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 44   xDisconnect - D
14250 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 20 61  isconnect from a
14260 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20   table */.  0,  
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14280 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73           /* xDes
14290 74 72 6f 79 20 2d 20 44 72 6f 70 20 61 20 74 61  troy - Drop a ta
142a0 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  ble */.  pragmaV
142b0 74 61 62 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  tabOpen,        
142c0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d        /* xOpen -
142d0 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a   open a cursor *
142e0 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6c  /.  pragmaVtabCl
142f0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
14300 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
14310 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
14320 20 70 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65   pragmaVtabFilte
14330 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
14340 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69   xFilter - confi
14350 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72  gure scan constr
14360 61 69 6e 74 73 20 2a 2f 0a 20 20 70 72 61 67 6d  aints */.  pragm
14370 61 56 74 61 62 4e 65 78 74 2c 20 20 20 20 20 20  aVtabNext,      
14380 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
14390 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
143a0 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56  sor */.  pragmaV
143b0 74 61 62 45 6f 66 2c 20 20 20 20 20 20 20 20 20  tabEof,         
143c0 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f        /* xEof */
143d0 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c  .  pragmaVtabCol
143e0 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
143f0 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
14400 64 20 64 61 74 61 20 2a 2f 0a 20 20 70 72 61 67  d data */.  prag
14410 6d 61 56 74 61 62 52 6f 77 69 64 2c 20 20 20 20  maVtabRowid,    
14420 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
14430 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
14440 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20 77 72   /* xUpdate - wr
14470 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c  ite data */.  0,
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
144a0 65 67 69 6e 20 2d 20 62 65 67 69 6e 20 74 72 61  egin - begin tra
144b0 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
144e0 79 6e 63 20 2d 20 73 79 6e 63 20 74 72 61 6e 73  ync - sync trans
144f0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  action */.  0,  
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d           /* xCom
14520 6d 69 74 20 2d 20 63 6f 6d 6d 69 74 20 74 72 61  mit - commit tra
14530 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
14560 6f 6c 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61  ollback - rollba
14570 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  ck transaction *
14580 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145a0 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f   /* xFindFunctio
145b0 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  n - function ove
145c0 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 30 2c  rloading */.  0,
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
145f0 65 6e 61 6d 65 20 2d 20 72 65 6e 61 6d 65 20 74  ename - rename t
14600 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 30 2c  he table */.  0,
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
14630 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c  avepoint */.  0,
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
14660 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20 20 20  elease */.  0   
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14680 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
14690 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f  lbackTo */.};../
146a0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
146b0 65 20 69 66 20 7a 54 61 62 4e 61 6d 65 20 69 73  e if zTabName is
146c0 20 72 65 61 6c 6c 79 20 74 68 65 20 6e 61 6d 65   really the name
146d0 20 6f 66 20 61 20 70 72 61 67 6d 61 2e 20 20 49   of a pragma.  I
146e0 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 65 6e  f it is,.** then
146f0 20 72 65 67 69 73 74 65 72 20 61 6e 20 65 70 6f   register an epo
14700 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74  nymous virtual t
14710 61 62 6c 65 20 66 6f 72 20 74 68 61 74 20 70 72  able for that pr
14720 61 67 6d 61 20 61 6e 64 20 72 65 74 75 72 6e 0a  agma and return.
14730 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
14740 74 68 65 20 4d 6f 64 75 6c 65 20 6f 62 6a 65 63  the Module objec
14750 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  t for the new vi
14760 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
14770 4d 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65 33 50  Module *sqlite3P
14780 72 61 67 6d 61 56 74 61 62 52 65 67 69 73 74 65  ragmaVtabRegiste
14790 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  r(sqlite3 *db, c
147a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
147b0 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d  ){.  const Pragm
147c0 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 0a 20 20  aName *pName;.  
147d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
147e0 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  strnicmp(zName, 
147f0 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d 30  "pragma_", 7)==0
14800 20 29 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 70 72   );.  pName = pr
14810 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4e 61 6d 65  agmaLocate(zName
14820 2b 37 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  +7);.  if( pName
14830 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14840 20 20 69 66 28 20 28 70 4e 61 6d 65 2d 3e 6d 50    if( (pName->mP
14850 72 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c  ragFlg & (PragFl
14860 67 5f 52 65 73 75 6c 74 30 7c 50 72 61 67 46 6c  g_Result0|PragFl
14870 67 5f 52 65 73 75 6c 74 31 29 29 3d 3d 30 20 29  g_Result1))==0 )
14880 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
14890 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
148a0 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Find(&db->aModul
148b0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a  e, zName)==0 );.
148c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
148d0 56 74 61 62 43 72 65 61 74 65 4d 6f 64 75 6c 65  VtabCreateModule
148e0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 72 61  (db, zName, &pra
148f0 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 2c 20 28  gmaVtabModule, (
14900 76 6f 69 64 2a 29 70 4e 61 6d 65 2c 20 30 29 3b  void*)pName, 0);
14910 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
14920 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14930 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69  LTABLE */..#endi
14940 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14950 5f 50 52 41 47 4d 41 20 2a 2f 0a                 _PRAGMA */.