/ Hex Artifact Content
Login

Artifact 5e8c63fd746a6a521c657b7d2ce02205286c6a0b90b9fdf3f682d8d8b9e7cd66:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61  esult row with a
2400: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
2410: 20 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20   string held in 
2420: 72 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63  register 3.  Dec
2430: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c  rement the resul
2440: 74 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73  t count in regis
2450: 74 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c  ter 1.** and hal
2460: 74 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d  t if the maximum
2470: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
2480: 74 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  t rows have been
2490: 20 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74   issued..*/.stat
24a0: 69 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79  ic int integrity
24b0: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56  CheckResultRow(V
24c0: 64 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61  dbe *v){.  int a
24d0: 64 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ddr;.  sqlite3Vd
24e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
24f0: 65 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b  esultRow, 3, 1);
2500: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2520: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69  P_IfPos, 1, sqli
2530: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2540: 64 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56  dr(v)+2, 1);.  V
2550: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2570: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
2580: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
25a0: 20 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d   a pragma statem
25b0: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61  ent.  .**.** Pra
25c0: 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73  gmas are of this
25d0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
25e0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
25f0: 2e 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a  .]id [= value].*
2600: 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66  *.** The identif
2610: 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  ier might also b
2620: 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65  e a string.  The
2630: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
2640: 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74  ng, and.** ident
2650: 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62  ifier, or a numb
2660: 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61  er.  If minusFla
2670: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
2680: 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  the value is.** 
2690: 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61  a number that wa
26a0: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
26b0: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
26c0: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69  * If the left si
26d0: 64 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e  de is "database.
26e0: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
26f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
2700: 6d 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69  me.** and pId2 i
2710: 73 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68  s the id.  If th
2720: 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a  e left side is j
2730: 75 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49  ust "id" then pI
2740: 64 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20  d1 is the.** id 
2750: 61 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20  and pId2 is any 
2760: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f  empty string..*/
2770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61  .void sqlite3Pra
2780: 67 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gma(.  Parse *pP
2790: 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  arse, .  Token *
27a0: 70 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20  pId1,        /* 
27b0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73  First part of [s
27c0: 63 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20  chema.]id field 
27d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32  */.  Token *pId2
27e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  ,        /* Seco
27f0: 6e 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65  nd part of [sche
2800: 6d 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72  ma.]id field, or
2810: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
2820: 20 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f   *pValue,      /
2830: 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c  * Token for <val
2840: 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ue>, or NULL */.
2850: 20 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20    int minusFlag 
2860: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2870: 20 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63   a '-' sign prec
2880: 65 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a  eded <value> */.
2890: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74  ){.  char *zLeft
28a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
28b0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
28c0: 46 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20  F-8 string <id> 
28d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  */.  char *zRigh
28e0: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  t = 0;      /* N
28f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2900: 46 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75  F-8 string <valu
2910: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2930: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64   = 0;   /* The d
2940: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
2950: 20 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20    Token *pId;   
2960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2970: 74 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65  ter to <id> toke
2980: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63  n */.  char *aFc
2990: 6e 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a  ntl[4];       /*
29a0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c   Argument to SQL
29b0: 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41  ITE_FCNTL_PRAGMA
29c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 44 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66  Database index f
29f0: 6f 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f  or <database> */
2a00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 2f 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  /* return value 
2a30: 66 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54  form SQLITE_FCNT
2a40: 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71  L_PRAGMA */.  sq
2a50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2a60: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68  se->db;    /* Th
2a70: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2a80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70  ction */.  Db *p
2a90: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2ab0: 70 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65  pecific database
2ac0: 20 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20   being pragmaed 
2ad0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
2ae0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2af0: 61 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61  arse);  /* Prepa
2b00: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
2b10: 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
2b20: 61 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20  ame *pPragma;   
2b30: 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f  /* The pragma */
2b40: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2b50: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2b60: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
2b70: 76 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  v);.  pParse->nM
2b80: 65 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e  em = 2;..  /* In
2b90: 74 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68  terpret the [sch
2ba0: 65 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68  ema.] part of th
2bb0: 65 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  e pragma stateme
2bc0: 6e 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20  nt. iDb is the. 
2bd0: 20 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65   ** index of the
2be0: 20 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70   database this p
2bf0: 72 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61  ragma is being a
2c00: 70 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e  pplied to in db.
2c10: 61 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20  aDb[]. */.  iDb 
2c20: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
2c30: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64  Name(pParse, pId
2c40: 31 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a  1, pId2, &pId);.
2c50: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
2c60: 74 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64  turn;.  pDb = &d
2c70: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
2c80: 2f 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64  /* If the temp d
2c90: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
2ca0: 20 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65   explicitly name
2cb0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2cc0: 20 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d   .  ** pragma, m
2cd0: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f  ake sure it is o
2ce0: 70 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  pen. .  */.  if(
2cf0: 20 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74   iDb==1 && sqlit
2d00: 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
2d10: 73 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  se(pParse) ){.  
2d20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2d30: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   zLeft = sqlite3
2d40: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
2d50: 2c 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a  , pId);.  if( !z
2d60: 4c 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Left ) return;. 
2d70: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
2d80: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
2d90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2da0: 2c 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29  , "-%T", pValue)
2db0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2dc0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e  Right = sqlite3N
2dd0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2de0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20   pValue);.  }.. 
2df0: 20 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b   assert( pId2 );
2e00: 0a 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e  .  zDb = pId2->n
2e10: 3e 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61  >0 ? pDb->zDbSNa
2e20: 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71  me : 0;.  if( sq
2e30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
2e40: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52  Parse, SQLITE_PR
2e50: 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69  AGMA, zLeft, zRi
2e60: 67 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ght, zDb) ){.   
2e70: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
2e80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64  ;.  }..  /* Send
2e90: 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   an SQLITE_FCNTL
2ea0: 5f 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e  _PRAGMA file-con
2eb0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65  trol to the unde
2ec0: 72 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20  rlying VFS.  ** 
2ed0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20  connection.  If 
2ee0: 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
2ef0: 45 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d  E_OK, then assum
2f00: 65 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20  e that the VFS. 
2f10: 20 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20   ** handled the 
2f20: 70 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72  pragma and gener
2f30: 61 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70  ate a no-op prep
2f40: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
2f50: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
2f60: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31  ENTATION-OF: R-1
2f70: 32 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65  2238-55120 Whene
2f80: 76 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61  ver a PRAGMA sta
2f90: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
2fa0: 2c 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45  ,.  ** an SQLITE
2fb0: 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69  _FCNTL_PRAGMA fi
2fc0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65  le control is se
2fd0: 6e 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73  nt to the open s
2fe0: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a  qlite3_file.  **
2ff0: 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
3000: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  nding to the dat
3010: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68  abase file to wh
3020: 69 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20  ich the pragma. 
3030: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
3040: 66 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fers..  **.  ** 
3050: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
3060: 46 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38  F: R-29875-31678
3070: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
3080: 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
3090: 4c 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69  L_PRAGMA.  ** fi
30a0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e  le control is an
30b0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
30c0: 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63  rs to strings (c
30d0: 68 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20  har**) in which 
30e0: 74 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20  the.  ** second 
30f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
3100: 72 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65  rray is the name
3110: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61   of the pragma a
3120: 6e 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a  nd the third.  *
3130: 2a 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65  * element is the
3140: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3150: 20 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20   pragma or NULL 
3160: 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61  if the pragma ha
3170: 73 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65  s no.  ** argume
3180: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74  nt..  */.  aFcnt
3190: 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e  l[0] = 0;.  aFcn
31a0: 74 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20  tl[1] = zLeft;. 
31b0: 20 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69   aFcntl[2] = zRi
31c0: 67 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d  ght;.  aFcntl[3]
31d0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
31e0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
31f0: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
3200: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
3210: 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
3220: 43 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f  CNTL_PRAGMA, (vo
3230: 69 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69  id*)aFcntl);.  i
3240: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3250: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
3260: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
3270: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3280: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
3290: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
32a0: 45 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51  E, aFcntl[0], SQ
32b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
32c0: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
32d0: 65 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b  eText(v, aFcntl[
32e0: 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0]);.    sqlite3
32f0: 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29  _free(aFcntl[0])
3300: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d  ;.    goto pragm
3310: 61 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  a_out;.  }.  if(
3320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
3330: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20  OUND ){.    if( 
3340: 61 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20  aFcntl[0] ){.   
3350: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3360: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
3370: 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20   aFcntl[0]);.   
3380: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3390: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
33a0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  }.    pParse->nE
33b0: 72 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65  rr++;.    pParse
33c0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67  ->rc = rc;.    g
33d0: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
33e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
33f0: 20 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74   the pragma in t
3400: 68 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20  he lookup table 
3410: 2a 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70  */.  pPragma = p
3420: 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66  ragmaLocate(zLef
3430: 74 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d  t);.  if( pPragm
3440: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67  a==0 ) goto prag
3450: 6d 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61  ma_out;..  /* Ma
3460: 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
3470: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c  base schema is l
3480: 6f 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61  oaded if the pra
3490: 67 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61  gma requires tha
34a0: 74 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  t */.  if( (pPra
34b0: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
34c0: 50 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65  PragFlg_NeedSche
34d0: 6d 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ma)!=0 ){.    if
34e0: 28 20 49 73 53 68 61 72 65 64 53 63 68 65 6d 61  ( IsSharedSchema
34f0: 28 64 62 29 20 26 26 20 28 7a 44 62 20 7c 7c 20  (db) && (zDb || 
3500: 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46  (pPragma->mPragF
3510: 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4f 6e 65  lg & PragFlg_One
3520: 53 63 68 65 6d 61 29 29 20 29 7b 0a 20 20 20 20  Schema)) ){.    
3530: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
3540: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
3550: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
3560: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68  >rc = sqlite3Sch
3570: 65 6d 61 4c 6f 61 64 28 64 62 2c 20 69 44 62 2c  emaLoad(db, iDb,
3580: 20 30 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72   0, &pParse->zEr
3590: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28  rMsg);.      if(
35a0: 20 70 50 61 72 73 65 2d 3e 72 63 20 29 20 67 6f   pParse->rc ) go
35b0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
35c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35d0: 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53  if( sqlite3ReadS
35e0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
35f0: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
3600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3610: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 72 65   Register the re
3620: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
3630: 73 20 66 6f 72 20 70 72 61 67 6d 61 73 20 74 68  s for pragmas th
3640: 61 74 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74  at return result
3650: 73 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  s */.  if( (pPra
3660: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
3670: 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e  PragFlg_NoColumn
3680: 73 29 3d 3d 30 20 0a 20 20 20 26 26 20 28 28 70  s)==0 .   && ((p
3690: 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
36a0: 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c   & PragFlg_NoCol
36b0: 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c 20 7a 52 69  umns1)==0 || zRi
36c0: 67 68 74 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  ght==0).  ){.   
36d0: 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74   setPragmaResult
36e0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70  ColumnNames(v, p
36f0: 50 72 61 67 6d 61 29 3b 0a 20 20 7d 0a 0a 20 20  Pragma);.  }..  
3700: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61  /* Jump to the a
3710: 70 70 72 6f 70 72 69 61 74 65 20 70 72 61 67 6d  ppropriate pragm
3720: 61 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 73  a handler */.  s
3730: 77 69 74 63 68 28 20 70 50 72 61 67 6d 61 2d 3e  witch( pPragma->
3740: 65 50 72 61 67 54 79 70 20 29 7b 0a 20 20 0a 23  ePragTyp ){.  .#
3750: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3760: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
3770: 41 47 4d 41 53 29 20 26 26 20 21 64 65 66 69 6e  AGMAS) && !defin
3780: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
3790: 45 50 52 45 43 41 54 45 44 29 0a 20 20 2f 2a 0a  EPRECATED).  /*.
37a0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
37b0: 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61  hema.]default_ca
37c0: 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50  che_size.  **  P
37d0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64  RAGMA [schema.]d
37e0: 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a  efault_cache_siz
37f0: 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e=N.  **.  ** Th
3800: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
3810: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
3820: 20 70 65 72 73 69 73 74 65 6e 74 20 73 65 74 74   persistent sett
3830: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
3840: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
3850: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  .  The value ret
3860: 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78  urned is the max
3870: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
3880: 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65   ** pages in the
3890: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 54 68   page cache.  Th
38a0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
38b0: 74 73 20 62 6f 74 68 20 74 68 65 20 63 75 72 72  ts both the curr
38c0: 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  ent.  ** page ca
38d0: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61  che size value a
38e0: 6e 64 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  nd the persisten
38f0: 74 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  t page cache siz
3900: 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f  e value.  ** sto
3910: 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
3920: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20  ase file..  **. 
3930: 20 2a 2a 20 4f 6c 64 65 72 20 76 65 72 73 69 6f   ** Older versio
3940: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 6f 75  ns of SQLite wou
3950: 6c 64 20 73 65 74 20 74 68 65 20 64 65 66 61 75  ld set the defau
3960: 6c 74 20 63 61 63 68 65 20 73 69 7a 65 20 74 6f  lt cache size to
3970: 20 61 0a 20 20 2a 2a 20 6e 65 67 61 74 69 76 65   a.  ** negative
3980: 20 6e 75 6d 62 65 72 20 74 6f 20 69 6e 64 69 63   number to indic
3990: 61 74 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ate synchronous=
39a0: 4f 46 46 2e 20 20 54 68 65 73 65 20 64 61 79 73  OFF.  These days
39b0: 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  , synchronous.  
39c0: 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 20  ** is always on 
39d0: 62 79 20 64 65 66 61 75 6c 74 20 72 65 67 61 72  by default regar
39e0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73 69 67  dless of the sig
39f0: 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  n of the default
3a00: 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65   cache.  ** size
3a10: 2e 20 20 42 75 74 20 63 6f 6e 74 69 6e 75 65 20  .  But continue 
3a20: 74 6f 20 74 61 6b 65 20 74 68 65 20 61 62 73 6f  to take the abso
3a30: 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68  lute value of th
3a40: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a  e default cache.
3a50: 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 68 69 73    ** size of his
3a60: 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
3a70: 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a 20 20 63 61  ility..  */.  ca
3a80: 73 65 20 50 72 61 67 54 79 70 5f 44 45 46 41 55  se PragTyp_DEFAU
3a90: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b  LT_CACHE_SIZE: {
3aa0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
3ab0: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
3ac0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
3ad0: 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  );.    static co
3ae0: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 67  nst VdbeOpList g
3af0: 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20  etCacheSize[] = 
3b00: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61  {.      { OP_Tra
3b10: 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  nsaction, 0, 0, 
3b20: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20         0},      
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20     /* 0 */.     
3b50: 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65   { OP_ReadCookie
3b60: 2c 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20  ,  0, 1,        
3b70: 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41  BTREE_DEFAULT_CA
3b80: 43 48 45 5f 53 49 5a 45 7d 2c 20 20 2f 2a 20 31  CHE_SIZE},  /* 1
3b90: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49   */.      { OP_I
3ba0: 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38  fPos,       1, 8
3bb0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3bc0: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
3bd0: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
3be0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
3bf0: 5f 53 75 62 74 72 61 63 74 2c 20 20 20 20 31 2c  _Subtract,    1,
3c00: 20 32 2c 20 20 20 20 20 20 20 20 31 7d 2c 0a 20   2,        1},. 
3c10: 20 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c       { OP_IfPos,
3c20: 20 20 20 20 20 20 20 31 2c 20 38 2c 20 20 20 20         1, 8,    
3c30: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
3c40: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20  OP_Integer,     
3c50: 30 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 1,        0},
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 36 20 2a 2f           /* 6 */
3c80: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 6f 6f 70  .      { OP_Noop
3c90: 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20  ,        0, 0,  
3ca0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3cb0: 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  { OP_ResultRow, 
3cc0: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30    1, 1,        0
3cd0: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  },.    };.    Vd
3ce0: 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 73  beOp *aOp;.    s
3cf0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3d00: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
3d10: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
3d20: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
3d30: 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 73  em += 2;.      s
3d40: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
3d50: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
3d60: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65  (v, ArraySize(ge
3d70: 74 43 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  tCacheSize));.  
3d80: 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65      aOp = sqlite
3d90: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
3da0: 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 43  , ArraySize(getC
3db0: 61 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61  acheSize), getCa
3dc0: 63 68 65 53 69 7a 65 2c 20 69 4c 6e 29 3b 0a 20  cheSize, iLn);. 
3dd0: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
3de0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
3df0: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
3e00: 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31  .      aOp[0].p1
3e10: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
3e20: 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[1].p1 = iDb;. 
3e30: 20 20 20 20 20 61 4f 70 5b 36 5d 2e 70 31 20 3d       aOp[6].p1 =
3e40: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
3e50: 43 41 43 48 45 5f 53 49 5a 45 3b 0a 20 20 20 20  CACHE_SIZE;.    
3e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
3e70: 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41   size = sqlite3A
3e80: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
3e90: 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20  toi(zRight));.  
3ea0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
3eb0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
3ec0: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
3ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3ee0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
3ef0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
3f00: 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  REE_DEFAULT_CACH
3f10: 45 5f 53 49 5a 45 2c 20 73 69 7a 65 29 3b 0a 20  E_SIZE, size);. 
3f20: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
3f30: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
3f40: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
3f50: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 53  );.      pDb->pS
3f60: 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a  chema->cache_siz
3f70: 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e = size;.      
3f80: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
3f90: 61 63 68 65 53 69 7a 65 28 70 44 62 2d 3e 70 42  acheSize(pDb->pB
3fa0: 74 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t, pDb->pSchema-
3fb0: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
3fc0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
3fd0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51   }.#endif /* !SQ
3fe0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
3ff0: 50 52 41 47 4d 41 53 20 26 26 20 21 53 51 4c 49  PRAGMAS && !SQLI
4000: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
4010: 45 44 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ED */..#if !defi
4020: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4030: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 0a 20  PAGER_PRAGMAS). 
4040: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
4050: 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 73   [schema.]page_s
4060: 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
4070: 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f 73   [schema.]page_s
4080: 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize=N.  **.  ** 
4090: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
40a0: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
40b0: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
40c0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
40d0: 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 62 79   page size in by
40e0: 74 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  tes.  The second
40f0: 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65 0a 20   form sets the. 
4100: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
4110: 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 54  e size value.  T
4120: 68 65 20 76 61 6c 75 65 20 63 61 6e 20 6f 6e 6c  he value can onl
4130: 79 20 62 65 20 73 65 74 20 69 66 0a 20 20 2a 2a  y be set if.  **
4140: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
4150: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
4160: 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  reated..  */.  c
4170: 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 47 45  ase PragTyp_PAGE
4180: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 42 74 72  _SIZE: {.    Btr
4190: 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70  ee *pBt = pDb->p
41a0: 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
41b0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  pBt!=0 );.    if
41c0: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
41d0: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 41 4c     int size = AL
41e0: 57 41 59 53 28 70 42 74 29 20 3f 20 73 71 6c 69  WAYS(pBt) ? sqli
41f0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
4200: 69 7a 65 28 70 42 74 29 20 3a 20 30 3b 0a 20 20  ize(pBt) : 0;.  
4210: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
4220: 49 6e 74 28 76 2c 20 73 69 7a 65 29 3b 0a 20 20  Int(v, size);.  
4230: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
4240: 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79 20 66 61 69  * Malloc may fai
4250: 6c 20 77 68 65 6e 20 73 65 74 74 69 6e 67 20 74  l when setting t
4260: 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 73  he page-size, as
4270: 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 74   there is an int
4280: 65 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 62  ernal.      ** b
4290: 75 66 66 65 72 20 74 68 61 74 20 74 68 65 20 70  uffer that the p
42a0: 61 67 65 72 20 6d 6f 64 75 6c 65 20 72 65 73 69  ager module resi
42b0: 7a 65 73 20 75 73 69 6e 67 20 73 71 6c 69 74 65  zes using sqlite
42c0: 33 5f 72 65 61 6c 6c 6f 63 28 29 2e 0a 20 20 20  3_realloc()..   
42d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e     */.      db->
42e0: 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 73  nextPagesize = s
42f0: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
4300: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  t);.      if( SQ
4310: 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
4320: 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
4330: 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
4340: 74 50 61 67 65 73 69 7a 65 2c 2d 31 2c 30 29 20  tPagesize,-1,0) 
4350: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4360: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
4370: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4380: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
4390: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
43a0: 5b 73 63 68 65 6d 61 2e 5d 73 65 63 75 72 65 5f  [schema.]secure_
43b0: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 20 50 52 41  delete.  **  PRA
43c0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63  GMA [schema.]sec
43d0: 75 72 65 5f 64 65 6c 65 74 65 3d 4f 4e 2f 4f 46  ure_delete=ON/OF
43e0: 46 2f 46 41 53 54 0a 20 20 2a 2a 0a 20 20 2a 2a  F/FAST.  **.  **
43f0: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
4400: 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
4410: 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ent setting for 
4420: 74 68 65 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f  the.  ** secure_
4430: 64 65 6c 65 74 65 20 66 6c 61 67 2e 20 20 54 68  delete flag.  Th
4440: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68  e second form ch
4450: 61 6e 67 65 73 20 74 68 65 20 73 65 63 75 72 65  anges the secure
4460: 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61  _delete.  ** fla
4470: 67 20 73 65 74 74 69 6e 67 20 61 6e 64 20 72 65  g setting and re
4480: 70 6f 72 74 73 20 74 68 65 20 6e 65 77 20 76 61  ports the new va
4490: 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  lue..  */.  case
44a0: 20 50 72 61 67 54 79 70 5f 53 45 43 55 52 45 5f   PragTyp_SECURE_
44b0: 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 42 74  DELETE: {.    Bt
44c0: 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e  ree *pBt = pDb->
44d0: 70 42 74 3b 0a 20 20 20 20 69 6e 74 20 62 20 3d  pBt;.    int b =
44e0: 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
44f0: 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69   pBt!=0 );.    i
4500: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
4510: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
4520: 74 72 69 63 6d 70 28 7a 52 69 67 68 74 2c 20 22  tricmp(zRight, "
4530: 66 61 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  fast")==0 ){.   
4540: 20 20 20 20 20 62 20 3d 20 32 3b 0a 20 20 20 20       b = 2;.    
4550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4560: 20 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42   b = sqlite3GetB
4570: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
4580: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4590: 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e  .    if( pId2->n
45a0: 3d 3d 30 20 26 26 20 62 3e 3d 30 20 29 7b 0a 20  ==0 && b>=0 ){. 
45b0: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
45c0: 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
45d0: 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a  db->nDb; ii++){.
45e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
45f0: 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
4600: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4610: 2c 20 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , b);.      }.  
4620: 20 20 7d 0a 20 20 20 20 62 20 3d 20 73 71 6c 69    }.    b = sqli
4630: 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
4640: 6c 65 74 65 28 70 42 74 2c 20 62 29 3b 0a 20 20  lete(pBt, b);.  
4650: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
4660: 74 28 76 2c 20 62 29 3b 0a 20 20 20 20 62 72 65  t(v, b);.    bre
4670: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
4680: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4690: 6d 61 2e 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75  ma.]max_page_cou
46a0: 6e 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  nt.  **  PRAGMA 
46b0: 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70 61 67  [schema.]max_pag
46c0: 65 5f 63 6f 75 6e 74 3d 4e 0a 20 20 2a 2a 0a 20  e_count=N.  **. 
46d0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
46e0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
46f0: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
4700: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69  or the.  ** maxi
4710: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
4720: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
4730: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 0a  ase file.  The .
4740: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 66 6f 72 6d    ** second form
4750: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 68 61   attempts to cha
4760: 6e 67 65 20 74 68 69 73 20 73 65 74 74 69 6e 67  nge this setting
4770: 2e 20 20 42 6f 74 68 0a 20 20 2a 2a 20 66 6f 72  .  Both.  ** for
4780: 6d 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  ms return the cu
4790: 72 72 65 6e 74 20 73 65 74 74 69 6e 67 2e 0a 20  rrent setting.. 
47a0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 62 73   **.  ** The abs
47b0: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 4e  olute value of N
47c0: 20 69 73 20 75 73 65 64 2e 20 20 54 68 69 73 20   is used.  This 
47d0: 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20  is undocumented 
47e0: 61 6e 64 20 6d 69 67 68 74 0a 20 20 2a 2a 20 63  and might.  ** c
47f0: 68 61 6e 67 65 2e 20 20 54 68 65 20 6f 6e 6c 79  hange.  The only
4800: 20 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 70   purpose is to p
4810: 72 6f 76 69 64 65 20 61 6e 20 65 61 73 79 20 77  rovide an easy w
4820: 61 79 20 74 6f 20 74 65 73 74 0a 20 20 2a 2a 20  ay to test.  ** 
4830: 74 68 65 20 73 71 6c 69 74 65 33 41 62 73 49 6e  the sqlite3AbsIn
4840: 74 33 32 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  t32() function..
4850: 20 20 2a 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    **.  **  PRAGM
4860: 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67 65 5f  A [schema.]page_
4870: 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  count.  **.  ** 
4880: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4890: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
48a0: 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
48b0: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
48c0: 65 20 50 72 61 67 54 79 70 5f 50 41 47 45 5f 43  e PragTyp_PAGE_C
48d0: 4f 55 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  OUNT: {.    int 
48e0: 69 52 65 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  iReg;.    sqlite
48f0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
4900: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
4910: 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61      iReg = ++pPa
4920: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
4930: 66 28 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65  f( sqlite3Tolowe
4940: 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 70 27  r(zLeft[0])=='p'
4950: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4960: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4970: 50 5f 50 61 67 65 63 6f 75 6e 74 2c 20 69 44 62  P_Pagecount, iDb
4980: 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c  , iReg);.    }el
4990: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
49a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
49b0: 50 5f 4d 61 78 50 67 63 6e 74 2c 20 69 44 62 2c  P_MaxPgcnt, iDb,
49c0: 20 69 52 65 67 2c 20 0a 20 20 20 20 20 20 20 20   iReg, .        
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49e0: 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
49f0: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
4a00: 68 74 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ht)));.    }.   
4a10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4a20: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
4a30: 6f 77 2c 20 69 52 65 67 2c 20 31 29 3b 0a 20 20  ow, iReg, 1);.  
4a40: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
4a50: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
4a60: 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 69 6e 67  [schema.]locking
4a70: 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47  _mode.  **  PRAG
4a80: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
4a90: 69 6e 67 5f 6d 6f 64 65 20 3d 20 28 6e 6f 72 6d  ing_mode = (norm
4aa0: 61 6c 7c 65 78 63 6c 75 73 69 76 65 29 0a 20 20  al|exclusive).  
4ab0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
4ac0: 70 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3a 20  p_LOCKING_MODE: 
4ad0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
4ae0: 20 2a 7a 52 65 74 20 3d 20 22 6e 6f 72 6d 61 6c   *zRet = "normal
4af0: 22 3b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65  ";.    int eMode
4b00: 20 3d 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64   = getLockingMod
4b10: 65 28 7a 52 69 67 68 74 29 3b 0a 0a 20 20 20 20  e(zRight);..    
4b20: 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26  if( pId2->n==0 &
4b30: 26 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  & eMode==PAGER_L
4b40: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
4b50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6d   ){.      /* Sim
4b60: 70 6c 65 20 22 50 52 41 47 4d 41 20 6c 6f 63 6b  ple "PRAGMA lock
4b70: 69 6e 67 5f 6d 6f 64 65 3b 22 20 73 74 61 74 65  ing_mode;" state
4b80: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20  ment. This is a 
4b90: 71 75 65 72 79 20 66 6f 72 0a 20 20 20 20 20 20  query for.      
4ba0: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  ** the current d
4bb0: 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 6d  efault locking m
4bc0: 6f 64 65 20 28 77 68 69 63 68 20 6d 61 79 20 62  ode (which may b
4bd0: 65 20 64 69 66 66 65 72 65 6e 74 20 74 6f 0a 20  e different to. 
4be0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b       ** the lock
4bf0: 69 6e 67 2d 6d 6f 64 65 20 6f 66 20 74 68 65 20  ing-mode of the 
4c00: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 29 2e 0a  main database)..
4c10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 65        */.      e
4c20: 4d 6f 64 65 20 3d 20 64 62 2d 3e 64 66 6c 74 4c  Mode = db->dfltL
4c30: 6f 63 6b 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c  ockMode;.    }el
4c40: 73 65 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20  se{.      Pager 
4c50: 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 69  *pPager;.      i
4c60: 66 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b  f( pId2->n==0 ){
4c70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
4c80: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
4c90: 6e 6f 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  no database name
4ca0: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 61   was specified a
4cb0: 73 20 70 61 72 74 0a 20 20 20 20 20 20 20 20 2a  s part.        *
4cc0: 2a 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  * of the PRAGMA 
4cd0: 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74 68 69 73  command. In this
4ce0: 20 63 61 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e   case the lockin
4cf0: 67 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 0a 20  g-mode must be. 
4d00: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e         ** set on
4d10: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
4d20: 74 61 62 61 73 65 73 2c 20 61 73 20 77 65 6c 6c  tabases, as well
4d30: 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64 62 20   as the main db 
4d40: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  file..        **
4d50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f  .        ** Also
4d60: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 2e 64 66  , the sqlite3.df
4d70: 6c 74 4c 6f 63 6b 4d 6f 64 65 20 76 61 72 69 61  ltLockMode varia
4d80: 62 6c 65 20 69 73 20 73 65 74 20 73 6f 20 74 68  ble is set so th
4d90: 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  at.        ** an
4da0: 79 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 61  y subsequently a
4db0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
4dc0: 73 20 61 6c 73 6f 20 75 73 65 20 74 68 65 20 73  s also use the s
4dd0: 70 65 63 69 66 69 65 64 0a 20 20 20 20 20 20 20  pecified.       
4de0: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65   ** locking mode
4df0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
4e00: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
4e10: 20 20 20 20 20 61 73 73 65 72 74 28 70 44 62 3d       assert(pDb=
4e20: 3d 26 64 62 2d 3e 61 44 62 5b 30 5d 29 3b 0a 20  =&db->aDb[0]);. 
4e30: 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 32 3b         for(ii=2;
4e40: 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b   ii<db->nDb; ii+
4e50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50  +){.          pP
4e60: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
4e70: 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
4e80: 5b 69 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20  [ii].pBt);.     
4e90: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
4ea0: 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61  rLockingMode(pPa
4eb0: 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ger, eMode);.   
4ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
4ed0: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
4ee0: 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20  = (u8)eMode;.   
4ef0: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
4f00: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
4f10: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
4f20: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 73  .      eMode = s
4f30: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
4f40: 6e 67 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65  ngMode(pPager, e
4f50: 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mode);.    }..  
4f60: 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
4f70: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4f80: 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
4f90: 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
4fa0: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4fb0: 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
4fc0: 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41     if( eMode==PA
4fd0: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
4fe0: 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
4ff0: 20 20 20 7a 52 65 74 20 3d 20 22 65 78 63 6c 75     zRet = "exclu
5000: 73 69 76 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20  sive";.    }.   
5010: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
5020: 74 28 76 2c 20 7a 52 65 74 29 3b 0a 20 20 20 20  t(v, zRet);.    
5030: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
5040: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5050: 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d  chema.]journal_m
5060: 6f 64 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ode.  **  PRAGMA
5070: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5080: 6c 5f 6d 6f 64 65 20 3d 0a 20 20 2a 2a 20 20 20  l_mode =.  **   
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 28 64 65 6c 65 74 65 7c 70 65 72 73 69     (delete|persi
50b0: 73 74 7c 6f 66 66 7c 74 72 75 6e 63 61 74 65 7c  st|off|truncate|
50c0: 6d 65 6d 6f 72 79 7c 77 61 6c 7c 6f 66 66 29 0a  memory|wal|off).
50d0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
50e0: 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 4d 4f 44 45  Typ_JOURNAL_MODE
50f0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64  : {.    int eMod
5100: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  e;        /* One
5110: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
5120: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 73 79  URNALMODE_XXX sy
5130: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  mbols */.    int
5140: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f   ii;           /
5150: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
5160: 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  /..    if( zRigh
5170: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
5180: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
5190: 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 6f 66 20  "=MODE" part of 
51a0: 74 68 65 20 70 72 61 67 6d 61 2c 20 64 6f 20 61  the pragma, do a
51b0: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20   query for the. 
51c0: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
51d0: 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 65 4d  mode */.      eM
51e0: 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
51f0: 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20  NALMODE_QUERY;. 
5200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64  const char *zMod
5220: 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  e;.      int n =
5230: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
5240: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
5250: 66 6f 72 28 65 4d 6f 64 65 3d 30 3b 20 28 7a 4d  for(eMode=0; (zM
5260: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75  ode = sqlite3Jou
5270: 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4d 6f  rnalModename(eMo
5280: 64 65 29 29 21 3d 30 3b 20 65 4d 6f 64 65 2b 2b  de))!=0; eMode++
5290: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
52a0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
52b0: 52 69 67 68 74 2c 20 7a 4d 6f 64 65 2c 20 6e 29  Right, zMode, n)
52c0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
52d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
52e0: 7a 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  zMode ){.       
52f0: 20 2f 2a 20 49 66 20 74 68 65 20 22 3d 4d 4f 44   /* If the "=MOD
5300: 45 22 20 70 61 72 74 20 64 6f 65 73 20 6e 6f 74  E" part does not
5310: 20 6d 61 74 63 68 20 61 6e 79 20 6b 6e 6f 77 6e   match any known
5320: 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 0a 20   journal mode,. 
5330: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64         ** then d
5340: 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  o a query */.   
5350: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
5360: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
5370: 55 45 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UERY;.      }.  
5380: 20 20 7d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64    }.    if( eMod
5390: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
53a0: 4d 4f 44 45 5f 51 55 45 52 59 20 26 26 20 70 49  MODE_QUERY && pI
53b0: 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  d2->n==0 ){.    
53c0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 50 52    /* Convert "PR
53d0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
53e0: 65 22 20 69 6e 74 6f 20 22 50 52 41 47 4d 41 20  e" into "PRAGMA 
53f0: 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  main.journal_mod
5400: 65 22 20 2a 2f 0a 20 20 20 20 20 20 69 44 62 20  e" */.      iDb 
5410: 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 64 32 2d  = 0;.      pId2-
5420: 3e 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  >n = 1;.    }.  
5430: 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62    for(ii=db->nDb
5440: 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29  -1; ii>=0; ii--)
5450: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
5460: 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28  aDb[ii].pBt && (
5470: 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d  ii==iDb || pId2-
5480: 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  >n==0) ){.      
5490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
54a0: 73 42 74 72 65 65 28 76 2c 20 69 69 29 3b 0a 20  sBtree(v, ii);. 
54b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
54c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
54d0: 6f 75 72 6e 61 6c 4d 6f 64 65 2c 20 69 69 2c 20  ournalMode, ii, 
54e0: 31 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  1, eMode);.     
54f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
5500: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5510: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
5520: 31 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b  1, 1);.    break
5530: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
5540: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
5550: 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  .]journal_size_l
5560: 69 6d 69 74 0a 20 20 2a 2a 20 20 50 52 41 47 4d  imit.  **  PRAGM
5570: 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e  A [schema.]journ
5580: 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 3d 4e 0a  al_size_limit=N.
5590: 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72    **.  ** Get or
55a0: 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6c 69   set the size li
55b0: 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  mit on rollback 
55c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 20  journal files.. 
55d0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
55e0: 79 70 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  yp_JOURNAL_SIZE_
55f0: 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 50 61 67  LIMIT: {.    Pag
5600: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
5610: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
5620: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 69 36  Db->pBt);.    i6
5630: 34 20 69 4c 69 6d 69 74 20 3d 20 2d 32 3b 0a 20  4 iLimit = -2;. 
5640: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
5650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
5660: 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67  cOrHexToI64(zRig
5670: 68 74 2c 20 26 69 4c 69 6d 69 74 29 3b 0a 20 20  ht, &iLimit);.  
5680: 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 2d      if( iLimit<-
5690: 31 20 29 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  1 ) iLimit = -1;
56a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 69 6d 69  .    }.    iLimi
56b0: 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  t = sqlite3Pager
56c0: 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
56d0: 28 70 50 61 67 65 72 2c 20 69 4c 69 6d 69 74 29  (pPager, iLimit)
56e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  ;.    returnSing
56f0: 6c 65 49 6e 74 28 76 2c 20 69 4c 69 6d 69 74 29  leInt(v, iLimit)
5700: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
5710: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
5720: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
5730: 41 47 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  AGMAS */..  /*. 
5740: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
5750: 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d  ema.]auto_vacuum
5760: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5770: 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75  chema.]auto_vacu
5780: 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47  um=N.  **.  ** G
5790: 65 74 20 6f 72 20 73 65 74 20 74 68 65 20 76 61  et or set the va
57a0: 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  lue of the datab
57b0: 61 73 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  ase 'auto-vacuum
57c0: 27 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a  ' parameter..  *
57d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 6f  * The value is o
57e0: 6e 65 20 6f 66 3a 20 20 30 20 4e 4f 4e 45 20 31  ne of:  0 NONE 1
57f0: 20 46 55 4c 4c 20 32 20 49 4e 43 52 45 4d 45 4e   FULL 2 INCREMEN
5800: 54 41 4c 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  TAL.  */.#ifndef
5810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5820: 4f 56 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50  OVACUUM.  case P
5830: 72 61 67 54 79 70 5f 41 55 54 4f 5f 56 41 43 55  ragTyp_AUTO_VACU
5840: 55 4d 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20  UM: {.    Btree 
5850: 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b  *pBt = pDb->pBt;
5860: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
5870: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21  !=0 );.    if( !
5880: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
5890: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
58a0: 76 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  v, sqlite3BtreeG
58b0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74  etAutoVacuum(pBt
58c0: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
58d0: 20 20 20 20 20 69 6e 74 20 65 41 75 74 6f 20 3d       int eAuto =
58e0: 20 67 65 74 41 75 74 6f 56 61 63 75 75 6d 28 7a   getAutoVacuum(z
58f0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
5900: 73 65 72 74 28 20 65 41 75 74 6f 3e 3d 30 20 26  sert( eAuto>=0 &
5910: 26 20 65 41 75 74 6f 3c 3d 32 20 29 3b 0a 20 20  & eAuto<=2 );.  
5920: 20 20 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f      db->nextAuto
5930: 76 61 63 20 3d 20 28 75 38 29 65 41 75 74 6f 3b  vac = (u8)eAuto;
5940: 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 53  .      /* Call S
5950: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 29 20 74  etAutoVacuum() t
5960: 6f 20 73 65 74 20 69 6e 69 74 69 61 6c 69 7a 65  o set initialize
5970: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 75   the internal au
5980: 74 6f 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  to and.      ** 
5990: 69 6e 63 72 2d 76 61 63 75 75 6d 20 66 6c 61 67  incr-vacuum flag
59a0: 73 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  s. This is requi
59b0: 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
59c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
59d0: 20 20 2a 2a 20 63 72 65 61 74 65 73 20 74 68 65    ** creates the
59e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
59f0: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
5a00: 74 68 61 74 20 69 74 20 69 73 20 63 72 65 61 74  that it is creat
5a10: 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 61  ed.      ** as a
5a20: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  n auto-vacuum ca
5a30: 70 61 62 6c 65 20 64 62 2e 0a 20 20 20 20 20 20  pable db..      
5a40: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
5a50: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
5a60: 6f 56 61 63 75 75 6d 28 70 42 74 2c 20 65 41 75  oVacuum(pBt, eAu
5a70: 74 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  to);.      if( r
5a80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
5a90: 28 65 41 75 74 6f 3d 3d 31 20 7c 7c 20 65 41 75  (eAuto==1 || eAu
5aa0: 74 6f 3d 3d 32 29 20 29 7b 0a 20 20 20 20 20 20  to==2) ){.      
5ab0: 20 20 2f 2a 20 57 68 65 6e 20 73 65 74 74 69 6e    /* When settin
5ac0: 67 20 74 68 65 20 61 75 74 6f 5f 76 61 63 75 75  g the auto_vacuu
5ad0: 6d 20 6d 6f 64 65 20 74 6f 20 65 69 74 68 65 72  m mode to either
5ae0: 20 22 66 75 6c 6c 22 20 6f 72 20 0a 20 20 20 20   "full" or .    
5af0: 20 20 20 20 2a 2a 20 22 69 6e 63 72 65 6d 65 6e      ** "incremen
5b00: 74 61 6c 22 2c 20 77 72 69 74 65 20 74 68 65 20  tal", write the 
5b10: 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 36 5d  value of meta[6]
5b20: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5b30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
5b40: 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
5b50: 20 74 6f 20 6d 65 74 61 5b 36 5d 2c 20 63 68 65   to meta[6], che
5b60: 63 6b 20 74 68 61 74 20 6d 65 74 61 5b 33 5d 20  ck that meta[3] 
5b70: 69 6e 64 69 63 61 74 65 73 0a 20 20 20 20 20 20  indicates.      
5b80: 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
5b90: 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 75 74 6f  eally is an auto
5ba0: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
5bb0: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
5bc0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61    */.        sta
5bd0: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
5be0: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
5bf0: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20  LINENO(2);.     
5c00: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
5c10: 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 4d 65  VdbeOpList setMe
5c20: 74 61 36 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ta6[] = {.      
5c30: 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63      { OP_Transac
5c40: 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 20 20 20  tion,    0,     
5c50: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
5c60: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
5c70: 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   0 */.          
5c80: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
5c90: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
5ca0: 31 2c 20 20 20 20 20 20 20 20 20 42 54 52 45 45  1,         BTREE
5cb0: 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41  _LARGEST_ROOT_PA
5cc0: 47 45 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 7b  GE},.          {
5cd0: 20 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20 20   OP_If,         
5ce0: 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 30      1,         0
5cf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5d00: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f    0},    /* 2 */
5d10: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5d20: 48 61 6c 74 2c 20 20 20 20 20 20 20 20 20 20 20  Halt,           
5d30: 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 41 62  SQLITE_OK, OE_Ab
5d40: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 30 7d  ort,          0}
5d50: 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20  ,    /* 3 */.   
5d60: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43         { OP_SetC
5d70: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20  ookie,      0,  
5d80: 20 20 20 20 20 20 20 42 54 52 45 45 5f 49 4e 43         BTREE_INC
5d90: 52 5f 56 41 43 55 55 4d 2c 20 30 7d 2c 20 20 20  R_VACUUM, 0},   
5da0: 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20   /* 4 */.       
5db0: 20 7d 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65   };.        Vdbe
5dc0: 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 20  Op *aOp;.       
5dd0: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
5de0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5df0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
5e00: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
5e10: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
5e20: 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73  d(v, ArraySize(s
5e30: 65 74 4d 65 74 61 36 29 29 3b 0a 20 20 20 20 20  etMeta6));.     
5e40: 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33     aOp = sqlite3
5e50: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
5e60: 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 4d 65   ArraySize(setMe
5e70: 74 61 36 29 2c 20 73 65 74 4d 65 74 61 36 2c 20  ta6), setMeta6, 
5e80: 69 4c 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  iLn);.        if
5e90: 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f  ( ONLY_IF_REALLO
5ea0: 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29  C_STRESS(aOp==0)
5eb0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5ec0: 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44    aOp[0].p1 = iD
5ed0: 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 31  b;.        aOp[1
5ee0: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
5ef0: 20 20 20 20 61 4f 70 5b 32 5d 2e 70 32 20 3d 20      aOp[2].p2 = 
5f00: 69 41 64 64 72 2b 34 3b 0a 20 20 20 20 20 20 20  iAddr+4;.       
5f10: 20 61 4f 70 5b 34 5d 2e 70 31 20 3d 20 69 44 62   aOp[4].p1 = iDb
5f20: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d  ;.        aOp[4]
5f30: 2e 70 33 20 3d 20 65 41 75 74 6f 20 2d 20 31 3b  .p3 = eAuto - 1;
5f40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5f50: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
5f60: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
5f70: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
5f80: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
5f90: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5fa0: 63 68 65 6d 61 2e 5d 69 6e 63 72 65 6d 65 6e 74  chema.]increment
5fb0: 61 6c 5f 76 61 63 75 75 6d 28 4e 29 0a 20 20 2a  al_vacuum(N).  *
5fc0: 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20 73 74 65 70  *.  ** Do N step
5fd0: 73 20 6f 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s of incremental
5fe0: 20 76 61 63 75 75 6d 69 6e 67 20 6f 6e 20 61 20   vacuuming on a 
5ff0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
6000: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6010: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
6020: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 43  case PragTyp_INC
6030: 52 45 4d 45 4e 54 41 4c 5f 56 41 43 55 55 4d 3a  REMENTAL_VACUUM:
6040: 20 7b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69   {.    int iLimi
6050: 74 2c 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28  t, addr;.    if(
6060: 20 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 21 73   zRight==0 || !s
6070: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
6080: 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 20  Right, &iLimit) 
6090: 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a  || iLimit<=0 ){.
60a0: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 30        iLimit = 0
60b0: 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 7d  x7fffffff;.    }
60c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
60d0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
60e0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
60f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6100: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6110: 65 67 65 72 2c 20 69 4c 69 6d 69 74 2c 20 31 29  eger, iLimit, 1)
6120: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
6130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6140: 2c 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 2c  , OP_IncrVacuum,
6150: 20 69 44 62 29 3b 20 56 64 62 65 43 6f 76 65 72   iDb); VdbeCover
6160: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
6170: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6180: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
6190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
61a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
61b0: 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20  ddImm, 1, -1);. 
61c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
61d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
61e0: 2c 20 31 2c 20 61 64 64 72 29 3b 20 56 64 62 65  , 1, addr); Vdbe
61f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6200: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6210: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
6220: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
6230: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
6240: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
6250: 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a  PRAGMAS.  /*.  *
6260: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
6270: 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 0a 20 20  a.]cache_size.  
6280: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
6290: 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 3d 4e  ma.]cache_size=N
62a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
62b0: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
62c0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
62d0: 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20  cal setting for 
62e0: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
62f0: 63 68 65 20 73 69 7a 65 2e 20 54 68 65 20 73 65  che size. The se
6300: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
6310: 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61  he local.  ** pa
6320: 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  ge cache size va
6330: 6c 75 65 2e 20 20 49 66 20 4e 20 69 73 20 70 6f  lue.  If N is po
6340: 73 69 74 69 76 65 20 74 68 65 6e 20 74 68 61 74  sitive then that
6350: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d   is the.  ** num
6360: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
6370: 74 68 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e  the cache.  If N
6380: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
6390: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62  en the.  ** numb
63a0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 73 20 61  er of pages is a
63b0: 64 6a 75 73 74 65 64 20 73 6f 20 74 68 61 74 20  djusted so that 
63c0: 74 68 65 20 63 61 63 68 65 20 75 73 65 73 20 2d  the cache uses -
63d0: 4e 20 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a  N kibibytes.  **
63e0: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f   of memory..  */
63f0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
6400: 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a 20 20  CACHE_SIZE: {.  
6410: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6420: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
6430: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
6440: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
6450: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
6460: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
6470: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
6480: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  size);.    }else
6490: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
64a0: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
64b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 44  Right);.      pD
64c0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68  b->pSchema->cach
64d0: 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20  e_size = size;. 
64e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
64f0: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44  eSetCacheSize(pD
6500: 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63  b->pBt, pDb->pSc
6510: 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65  hema->cache_size
6520: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
6530: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
6540: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
6550: 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69 6c 6c 0a  ma.]cache_spill.
6560: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63    **  PRAGMA cac
6570: 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e  he_spill=BOOLEAN
6580: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
6590: 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69  chema.]cache_spi
65a0: 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ll=N.  **.  ** T
65b0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
65c0: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
65d0: 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  t local setting 
65e0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
65f0: 65 20 63 61 63 68 65 20 73 70 69 6c 6c 20 73 69  e cache spill si
6600: 7a 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66  ze. The second f
6610: 6f 72 6d 20 74 75 72 6e 73 20 63 61 63 68 65 20  orm turns cache 
6620: 73 70 69 6c 6c 20 6f 6e 0a 20 20 2a 2a 20 6f 72  spill on.  ** or
6630: 20 6f 66 66 2e 20 20 57 68 65 6e 20 74 75 72 6e   off.  When turn
6640: 6e 69 6e 67 20 63 61 63 68 65 20 73 70 69 6c 6c  ning cache spill
6650: 20 6f 6e 2c 20 74 68 65 20 73 69 7a 65 20 69 73   on, the size is
6660: 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a   set to the.  **
6670: 20 63 75 72 72 65 6e 74 20 63 61 63 68 65 5f 73   current cache_s
6680: 69 7a 65 2e 20 20 54 68 65 20 74 68 69 72 64 20  ize.  The third 
6690: 66 6f 72 6d 20 73 65 74 73 20 61 20 73 70 69 6c  form sets a spil
66a0: 6c 20 73 69 7a 65 20 74 68 61 74 0a 20 20 2a 2a  l size that.  **
66b0: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
66c0: 74 20 66 6f 72 6d 20 74 68 65 20 63 61 63 68 65  t form the cache
66d0: 20 73 69 7a 65 2e 0a 20 20 2a 2a 20 49 66 20 4e   size..  ** If N
66e0: 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68 65   is positive the
66f0: 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  n that is the.  
6700: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6710: 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
6720: 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69    If N is negati
6730: 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ve, then the.  *
6740: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
6750: 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f  s is adjusted so
6760: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
6770: 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65  uses -N kibibyte
6780: 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  s.  ** of memory
6790: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
67a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  he number of cac
67b0: 68 65 5f 73 70 69 6c 6c 20 70 61 67 65 73 20 69  he_spill pages i
67c0: 73 20 6c 65 73 73 20 74 68 65 6e 20 74 68 65 20  s less then the 
67d0: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63  number of.  ** c
67e0: 61 63 68 65 5f 73 69 7a 65 20 70 61 67 65 73 2c  ache_size pages,
67f0: 20 6e 6f 20 73 70 69 6c 6c 69 6e 67 20 6f 63 63   no spilling occ
6800: 75 72 73 20 75 6e 74 69 6c 20 74 68 65 20 70 61  urs until the pa
6810: 67 65 20 63 6f 75 6e 74 20 65 78 63 65 65 64 73  ge count exceeds
6820: 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
6830: 20 6f 66 20 63 61 63 68 65 5f 73 69 7a 65 20 70   of cache_size p
6840: 61 67 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ages..  **.  ** 
6850: 54 68 65 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d  The cache_spill=
6860: 42 4f 4f 4c 45 41 4e 20 73 65 74 74 69 6e 67 20  BOOLEAN setting 
6870: 61 70 70 6c 69 65 73 20 74 6f 20 61 6c 6c 20 61  applies to all a
6880: 74 74 61 63 68 65 64 20 73 63 68 65 6d 61 73 2c  ttached schemas,
6890: 0a 20 20 2a 2a 20 6e 6f 74 20 6a 75 73 74 20 74  .  ** not just t
68a0: 68 65 20 73 63 68 65 6d 61 20 73 70 65 63 69 66  he schema specif
68b0: 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ied..  */.  case
68c0: 20 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53   PragTyp_CACHE_S
68d0: 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 61 73 73 65  PILL: {.    asse
68e0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
68f0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
6900: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
6910: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
6920: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
6930: 6e 74 28 76 2c 0a 20 20 20 20 20 20 20 20 20 28  nt(v,.         (
6940: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
6950: 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 29 3d 3d  TE_CacheSpill)==
6960: 30 20 3f 20 30 20 3a 20 0a 20 20 20 20 20 20 20  0 ? 0 : .       
6970: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
6980: 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70 44  eSetSpillSize(pD
6990: 62 2d 3e 70 42 74 2c 30 29 29 3b 0a 20 20 20 20  b->pBt,0));.    
69a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
69b0: 20 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 20   size = 1;.     
69c0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
69d0: 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 73 69  nt32(zRight, &si
69e0: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ze) ){.        s
69f0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70  qlite3BtreeSetSp
6a00: 69 6c 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74  illSize(pDb->pBt
6a10: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  , size);.      }
6a20: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6a30: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  e3GetBoolean(zRi
6a40: 67 68 74 2c 20 73 69 7a 65 21 3d 30 29 20 29 7b  ght, size!=0) ){
6a50: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
6a60: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 61 63  gs |= SQLITE_Cac
6a70: 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d  heSpill;.      }
6a80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62  else{.        db
6a90: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34  ->flags &= ~(u64
6aa0: 29 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69  )SQLITE_CacheSpi
6ab0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
6ac0: 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61    setAllPagerFla
6ad0: 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  gs(db);.    }.  
6ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6af0: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
6b00: 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69  [schema.]mmap_si
6b10: 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ze(N).  **.  ** 
6b20: 55 73 65 64 20 74 6f 20 73 65 74 20 6d 61 70 70  Used to set mapp
6b30: 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20  ing size limit. 
6b40: 54 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  The mapping size
6b50: 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75   limit is.  ** u
6b60: 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65  sed to limit the
6b70: 20 61 67 67 72 65 67 61 74 65 20 73 69 7a 65 20   aggregate size 
6b80: 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61  of all memory ma
6b90: 70 70 65 64 20 72 65 67 69 6f 6e 73 20 6f 66 20  pped regions of 
6ba0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
6bb0: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20  e file. If this 
6bc0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
6bd0: 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d   to zero, then m
6be0: 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a 20 20  emory mapping.  
6bf0: 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 20 61  ** is not used a
6c00: 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20  t all.  If N is 
6c10: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
6c20: 68 65 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72  he default memor
6c30: 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74  y map.  ** limit
6c40: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 73   determined by s
6c50: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
6c60: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
6c70: 5f 53 49 5a 45 29 20 69 73 20 73 65 74 2e 0a 20  _SIZE) is set.. 
6c80: 20 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65   ** The paramete
6c90: 72 20 4e 20 69 73 20 6d 65 61 73 75 72 65 64 20  r N is measured 
6ca0: 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20  in bytes..  **. 
6cb0: 20 2a 2a 20 54 68 69 73 20 76 61 6c 75 65 20 69   ** This value i
6cc0: 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65  s advisory.  The
6cd0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20   underlying VFS 
6ce0: 69 73 20 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72  is free to memor
6cf0: 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69  y map.  ** as li
6d00: 74 74 6c 65 20 6f 72 20 61 73 20 6d 75 63 68 20  ttle or as much 
6d10: 61 73 20 69 74 20 77 61 6e 74 73 2e 20 20 45 78  as it wants.  Ex
6d20: 63 65 70 74 2c 20 69 66 20 4e 20 69 73 20 73 65  cept, if N is se
6d30: 74 20 74 6f 20 30 20 74 68 65 6e 20 74 68 65 0a  t to 0 then the.
6d40: 20 20 2a 2a 20 75 70 70 65 72 20 6c 61 79 65 72    ** upper layer
6d50: 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76  s will never inv
6d60: 6f 6b 65 20 74 68 65 20 78 46 65 74 63 68 20 69  oke the xFetch i
6d70: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 74 68 65  nterfaces to the
6d80: 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   VFS..  */.  cas
6d90: 65 20 50 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53  e PragTyp_MMAP_S
6da0: 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  IZE: {.    sqlit
6db0: 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66  e3_int64 sz;.#if
6dc0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
6dd0: 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61 73 73 65  _SIZE>0.    asse
6de0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
6df0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
6e00: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66  Db, 0) );.    if
6e10: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
6e20: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
6e30: 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
6e40: 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 73 7a  oI64(zRight, &sz
6e50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c  );.      if( sz<
6e60: 30 20 29 20 73 7a 20 3d 20 73 71 6c 69 74 65 33  0 ) sz = sqlite3
6e70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
6e80: 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  map;.      if( p
6e90: 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e  Id2->n==0 ) db->
6ea0: 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20  szMmap = sz;.   
6eb0: 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44     for(ii=db->nD
6ec0: 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d  b-1; ii>=0; ii--
6ed0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  ){.        if( d
6ee0: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26  b->aDb[ii].pBt &
6ef0: 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49  & (ii==iDb || pI
6f00: 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20  d2->n==0) ){.   
6f10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6f20: 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
6f30: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c  db->aDb[ii].pBt,
6f40: 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   sz);.        }.
6f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6f60: 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72    sz = -1;.    r
6f70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
6f80: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
6f90: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  , SQLITE_FCNTL_M
6fa0: 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a  MAP_SIZE, &sz);.
6fb0: 23 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d 20 30  #else.    sz = 0
6fc0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
6fd0: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  E_OK;.#endif.   
6fe0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6ff0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
7000: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
7010: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  z);.    }else if
7020: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc!=SQLITE_NOT
7030: 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 70  FOUND ){.      p
7040: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7050: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
7060: 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = rc;.    }.    
7070: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
7080: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
7090: 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20  emp_store.  **  
70a0: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
70b0: 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22 7c 22  re = "default"|"
70c0: 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20  memory"|"file". 
70d0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
70e0: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
70f0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65   value of the te
7100: 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20 20  mp_store flag.  
7110: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7120: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f  e local value do
7130: 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e  es not make chan
7140: 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ges to the disk 
7150: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 65 66  file and the def
7160: 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20  ault.  ** value 
7170: 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64  will be restored
7180: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
7190: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
71a0: 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pened..  **.  **
71b0: 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73   Note that it is
71c0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
71d0: 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70 69 6c  e library compil
71e0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74  e-time options t
71f0: 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64 65 20  o.  ** override 
7200: 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20 20 2a  this setting.  *
7210: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7220: 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20  _TEMP_STORE: {. 
7230: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
7240: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
7250: 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74  ngleInt(v, db->t
7260: 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20  emp_store);.    
7270: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
7280: 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70  ngeTempStorage(p
7290: 50 61 72 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a  Parse, zRight);.
72a0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
72b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
72c0: 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74    PRAGMA temp_st
72d0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20  ore_directory.  
72e0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
72f0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
7300: 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79   = ""|"directory
7310: 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _name".  **.  **
7320: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
7330: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
7340: 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65  f the temp_store
7350: 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e  _directory flag.
7360: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
7370: 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61  the value sets a
7380: 20 73 70 65 63 69 66 69 63 20 64 69 72 65 63 74   specific direct
7390: 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64 20 66  ory to be used f
73a0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
73b0: 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67  es..  ** Setting
73c0: 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e   to a null strin
73d0: 67 20 72 65 76 65 72 74 73 20 74 6f 20 74 68 65  g reverts to the
73e0: 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72 61   default tempora
73f0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 65 61  ry directory sea
7400: 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d  rch..  ** If tem
7410: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
7420: 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
7430: 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70  n invalidateTemp
7440: 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20  Storage..  **.  
7450: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
7460: 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52  p_TEMP_STORE_DIR
7470: 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66  ECTORY: {.    if
7480: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
7490: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54     returnSingleT
74a0: 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 74  ext(v, sqlite3_t
74b0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
74c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64      }else{.#ifnd
74d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
74e0: 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  SD.      if( zRi
74f0: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
7500: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
7510: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7520: 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73  sAccess(db->pVfs
7530: 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45  , zRight, SQLITE
7540: 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
7550: 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  E, &res);.      
7560: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7570: 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b  _OK || res==0 ){
7580: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7590: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
75a0: 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62  e, "not a writab
75b0: 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a  le directory");.
75c0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
75d0: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20  ragma_out;.     
75e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
75f0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45     if( SQLITE_TE
7600: 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20  MP_STORE==0.    
7610: 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45     || (SQLITE_TE
7620: 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64  MP_STORE==1 && d
7630: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31  b->temp_store<=1
7640: 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c  ).       || (SQL
7650: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
7660: 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74  2 && db->temp_st
7670: 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b  ore==1).      ){
7680: 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
7690: 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70  ateTempStorage(p
76a0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
76b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
76c0: 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ee(sqlite3_temp_
76d0: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
76e0: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
76f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7700: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7710: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
7720: 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74  ntf("%s", zRight
7730: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7740: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7750: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
7760: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
7770: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7780: 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20  T_WSD */.    }. 
7790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23     break;.  }..#
77a0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
77b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
77c0: 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  GMA data_store_d
77d0: 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20  irectory.  **   
77e0: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
77f0: 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22  e_directory = ""
7800: 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65  |"directory_name
7810: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
7820: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
7830: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
7840: 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
7850: 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61  ctory flag.  Cha
7860: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76  nging.  ** the v
7870: 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63  alue sets a spec
7880: 69 66 69 63 20 64 69 72 65 63 74 6f 72 79 20 74  ific directory t
7890: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61  o be used for da
78a0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 74 68 61  tabase files tha
78b0: 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63  t.  ** were spec
78c0: 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c  ified with a rel
78d0: 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20  ative pathname. 
78e0: 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75   Setting to a nu
78f0: 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74  ll string revert
7900: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65  s.  ** to the de
7910: 66 61 75 6c 74 20 64 61 74 61 62 61 73 65 20 64  fault database d
7920: 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20  irectory, which 
7930: 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  for database fil
7940: 65 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  es specified wit
7950: 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76  h.  ** a relativ
7960: 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62  e path will prob
7970: 61 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e  ably be based on
7980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72   the current dir
7990: 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20  ectory for the. 
79a0: 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61   ** process.  Da
79b0: 74 61 62 61 73 65 20 66 69 6c 65 20 73 70 65 63  tabase file spec
79c0: 69 66 69 65 64 20 77 69 74 68 20 61 6e 20 61 62  ified with an ab
79d0: 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65 20  solute path are 
79e0: 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a  not impacted.  *
79f0: 2a 20 62 79 20 74 68 69 73 20 73 65 74 74 69 6e  * by this settin
7a00: 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  g, regardless of
7a10: 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a   its value..  **
7a20: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7a30: 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f  gTyp_DATA_STORE_
7a40: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7a50: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7a60: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7a70: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
7a80: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7a90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
7aa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7ab0: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
7ac0: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
7ad0: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
7ae0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7af0: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
7b00: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
7b10: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
7b20: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
7b30: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7b40: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
7b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7b60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7b70: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
7b80: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
7b90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
7ba0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
7bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7bd0: 65 65 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  ee(sqlite3_data_
7be0: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
7bf0: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
7c00: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7c10: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7c20: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
7c30: 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74  ntf("%s", zRight
7c40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7c50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7c60: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
7c70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
7c80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7c90: 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20  T_WSD */.    }. 
7ca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
7cb0: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
7cc0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
7cd0: 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  STYLE.  /*.  ** 
7ce0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
7cf0: 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
7d00: 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  e.  **   PRAGMA 
7d10: 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72  [schema.]lock_pr
7d20: 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74  oxy_file = ":aut
7d30: 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70  o:"|"lock_file_p
7d40: 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ath".  **.  ** R
7d50: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
7d60: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
7d70: 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c  ck_proxy_file fl
7d80: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7d90: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7da0: 73 20 61 20 73 70 65 63 69 66 69 63 20 66 69 6c  s a specific fil
7db0: 65 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  e to be used for
7dc0: 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
7dd0: 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a   locks..  **.  *
7de0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
7df0: 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45  _LOCK_PROXY_FILE
7e00: 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  : {.    if( !zRi
7e10: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67  ght ){.      Pag
7e20: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
7e30: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
7e40: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
7e50: 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65  char *proxy_file
7e60: 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _path = NULL;.  
7e70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
7e80: 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *pFile = sqlite
7e90: 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
7ea0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7eb0: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
7ec0: 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  nt(pFile, SQLITE
7ed0: 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
7ee0: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68  &proxy_file_path
7f10: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  );.      returnS
7f20: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 70 72 6f  ingleText(v, pro
7f30: 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20  xy_file_path);. 
7f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7f50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7f60: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7f70: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7f80: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
7f90: 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *pFile = sqlite3
7fa0: 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
7fb0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  );.      int res
7fc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  ;.      if( zRig
7fd0: 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ht[0] ){.       
7fe0: 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69   res=sqlite3OsFi
7ff0: 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c  leControl(pFile,
8000: 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
8010: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
8050: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
8060: 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69   res=sqlite3OsFi
8070: 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c  leControl(pFile,
8080: 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
8090: 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20  PROXYFILE, .    
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a   NULL);.      }.
80d0: 20 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 53        if( res!=S
80e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
80f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8100: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 61 69  Msg(pParse, "fai
8110: 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20  led to set lock 
8120: 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20 20  proxy file");.  
8130: 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d        goto pragm
8140: 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  a_out;.      }. 
8150: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
8160: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
8170: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
8180: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20  ING_STYLE */    
8190: 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a    .    .  /*.  *
81a0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
81b0: 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  ma.]synchronous.
81c0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
81d0: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
81e0: 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c  us=OFF|ON|NORMAL
81f0: 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a  |FULL|EXTRA.  **
8200: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20  .  ** Return or 
8210: 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61  set the local va
8220: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68  lue of the synch
8230: 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68  ronous flag.  Ch
8240: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
8250: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73  local value does
8260: 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65   not make change
8270: 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69  s to the disk fi
8280: 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20  le and the.  ** 
8290: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
82a0: 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ll be restored t
82b0: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
82c0: 20 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a   database is.  *
82d0: 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  * opened..  */. 
82e0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 59   case PragTyp_SY
82f0: 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20  NCHRONOUS: {.   
8300: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
8310: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
8320: 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61  leInt(v, pDb->sa
8330: 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20  fety_level-1);. 
8340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8350: 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d  if( !db->autoCom
8360: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mit ){.        s
8370: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8380: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
8390: 20 20 20 20 22 53 61 66 65 74 79 20 6c 65 76 65      "Safety leve
83a0: 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61  l may not be cha
83b0: 6e 67 65 64 20 69 6e 73 69 64 65 20 61 20 74 72  nged inside a tr
83c0: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
83d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 44 62     }else if( iDb
83e0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=1 ){.        i
83f0: 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28 67 65 74  nt iLevel = (get
8400: 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67  SafetyLevel(zRig
8410: 68 74 2c 30 2c 31 29 2b 31 29 20 26 20 50 41 47  ht,0,1)+1) & PAG
8420: 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
8430: 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ASK;.        if(
8440: 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65   iLevel==0 ) iLe
8450: 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  vel = 1;.       
8460: 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
8470: 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20  el = iLevel;.   
8480: 20 20 20 20 20 70 44 62 2d 3e 62 53 79 6e 63 53       pDb->bSyncS
8490: 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
84a0: 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73  setAllPagerFlags
84b0: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
84c0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
84d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
84e0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
84f0: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
8500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
8510: 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61  LAG_PRAGMAS.  ca
8520: 73 65 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a  se PragTyp_FLAG:
8530: 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
8540: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 65  t==0 ){.      se
8550: 74 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c  tPragmaResultCol
8560: 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50 72 61  umnNames(v, pPra
8570: 67 6d 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  gma);.      retu
8580: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28  rnSingleInt(v, (
8590: 64 62 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61  db->flags & pPra
85a0: 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b  gma->iArg)!=0 );
85b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
85c0: 20 20 75 36 34 20 6d 61 73 6b 20 3d 20 70 50 72    u64 mask = pPr
85d0: 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f  agma->iArg;    /
85e0: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
85f0: 6f 20 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20  o set or clear. 
8600: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  */.      if( db-
8610: 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
8620: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
8630: 65 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74  eign key support
8640: 20 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62   may not be enab
8650: 6c 65 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20  led or disabled 
8660: 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20  while not.      
8670: 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d    ** in auto-com
8680: 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20  mit mode.  */.  
8690: 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28        mask &= ~(
86a0: 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
86b0: 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ys);.      }.#if
86c0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
86d0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
86e0: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
86f0: 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f  uthLevel==UAUTH_
8700: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  User ){.        
8710: 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
8720: 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20  non-admin users 
8730: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63  to modify the sc
8740: 68 65 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79  hema arbitrarily
8750: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b   */.        mask
8760: 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69   &= ~(SQLITE_Wri
8770: 74 65 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  teSchema);.     
8780: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
8790: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42   if( sqlite3GetB
87a0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
87b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  ) ){.        db-
87c0: 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  >flags |= mask;.
87d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
87e0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
87f0: 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = ~mask;.       
8800: 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54   if( mask==SQLIT
8810: 45 5f 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d  E_DeferFKs ) db-
8820: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
8830: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  s = 0;.      }..
8840: 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66        /* Many of
8850: 20 74 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61   the flag-pragma
8860: 73 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64  s modify the cod
8870: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
8880: 68 65 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a  he SQL .      **
8890: 20 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63   compiler (eg. c
88a0: 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53  ount_changes). S
88b0: 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  o add an opcode 
88c0: 74 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20  to expire all.  
88d0: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
88e0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  SQL statements a
88f0: 66 74 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  fter modifying a
8900: 20 70 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20   pragma value.. 
8910: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
8920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
8930: 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20  v, OP_Expire);. 
8940: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
8950: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
8960: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8970: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8980: 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d  _OMIT_FLAG_PRAGM
8990: 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  AS */..#ifndef S
89a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
89b0: 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20  A_PRAGMAS.  /*. 
89c0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 61 62   **   PRAGMA tab
89d0: 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29  le_info(<table>)
89e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
89f0: 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 66  n a single row f
8a00: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
8a10: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
8a20: 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  e. The columns o
8a30: 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 74 75 72  f.  ** the retur
8a40: 6e 65 64 20 64 61 74 61 20 73 65 74 20 61 72 65  ned data set are
8a50: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a  :.  **.  ** cid:
8a60: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69          Column i
8a70: 64 20 28 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d  d (numbered from
8a80: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
8a90: 73 74 61 72 74 69 6e 67 20 61 74 20 30 29 0a 20  starting at 0). 
8aa0: 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20 20 20   ** name:       
8ab0: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a  Column name.  **
8ac0: 20 74 79 70 65 3a 20 20 20 20 20 20 20 43 6f 6c   type:       Col
8ad0: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  umn declaration 
8ae0: 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75  type..  ** notnu
8af0: 6c 6c 3a 20 20 20 20 54 72 75 65 20 69 66 20 27  ll:    True if '
8b00: 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70 61 72  NOT NULL' is par
8b10: 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  t of column decl
8b20: 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c  aration.  ** dfl
8b30: 74 5f 76 61 6c 75 65 3a 20 54 68 65 20 64 65 66  t_value: The def
8b40: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
8b50: 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e  he column, if an
8b60: 79 2e 0a 20 20 2a 2a 20 70 6b 3a 20 20 20 20 20  y..  ** pk:     
8b70: 20 20 20 20 4e 6f 6e 2d 7a 65 72 6f 20 66 6f 72      Non-zero for
8b80: 20 50 4b 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f   PK fields..  */
8b90: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
8ba0: 54 41 42 4c 45 5f 49 4e 46 4f 3a 20 69 66 28 20  TABLE_INFO: if( 
8bb0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 54 61  zRight ){.    Ta
8bc0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
8bd0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
8be0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
8bf0: 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 2c 20 7a   LOCATE_NOERR, z
8c00: 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20  Right, zDb);.   
8c10: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
8c20: 20 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d 20     int iTabDb = 
8c30: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
8c40: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
8c50: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 69  Schema);.      i
8c60: 6e 74 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69  nt i, k;.      i
8c70: 6e 74 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a  nt nHidden = 0;.
8c80: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43        Column *pC
8c90: 6f 6c 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  ol;.      Index 
8ca0: 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
8cb0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
8cc0: 61 62 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ab);.      pPars
8cd0: 65 2d 3e 6e 4d 65 6d 20 3d 20 37 3b 0a 20 20 20  e->nMem = 7;.   
8ce0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
8cf0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
8d00: 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20  e, iTabDb);.    
8d10: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
8d20: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
8d30: 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  se, pTab);.     
8d40: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70   for(i=0, pCol=p
8d50: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61  Tab->aCol; i<pTa
8d60: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
8d70: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
8d80: 6e 74 20 69 73 48 69 64 64 65 6e 20 3d 20 49 73  nt isHidden = Is
8d90: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
8da0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
8db0: 69 73 48 69 64 64 65 6e 20 26 26 20 70 50 72 61  isHidden && pPra
8dc0: 67 6d 61 2d 3e 69 41 72 67 3d 3d 30 20 29 7b 0a  gma->iArg==0 ){.
8dd0: 20 20 20 20 20 20 20 20 20 20 6e 48 69 64 64 65            nHidde
8de0: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  n++;.          c
8df0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8e00: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
8e10: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
8e20: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
8e30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8e40: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    k = 0;.       
8e50: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 3d 3d   }else if( pPk==
8e60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b  0 ){.          k
8e70: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
8e80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
8e90: 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61 62 2d  or(k=1; k<=pTab-
8ea0: 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e 61 69  >nCol && pPk->ai
8eb0: 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b 20  Column[k-1]!=i; 
8ec0: 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 7d  k++){}.        }
8ed0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8ee0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20   pCol->pDflt==0 
8ef0: 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e  || pCol->pDflt->
8f00: 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a 20  op==TK_SPAN );. 
8f10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8f20: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
8f30: 2c 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20  , pPragma->iArg 
8f40: 3f 20 22 69 73 73 69 73 69 69 22 20 3a 20 22 69  ? "issisii" : "i
8f50: 73 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20 20  ssisi",.        
8f60: 20 20 20 20 20 20 20 69 2d 6e 48 69 64 64 65 6e         i-nHidden
8f70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8f80: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pCol->zName,.  
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8fa0: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
8fb0: 43 6f 6c 2c 22 22 29 2c 0a 20 20 20 20 20 20 20  Col,""),.       
8fc0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 6e 6f          pCol->no
8fd0: 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30 2c 0a 20  tNull ? 1 : 0,. 
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
8ff0: 6f 6c 2d 3e 70 44 66 6c 74 20 3f 20 70 43 6f 6c  ol->pDflt ? pCol
9000: 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pDflt->u.zToke
9010: 6e 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  n : 0,.         
9020: 20 20 20 20 20 20 6b 2c 0a 20 20 20 20 20 20 20        k,.       
9030: 20 20 20 20 20 20 20 20 69 73 48 69 64 64 65 6e          isHidden
9040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9050: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
9060: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9070: 55 47 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  UG.  case PragTy
9080: 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20 20 20 49  p_STATS: {.    I
9090: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
90a0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 20  HashElem *i;.   
90b0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
90c0: 35 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  5;.    sqlite3Co
90d0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
90e0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
90f0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9100: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
9110: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
9120: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
9130: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 20 20 54  ext(i)){.      T
9140: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
9150: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9170: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9180: 20 22 73 73 69 69 69 22 2c 0a 20 20 20 20 20 20   "ssiii",.      
9190: 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
91a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a  ,.           0,.
91b0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
91c0: 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20 20 20 20  >szTabRow,.     
91d0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
91e0: 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20 20 20 20  LogEst,.        
91f0: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
9200: 73 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  s);.      for(pI
9210: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
9220: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9230: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9250: 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20 22 73 69  tiLoad(v, 2, "si
9260: 69 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  iiX",.          
9270: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pIdx->zName,.  
9280: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 73           pIdx->s
9290: 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20 20 20  zIdxRow,.       
92a0: 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c      pIdx->aiRowL
92b0: 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20 20 20  ogEst[0],.      
92c0: 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73 53 74       pIdx->hasSt
92d0: 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  at1);.        sq
92e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
92f0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
9300: 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 5);.      }.
9310: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9320: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73  k;.#endif..  cas
9330: 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f  e PragTyp_INDEX_
9340: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
9350: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9360: 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Idx;.    Table *
9370: 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20 3d  pTab;.    pIdx =
9380: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
9390: 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  x(db, zRight, zD
93a0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  b);.    if( pIdx
93b0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49   ){.      int iI
93c0: 64 78 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63  dxDb = sqlite3Sc
93d0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
93e0: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pIdx->pSchema);.
93f0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
9400: 20 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20 20 20     int mx;.     
9410: 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41   if( pPragma->iA
9420: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rg ){.        /*
9430: 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69   PRAGMA index_xi
9440: 6e 66 6f 20 28 6e 65 77 65 72 20 76 65 72 73 69  nfo (newer versi
9450: 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 72 6f 77  on with more row
9460: 73 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29 20 2a  s and columns) *
9470: 2f 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 70  /.        mx = p
9480: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
9490: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
94a0: 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 7d 65  em = 6;.      }e
94b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
94c0: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e 66  PRAGMA index_inf
94d0: 6f 20 28 6c 65 67 61 63 79 20 76 65 72 73 69 6f  o (legacy versio
94e0: 6e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78  n) */.        mx
94f0: 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
9500: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
9510: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
9520: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 20 3d    }.      pTab =
9530: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
9540: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
9550: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
9560: 72 73 65 2c 20 69 49 64 78 44 62 29 3b 0a 20 20  rse, iIdxDb);.  
9570: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
9580: 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d  se->nMem<=pPragm
9590: 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 20 29 3b  a->nPragCName );
95a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
95b0: 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<mx; i++){.    
95c0: 20 20 20 20 69 31 36 20 63 6e 75 6d 20 3d 20 70      i16 cnum = p
95d0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
95e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
95f0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9600: 2c 20 31 2c 20 22 69 69 73 58 22 2c 20 69 2c 20  , 1, "iisX", i, 
9610: 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  cnum,.          
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20 3a 20     cnum<0 ? 0 : 
9640: 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d  pTab->aCol[cnum]
9650: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
9660: 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41   if( pPragma->iA
9670: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
9680: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9690: 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73 69 58  Load(v, 4, "isiX
96a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
96b0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
96c0: 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
96d0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c  pIdx->azColl[i],
96e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 70  .            i<p
96f0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
9700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9710: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9720: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
9730: 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e  ow, 1, pParse->n
9740: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mem);.      }.  
9750: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9760: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
9770: 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66 28  _INDEX_LIST: if(
9780: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49   zRight ){.    I
9790: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
97a0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
97b0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 61 62   int i;.    pTab
97c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
97d0: 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  ble(db, zRight, 
97e0: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
97f0: 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab ){.      int 
9800: 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33  iTabDb = sqlite3
9810: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
9820: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
9830: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
9840: 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 20 20  nMem = 5;.      
9850: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
9860: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
9870: 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20 20 66  iTabDb);.      f
9880: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
9890: 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b  ndex, i=0; pIdx;
98a0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
98b0: 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t, i++){.       
98c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f   const char *azO
98d0: 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c  rigin[] = { "c",
98e0: 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20   "u", "pk" };.  
98f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9900: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9910: 20 22 69 73 69 73 69 22 2c 0a 20 20 20 20 20 20   "isisi",.      
9920: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20       i,.        
9930: 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a     pIdx->zName,.
9940: 20 20 20 20 20 20 20 20 20 20 20 49 73 55 6e 69             IsUni
9950: 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 2c 0a  queIndex(pIdx),.
9960: 20 20 20 20 20 20 20 20 20 20 20 61 7a 4f 72 69             azOri
9970: 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54 79 70  gin[pIdx->idxTyp
9980: 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e],.           p
9990: 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
99a0: 72 65 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  re!=0);.      }.
99b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
99c0: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
99d0: 79 70 5f 44 41 54 41 42 41 53 45 5f 4c 49 53 54  yp_DATABASE_LIST
99e0: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  : {.    int i;. 
99f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9a00: 3d 20 33 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 3;.    for(i=0
9a10: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
9a20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  ){.      if( db-
9a30: 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[i].pBt==0 )
9a40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9a50: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
9a60: 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 21 3d 30 20  [i].zDbSName!=0 
9a70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9a80: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9a90: 20 31 2c 20 22 69 73 73 22 2c 0a 20 20 20 20 20   1, "iss",.     
9aa0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20      i,.         
9ab0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
9ac0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 73 71  ame,.         sq
9ad0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
9ae0: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d  ename(db->aDb[i]
9af0: 2e 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  .pBt));.    }.  
9b00: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61  }.  break;..  ca
9b10: 73 65 20 50 72 61 67 54 79 70 5f 43 4f 4c 4c 41  se PragTyp_COLLA
9b20: 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20  TION_LIST: {.   
9b30: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
9b40: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
9b50: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9b60: 32 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  2;.    for(p=sql
9b70: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9b80: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20  ->aCollSeq); p; 
9b90: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
9ba0: 28 70 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  (p)){.      Coll
9bb0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f  Seq *pColl = (Co
9bc0: 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61  llSeq *)sqliteHa
9bd0: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20  shData(p);.     
9be0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9bf0: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 22  iLoad(v, 1, "is"
9c00: 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  , i++, pColl->zN
9c10: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
9c20: 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66    break;..#ifdef
9c30: 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45   SQLITE_INTROSPE
9c40: 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20  CTION_PRAGMAS.  
9c50: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 55 4e  case PragTyp_FUN
9c60: 43 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20  CTION_LIST: {.  
9c70: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 48 61 73    int i;.    Has
9c80: 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 46 75  hElem *j;.    Fu
9c90: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 20 20 70 50  ncDef *p;.    pP
9ca0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a  arse->nMem = 2;.
9cb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
9cc0: 51 4c 49 54 45 5f 46 55 4e 43 5f 48 41 53 48 5f  QLITE_FUNC_HASH_
9cd0: 53 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  SZ; i++){.      
9ce0: 66 6f 72 28 70 3d 73 71 6c 69 74 65 33 42 75 69  for(p=sqlite3Bui
9cf0: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2e 61 5b  ltinFunctions.a[
9d00: 69 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75 2e 70 48  i]; p; p=p->u.pH
9d10: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ash ){.        i
9d20: 66 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  f( p->funcFlags 
9d30: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 49 4e  & SQLITE_FUNC_IN
9d40: 54 45 52 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75  TERNAL ) continu
9d50: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
9d60: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
9d70: 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d 3e 7a  v, 1, "si", p->z
9d80: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  Name, 1);.      
9d90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
9da0: 6a 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  j=sqliteHashFirs
9db0: 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 6a  t(&db->aFunc); j
9dc0: 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; j=sqliteHashNe
9dd0: 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 70 20  xt(j)){.      p 
9de0: 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69  = (FuncDef*)sqli
9df0: 74 65 48 61 73 68 44 61 74 61 28 6a 29 3b 0a 20  teHashData(j);. 
9e00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9e10: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9e20: 22 73 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  "si", p->zName, 
9e30: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
9e40: 62 72 65 61 6b 3b 0a 0a 23 69 66 6e 64 65 66 20  break;..#ifndef 
9e50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9e60: 55 41 4c 54 41 42 4c 45 0a 20 20 63 61 73 65 20  UALTABLE.  case 
9e70: 50 72 61 67 54 79 70 5f 4d 4f 44 55 4c 45 5f 4c  PragTyp_MODULE_L
9e80: 49 53 54 3a 20 7b 0a 20 20 20 20 48 61 73 68 45  IST: {.    HashE
9e90: 6c 65 6d 20 2a 6a 3b 0a 20 20 20 20 70 50 61 72  lem *j;.    pPar
9ea0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20  se->nMem = 1;.  
9eb0: 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65 48 61    for(j=sqliteHa
9ec0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
9ed0: 64 75 6c 65 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69  dule); j; j=sqli
9ee0: 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a  teHashNext(j)){.
9ef0: 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d        Module *pM
9f00: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71  od = (Module*)sq
9f10: 6c 69 74 65 48 61 73 68 44 61 74 61 28 6a 29 3b  liteHashData(j);
9f20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9f30: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
9f40: 2c 20 22 73 22 2c 20 70 4d 6f 64 2d 3e 7a 4e 61  , "s", pMod->zNa
9f50: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
9f60: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
9f70: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
9f80: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
9f90: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 52   case PragTyp_PR
9fa0: 41 47 4d 41 5f 4c 49 53 54 3a 20 7b 0a 20 20 20  AGMA_LIST: {.   
9fb0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
9fc0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
9fd0: 28 61 50 72 61 67 6d 61 4e 61 6d 65 29 3b 20 69  (aPragmaName); i
9fe0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
9ff0: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
a000: 76 2c 20 31 2c 20 22 73 22 2c 20 61 50 72 61 67  v, 1, "s", aPrag
a010: 6d 61 4e 61 6d 65 5b 69 5d 2e 7a 4e 61 6d 65 29  maName[i].zName)
a020: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
a030: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  eak;.#endif /* S
a040: 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54  QLITE_INTROSPECT
a050: 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  ION_PRAGMAS */..
a060: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a070: 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41  _OMIT_SCHEMA_PRA
a080: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
a090: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
a0a0: 45 49 47 4e 5f 4b 45 59 0a 20 20 63 61 73 65 20  EIGN_KEY.  case 
a0b0: 50 72 61 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f  PragTyp_FOREIGN_
a0c0: 4b 45 59 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52  KEY_LIST: if( zR
a0d0: 69 67 68 74 20 29 7b 0a 20 20 20 20 46 4b 65 79  ight ){.    FKey
a0e0: 20 2a 70 46 4b 3b 0a 20 20 20 20 54 61 62 6c 65   *pFK;.    Table
a0f0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62   *pTab;.    pTab
a100: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
a110: 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  ble(db, zRight, 
a120: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
a130: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 46 4b 20  ab ){.      pFK 
a140: 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20  = pTab->pFKey;. 
a150: 20 20 20 20 20 69 66 28 20 70 46 4b 20 29 7b 0a       if( pFK ){.
a160: 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 61 62          int iTab
a170: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
a180: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
a190: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
a1a0: 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b        int i = 0;
a1b0: 20 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65   .        pParse
a1c0: 2d 3e 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20 20 20  ->nMem = 8;.    
a1d0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
a1e0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
a1f0: 73 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20  se, iTabDb);.   
a200: 20 20 20 20 20 77 68 69 6c 65 28 70 46 4b 29 7b       while(pFK){
a210: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
a220: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
a230: 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c  j=0; j<pFK->nCol
a240: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
a250: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
a260: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
a270: 69 69 73 73 73 73 73 73 22 2c 0a 20 20 20 20 20  iissssss",.     
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2c                i,
a290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a2a0: 20 20 20 20 6a 2c 0a 20 20 20 20 20 20 20 20 20      j,.         
a2b0: 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 7a            pFK->z
a2c0: 54 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  To,.            
a2d0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
a2e0: 6c 5b 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69  l[pFK->aCol[j].i
a2f0: 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20  From].zName,.   
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  pFK->aCol[j].zCo
a320: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
a330: 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65        actionName
a340: 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d  (pFK->aAction[1]
a350: 29 2c 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45  ),  /* ON UPDATE
a360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
a370: 20 20 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d         actionNam
a380: 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30  e(pFK->aAction[0
a390: 5d 29 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54  ]),  /* ON DELET
a3a0: 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  E */.           
a3b0: 20 20 20 20 20 20 20 20 22 4e 4f 4e 45 22 29 3b          "NONE");
a3c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a3d0: 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20         ++i;.    
a3e0: 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d        pFK = pFK-
a3f0: 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20  >pNextFrom;.    
a400: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a410: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
a420: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
a430: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a440: 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
a450: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a460: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
a470: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a480: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 63  OMIT_TRIGGER.  c
a490: 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45  ase PragTyp_FORE
a4a0: 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20 7b  IGN_KEY_CHECK: {
a4b0: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 20  .    FKey *pFK; 
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a4d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
a4e0: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 54  straint */.    T
a4f0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
a500: 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 74        /* Child t
a510: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52 45  able contain "RE
a520: 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77 6f 72  FERENCES" keywor
a530: 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  d */.    Table *
a540: 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
a550: 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20  /* Parent table 
a560: 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  that child point
a570: 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64 65  s to */.    Inde
a580: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
a590: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 74     /* Index in t
a5a0: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
a5b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  */.    int i;   
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a5d0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20   Loop counter:  
a5e0: 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d 62  Foreign key numb
a5f0: 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  er for pTab */. 
a600: 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
a610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
a620: 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69 65 6c  p counter:  Fiel
a630: 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e  d of the foreign
a640: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61 73 68   key */.    Hash
a650: 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
a660: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
a670: 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c 65 20  er:  Next table 
a680: 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  in schema */.   
a690: 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20   int x;         
a6a0: 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73 75 6c          /* resul
a6b0: 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  t variable */.  
a6c0: 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b    int regResult;
a6d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 72 65           /* 3 re
a6e0: 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
a6f0: 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
a700: 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79 3b 20      int regKey; 
a710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a720: 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6b  gister to hold k
a730: 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 20  ey for checking 
a740: 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69 6e  the FK */.    in
a750: 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20 20 20  t regRow;       
a760: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
a770: 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77 20  s to hold a row 
a780: 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20 20  from pTab */.   
a790: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
a7a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
a7b0: 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69 6e  f a loop checkin
a7c0: 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 2a  g foreign keys *
a7d0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 6b  /.    int addrOk
a7e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a7f0: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
a800: 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20 20   key is OK */.  
a810: 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20 20    int *aiCols;  
a820: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 69 6c           /* chil
a830: 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c 75  d to parent colu
a840: 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a 20  mn mapping */.. 
a850: 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70     regResult = p
a860: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
a870: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
a880: 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b 65 79  += 4;.    regKey
a890: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
a8a0: 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20  m;.    regRow = 
a8b0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
a8c0: 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61      k = sqliteHa
a8d0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
a8e0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [iDb].pSchema->t
a8f0: 62 6c 48 61 73 68 29 3b 0a 20 20 20 20 77 68 69  blHash);.    whi
a900: 6c 65 28 20 6b 20 29 7b 0a 20 20 20 20 20 20 69  le( k ){.      i
a910: 6e 74 20 69 54 61 62 44 62 3b 0a 20 20 20 20 20  nt iTabDb;.     
a920: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
a930: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71         pTab = sq
a940: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
a950: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 52 69 67  (pParse, 0, zRig
a960: 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  ht, zDb);.      
a970: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    k = 0;.      }
a980: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
a990: 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
a9a0: 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
a9b0: 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
a9c0: 74 65 48 61 73 68 4e 65 78 74 28 6b 29 3b 0a 20  teHashNext(k);. 
a9d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a9e0: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 54 61 62   pTab==0 || pTab
a9f0: 2d 3e 70 46 4b 65 79 3d 3d 30 20 29 20 63 6f 6e  ->pFKey==0 ) con
aa00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 54 61  tinue;.      iTa
aa10: 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  bDb = sqlite3Sch
aa20: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
aa30: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
aa40: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
aa50: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
aa60: 72 73 65 2c 20 69 54 61 62 44 62 29 3b 0a 20 20  rse, iTabDb);.  
aa70: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
aa80: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 54 61  Lock(pParse, iTa
aa90: 62 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  bDb, pTab->tnum,
aaa0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
aab0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
aac0: 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50  ->nCol+regRow>pP
aad0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61  arse->nMem ) pPa
aae0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62  rse->nMem = pTab
aaf0: 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b  ->nCol + regRow;
ab00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
ab10: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
ab20: 30 2c 20 69 54 61 62 44 62 2c 20 70 54 61 62 2c  0, iTabDb, pTab,
ab30: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
ab40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ab50: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65  LoadString(v, re
ab60: 67 52 65 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a  gResult, pTab->z
ab70: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  Name);.      for
ab80: 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e  (i=1, pFK=pTab->
ab90: 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c  pFKey; pFK; i++,
aba0: 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46   pFK=pFK->pNextF
abb0: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50  rom){.        pP
abc0: 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46  arent = sqlite3F
abd0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b  indTable(db, pFK
abe0: 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20  ->zTo, zDb);.   
abf0: 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74       if( pParent
ac00: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
ac10: 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30          pIdx = 0
ac20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ac30: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
ac40: 65 2c 20 69 54 61 62 44 62 2c 20 70 50 61 72 65  e, iTabDb, pPare
ac50: 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61  nt->tnum, 0, pPa
ac60: 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  rent->zName);.  
ac70: 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
ac80: 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70  3FkLocateIndex(p
ac90: 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
aca0: 70 46 4b 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a  pFK, &pIdx, 0);.
acb0: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30          if( x==0
acc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
acd0: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
ace0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
acf0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
ad00: 2c 20 69 2c 20 69 54 61 62 44 62 2c 20 70 50 61  , i, iTabDb, pPa
ad10: 72 65 6e 74 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  rent, OP_OpenRea
ad20: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  d);.          }e
ad30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
ad40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad50: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
ad60: 64 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  d, i, pIdx->tnum
ad70: 2c 20 69 54 61 62 44 62 29 3b 0a 20 20 20 20 20  , iTabDb);.     
ad80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ad90: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
ada0: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
adb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
adc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
add0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20     k = 0;.      
ade0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
adf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ae00: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
ae10: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 46 4b  e->nErr>0 || pFK
ae20: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
ae30: 20 70 46 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20   pFK ) break;.  
ae40: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
ae50: 6e 54 61 62 3c 69 20 29 20 70 50 61 72 73 65 2d  nTab<i ) pParse-
ae60: 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20  >nTab = i;.     
ae70: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
ae80: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ae90: 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29 3b 20 56  OP_Rewind, 0); V
aea0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
aeb0: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70        for(i=1, p
aec0: 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20  FK=pTab->pFKey; 
aed0: 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46  pFK; i++, pFK=pF
aee0: 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  K->pNextFrom){. 
aef0: 20 20 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d         pParent =
af00: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
af10: 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20  e(db, pFK->zTo, 
af20: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 70 49  zDb);.        pI
af30: 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
af40: 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20  aiCols = 0;.    
af50: 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 20      if( pParent 
af60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d  ){.          x =
af70: 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65   sqlite3FkLocate
af80: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 50  Index(pParse, pP
af90: 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64  arent, pFK, &pId
afa0: 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a 20 20 20  x, &aiCols);.   
afb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78         assert( x
afc0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ==0 );.        }
afd0: 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f 6b 20  .        addrOk 
afe0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
aff0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
b000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  .        /* Gene
b010: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 61  rate code to rea
b020: 64 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20  d the child key 
b030: 76 61 6c 75 65 73 20 69 6e 74 6f 20 72 65 67 69  values into regi
b040: 73 74 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  sters.        **
b050: 20 72 65 67 52 6f 77 2e 2e 72 65 67 52 6f 77 2b   regRow..regRow+
b060: 6e 2e 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  n. If any of the
b070: 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c 75 65   child key value
b080: 73 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68 69 73  s are NULL, this
b090: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77   .        ** row
b0a0: 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 61 6e   cannot cause an
b0b0: 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e 20 4a   FK violation. J
b0c0: 75 6d 70 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ump directly to 
b0d0: 61 64 64 72 4f 6b 20 69 6e 20 0a 20 20 20 20 20  addrOk in .     
b0e0: 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 2e     ** this case.
b0f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
b100: 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c  j=0; j<pFK->nCol
b110: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
b120: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61 69 43    int iCol = aiC
b130: 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20  ols ? aiCols[j] 
b140: 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69  : pFK->aCol[j].i
b150: 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  From;.          
b160: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
b170: 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
b180: 76 2c 20 70 54 61 62 2c 20 30 2c 20 69 43 6f 6c  v, pTab, 0, iCol
b190: 2c 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20  , regRow+j);.   
b1a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b1b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b1c0: 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c  sNull, regRow+j,
b1d0: 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f   addrOk); VdbeCo
b1e0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b1f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
b200: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b210: 6f 20 71 75 65 72 79 20 74 68 65 20 70 61 72 65  o query the pare
b220: 6e 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20 6d  nt index for a m
b230: 61 74 63 68 69 6e 67 20 70 61 72 65 6e 74 0a 20  atching parent. 
b240: 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 2e 20 49         ** key. I
b250: 66 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75  f a match is fou
b260: 6e 64 2c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  nd, jump to addr
b270: 4f 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  Ok. */.        i
b280: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
b290: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2a0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
b2b0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
b2c0: 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b   pFK->nCol, regK
b2d0: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
b2e0: 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66    sqlite3IndexAf
b2f0: 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64  finityStr(db,pId
b300: 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a  x), pFK->nCol);.
b310: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b320: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
b330: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c 20 61  , OP_Found, i, a
b340: 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c 20 30  ddrOk, regKey, 0
b350: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
b360: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b370: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b380: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  pParent ){.     
b390: 20 20 20 20 20 69 6e 74 20 6a 6d 70 20 3d 20 73       int jmp = s
b3a0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
b3b0: 74 41 64 64 72 28 76 29 2b 32 3b 0a 20 20 20 20  tAddr(v)+2;.    
b3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b3d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
b3e0: 65 6b 52 6f 77 69 64 2c 20 69 2c 20 6a 6d 70 2c  ekRowid, i, jmp,
b3f0: 20 72 65 67 52 6f 77 29 3b 20 56 64 62 65 43 6f   regRow); VdbeCo
b400: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b420: 47 6f 74 6f 28 76 2c 20 61 64 64 72 4f 6b 29 3b  Goto(v, addrOk);
b430: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
b440: 74 28 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d 31 20  t( pFK->nCol==1 
b450: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
b460: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
b470: 65 20 63 6f 64 65 20 74 6f 20 72 65 70 6f 72 74  e code to report
b480: 20 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e   an FK violation
b490: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
b4a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 48  */.        if( H
b4b0: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
b4c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b4d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b4e0: 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  OP_Rowid, 0, reg
b4f0: 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20  Result+1);.     
b500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b510: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b520: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
b530: 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31  , 0, regResult+1
b540: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b550: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b560: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 72 65 67  MultiLoad(v, reg
b570: 52 65 73 75 6c 74 2b 32 2c 20 22 73 69 58 22 2c  Result+2, "siX",
b580: 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31 29 3b   pFK->zTo, i-1);
b590: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b5a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b5b0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
b5c0: 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20 20 20  esult, 4);.     
b5d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
b5e0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
b5f0: 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  drOk);.        s
b600: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b610: 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20   aiCols);.      
b620: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
b630: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b640: 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 54 6f 70  Next, 0, addrTop
b650: 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
b660: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
b670: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b680: 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  v, addrTop);.   
b690: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
b6a0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b6b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
b6c0: 52 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e 64 69  RIGGER) */.#endi
b6d0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
b6e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
b6f0: 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64  N_KEY) */..#ifnd
b700: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
b710: 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49  ASE_SENSITIVE_LI
b720: 4b 45 5f 50 52 41 47 4d 41 0a 20 20 2f 2a 20 52  KE_PRAGMA.  /* R
b730: 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b  einstall the LIK
b740: 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74  E and GLOB funct
b750: 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61  ions.  The varia
b760: 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20  nt of LIKE.  ** 
b770: 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73  used will be cas
b780: 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e  e sensitive or n
b790: 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ot depending on 
b7a0: 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
b7b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 53  case PragTyp_CAS
b7c0: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
b7d0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
b7e0: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
b7f0: 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46  te3RegisterLikeF
b800: 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c  unctions(db, sql
b810: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
b820: 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20  Right, 0));.    
b830: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
b840: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b850: 4f 4d 49 54 5f 43 41 53 45 5f 53 45 4e 53 49 54  OMIT_CASE_SENSIT
b860: 49 56 45 5f 4c 49 4b 45 5f 50 52 41 47 4d 41 20  IVE_LIKE_PRAGMA 
b870: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
b880: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
b890: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 0a 23 20 64  CK_ERROR_MAX.# d
b8a0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54  efine SQLITE_INT
b8b0: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
b8c0: 4f 52 5f 4d 41 58 20 31 30 30 0a 23 65 6e 64 69  OR_MAX 100.#endi
b8d0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
b8e0: 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
b8f0: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 20 20 20 50  _CHECK.  /*    P
b900: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
b910: 63 68 65 63 6b 0a 20 20 2a 2a 20 20 20 20 50 52  check.  **    PR
b920: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
b930: 68 65 63 6b 28 4e 29 0a 20 20 2a 2a 20 20 20 20  heck(N).  **    
b940: 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65  PRAGMA quick_che
b950: 63 6b 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d  ck.  **    PRAGM
b960: 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 28 4e 29  A quick_check(N)
b970: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 65 72 69 66  .  **.  ** Verif
b980: 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  y the integrity 
b990: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
b9a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
b9b0: 71 75 69 63 6b 5f 63 68 65 63 6b 22 20 69 73 20  quick_check" is 
b9c0: 72 65 64 75 63 65 64 20 76 65 72 73 69 6f 6e 20  reduced version 
b9d0: 6f 66 20 0a 20 20 2a 2a 20 69 6e 74 65 67 72 69  of .  ** integri
b9e0: 74 79 5f 63 68 65 63 6b 20 64 65 73 69 67 6e 65  ty_check designe
b9f0: 64 20 74 6f 20 64 65 74 65 63 74 20 6d 6f 73 74  d to detect most
ba00: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
ba10: 74 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75  tion.  ** withou
ba20: 74 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  t the overhead o
ba30: 66 20 63 72 6f 73 73 2d 63 68 65 63 6b 69 6e 67  f cross-checking
ba40: 20 69 6e 64 65 78 65 73 2e 20 20 51 75 69 63 6b   indexes.  Quick
ba50: 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 69 73 20 6c  _check.  ** is l
ba60: 69 6e 65 61 72 20 74 69 6d 65 20 77 68 65 72 65  inear time where
ba70: 61 73 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  ase integrity_ch
ba80: 65 63 6b 20 69 73 20 4f 28 4e 6c 6f 67 4e 29 2e  eck is O(NlogN).
ba90: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
baa0: 67 54 79 70 5f 49 4e 54 45 47 52 49 54 59 5f 43  gTyp_INTEGRITY_C
bab0: 48 45 43 4b 3a 20 7b 0a 20 20 20 20 69 6e 74 20  HECK: {.    int 
bac0: 69 2c 20 6a 2c 20 61 64 64 72 2c 20 6d 78 45 72  i, j, addr, mxEr
bad0: 72 3b 0a 0a 20 20 20 20 69 6e 74 20 69 73 51 75  r;..    int isQu
bae0: 69 63 6b 20 3d 20 28 73 71 6c 69 74 65 33 54 6f  ick = (sqlite3To
baf0: 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d  lower(zLeft[0])=
bb00: 3d 27 71 27 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ='q');..    /* I
bb10: 66 20 74 68 65 20 50 52 41 47 4d 41 20 63 6f 6d  f the PRAGMA com
bb20: 6d 61 6e 64 20 77 61 73 20 6f 66 20 74 68 65 20  mand was of the 
bb30: 66 6f 72 6d 20 22 50 52 41 47 4d 41 20 3c 64 62  form "PRAGMA <db
bb40: 3e 2e 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  >.integrity_chec
bb50: 6b 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  k",.    ** then 
bb60: 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 74 68  iDb is set to th
bb70: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
bb80: 61 74 61 62 61 73 65 20 69 64 65 6e 74 69 66 69  atabase identifi
bb90: 65 64 20 62 79 20 3c 64 62 3e 2e 0a 20 20 20 20  ed by <db>..    
bba0: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
bbb0: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
bbc0: 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20 6f  f database iDb o
bbd0: 6e 6c 79 20 69 73 20 76 65 72 69 66 69 65 64 20  nly is verified 
bbe0: 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 56 44  by.    ** the VD
bbf0: 42 45 20 63 72 65 61 74 65 64 20 62 65 6c 6f 77  BE created below
bc00: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
bc10: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
bc20: 65 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 73 69  e command was si
bc30: 6d 70 6c 79 20 22 50 52 41 47 4d 41 20 69 6e 74  mply "PRAGMA int
bc40: 65 67 72 69 74 79 5f 63 68 65 63 6b 22 20 28 6f  egrity_check" (o
bc50: 72 0a 20 20 20 20 2a 2a 20 22 50 52 41 47 4d 41  r.    ** "PRAGMA
bc60: 20 71 75 69 63 6b 5f 63 68 65 63 6b 22 29 2c 20   quick_check"), 
bc70: 74 68 65 6e 20 69 44 62 20 69 73 20 73 65 74 20  then iDb is set 
bc80: 74 6f 20 30 2e 20 49 6e 20 74 68 69 73 20 63 61  to 0. In this ca
bc90: 73 65 2c 20 73 65 74 20 69 44 62 0a 20 20 20 20  se, set iDb.    
bca0: 2a 2a 20 74 6f 20 2d 31 20 68 65 72 65 2c 20 74  ** to -1 here, t
bcb0: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
bcc0: 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
bcd0: 76 65 72 69 66 79 20 74 68 65 20 69 6e 74 65 67  verify the integ
bce0: 72 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 61  rity.    ** of a
bcf0: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
bd00: 62 61 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 61  bases.  */.    a
bd10: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b  ssert( iDb>=0 );
bd20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
bd30: 3d 3d 30 20 7c 7c 20 70 49 64 32 2d 3e 7a 20 29  ==0 || pId2->z )
bd40: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e  ;.    if( pId2->
bd50: 7a 3d 3d 30 20 29 20 69 44 62 20 3d 20 2d 31 3b  z==0 ) iDb = -1;
bd60: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
bd70: 69 7a 65 20 74 68 65 20 56 44 42 45 20 70 72 6f  ize the VDBE pro
bd80: 67 72 61 6d 20 2a 2f 0a 20 20 20 20 70 50 61 72  gram */.    pPar
bd90: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20  se->nMem = 6;.. 
bda0: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61     /* Set the ma
bdb0: 78 69 6d 75 6d 20 65 72 72 6f 72 20 63 6f 75 6e  ximum error coun
bdc0: 74 20 2a 2f 0a 20 20 20 20 6d 78 45 72 72 20 3d  t */.    mxErr =
bdd0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54   SQLITE_INTEGRIT
bde0: 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41  Y_CHECK_ERROR_MA
bdf0: 58 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  X;.    if( zRigh
be00: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
be10: 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68  e3GetInt32(zRigh
be20: 74 2c 20 26 6d 78 45 72 72 29 3b 0a 20 20 20 20  t, &mxErr);.    
be30: 20 20 69 66 28 20 6d 78 45 72 72 3c 3d 30 20 29    if( mxErr<=0 )
be40: 7b 0a 20 20 20 20 20 20 20 20 6d 78 45 72 72 20  {.        mxErr 
be50: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49  = SQLITE_INTEGRI
be60: 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d  TY_CHECK_ERROR_M
be70: 41 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  AX;.      }.    
be80: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
be90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
bea0: 74 65 67 65 72 2c 20 6d 78 45 72 72 2d 31 2c 20  teger, mxErr-1, 
beb0: 31 29 3b 20 2f 2a 20 72 65 67 5b 31 5d 20 68 6f  1); /* reg[1] ho
bec0: 6c 64 73 20 65 72 72 6f 72 73 20 6c 65 66 74 20  lds errors left 
bed0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e  */..    /* Do an
bee0: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
bef0: 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73   on each databas
bf00: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 66 6f  e file */.    fo
bf10: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
bf20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 48 61  ; i++){.      Ha
bf30: 73 68 45 6c 65 6d 20 2a 78 3b 20 20 20 20 20 2f  shElem *x;     /
bf40: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
bf50: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  er tables in the
bf60: 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 20   schema */.     
bf70: 20 48 61 73 68 20 2a 70 54 62 6c 73 3b 20 20 20   Hash *pTbls;   
bf80: 20 20 2f 2a 20 53 65 74 20 6f 66 20 61 6c 6c 20    /* Set of all 
bf90: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 63  tables in the sc
bfa0: 68 65 6d 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e  hema */.      in
bfb0: 74 20 2a 61 52 6f 6f 74 3b 20 20 20 20 20 20 2f  t *aRoot;      /
bfc0: 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6f 74 20  * Array of root 
bfd0: 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6f 66 20  page numbers of 
bfe0: 61 6c 6c 20 62 74 72 65 65 73 20 2a 2f 0a 20 20  all btrees */.  
bff0: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
c000: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c010: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
c020: 6f 74 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ot[] */.      in
c030: 74 20 6d 78 49 64 78 20 3d 20 30 3b 20 20 20 2f  t mxIdx = 0;   /
c040: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
c050: 20 6f 66 20 69 6e 64 65 78 65 73 20 66 6f 72 20   of indexes for 
c060: 61 6e 79 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  any table */..  
c070: 20 20 20 20 69 66 28 20 4f 4d 49 54 5f 54 45 4d      if( OMIT_TEM
c080: 50 44 42 20 26 26 20 69 3d 3d 31 20 29 20 63 6f  PDB && i==1 ) co
c090: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
c0a0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 21 3d 69  ( iDb>=0 && i!=i
c0b0: 44 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  Db ) continue;..
c0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
c0d0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
c0e0: 61 72 73 65 2c 20 69 29 3b 0a 0a 20 20 20 20 20  arse, i);..     
c0f0: 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72   /* Do an integr
c100: 69 74 79 20 63 68 65 63 6b 20 6f 66 20 74 68 65  ity check of the
c110: 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 2a 2a   B-Tree.      **
c120: 0a 20 20 20 20 20 20 2a 2a 20 42 65 67 69 6e 20  .      ** Begin 
c130: 62 79 20 66 69 6e 64 69 6e 67 20 74 68 65 20 72  by finding the r
c140: 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72  oot pages number
c150: 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 61  s.      ** for a
c160: 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
c170: 64 69 63 65 73 20 69 6e 20 74 68 65 20 64 61 74  dices in the dat
c180: 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
c190: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
c1a0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
c1b0: 48 65 6c 64 28 64 62 2c 20 69 2c 20 30 29 20 29  Held(db, i, 0) )
c1c0: 3b 0a 20 20 20 20 20 20 70 54 62 6c 73 20 3d 20  ;.      pTbls = 
c1d0: 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68  &db->aDb[i].pSch
c1e0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  ema->tblHash;.  
c1f0: 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 78      for(cnt=0, x
c200: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
c210: 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71  (pTbls); x; x=sq
c220: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29 29  liteHashNext(x))
c230: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
c240: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
c250: 73 68 44 61 74 61 28 78 29 3b 20 20 2f 2a 20 43  shData(x);  /* C
c260: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
c270: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
c280: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
c290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
c2a0: 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 20 2a 2f  index on pTab */
c2b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 49 64  .        int nId
c2c0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
c2d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c2e0: 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73 20  mber of indexes 
c2f0: 6f 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  on pTab */.     
c300: 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
c310: 70 54 61 62 29 20 29 20 63 6e 74 2b 2b 3b 0a 20  pTab) ) cnt++;. 
c320: 20 20 20 20 20 20 20 66 6f 72 28 6e 49 64 78 3d         for(nIdx=
c330: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
c340: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
c350: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49  =pIdx->pNext, nI
c360: 64 78 2b 2b 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a  dx++){ cnt++; }.
c370: 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 64 78          if( nIdx
c380: 3e 6d 78 49 64 78 20 29 20 6d 78 49 64 78 20 3d  >mxIdx ) mxIdx =
c390: 20 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   nIdx;.      }. 
c3a0: 20 20 20 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c       aRoot = sql
c3b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c3c0: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  N(db, sizeof(int
c3d0: 29 2a 28 63 6e 74 2b 31 29 29 3b 0a 20 20 20 20  )*(cnt+1));.    
c3e0: 20 20 69 66 28 20 61 52 6f 6f 74 3d 3d 30 20 29    if( aRoot==0 )
c3f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
c400: 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74  r(cnt=0, x=sqlit
c410: 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73  eHashFirst(pTbls
c420: 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61  ); x; x=sqliteHa
c430: 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20  shNext(x)){.    
c440: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c450: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
c460: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64  (x);.        Ind
c470: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20  ex *pIdx;.      
c480: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
c490: 54 61 62 29 20 29 20 61 52 6f 6f 74 5b 2b 2b 63  Tab) ) aRoot[++c
c4a0: 6e 74 5d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  nt] = pTab->tnum
c4b0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  ;.        for(pI
c4c0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
c4d0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
c4e0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
c4f0: 20 20 20 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74 5d      aRoot[++cnt]
c500: 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
c510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c520: 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b 30 5d 20  .      aRoot[0] 
c530: 3d 20 63 6e 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  = cnt;..      /*
c540: 20 4d 61 6b 65 20 73 75 72 65 20 73 75 66 66 69   Make sure suffi
c550: 63 69 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  cient number of 
c560: 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20 62  registers have b
c570: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
c580: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
c590: 4d 65 6d 20 3d 20 4d 41 58 28 20 70 50 61 72 73  Mem = MAX( pPars
c5a0: 65 2d 3e 6e 4d 65 6d 2c 20 38 2b 6d 78 49 64 78  e->nMem, 8+mxIdx
c5b0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
c5c0: 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
c5d0: 68 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  he(pParse);..   
c5e0: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 62 2d 74     /* Do the b-t
c5f0: 72 65 65 20 69 6e 74 65 67 72 69 74 79 20 63 68  ree integrity ch
c600: 65 63 6b 73 20 2a 2f 0a 20 20 20 20 20 20 73 71  ecks */.      sq
c610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
c620: 76 2c 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43  v, OP_IntegrityC
c630: 6b 2c 20 32 2c 20 63 6e 74 2c 20 31 2c 20 28 63  k, 2, cnt, 1, (c
c640: 68 61 72 2a 29 61 52 6f 6f 74 2c 50 34 5f 49 4e  har*)aRoot,P4_IN
c650: 54 41 52 52 41 59 29 3b 0a 20 20 20 20 20 20 73  TARRAY);.      s
c660: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
c670: 50 35 28 76 2c 20 28 75 38 29 69 29 3b 0a 20 20  P5(v, (u8)i);.  
c680: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
c690: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c6a0: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32 29 3b 20 56  OP_IsNull, 2); V
c6b0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c6d0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
c6e0: 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 0a  ring8, 0, 3, 0,.
c6f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c700: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2a 2a 2a  MPrintf(db, "***
c710: 20 69 6e 20 64 61 74 61 62 61 73 65 20 25 73 20   in database %s 
c720: 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e 61 44 62 5b  ***\n", db->aDb[
c730: 69 5d 2e 7a 44 62 53 4e 61 6d 65 29 2c 0a 20 20  i].zDbSName),.  
c740: 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49         P4_DYNAMI
c750: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
c760: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c770: 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 33 2c 20  P_Concat, 2, 3, 
c780: 33 29 3b 0a 20 20 20 20 20 20 69 6e 74 65 67 72  3);.      integr
c790: 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f  ityCheckResultRo
c7a0: 77 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w(v);.      sqli
c7b0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c7c0: 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20 20 20 20  v, addr);..     
c7d0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
c7e0: 6c 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 72  l the indices ar
c7f0: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 63 6f  e constructed co
c800: 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
c810: 2f 0a 20 20 20 20 20 20 66 6f 72 28 78 3d 73 71  /.      for(x=sq
c820: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 54  liteHashFirst(pT
c830: 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74  bls); x; x=sqlit
c840: 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20  eHashNext(x)){. 
c850: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
c860: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
c870: 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20  ata(x);.        
c880: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 2a 70 50  Index *pIdx, *pP
c890: 6b 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  k;.        Index
c8a0: 20 2a 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20   *pPrior = 0;.  
c8b0: 20 20 20 20 20 20 69 6e 74 20 6c 6f 6f 70 54 6f        int loopTo
c8c0: 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  p;.        int i
c8d0: 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72  DataCur, iIdxCur
c8e0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
c8f0: 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 20 20 20 20   = -1;..        
c900: 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3c 31  if( pTab->tnum<1
c910: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
c920: 20 53 6b 69 70 20 56 49 45 57 73 20 6f 72 20 56   Skip VIEWs or V
c930: 49 52 54 55 41 4c 20 54 41 42 4c 45 73 20 2a 2f  IRTUAL TABLEs */
c940: 0a 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20 48  .        pPk = H
c950: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20  asRowid(pTab) ? 
c960: 30 20 3a 20 73 71 6c 69 74 65 33 50 72 69 6d 61  0 : sqlite3Prima
c970: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
c980: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c990: 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64  3OpenTableAndInd
c9a0: 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ices(pParse, pTa
c9b0: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  b, OP_OpenRead, 
c9c0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 20 20 31 2c 20 30 2c 20 26 69 44 61        1, 0, &iDa
c9f0: 74 61 43 75 72 2c 20 26 69 49 64 78 43 75 72 29  taCur, &iIdxCur)
ca00: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 72 65 67  ;.        /* reg
ca10: 5b 37 5d 20 63 6f 75 6e 74 73 20 74 68 65 20 6e  [7] counts the n
ca20: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
ca30: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   in the table.. 
ca40: 20 20 20 20 20 20 20 2a 2a 20 72 65 67 5b 38 2b         ** reg[8+
ca50: 69 5d 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75  i] counts the nu
ca60: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
ca70: 69 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  in the i-th inde
ca80: 78 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  x .        */.  
ca90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
caa0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
cab0: 74 65 67 65 72 2c 20 30 2c 20 37 29 3b 0a 20 20  teger, 0, 7);.  
cac0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
cad0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
cae0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
caf0: 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a  x->pNext, j++){.
cb00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cb10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cb20: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 38 2b  P_Integer, 0, 8+
cb30: 6a 29 3b 20 2f 2a 20 69 6e 64 65 78 20 65 6e 74  j); /* index ent
cb40: 72 69 65 73 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ries counter */.
cb50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cb60: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
cb70: 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a 20  ->nMem>=8+j );. 
cb80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
cb90: 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52  qlite3NoTempsInR
cba0: 61 6e 67 65 28 70 50 61 72 73 65 2c 31 2c 37 2b  ange(pParse,1,7+
cbb0: 6a 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  j) );.        sq
cbc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cbd0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44  v, OP_Rewind, iD
cbe0: 61 74 61 43 75 72 2c 20 30 29 3b 20 56 64 62 65  ataCur, 0); Vdbe
cbf0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
cc00: 20 20 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73       loopTop = s
cc10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cc20: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 37  (v, OP_AddImm, 7
cc30: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
cc40: 28 20 21 69 73 51 75 69 63 6b 20 29 7b 0a 20 20  ( !isQuick ){.  
cc50: 20 20 20 20 20 20 20 20 2f 2a 20 53 61 6e 69 74          /* Sanit
cc60: 79 20 63 68 65 63 6b 20 6f 6e 20 72 65 63 6f 72  y check on recor
cc70: 64 20 68 65 61 64 65 72 20 64 65 63 6f 64 69 6e  d header decodin
cc80: 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  g */.          s
cc90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cca0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
ccb0: 44 61 74 61 43 75 72 2c 20 70 54 61 62 2d 3e 6e  DataCur, pTab->n
ccc0: 43 6f 6c 2d 31 2c 20 33 29 3b 0a 20 20 20 20 20  Col-1, 3);.     
ccd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cce0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
ccf0: 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
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 74 68 61 74 20   /* Verify that 
cd20: 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  all NOT NULL col
cd30: 75 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72 65 20  umns really are 
cd40: 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  NOT NULL */.    
cd50: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
cd60: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
cd70: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
cd80: 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20  *zErr;.         
cd90: 20 69 6e 74 20 6a 6d 70 32 3b 0a 20 20 20 20 20   int jmp2;.     
cda0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62       if( j==pTab
cdb0: 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e  ->iPKey ) contin
cdc0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
cdd0: 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ( pTab->aCol[j].
cde0: 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e  notNull==0 ) con
cdf0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
ce00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ce10: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
ce20: 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43  (v, pTab, iDataC
ce30: 75 72 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20 20  ur, j, 3);.     
ce40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ce50: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
ce60: 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
ce70: 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20           jmp2 = 
ce80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ce90: 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
cea0: 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   3); VdbeCoverag
ceb0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
cec0: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  zErr = sqlite3MP
ced0: 72 69 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20  rintf(db, "NULL 
cee0: 76 61 6c 75 65 20 69 6e 20 25 73 2e 25 73 22 2c  value in %s.%s",
cef0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
cf20: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
cf30: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cf40: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
cf50: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
cf60: 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44  3, 0, zErr, P4_D
cf70: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
cf80: 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63     integrityChec
cf90: 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20  kResultRow(v);. 
cfa0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cfb0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
cfc0: 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  jmp2);.        }
cfd0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69  .        /* Veri
cfe0: 66 79 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  fy CHECK constra
cff0: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
d000: 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  if( pTab->pCheck
d010: 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
d020: 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43 68   SQLITE_IgnoreCh
d030: 65 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ecks)==0 ){.    
d040: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
d050: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
d060: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
d070: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 30 29  pTab->pCheck, 0)
d080: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d090: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d0a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
d0b0: 20 20 20 69 6e 74 20 61 64 64 72 43 6b 46 61 75     int addrCkFau
d0c0: 6c 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  lt = sqlite3Vdbe
d0d0: 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
d0e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
d0f0: 6e 74 20 61 64 64 72 43 6b 4f 6b 20 3d 20 73 71  nt addrCkOk = sq
d100: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d110: 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
d120: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45          char *zE
d130: 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr;.            
d140: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
d150: 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
d160: 54 61 62 20 3d 20 69 44 61 74 61 43 75 72 20 2b  Tab = iDataCur +
d170: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
d180: 66 6f 72 28 6b 3d 70 43 68 65 63 6b 2d 3e 6e 45  for(k=pCheck->nE
d190: 78 70 72 2d 31 3b 20 6b 3e 30 3b 20 6b 2d 2d 29  xpr-1; k>0; k--)
d1a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d1b0: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
d1c0: 73 65 28 70 50 61 72 73 65 2c 20 70 43 68 65 63  se(pParse, pChec
d1d0: 6b 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 61  k->a[k].pExpr, a
d1e0: 64 64 72 43 6b 46 61 75 6c 74 2c 20 30 29 3b 0a  ddrCkFault, 0);.
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d200: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d210: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
d220: 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 30 5d  se, pCheck->a[0]
d230: 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b 4f 6b  .pExpr, addrCkOk
d240: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d250: 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46     SQLITE_JUMPIF
d260: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
d270: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
d280: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
d290: 64 72 43 6b 46 61 75 6c 74 29 3b 0a 20 20 20 20  drCkFault);.    
d2a0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
d2b0: 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20  iSelfTab = 0;.  
d2c0: 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d            zErr =
d2d0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
d2e0: 64 62 2c 20 22 43 48 45 43 4b 20 63 6f 6e 73 74  db, "CHECK const
d2f0: 72 61 69 6e 74 20 66 61 69 6c 65 64 20 69 6e 20  raint failed in 
d300: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
d310: 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
d320: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d340: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
d350: 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50  0, 3, 0, zErr, P
d360: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
d370: 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69 74          integrit
d380: 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28  yCheckResultRow(
d390: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
d3a0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d3b0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
d3c0: 6b 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  kOk);.          
d3d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
d3e0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
d3f0: 65 28 64 62 2c 20 70 43 68 65 63 6b 29 3b 0a 20  e(db, pCheck);. 
d400: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d410: 20 69 66 28 20 21 69 73 51 75 69 63 6b 20 29 7b   if( !isQuick ){
d420: 20 2f 2a 20 4f 6d 69 74 20 74 68 65 20 72 65 6d   /* Omit the rem
d430: 61 69 6e 69 6e 67 20 74 65 73 74 73 20 66 6f 72  aining tests for
d440: 20 71 75 69 63 6b 5f 63 68 65 63 6b 20 2a 2f 0a   quick_check */.
d450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
d460: 69 64 61 74 65 20 69 6e 64 65 78 20 65 6e 74 72  idate index entr
d470: 69 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  ies for the curr
d480: 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ent row */.     
d490: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
d4a0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
d4b0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
d4c0: 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20  ->pNext, j++){. 
d4d0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
d4e0: 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c  mp2, jmp3, jmp4,
d4f0: 20 6a 6d 70 35 3b 0a 20 20 20 20 20 20 20 20 20   jmp5;.         
d500: 20 20 20 69 6e 74 20 63 6b 55 6e 69 71 20 3d 20     int ckUniq = 
d510: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d520: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
d530: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
d540: 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e  k==pIdx ) contin
d550: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
d560: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65  r1 = sqlite3Gene
d570: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
d580: 72 73 65 2c 20 70 49 64 78 2c 20 69 44 61 74 61  rse, pIdx, iData
d590: 43 75 72 2c 20 30 2c 20 30 2c 20 26 6a 6d 70 33  Cur, 0, 0, &jmp3
d5a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5c0: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
d5d0: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  r, r1);.        
d5e0: 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 49 64      pPrior = pId
d5f0: 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  x;.            s
d600: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d610: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 38  (v, OP_AddImm, 8
d620: 2b 6a 2c 20 31 29 3b 2f 2a 20 69 6e 63 72 65 6d  +j, 1);/* increm
d630: 65 6e 74 20 65 6e 74 72 79 20 63 6f 75 6e 74 20  ent entry count 
d640: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  */.            /
d650: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6e  * Verify that an
d660: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 65 78 69   index entry exi
d670: 73 74 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  sts for the curr
d680: 65 6e 74 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f  ent table row */
d690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
d6a0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
d6b0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
d6c0: 6f 75 6e 64 2c 20 69 49 64 78 43 75 72 2b 6a 2c  ound, iIdxCur+j,
d6d0: 20 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20 20 20   ckUniq, r1,.   
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
d710: 6d 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  mn); VdbeCoverag
d720: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
d730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
d740: 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 72  dString(v, 3, "r
d750: 6f 77 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ow ");.         
d760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d770: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  dOp3(v, OP_Conca
d780: 74 2c 20 37 2c 20 33 2c 20 33 29 3b 0a 20 20 20  t, 7, 3, 3);.   
d790: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d7a0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
d7b0: 2c 20 34 2c 20 22 20 6d 69 73 73 69 6e 67 20 66  , 4, " missing f
d7c0: 72 6f 6d 20 69 6e 64 65 78 20 22 29 3b 0a 20 20  rom index ");.  
d7d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d7e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d7f0: 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20  P_Concat, 4, 3, 
d800: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
d810: 6a 6d 70 35 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp5 = sqlite3Vd
d820: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
d830: 34 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  4, pIdx->zName);
d840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d850: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d860: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20  , OP_Concat, 4, 
d870: 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 3);.         
d880: 20 20 20 6a 6d 70 34 20 3d 20 69 6e 74 65 67 72     jmp4 = integr
d890: 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f  ityCheckResultRo
d8a0: 77 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  w(v);.          
d8b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d8c0: 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b 0a  pHere(v, jmp2);.
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d8e0: 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 65  or UNIQUE indexe
d8f0: 73 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 6f  s, verify that o
d900: 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20 65 78  nly one entry ex
d910: 69 73 74 73 20 77 69 74 68 20 74 68 65 0a 20 20  ists with the.  
d920: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
d930: 72 65 6e 74 20 6b 65 79 2e 20 20 54 68 65 20 65  rent key.  The e
d940: 6e 74 72 79 20 69 73 20 75 6e 69 71 75 65 20 69  ntry is unique i
d950: 66 20 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e  f (1) any column
d960: 20 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20   is NULL.       
d970: 20 20 20 20 20 2a 2a 20 6f 72 20 28 32 29 20 74       ** or (2) t
d980: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 68 61  he next entry ha
d990: 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 65  s a different ke
d9a0: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  y */.           
d9b0: 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
d9c0: 65 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20  ex(pIdx) ){.    
d9d0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 75 6e            int un
d9e0: 69 71 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  iqOk = sqlite3Vd
d9f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
da00: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  se);.           
da10: 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20 20 20     int jmp6;.   
da20: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
da30: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
da40: 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49   for(kk=0; kk<pI
da50: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b  dx->nKeyCol; kk+
da60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
da70: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
da80: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b  Idx->aiColumn[kk
da90: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
daa0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 21     assert( iCol!
dab0: 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 69 43 6f  =XN_ROWID && iCo
dac0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  l<pTab->nCol );.
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70  if( iCol>=0 && p
daf0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
db00: 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74 69 6e  notNull ) contin
db10: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
db20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
db40: 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f  ll, r1+kk, uniqO
db50: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
db60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
db70: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
db80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
db90: 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65     jmp6 = sqlite
dba0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
dbb0: 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2b  P_Next, iIdxCur+
dbc0: 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  j); VdbeCoverage
dbd0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
dbe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
dbf0: 74 6f 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20  to(v, uniqOk);. 
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
dc10: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
dc20: 28 76 2c 20 6a 6d 70 36 29 3b 0a 20 20 20 20 20  (v, jmp6);.     
dc30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dc40: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
dc50: 20 4f 50 5f 49 64 78 47 54 2c 20 69 49 64 78 43   OP_IdxGT, iIdxC
dc60: 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c 20 72 31  ur+j, uniqOk, r1
dc70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65 79 43       pIdx->nKeyC
dca0: 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
dcb0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
dcc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
dcd0: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20  oadString(v, 3, 
dce0: 22 6e 6f 6e 2d 75 6e 69 71 75 65 20 65 6e 74 72  "non-unique entr
dcf0: 79 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20  y in index ");. 
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
dd10: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
dd20: 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp5);.         
dd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd40: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
dd50: 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20  uniqOk);.       
dd60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
dd70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
dd80: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b  mpHere(v, jmp4);
dd90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
dda0: 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49  ite3ResolvePartI
ddb0: 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20  dxLabel(pParse, 
ddc0: 6a 6d 70 33 29 3b 0a 20 20 20 20 20 20 20 20 20  jmp3);.         
ddd0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
dde0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ddf0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
de00: 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f  t, iDataCur, loo
de10: 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72  pTop); VdbeCover
de20: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
de30: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
de40: 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31  ere(v, loopTop-1
de50: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
de60: 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
de70: 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  T.        if( !i
de80: 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20  sQuick ){.      
de90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
dea0: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 32 2c 20  oadString(v, 2, 
deb0: 22 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72  "wrong # of entr
dec0: 69 65 73 20 69 6e 20 69 6e 64 65 78 20 22 29 3b  ies in index ");
ded0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
dee0: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
def0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
df00: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
df10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
df20: 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29   if( pPk==pIdx )
df30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
df40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
df50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
df60: 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c  ount, iIdxCur+j,
df70: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
df80: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
df90: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
dfa0: 45 71 2c 20 38 2b 6a 2c 20 30 2c 20 33 29 3b 20  Eq, 8+j, 0, 3); 
dfb0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
dfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
dfd0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
dfe0: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55  (v, SQLITE_NOTNU
dff0: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LL);.           
e000: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
e010: 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70 49 64  String(v, 4, pId
e020: 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
e030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e040: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
e050: 6f 6e 63 61 74 2c 20 34 2c 20 32 2c 20 33 29 3b  oncat, 4, 2, 3);
e060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
e070: 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c  egrityCheckResul
e080: 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20 20  tRow(v);.       
e090: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e0a0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
e0b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
e0c0: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
e0d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
e0e0: 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
e0f0: 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20     } .    }.    
e100: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
e110: 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56  onst int iLn = V
e120: 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e  DBE_OFFSET_LINEN
e130: 4f 28 32 29 3b 0a 20 20 20 20 20 20 73 74 61 74  O(2);.      stat
e140: 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
e150: 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20  ist endCode[] = 
e160: 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 41  {.        { OP_A
e170: 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30  ddImm,      1, 0
e180: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
e190: 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 0 */.        
e1a0: 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  { OP_IfNotZero, 
e1b0: 20 20 31 2c 20 34 2c 20 20 20 20 20 20 20 20 30    1, 4,        0
e1c0: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
e1d0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
e1e0: 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 20  g8,     0, 3,   
e1f0: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32       0},    /* 2
e200: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
e210: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c  _ResultRow,   3,
e220: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   1,        0},  
e230: 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20    /* 3 */.      
e240: 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20    { OP_Halt,    
e250: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
e260: 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a   0},    /* 4 */.
e270: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72          { OP_Str
e280: 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20  ing8,     0, 3, 
e290: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
e2a0: 20 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   5 */.        { 
e2b0: 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 20  OP_Goto,        
e2c0: 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
e2d0: 20 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20      /* 6 */.    
e2e0: 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f    };.      VdbeO
e2f0: 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61  p *aOp;..      a
e300: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
e310: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
e320: 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c  aySize(endCode),
e330: 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a   endCode, iLn);.
e340: 20 20 20 20 20 20 69 66 28 20 61 4f 70 20 29 7b        if( aOp ){
e350: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
e360: 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b 0a 20 20  p2 = 1-mxErr;.  
e370: 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 74        aOp[2].p4t
e380: 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b  ype = P4_STATIC;
e390: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e  .        aOp[2].
e3a0: 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20 20  p4.z = "ok";.   
e3b0: 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70 34 74 79       aOp[5].p4ty
e3c0: 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b 0a  pe = P4_STATIC;.
e3d0: 20 20 20 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70          aOp[5].p
e3e0: 34 2e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  4.z = (char*)sql
e3f0: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
e400: 45 5f 43 4f 52 52 55 50 54 29 3b 0a 20 20 20 20  E_CORRUPT);.    
e410: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e420: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
e430: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
e440: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
e450: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
e460: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  eak;.#endif /* S
e470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
e480: 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
e490: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e4a0: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20  IT_UTF16.  /*.  
e4b0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f  **   PRAGMA enco
e4c0: 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47  ding.  **   PRAG
e4d0: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75  MA encoding = "u
e4e0: 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22  tf-8"|"utf-16"|"
e4f0: 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31  utf-16le"|"utf-1
e500: 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  6be".  **.  ** I
e510: 6e 20 69 74 73 20 66 69 72 73 74 20 66 6f 72 6d  n its first form
e520: 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20 72 65  , this pragma re
e530: 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69  turns the encodi
e540: 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20  ng of the main. 
e550: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66   ** database. If
e560: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
e570: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
e580: 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  , it is initiali
e590: 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20  zed now..  **.  
e5a0: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
e5b0: 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d  rm of this pragm
e5c0: 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  a is a no-op if 
e5d0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
e5e0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20  e file.  ** has 
e5f0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
e600: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e   initialized. In
e610: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 73 65   this case it se
e620: 74 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20  ts the default. 
e630: 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61   ** encoding tha
e640: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
e650: 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
e660: 62 61 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e  base file if a n
e670: 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  ew file.  ** is 
e680: 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65  created. If an e
e690: 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74  xisting main dat
e6a0: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
e6b0: 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20  ened, then the. 
e6c0: 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74   ** default text
e6d0: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
e6e0: 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
e6f0: 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a  ase is used..  *
e700: 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63  * .  ** In all c
e710: 61 73 65 73 20 6e 65 77 20 64 61 74 61 62 61 73  ases new databas
e720: 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  es created using
e730: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
e740: 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65  and are.  ** cre
e750: 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  ated to use the 
e760: 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78  same default tex
e770: 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68  t encoding as th
e780: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
e790: 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69   If.  ** the mai
e7a0: 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  n database has n
e7b0: 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  ot been initiali
e7c0: 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74  zed and/or creat
e7d0: 65 64 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20  ed when ATTACH. 
e7e0: 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c   ** is executed,
e7f0: 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   this is done be
e800: 66 6f 72 65 20 74 68 65 20 41 54 54 41 43 48 20  fore the ATTACH 
e810: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  operation..  **.
e820: 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f    ** In the seco
e830: 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61  nd form this pra
e840: 67 6d 61 20 73 65 74 73 20 74 68 65 20 74 65 78  gma sets the tex
e850: 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65  t encoding to be
e860: 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65   used in.  ** ne
e870: 77 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  w database files
e880: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
e890: 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  his database han
e8a0: 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a  dle. It is only.
e8b0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69    ** useful if i
e8c0: 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65  nvoked immediate
e8d0: 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d 61 69  ly after the mai
e8e0: 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a  n database i.  *
e8f0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
e900: 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20 20  _ENCODING: {.   
e910: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
e920: 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a 20  ruct EncName {. 
e930: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
e940: 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 3b 0a  ;.      u8 enc;.
e950: 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d      } encnames[]
e960: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 55 54   = {.      { "UT
e970: 46 38 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  F8",     SQLITE_
e980: 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c 0a 20  UTF8        },. 
e990: 20 20 20 20 20 7b 20 22 55 54 46 2d 38 22 2c 20       { "UTF-8", 
e9a0: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20     SQLITE_UTF8  
e9b0: 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73        },  /* Mus
e9c0: 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31 5d  t be element [1]
e9d0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46   */.      { "UTF
e9e0: 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55  -16le", SQLITE_U
e9f0: 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 20 20 2f  TF16LE     },  /
ea00: 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e  * Must be elemen
ea10: 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20 7b  t [2] */.      {
ea20: 20 22 55 54 46 2d 31 36 62 65 22 2c 20 53 51 4c   "UTF-16be", SQL
ea30: 49 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20  ITE_UTF16BE     
ea40: 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65  },  /* Must be e
ea50: 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20  lement [3] */.  
ea60: 20 20 20 20 7b 20 22 55 54 46 31 36 6c 65 22 2c      { "UTF16le",
ea70: 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45    SQLITE_UTF16LE
ea80: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
ea90: 22 55 54 46 31 36 62 65 22 2c 20 20 53 51 4c 49  "UTF16be",  SQLI
eaa0: 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d  TE_UTF16BE     }
eab0: 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31  ,.      { "UTF-1
eac0: 36 22 2c 20 20 20 30 20 20 20 20 20 20 20 20 20  6",   0         
ead0: 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53           }, /* S
eae0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
eaf0: 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54  E */.      { "UT
eb00: 46 31 36 22 2c 20 20 20 20 30 20 20 20 20 20 20  F16",    0      
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f              }, /
eb20: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
eb30: 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20  TIVE */.      { 
eb40: 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20  0, 0 }.    };.  
eb50: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45    const struct E
eb60: 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20 20  ncName *pEnc;.  
eb70: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
eb80: 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65      /* "PRAGMA e
eb90: 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20  ncoding" */.    
eba0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
ebb0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
ebc0: 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75  ) goto pragma_ou
ebd0: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
ebe0: 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45   encnames[SQLITE
ebf0: 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49  _UTF8].enc==SQLI
ec00: 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20  TE_UTF8 );.     
ec10: 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65   assert( encname
ec20: 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  s[SQLITE_UTF16LE
ec30: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
ec40: 46 31 36 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  F16LE );.      a
ec50: 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b  ssert( encnames[
ec60: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2e  SQLITE_UTF16BE].
ec70: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
ec80: 36 42 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74  6BE );.      ret
ec90: 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c  urnSingleText(v,
eca0: 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70 50   encnames[ENC(pP
ecb0: 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d 65  arse->db)].zName
ecc0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20  );.    }else{   
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20       /* "PRAGMA 
ecf0: 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58 22 20  encoding = XXX" 
ed00: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79  */.      /* Only
ed10: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
ed20: 65 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63 20  e of sqlite.enc 
ed30: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
ed40: 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20 20  handle is not.  
ed50: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
ed60: 65 64 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20  ed. If the main 
ed70: 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2c  database exists,
ed80: 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 2e   the new sqlite.
ed90: 65 6e 63 20 76 61 6c 75 65 0a 20 20 20 20 20 20  enc value.      
eda0: 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  ** will be overw
edb0: 72 69 74 74 65 6e 20 77 68 65 6e 20 74 68 65 20  ritten when the 
edc0: 73 63 68 65 6d 61 20 69 73 20 6e 65 78 74 20 6c  schema is next l
edd0: 6f 61 64 65 64 2e 20 49 66 20 69 74 20 64 6f 65  oaded. If it doe
ede0: 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61  s not.      ** a
edf0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 69  lready exists, i
ee00: 74 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  t will be create
ee10: 64 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77  d to use the new
ee20: 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65 2e   encoding value.
ee30: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ee40: 69 66 28 20 0a 20 20 20 20 20 20 20 20 21 28 44  if( .        !(D
ee50: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
ee60: 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
ee70: 64 65 64 29 29 20 7c 7c 20 0a 20 20 20 20 20 20  ded)) || .      
ee80: 20 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28    DbHasProperty(
ee90: 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79 29  db, 0, DB_Empty)
eea0: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
eeb0: 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63     for(pEnc=&enc
eec0: 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e  names[0]; pEnc->
eed0: 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a  zName; pEnc++){.
eee0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d            if( 0=
eef0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
ef00: 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e  zRight, pEnc->zN
ef10: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
ef20: 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 64      SCHEMA_ENC(d
ef30: 62 29 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a 20  b) = ENC(db) =. 
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
ef50: 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63 2d  Enc->enc ? pEnc-
ef60: 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55 54  >enc : SQLITE_UT
ef70: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 20  F16NATIVE;.     
ef80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ef90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
efa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
efb0: 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  !pEnc->zName ){.
efc0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
efd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
efe0: 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 65  , "unsupported e
eff0: 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a 52  ncoding: %s", zR
f000: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  ight);.        }
f010: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f020: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
f030: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f040: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
f050: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f060: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50  SCHEMA_VERSION_P
f070: 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a  RAGMAS.  /*.  **
f080: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
f090: 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  a.]schema_versio
f0a0: 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  n.  **   PRAGMA 
f0b0: 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f  [schema.]schema_
f0c0: 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67  version = <integ
f0d0: 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  er>.  **.  **   
f0e0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
f0f0: 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20 2a  user_version.  *
f100: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
f110: 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e  ma.]user_version
f120: 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a   = <integer>.  *
f130: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
f140: 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69 73  [schema.]freelis
f150: 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20 2a  t_count.  **.  *
f160: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
f170: 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73 69 6f 6e  ma.]data_version
f180: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  **.  **   PRA
f190: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70 70  GMA [schema.]app
f1a0: 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a  lication_id.  **
f1b0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
f1c0: 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69  a.]application_i
f1d0: 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20  d = <integer>.  
f1e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72 61 67  **.  ** The prag
f1f0: 6d 61 27 73 20 73 63 68 65 6d 61 5f 76 65 72 73  ma's schema_vers
f200: 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76 65 72  ion and user_ver
f210: 73 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  sion are used to
f220: 20 73 65 74 20 6f 72 20 67 65 74 0a 20 20 2a 2a   set or get.  **
f230: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
f240: 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e  e schema-version
f250: 20 61 6e 64 20 75 73 65 72 2d 76 65 72 73 69 6f   and user-versio
f260: 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  n, respectively.
f270: 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65 20 73   Both.  ** the s
f280: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e  chema-version an
f290: 64 20 74 68 65 20 75 73 65 72 2d 76 65 72 73 69  d the user-versi
f2a0: 6f 6e 20 61 72 65 20 33 32 2d 62 69 74 20 73 69  on are 32-bit si
f2b0: 67 6e 65 64 20 69 6e 74 65 67 65 72 73 0a 20 20  gned integers.  
f2c0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
f2d0: 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
f2e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
f2f0: 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 69 73  schema-cookie is
f300: 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61   usually only ma
f310: 6e 69 70 75 6c 61 74 65 64 20 69 6e 74 65 72 6e  nipulated intern
f320: 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20  ally by SQLite. 
f330: 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63 72 65  It.  ** is incre
f340: 6d 65 6e 74 65 64 20 62 79 20 53 51 4c 69 74 65  mented by SQLite
f350: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64 61   whenever the da
f360: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
f370: 20 6d 6f 64 69 66 69 65 64 20 28 62 79 0a 20 20   modified (by.  
f380: 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  ** creating or d
f390: 72 6f 70 70 69 6e 67 20 61 20 74 61 62 6c 65 20  ropping a table 
f3a0: 6f 72 20 69 6e 64 65 78 29 2e 20 54 68 65 20 73  or index). The s
f3b0: 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 69 73  chema version is
f3c0: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 53 51   used by.  ** SQ
f3d0: 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65 20 61  Lite each time a
f3e0: 20 71 75 65 72 79 20 69 73 20 65 78 65 63 75 74   query is execut
f3f0: 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
f400: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  t the internal c
f410: 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ache.  ** of the
f420: 20 73 63 68 65 6d 61 20 75 73 65 64 20 77 68 65   schema used whe
f430: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20  n compiling the 
f440: 53 51 4c 20 71 75 65 72 79 20 6d 61 74 63 68 65  SQL query matche
f450: 73 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 0a  s the schema of.
f460: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
f470: 65 20 61 67 61 69 6e 73 74 20 77 68 69 63 68 20  e against which 
f480: 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 71 75 65  the compiled que
f490: 72 79 20 69 73 20 61 63 74 75 61 6c 6c 79 20 65  ry is actually e
f4a0: 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 53 75  xecuted..  ** Su
f4b0: 62 76 65 72 74 69 6e 67 20 74 68 69 73 20 6d 65  bverting this me
f4c0: 63 68 61 6e 69 73 6d 20 62 79 20 75 73 69 6e 67  chanism by using
f4d0: 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f   "PRAGMA schema_
f4e0: 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f 64 69  version" to modi
f4f0: 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
f500: 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73 20 70 6f  ma-version is po
f510: 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67 65 72  tentially danger
f520: 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c 65 61 64  ous and may lead
f530: 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2a   to program.  **
f540: 20 63 72 61 73 68 65 73 20 6f 72 20 64 61 74 61   crashes or data
f550: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
f560: 20 55 73 65 20 77 69 74 68 20 63 61 75 74 69 6f   Use with cautio
f570: 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n!.  **.  ** The
f580: 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 69 73   user-version is
f590: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
f5a0: 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e 20  ally by SQLite. 
f5b0: 49 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 62  It may be used b
f5c0: 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61 74 69  y.  ** applicati
f5d0: 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70 75 72 70  ons for any purp
f5e0: 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ose..  */.  case
f5f0: 20 50 72 61 67 54 79 70 5f 48 45 41 44 45 52 5f   PragTyp_HEADER_
f600: 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 6e 74  VALUE: {.    int
f610: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
f620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
f630: 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20 72 65  ich cookie to re
f640: 61 64 20 6f 72 20 77 72 69 74 65 20 2a 2f 0a 20  ad or write */. 
f650: 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72     iCookie = pPr
f660: 61 67 6d 61 2d 3e 69 41 72 67 20 26 20 50 52 41  agma->iArg & PRA
f670: 47 4d 41 5f 48 45 41 44 45 52 5f 56 41 4c 55 45  GMA_HEADER_VALUE
f680: 5f 4d 41 53 4b 3b 20 20 20 20 20 0a 20 20 20 20  _MASK;     .    
f690: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
f6a0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
f6b0: 20 20 69 66 28 20 7a 52 69 67 68 74 20 26 26 20    if( zRight && 
f6c0: 28 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 26  (pPragma->iArg &
f6d0: 20 50 52 41 47 4d 41 5f 48 45 41 44 45 52 5f 56   PRAGMA_HEADER_V
f6e0: 41 4c 55 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d  ALUE_READONLY)==
f6f0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72  0 ){.      /* Wr
f700: 69 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ite the specifie
f710: 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  d cookie value *
f720: 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
f730: 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20  onst VdbeOpList 
f740: 73 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a  setCookie[] = {.
f750: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61          { OP_Tra
f760: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20  nsaction,    0, 
f770: 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30   1,  0},    /* 0
f780: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
f790: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20  _SetCookie,     
f7a0: 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20   0,  0,  0},    
f7b0: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b  /* 1 */.      };
f7c0: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61  .      VdbeOp *a
f7d0: 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Op;.      sqlite
f7e0: 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c  3VdbeVerifyNoMal
f7f0: 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41  locRequired(v, A
f800: 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b  rraySize(setCook
f810: 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ie));.      aOp 
f820: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f830: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
f840: 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20  ize(setCookie), 
f850: 73 65 74 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  setCookie, 0);. 
f860: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
f870: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
f880: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
f890: 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31  .      aOp[0].p1
f8a0: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
f8b0: 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[1].p1 = iDb;. 
f8c0: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d       aOp[1].p2 =
f8d0: 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20   iCookie;.      
f8e0: 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69  aOp[1].p3 = sqli
f8f0: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b  te3Atoi(zRight);
f900: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f910: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 70    /* Read the sp
f920: 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76  ecified cookie v
f930: 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74  alue */.      st
f940: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
f950: 70 4c 69 73 74 20 72 65 61 64 43 6f 6f 6b 69 65  pList readCookie
f960: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
f970: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
f980: 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c       0,  0,  0},
f990: 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20      /* 0 */.    
f9a0: 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
f9b0: 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 31 2c  kie,      0,  1,
f9c0: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f    0},    /* 1 */
f9d0: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  .        { OP_Re
f9e0: 73 75 6c 74 52 6f 77 2c 20 20 20 20 20 20 20 31  sultRow,       1
f9f0: 2c 20 20 31 2c 20 20 30 7d 0a 20 20 20 20 20 20  ,  1,  0}.      
fa00: 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  };.      VdbeOp 
fa10: 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  *aOp;.      sqli
fa20: 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d  te3VdbeVerifyNoM
fa30: 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c  allocRequired(v,
fa40: 20 41 72 72 61 79 53 69 7a 65 28 72 65 61 64 43   ArraySize(readC
fa50: 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61  ookie));.      a
fa60: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
fa70: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
fa80: 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69  aySize(readCooki
fa90: 65 29 2c 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29  e),readCookie,0)
faa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59  ;.      if( ONLY
fab0: 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  _IF_REALLOC_STRE
fac0: 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65  SS(aOp==0) ) bre
fad0: 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d  ak;.      aOp[0]
fae0: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
faf0: 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62   aOp[1].p1 = iDb
fb00: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70  ;.      aOp[1].p
fb10: 33 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20  3 = iCookie;.   
fb20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
fb30: 75 73 61 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d  usable(v);.    }
fb40: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
fb50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
fb60: 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  MIT_SCHEMA_VERSI
fb70: 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  ON_PRAGMAS */..#
fb80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fb90: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
fba0: 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a  _DIAGS.  /*.  **
fbb0: 20 20 20 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c     PRAGMA compil
fbc0: 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20  e_options.  **. 
fbd0: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
fbe0: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70  ames of all comp
fbf0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
fc00: 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 62 75   used in this bu
fc10: 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70  ild,.  ** one op
fc20: 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20  tion per row..  
fc30: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
fc40: 70 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e  p_COMPILE_OPTION
fc50: 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  S: {.    int i =
fc60: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
fc70: 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50  ar *zOpt;.    pP
fc80: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a  arse->nMem = 1;.
fc90: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4f 70 74      while( (zOpt
fca0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69   = sqlite3_compi
fcb0: 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b  leoption_get(i++
fcc0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
fcd0: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
fce0: 72 69 6e 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29  ring(v, 1, zOpt)
fcf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fd00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fd10: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29  ResultRow, 1, 1)
fd20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fd30: 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28  te3VdbeReusable(
fd40: 76 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  v);.  }.  break;
fd50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
fd60: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
fd70: 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23  TION_DIAGS */..#
fd80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fd90: 49 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a  IT_WAL.  /*.  **
fda0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
fdb0: 61 2e 5d 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  a.]wal_checkpoin
fdc0: 74 20 3d 20 70 61 73 73 69 76 65 7c 66 75 6c 6c  t = passive|full
fdd0: 7c 72 65 73 74 61 72 74 7c 74 72 75 6e 63 61 74  |restart|truncat
fde0: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63  e.  **.  ** Chec
fdf0: 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62  kpoint the datab
fe00: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
fe10: 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 43 48 45   PragTyp_WAL_CHE
fe20: 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69  CKPOINT: {.    i
fe30: 6e 74 20 69 42 74 20 3d 20 28 70 49 64 32 2d 3e  nt iBt = (pId2->
fe40: 7a 3f 69 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58  z?iDb:SQLITE_MAX
fe50: 5f 41 54 54 41 43 48 45 44 29 3b 0a 20 20 20 20  _ATTACHED);.    
fe60: 69 6e 74 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49  int eMode = SQLI
fe70: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
fe80: 53 53 49 56 45 3b 0a 20 20 20 20 69 66 28 20 7a  SSIVE;.    if( z
fe90: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69  Right ){.      i
fea0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
feb0: 70 28 7a 52 69 67 68 74 2c 20 22 66 75 6c 6c 22  p(zRight, "full"
fec0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fed0: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
fee0: 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a  HECKPOINT_FULL;.
fef0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ff00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
ff10: 52 69 67 68 74 2c 20 22 72 65 73 74 61 72 74 22  Right, "restart"
ff20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ff30: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
ff40: 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
ff50: 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  T;.      }else i
ff60: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
ff70: 70 28 7a 52 69 67 68 74 2c 20 22 74 72 75 6e 63  p(zRight, "trunc
ff80: 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ate")==0 ){.    
ff90: 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49      eMode = SQLI
ffa0: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
ffb0: 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a  UNCATE;.      }.
ffc0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
ffd0: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
ffe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fff0: 33 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69  3(v, OP_Checkpoi
10000 6e 74 2c 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20  nt, iBt, eMode, 
10010 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
10020 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10030 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29  ResultRow, 1, 3)
10040 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  ;.  }.  break;..
10050 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
10060 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  MA wal_autocheck
10070 70 6f 69 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41  point.  **   PRA
10080 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  GMA wal_autochec
10090 6b 70 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a  kpoint = N.  **.
100a0 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61    ** Configure a
100b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
100c0 74 69 6f 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69  tion to automati
100d0 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
100e0 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a   a database.  **
100f0 20 61 66 74 65 72 20 61 63 63 75 6d 75 6c 61 74   after accumulat
10100 69 6e 67 20 4e 20 66 72 61 6d 65 73 20 69 6e 20  ing N frames in 
10110 74 68 65 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72  the log. Or quer
10120 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
10130 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20  t value.  ** of 
10140 4e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  N..  */.  case P
10150 72 61 67 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43  ragTyp_WAL_AUTOC
10160 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20  HECKPOINT: {.   
10170 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
10180 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c       sqlite3_wal
10190 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
101a0 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28  db, sqlite3Atoi(
101b0 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a  zRight));.    }.
101c0 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
101d0 49 6e 74 28 76 2c 20 0a 20 20 20 20 20 20 20 64  Int(v, .       d
101e0 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d  b->xWalCallback=
101f0 3d 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75  =sqlite3WalDefau
10200 6c 74 48 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20  ltHook ? .      
10210 20 20 20 20 20 53 51 4c 49 54 45 5f 50 54 52 5f       SQLITE_PTR_
10220 54 4f 5f 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41  TO_INT(db->pWalA
10230 72 67 29 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  rg) : 0);.  }.  
10240 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20  break;.#endif.. 
10250 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
10260 20 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20   shrink_memory. 
10270 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
10280 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33  NTATION-OF: R-23
10290 34 34 35 2d 34 36 31 30 39 20 54 68 69 73 20 70  445-46109 This p
102a0 72 61 67 6d 61 20 63 61 75 73 65 73 20 74 68 65  ragma causes the
102b0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 63   database.  ** c
102c0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69  onnection on whi
102d0 63 68 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  ch it is invoked
102e0 20 74 6f 20 66 72 65 65 20 75 70 20 61 73 20 6d   to free up as m
102f0 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 69 74  uch memory as it
10300 0a 20 20 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61  .  ** can, by ca
10310 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 62  lling sqlite3_db
10320 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
10330 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  )..  */.  case P
10340 72 61 67 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45  ragTyp_SHRINK_ME
10350 4d 4f 52 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69  MORY: {.    sqli
10360 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
10370 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 20 20 62  emory(db);.    b
10380 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
10390 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70 74    **  PRAGMA opt
103a0 69 6d 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  imize.  **  PRAG
103b0 4d 41 20 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b  MA optimize(MASK
103c0 29 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73  ).  **  PRAGMA s
103d0 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a 20  chema.optimize. 
103e0 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65   **  PRAGMA sche
103f0 6d 61 2e 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b  ma.optimize(MASK
10400 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 74 65  ).  **.  ** Atte
10410 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  mpt to optimize 
10420 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
10430 6c 6c 20 73 63 68 65 6d 61 73 20 61 72 65 20 6f  ll schemas are o
10440 70 74 69 6d 69 7a 65 64 20 69 6e 20 74 68 65 20  ptimized in the 
10450 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 66  first.  ** two f
10460 6f 72 6d 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  orms, and only t
10470 68 65 20 73 70 65 63 69 66 69 65 64 20 73 63 68  he specified sch
10480 65 6d 61 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ema is optimized
10490 20 69 6e 20 74 68 65 20 6c 61 74 74 65 72 20 74   in the latter t
104a0 77 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  wo..  **.  ** Th
104b0 65 20 64 65 74 61 69 6c 73 20 6f 66 20 6f 70 74  e details of opt
104c0 69 6d 69 7a 61 74 69 6f 6e 73 20 70 65 72 66 6f  imizations perfo
104d0 72 6d 65 64 20 62 79 20 74 68 69 73 20 70 72 61  rmed by this pra
104e0 67 6d 61 20 61 72 65 20 65 78 70 65 63 74 65 64  gma are expected
104f0 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  .  ** to change 
10500 61 6e 64 20 69 6d 70 72 6f 76 65 20 6f 76 65 72  and improve over
10510 20 74 69 6d 65 2e 20 20 41 70 70 6c 69 63 61 74   time.  Applicat
10520 69 6f 6e 73 20 73 68 6f 75 6c 64 20 61 6e 74 69  ions should anti
10530 63 69 70 61 74 65 20 74 68 61 74 0a 20 20 2a 2a  cipate that.  **
10540 20 74 68 69 73 20 70 72 61 67 6d 61 20 77 69 6c   this pragma wil
10550 6c 20 70 65 72 66 6f 72 6d 20 6e 65 77 20 6f 70  l perform new op
10560 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 66  timizations in f
10570 75 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a  uture releases..
10580 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 70    **.  ** The op
10590 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20  tional argument 
105a0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
105b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
105c0 20 70 65 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20   perform:.  **. 
105d0 20 2a 2a 20 20 20 20 30 78 30 30 30 31 20 20 20   **    0x0001   
105e0 20 44 65 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e   Debugging mode.
105f0 20 20 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c    Do not actuall
10600 79 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 6f 70  y perform any op
10610 74 69 6d 69 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a  timizations.  **
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
10630 74 20 69 6e 73 74 65 61 64 20 72 65 74 75 72 6e  t instead return
10640 20 6f 6e 65 20 6c 69 6e 65 20 6f 66 20 74 65 78   one line of tex
10650 74 20 66 6f 72 20 65 61 63 68 20 6f 70 74 69 6d  t for each optim
10660 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20  ization.  **    
10670 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 77            that w
10680 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 64  ould have been d
10690 6f 6e 65 2e 20 20 4f 66 66 20 62 79 20 64 65 66  one.  Off by def
106a0 61 75 6c 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ault..  **.  ** 
106b0 20 20 20 30 78 30 30 30 32 20 20 20 20 52 75 6e     0x0002    Run
106c0 20 41 4e 41 4c 59 5a 45 20 6f 6e 20 74 61 62 6c   ANALYZE on tabl
106d0 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  es that might be
106e0 6e 65 66 69 74 2e 20 20 4f 6e 20 62 79 20 64 65  nefit.  On by de
106f0 66 61 75 6c 74 2e 0a 20 20 2a 2a 20 20 20 20 20  fault..  **     
10700 20 20 20 20 20 20 20 20 20 53 65 65 20 62 65 6c           See bel
10710 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ow for additiona
10720 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
10730 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30   **.  **    0x00
10740 30 34 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69  04    (Not yet i
10750 6d 70 6c 65 6d 65 6e 74 65 64 29 20 52 65 63 6f  mplemented) Reco
10760 72 64 20 75 73 61 67 65 20 61 6e 64 20 70 65 72  rd usage and per
10770 66 6f 72 6d 61 6e 63 65 20 0a 20 20 2a 2a 20 20  formance .  **  
10780 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 66 6f              info
10790 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
107a0 20 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f 6e   current session
107b0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 20 20 20   in the.  **    
107c0 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
107d0 73 65 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  se file so that 
107e0 69 74 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c  it will be avail
107f0 61 62 6c 65 20 74 6f 20 22 6f 70 74 69 6d 69 7a  able to "optimiz
10800 65 22 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  e".  **         
10810 20 20 20 20 20 70 72 61 67 6d 61 73 20 72 75 6e       pragmas run
10820 20 62 79 20 66 75 74 75 72 65 20 64 61 74 61 62   by future datab
10830 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
10840 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78  .  **.  **    0x
10850 30 30 30 38 20 20 20 20 28 4e 6f 74 20 79 65 74  0008    (Not yet
10860 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 20 43 72   implemented) Cr
10870 65 61 74 65 20 69 6e 64 65 78 65 73 20 74 68 61  eate indexes tha
10880 74 20 6d 69 67 68 74 20 68 61 76 65 0a 20 20 2a  t might have.  *
10890 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  *              b
108a0 65 65 6e 20 68 65 6c 70 66 75 6c 20 74 6f 20 72  een helpful to r
108b0 65 63 65 6e 74 20 71 75 65 72 69 65 73 0a 20 20  ecent queries.  
108c0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 66 61  **.  ** The defa
108d0 75 6c 74 20 4d 41 53 4b 20 69 73 20 61 6e 64 20  ult MASK is and 
108e0 61 6c 77 61 79 73 20 73 68 61 6c 6c 20 62 65 20  always shall be 
108f0 30 78 66 66 66 65 2e 20 20 30 78 66 66 66 65 20  0xfffe.  0xfffe 
10900 6d 65 61 6e 73 20 70 65 72 66 6f 72 6d 20 61 6c  means perform al
10910 6c 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70  l.  ** of the op
10920 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 73 74  timizations list
10930 65 64 20 61 62 6f 76 65 20 65 78 63 65 70 74 20  ed above except 
10940 44 65 62 75 67 20 4d 6f 64 65 2c 20 69 6e 63 6c  Debug Mode, incl
10950 75 64 69 6e 67 20 6e 65 77 0a 20 20 2a 2a 20 6f  uding new.  ** o
10960 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61  ptimizations tha
10970 74 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  t have not yet b
10980 65 65 6e 20 69 6e 76 65 6e 74 65 64 2e 20 20 49  een invented.  I
10990 66 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74 69  f new optimizati
109a0 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 65 76 65  ons are.  ** eve
109b0 72 20 61 64 64 65 64 20 74 68 61 74 20 73 68 6f  r added that sho
109c0 75 6c 64 20 62 65 20 6f 66 66 20 62 79 20 64 65  uld be off by de
109d0 66 61 75 6c 74 2c 20 74 68 6f 73 65 20 6f 66 66  fault, those off
109e0 2d 62 79 2d 64 65 66 61 75 6c 74 20 0a 20 20 2a  -by-default .  *
109f0 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  * optimizations 
10a00 77 69 6c 6c 20 68 61 76 65 20 62 69 74 6d 61 73  will have bitmas
10a10 6b 73 20 6f 66 20 30 78 31 30 30 30 30 20 6f 72  ks of 0x10000 or
10a20 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 0a 20 20   larger..  **.  
10a30 2a 2a 20 44 45 54 45 52 4d 49 4e 41 54 49 4f 4e  ** DETERMINATION
10a40 20 4f 46 20 57 48 45 4e 20 54 4f 20 52 55 4e 20   OF WHEN TO RUN 
10a50 41 4e 41 4c 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a  ANALYZE.  **.  *
10a60 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * In the current
10a70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
10a80 20 61 20 74 61 62 6c 65 20 69 73 20 61 6e 61 6c   a table is anal
10a90 79 7a 65 64 20 69 66 20 6f 6e 6c 79 20 69 66 20  yzed if only if 
10aa0 61 6c 6c 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  all of.  ** the 
10ab0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
10ac0 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31  ue:.  **.  ** (1
10ad0 29 20 4d 41 53 4b 20 62 69 74 20 30 78 30 32 20  ) MASK bit 0x02 
10ae0 69 73 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  is set..  **.  *
10af0 2a 20 28 32 29 20 54 68 65 20 71 75 65 72 79 20  * (2) The query 
10b00 70 6c 61 6e 6e 65 72 20 75 73 65 64 20 73 71 6c  planner used sql
10b10 69 74 65 5f 73 74 61 74 31 2d 73 74 79 6c 65 20  ite_stat1-style 
10b20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 6f  statistics for o
10b30 6e 65 20 6f 72 0a 20 20 2a 2a 20 20 20 20 20 6d  ne or.  **     m
10b40 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74  ore indexes of t
10b50 68 65 20 74 61 62 6c 65 20 61 74 20 73 6f 6d 65  he table at some
10b60 20 70 6f 69 6e 74 20 64 75 72 69 6e 67 20 74 68   point during th
10b70 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 20 20  e lifetime of.  
10b80 2a 2a 20 20 20 20 20 74 68 65 20 63 75 72 72 65  **     the curre
10b90 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  nt connection.. 
10ba0 20 2a 2a 0a 20 20 2a 2a 20 28 33 29 20 4f 6e 65   **.  ** (3) One
10bb0 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73   or more indexes
10bc0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72   of the table ar
10bd0 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 61 6e  e currently unan
10be0 61 6c 79 7a 65 64 20 4f 52 0a 20 20 2a 2a 20 20  alyzed OR.  **  
10bf0 20 20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66     the number of
10c00 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
10c10 6c 65 20 68 61 73 20 69 6e 63 72 65 61 73 65 64  le has increased
10c20 20 62 79 20 32 35 20 74 69 6d 65 73 20 6f 72 20   by 25 times or 
10c30 6d 6f 72 65 0a 20 20 2a 2a 20 20 20 20 20 73 69  more.  **     si
10c40 6e 63 65 20 74 68 65 20 6c 61 73 74 20 74 69 6d  nce the last tim
10c50 65 20 41 4e 41 4c 59 5a 45 20 77 61 73 20 72 75  e ANALYZE was ru
10c60 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
10c70 20 72 75 6c 65 73 20 66 6f 72 20 77 68 65 6e 20   rules for when 
10c80 74 61 62 6c 65 73 20 61 72 65 20 61 6e 61 6c 79  tables are analy
10c90 7a 65 64 20 61 72 65 20 6c 69 6b 65 6c 79 20 74  zed are likely t
10ca0 6f 20 63 68 61 6e 67 65 20 69 6e 0a 20 20 2a 2a  o change in.  **
10cb0 20 66 75 74 75 72 65 20 72 65 6c 65 61 73 65 73   future releases
10cc0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
10cd0 61 67 54 79 70 5f 4f 50 54 49 4d 49 5a 45 3a 20  agTyp_OPTIMIZE: 
10ce0 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 4c 61 73  {.    int iDbLas
10cf0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
10d00 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  Loop termination
10d10 20 70 6f 69 6e 74 20 66 6f 72 20 74 68 65 20 73   point for the s
10d20 63 68 65 6d 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20  chema loop */.  
10d30 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20    int iTabCur;  
10d40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
10d50 6f 72 20 66 6f 72 20 61 20 74 61 62 6c 65 20 77  or for a table w
10d60 68 6f 73 65 20 73 69 7a 65 20 6e 65 65 64 73 20  hose size needs 
10d70 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20  checking */.    
10d80 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
10d90 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f         /* Loop o
10da0 76 65 72 20 74 61 62 6c 65 73 20 6f 66 20 61 20  ver tables of a 
10db0 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 53 63  schema */.    Sc
10dc0 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 3b 20 20  hema *pSchema;  
10dd0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
10de0 65 6e 74 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  ent schema */.  
10df0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
10e00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
10e10 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d  ble in the schem
10e20 61 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  a */.    Index *
10e30 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
10e40 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 66 20 74  /* An index of t
10e50 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
10e60 4c 6f 67 45 73 74 20 73 7a 54 68 72 65 73 68 6f  LogEst szThresho
10e70 6c 64 3b 20 20 20 20 2f 2a 20 53 69 7a 65 20 74  ld;    /* Size t
10e80 68 72 65 73 68 6f 6c 64 20 61 62 6f 76 65 20 77  hreshold above w
10e90 68 69 63 68 20 72 65 61 6e 61 6c 79 73 69 73 20  hich reanalysis 
10ea0 69 73 20 6e 65 65 64 64 20 2a 2f 0a 20 20 20 20  is needd */.    
10eb0 63 68 61 72 20 2a 7a 53 75 62 53 71 6c 3b 20 20  char *zSubSql;  
10ec0 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
10ed0 61 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20  atement for the 
10ee0 4f 50 5f 53 71 6c 45 78 65 63 20 6f 70 63 6f 64  OP_SqlExec opcod
10ef0 65 20 2a 2f 0a 20 20 20 20 75 33 32 20 6f 70 4d  e */.    u32 opM
10f00 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
10f10 2f 2a 20 4d 61 73 6b 20 6f 66 20 6f 70 65 72 61  /* Mask of opera
10f20 74 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d  tions to perform
10f30 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69   */..    if( zRi
10f40 67 68 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 4d  ght ){.      opM
10f50 61 73 6b 20 3d 20 28 75 33 32 29 73 71 6c 69 74  ask = (u32)sqlit
10f60 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
10f70 20 20 20 20 20 20 69 66 28 20 28 6f 70 4d 61 73        if( (opMas
10f80 6b 20 26 20 30 78 30 32 29 3d 3d 30 20 29 20 62  k & 0x02)==0 ) b
10f90 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
10fa0 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  .      opMask = 
10fb0 30 78 66 66 66 65 3b 0a 20 20 20 20 7d 0a 20 20  0xfffe;.    }.  
10fc0 20 20 69 54 61 62 43 75 72 20 3d 20 70 50 61 72    iTabCur = pPar
10fd0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
10fe0 66 6f 72 28 69 44 62 4c 61 73 74 20 3d 20 7a 44  for(iDbLast = zD
10ff0 62 3f 69 44 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b  b?iDb:db->nDb-1;
11000 20 69 44 62 3c 3d 69 44 62 4c 61 73 74 3b 20 69   iDb<=iDbLast; i
11010 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Db++){.      if(
11020 20 69 44 62 3d 3d 31 20 29 20 63 6f 6e 74 69 6e   iDb==1 ) contin
11030 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ue;.      sqlite
11040 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
11050 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
11060 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
11070 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
11080 68 65 6d 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  hema;.      for(
11090 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
110a0 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
110b0 61 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74  ash); k; k=sqlit
110c0 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
110d0 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54         pTab = (T
110e0 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
110f0 44 61 74 61 28 6b 29 3b 0a 0a 20 20 20 20 20 20  Data(k);..      
11100 20 20 2f 2a 20 49 66 20 74 61 62 6c 65 20 70 54    /* If table pT
11110 61 62 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ab has not been 
11120 75 73 65 64 20 69 6e 20 61 20 77 61 79 20 74 68  used in a way th
11130 61 74 20 77 6f 75 6c 64 20 62 65 6e 65 66 69 74  at would benefit
11140 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
11150 20 68 61 76 69 6e 67 20 61 6e 61 6c 79 73 69 73   having analysis
11160 20 73 74 61 74 69 73 74 69 63 73 20 64 75 72 69   statistics duri
11170 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
11180 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 6b 69  ession, then ski
11190 70 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  p it..        **
111a0 20 54 68 69 73 20 61 6c 73 6f 20 68 61 73 20 74   This also has t
111b0 68 65 20 65 66 66 65 63 74 20 6f 66 20 73 6b 69  he effect of ski
111c0 70 70 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61  pping virtual ta
111d0 62 6c 65 73 20 61 6e 64 20 76 69 65 77 73 20 2a  bles and views *
111e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
111f0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
11200 54 46 5f 53 74 61 74 73 55 73 65 64 29 3d 3d 30  TF_StatsUsed)==0
11210 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
11220 20 20 20 20 20 20 2f 2a 20 52 65 61 6e 61 6c 79        /* Reanaly
11230 7a 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ze if the table 
11240 69 73 20 32 35 20 74 69 6d 65 73 20 6c 61 72 67  is 25 times larg
11250 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74  er than the last
11260 20 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20   analysis */.   
11270 20 20 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64       szThreshold
11280 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
11290 45 73 74 20 2b 20 34 36 3b 20 61 73 73 65 72 74  Est + 46; assert
112a0 28 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ( sqlite3LogEst(
112b0 32 35 29 3d 3d 34 36 20 29 3b 0a 20 20 20 20 20  25)==46 );.     
112c0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
112d0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
112e0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
112f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
11300 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31   !pIdx->hasStat1
11310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11320 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 30 3b  szThreshold = 0;
11330 20 2f 2a 20 41 6c 77 61 79 73 20 61 6e 61 6c 79   /* Always analy
11340 7a 65 20 69 66 20 61 6e 79 20 69 6e 64 65 78 20  ze if any index 
11350 6c 61 63 6b 73 20 73 74 61 74 69 73 74 69 63 73  lacks statistics
11360 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
11370 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
11380 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
11390 20 20 20 20 20 69 66 28 20 73 7a 54 68 72 65 73       if( szThres
113a0 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  hold ){.        
113b0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
113c0 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 43  le(pParse, iTabC
113d0 75 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ur, iDb, pTab, O
113e0 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
113f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11400 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
11410 66 53 6d 61 6c 6c 65 72 2c 20 69 54 61 62 43 75  fSmaller, iTabCu
11420 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
11440 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
11450 64 64 72 28 76 29 2b 32 2b 28 6f 70 4d 61 73 6b  ddr(v)+2+(opMask
11460 26 31 29 2c 20 73 7a 54 68 72 65 73 68 6f 6c 64  &1), szThreshold
11470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
11480 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
11490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
114a0 7a 53 75 62 53 71 6c 20 3d 20 73 71 6c 69 74 65  zSubSql = sqlite
114b0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 41 4e  3MPrintf(db, "AN
114c0 41 4c 59 5a 45 20 5c 22 25 77 5c 22 2e 5c 22 25  ALYZE \"%w\".\"%
114d0 77 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  w\"",.          
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114f0 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
11500 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 70 54  Db].zDbSName, pT
11510 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
11520 20 20 20 20 69 66 28 20 6f 70 4d 61 73 6b 20 26      if( opMask &
11530 20 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20   0x01 ){.       
11540 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
11550 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
11560 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
11570 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11580 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
11590 2c 20 30 2c 20 72 31 2c 20 30 2c 20 7a 53 75 62  , 0, r1, 0, zSub
115a0 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Sql, P4_DYNAMIC)
115b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
115c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
115d0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
115e0 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 1);.        }
115f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11610 34 28 76 2c 20 4f 50 5f 53 71 6c 45 78 65 63 2c  4(v, OP_SqlExec,
11620 20 30 2c 20 30 2c 20 30 2c 20 7a 53 75 62 53 71   0, 0, 0, zSubSq
11630 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  l, P4_DYNAMIC);.
11640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11650 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
11660 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
11670 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20   OP_Expire);.   
11680 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
11690 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
116a0 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a  busy_timeout.  *
116b0 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f  *   PRAGMA busy_
116c0 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a  timeout = N.  **
116d0 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  .  ** Call sqlit
116e0 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
116f0 64 62 2c 20 4e 29 2e 20 20 52 65 74 75 72 6e 20  db, N).  Return 
11700 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
11710 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  out value.  ** i
11720 66 20 6f 6e 65 20 69 73 20 73 65 74 2e 20 20 49  f one is set.  I
11730 66 20 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c 65  f no busy handle
11740 72 20 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74  r or a different
11750 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 69 73   busy handler is
11760 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30   set.  ** then 0
11770 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 53   is returned.  S
11780 65 74 74 69 6e 67 20 74 68 65 20 62 75 73 79 5f  etting the busy_
11790 74 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f 72 20  timeout to 0 or 
117a0 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a 20 64 69  negative.  ** di
117b0 73 61 62 6c 65 73 20 74 68 65 20 74 69 6d 65 6f  sables the timeo
117c0 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73  ut..  */.  /*cas
117d0 65 20 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54  e PragTyp_BUSY_T
117e0 49 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74  IMEOUT*/ default
117f0 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  : {.    assert( 
11800 70 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79  pPragma->ePragTy
11810 70 3d 3d 50 72 61 67 54 79 70 5f 42 55 53 59 5f  p==PragTyp_BUSY_
11820 54 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20 20 69  TIMEOUT );.    i
11830 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
11840 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
11850 74 69 6d 65 6f 75 74 28 64 62 2c 20 73 71 6c 69  timeout(db, sqli
11860 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
11870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
11880 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64  rnSingleInt(v, d
11890 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 29 3b  b->busyTimeout);
118a0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
118b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
118c0 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  GMA soft_heap_li
118d0 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  mit.  **   PRAGM
118e0 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  A soft_heap_limi
118f0 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t = N.  **.  ** 
11900 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
11910 46 3a 20 52 2d 32 36 33 34 33 2d 34 35 39 33 30  F: R-26343-45930
11920 20 54 68 69 73 20 70 72 61 67 6d 61 20 69 6e 76   This pragma inv
11930 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 71  okes the.  ** sq
11940 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
11950 6c 69 6d 69 74 36 34 28 29 20 69 6e 74 65 72 66  limit64() interf
11960 61 63 65 20 77 69 74 68 20 74 68 65 20 61 72 67  ace with the arg
11970 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73  ument N, if N is
11980 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
11990 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67  and is a non-neg
119a0 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20  ative integer.. 
119b0 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
119c0 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30  ON-OF: R-64451-0
119d0 37 31 36 33 20 54 68 65 20 73 6f 66 74 5f 68 65  7163 The soft_he
119e0 61 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61 20  ap_limit pragma 
119f0 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65 74 75  always.  ** retu
11a00 72 6e 73 20 74 68 65 20 73 61 6d 65 20 69 6e 74  rns the same int
11a10 65 67 65 72 20 74 68 61 74 20 77 6f 75 6c 64 20  eger that would 
11a20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
11a30 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  he.  ** sqlite3_
11a40 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
11a50 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67 65  4(-1) C-language
11a60 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
11a70 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
11a80 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20  OFT_HEAP_LIMIT: 
11a90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
11aa0 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a  t64 N;.    if( z
11ab0 52 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 33  Right && sqlite3
11ac0 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
11ad0 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54  ight, &N)==SQLIT
11ae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11af0 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
11b00 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20 20  limit64(N);.    
11b10 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
11b20 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33  leInt(v, sqlite3
11b30 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
11b40 36 34 28 2d 31 29 29 3b 0a 20 20 20 20 62 72 65  64(-1));.    bre
11b50 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
11b60 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72 65  **   PRAGMA thre
11b70 61 64 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ads.  **   PRAGM
11b80 41 20 74 68 72 65 61 64 73 20 3d 20 4e 0a 20 20  A threads = N.  
11b90 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72  **.  ** Configur
11ba0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
11bb0 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74  mber of worker t
11bc0 68 72 65 61 64 73 2e 20 20 52 65 74 75 72 6e 20  hreads.  Return 
11bd0 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78  the new.  ** max
11be0 69 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69 67 68  imum, which migh
11bf0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 72  t be less than r
11c00 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
11c10 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 48   case PragTyp_TH
11c20 52 45 41 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c  READS: {.    sql
11c30 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20  ite3_int64 N;.  
11c40 20 20 69 66 28 20 7a 52 69 67 68 74 0a 20 20 20    if( zRight.   
11c50 20 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f    && sqlite3DecO
11c60 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74  rHexToI64(zRight
11c70 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &N)==SQLITE_OK
11c80 0a 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20  .     && N>=0.  
11c90 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
11ca0 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c  e3_limit(db, SQL
11cb0 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
11cc0 5f 54 48 52 45 41 44 53 2c 20 28 69 6e 74 29 28  _THREADS, (int)(
11cd0 4e 26 30 78 37 66 66 66 66 66 66 66 29 29 3b 0a  N&0x7fffffff));.
11ce0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
11cf0 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c  SingleInt(v, sql
11d00 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53  ite3_limit(db, S
11d10 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
11d20 45 52 5f 54 48 52 45 41 44 53 2c 20 2d 31 29 29  ER_THREADS, -1))
11d30 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
11d40 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
11d50 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
11d60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
11d70 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65  ST).  /*.  ** Re
11d80 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  port the current
11d90 20 73 74 61 74 65 20 6f 66 20 66 69 6c 65 20 6c   state of file l
11da0 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  ogs for all data
11db0 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73  bases.  */.  cas
11dc0 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53  e PragTyp_LOCK_S
11dd0 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 73 74 61  TATUS: {.    sta
11de0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
11df0 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65  const azLockName
11e00 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e  [] = {.      "un
11e10 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65 64  locked", "shared
11e20 22 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20 22  ", "reserved", "
11e30 70 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c 75  pending", "exclu
11e40 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20  sive".    };.   
11e50 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72   int i;.    pPar
11e60 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20  se->nMem = 2;.  
11e70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
11e80 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
11e90 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
11ea0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11eb0 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77  zState = "unknow
11ec0 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  n";.      int j;
11ed0 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
11ee0 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d  Db[i].zDbSName==
11ef0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
11f00 20 20 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44      pBt = db->aD
11f10 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11f20 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71  if( pBt==0 || sq
11f30 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
11f40 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pBt)==0 ){.     
11f50 20 20 20 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f     zState = "clo
11f60 73 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  sed";.      }els
11f70 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69  e if( sqlite3_fi
11f80 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69  le_control(db, i
11f90 20 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44   ? db->aDb[i].zD
11fa0 62 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20  bSName : 0, .   
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c    SQLITE_FCNTL_L
11fe0 4f 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53  OCKSTATE, &j)==S
11ff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12000 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20 61 7a       zState = az
12010 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20  LockName[j];.   
12020 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12030 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
12040 76 2c 20 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e  v, 1, "ss", db->
12050 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c  aDb[i].zDbSName,
12060 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 7d 0a   zState);.    }.
12070 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
12080 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
12090 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
120a0 20 2f 2a 20 50 72 61 67 6d 61 20 20 20 20 20 20   /* Pragma      
120b0 20 20 69 41 72 67 0a 20 20 2a 2a 20 2d 2d 2d 2d    iArg.  ** ----
120c0 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d 0a  ------   ------.
120d0 20 20 2a 2a 20 20 6b 65 79 20 20 20 20 20 20 20    **  key       
120e0 20 20 20 20 30 0a 20 20 2a 2a 20 20 72 65 6b 65      0.  **  reke
120f0 79 20 20 20 20 20 20 20 20 20 31 0a 20 20 2a 2a  y         1.  **
12100 20 20 68 65 78 6b 65 79 20 20 20 20 20 20 20 20    hexkey        
12110 32 0a 20 20 2a 2a 20 20 68 65 78 72 65 6b 65 79  2.  **  hexrekey
12120 20 20 20 20 20 20 33 0a 20 20 2a 2a 20 20 74 65        3.  **  te
12130 78 74 6b 65 79 20 20 20 20 20 20 20 34 0a 20 20  xtkey       4.  
12140 2a 2a 20 20 74 65 78 74 72 65 6b 65 79 20 20 20  **  textrekey   
12150 20 20 35 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20    5.  */.  case 
12160 50 72 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20  PragTyp_KEY: {. 
12170 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
12180 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  .      int n = p
12190 50 72 61 67 6d 61 2d 3e 69 41 72 67 3c 34 20 3f  Pragma->iArg<4 ?
121a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
121b0 28 7a 52 69 67 68 74 29 20 3a 20 2d 31 3b 0a 20  (zRight) : -1;. 
121c0 20 20 20 20 20 69 66 28 20 28 70 50 72 61 67 6d       if( (pPragm
121d0 61 2d 3e 69 41 72 67 20 26 20 31 29 3d 3d 30 20  a->iArg & 1)==0 
121e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
121f0 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  e3_key_v2(db, zD
12200 62 2c 20 7a 52 69 67 68 74 2c 20 6e 29 3b 0a 20  b, zRight, n);. 
12210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12220 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65      sqlite3_reke
12230 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52  y_v2(db, zDb, zR
12240 69 67 68 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ight, n);.      
12250 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
12260 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20 50 72  k;.  }.  case Pr
12270 61 67 54 79 70 5f 48 45 58 4b 45 59 3a 20 7b 0a  agTyp_HEXKEY: {.
12280 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
12290 7b 0a 20 20 20 20 20 20 75 38 20 69 42 79 74 65  {.      u8 iByte
122a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
122b0 20 20 20 20 20 63 68 61 72 20 7a 4b 65 79 5b 34       char zKey[4
122c0 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0];.      for(i=
122d0 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69  0, iByte=0; i<si
122e0 7a 65 6f 66 28 7a 4b 65 79 29 2a 32 20 26 26 20  zeof(zKey)*2 && 
122f0 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
12300 7a 52 69 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29  zRight[i]); i++)
12310 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74 65 20  {.        iByte 
12320 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73  = (iByte<<4) + s
12330 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
12340 52 69 67 68 74 5b 69 5d 29 3b 0a 20 20 20 20 20  Right[i]);.     
12350 20 20 20 69 66 28 20 28 69 26 31 29 21 3d 30 20     if( (i&1)!=0 
12360 29 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42  ) zKey[i/2] = iB
12370 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  yte;.      }.   
12380 20 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d     if( (pPragma-
12390 3e 69 41 72 67 20 26 20 31 29 3d 3d 30 20 29 7b  >iArg & 1)==0 ){
123a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
123b0 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  _key_v2(db, zDb,
123c0 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20   zKey, i/2);.   
123d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
123e0 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f    sqlite3_rekey_
123f0 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79  v2(db, zDb, zKey
12400 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d 0a  , i/2);.      }.
12410 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
12420 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  }.#endif.#if 
12430 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
12440 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66  AS_CODEC) || def
12450 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
12460 4c 45 5f 43 45 52 4f 44 29 0a 20 20 63 61 73 65  LE_CEROD).  case
12470 20 50 72 61 67 54 79 70 5f 41 43 54 49 56 41 54   PragTyp_ACTIVAT
12480 45 5f 45 58 54 45 4e 53 49 4f 4e 53 3a 20 69 66  E_EXTENSIONS: if
12490 28 20 7a 52 69 67 68 74 20 29 7b 0a 23 69 66 64  ( zRight ){.#ifd
124a0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
124b0 44 45 43 0a 20 20 20 20 69 66 28 20 73 71 6c 69  DEC.    if( sqli
124c0 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67  te3StrNICmp(zRig
124d0 68 74 2c 20 22 73 65 65 2d 22 2c 20 34 29 3d 3d  ht, "see-", 4)==
124e0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
124f0 65 33 5f 61 63 74 69 76 61 74 65 5f 73 65 65 28  e3_activate_see(
12500 26 7a 52 69 67 68 74 5b 34 5d 29 3b 0a 20 20 20  &zRight[4]);.   
12510 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
12520 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
12530 45 52 4f 44 0a 20 20 20 20 69 66 28 20 73 71 6c  EROD.    if( sql
12540 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 52 69  ite3StrNICmp(zRi
12550 67 68 74 2c 20 22 63 65 72 6f 64 2d 22 2c 20 36  ght, "cerod-", 6
12560 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
12570 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 63  lite3_activate_c
12580 65 72 6f 64 28 26 7a 52 69 67 68 74 5b 36 5d 29  erod(&zRight[6])
12590 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
125a0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
125b0 69 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f  if..  } /* End o
125c0 66 20 74 68 65 20 50 52 41 47 4d 41 20 73 77 69  f the PRAGMA swi
125d0 74 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  tch */..  /* The
125e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
125f0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
12600 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ss SQLITE_DEBUG 
12610 69 73 20 64 65 66 69 6e 65 64 2e 20 49 74 73 20  is defined. Its 
12620 6f 6e 6c 79 0a 20 20 2a 2a 20 70 75 72 70 6f 73  only.  ** purpos
12630 65 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  e is to execute 
12640 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
12650 6e 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  nts to verify th
12660 61 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 50  at if the.  ** P
12670 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73  ragFlg_NoColumns
12680 31 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  1 flag is set an
12690 64 20 74 68 65 20 63 61 6c 6c 65 72 20 73 70 65  d the caller spe
126a0 63 69 66 69 65 64 20 61 6e 20 61 72 67 75 6d 65  cified an argume
126b0 6e 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 50  nt.  ** to the P
126c0 52 41 47 4d 41 2c 20 74 68 65 20 69 6d 70 6c 65  RAGMA, the imple
126d0 6d 65 6e 74 61 74 69 6f 6e 20 68 61 73 20 6e 6f  mentation has no
126e0 74 20 61 64 64 65 64 20 61 6e 79 20 4f 50 5f 52  t added any OP_R
126f0 65 73 75 6c 74 52 6f 77 20 0a 20 20 2a 2a 20 69  esultRow .  ** i
12700 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 6f 20 74  nstructions to t
12710 68 65 20 56 4d 2e 20 20 2a 2f 0a 20 20 69 66 28  he VM.  */.  if(
12720 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67   (pPragma->mPrag
12730 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f  Flg & PragFlg_No
12740 43 6f 6c 75 6d 6e 73 31 29 20 26 26 20 7a 52 69  Columns1) && zRi
12750 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
12760 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65  e3VdbeVerifyNoRe
12770 73 75 6c 74 52 6f 77 28 76 29 3b 0a 20 20 7d 0a  sultRow(v);.  }.
12780 0a 70 72 61 67 6d 61 5f 6f 75 74 3a 0a 20 20 73  .pragma_out:.  s
12790 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
127a0 20 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74   zLeft);.  sqlit
127b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 52 69  e3DbFree(db, zRi
127c0 67 68 74 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20  ght);.}.#ifndef 
127d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
127e0 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a  UALTABLE./******
127f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  *******.** Imple
12840 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20  mentation of an 
12850 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
12860 6c 20 74 61 62 6c 65 20 74 68 61 74 20 72 75 6e  l table that run
12870 73 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a  s a pragma..**.*
12880 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
12890 20 50 72 61 67 6d 61 56 74 61 62 20 50 72 61 67   PragmaVtab Prag
128a0 6d 61 56 74 61 62 3b 0a 74 79 70 65 64 65 66 20  maVtab;.typedef 
128b0 73 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61  struct PragmaVta
128c0 62 43 75 72 73 6f 72 20 50 72 61 67 6d 61 56 74  bCursor PragmaVt
128d0 61 62 43 75 72 73 6f 72 3b 0a 73 74 72 75 63 74  abCursor;.struct
128e0 20 50 72 61 67 6d 61 56 74 61 62 20 7b 0a 20 20   PragmaVtab {.  
128f0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73  sqlite3_vtab bas
12900 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73  e;        /* Bas
12910 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62  e class.  Must b
12920 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c  e first */.  sql
12930 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
12940 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
12950 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12960 6e 20 74 6f 20 77 68 69 63 68 20 69 74 20 62 65  n to which it be
12970 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  longs */.  const
12980 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61   PragmaName *pNa
12990 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me;  /* Name of 
129a0 74 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20  the pragma */.  
129b0 75 38 20 6e 48 69 64 64 65 6e 3b 20 20 20 20 20  u8 nHidden;     
129c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
129d0 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20 63 6f  ber of hidden co
129e0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 48  lumns */.  u8 iH
129f0 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20 20  idden;          
12a00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
12a10 20 74 68 65 20 66 69 72 73 74 20 68 69 64 64 65   the first hidde
12a20 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73  n column */.};.s
12a30 74 72 75 63 74 20 50 72 61 67 6d 61 56 74 61 62  truct PragmaVtab
12a40 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74  Cursor {.  sqlit
12a50 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
12a60 61 73 65 3b 20 2f 2a 20 42 61 73 65 20 63 6c 61  ase; /* Base cla
12a70 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72  ss.  Must be fir
12a80 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
12a90 73 74 6d 74 20 2a 70 50 72 61 67 6d 61 3b 20 20  stmt *pPragma;  
12aa0 20 20 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20    /* The pragma 
12ab0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e  statement to run
12ac0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74   */.  sqlite_int
12ad0 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
12ae0 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64  /* Current rowid
12af0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 7a 41 72   */.  char *azAr
12b00 67 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  g[2];           
12b10 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20  /* Value of the 
12b20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 63 68  argument and sch
12b30 65 6d 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ema */.};../* .*
12b40 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c  * Pragma virtual
12b50 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43   table module xC
12b60 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a  onnect method..*
12b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
12b80 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74 28 0a  gmaVtabConnect(.
12b90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
12ba0 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69   void *pAux,.  i
12bb0 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
12bc0 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c  har *const*argv,
12bd0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
12be0 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72  **ppVtab,.  char
12bf0 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 63 6f   **pzErr.){.  co
12c00 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
12c10 70 50 72 61 67 6d 61 20 3d 20 28 63 6f 6e 73 74  pPragma = (const
12c20 20 50 72 61 67 6d 61 4e 61 6d 65 2a 29 70 41 75   PragmaName*)pAu
12c30 78 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  x;.  PragmaVtab 
12c40 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 69 6e 74  *pTab = 0;.  int
12c50 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   rc;.  int i, j;
12c60 0a 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27  .  char cSep = '
12c70 28 27 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61  (';.  StrAccum a
12c80 63 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  cc;.  char zBuf[
12c90 32 30 30 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  200];..  UNUSED_
12ca0 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
12cb0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12cc0 54 45 52 28 61 72 67 76 29 3b 0a 20 20 73 71 6c  TER(argv);.  sql
12cd0 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
12ce0 28 26 61 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20  (&acc, 0, zBuf, 
12cf0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 30 29  sizeof(zBuf), 0)
12d00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f  ;.  sqlite3_str_
12d10 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20  appendall(&acc, 
12d20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 22  "CREATE TABLE x"
12d30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  );.  for(i=0, j=
12d40 70 50 72 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e  pPragma->iPragCN
12d50 61 6d 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e  ame; i<pPragma->
12d60 6e 50 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c  nPragCName; i++,
12d70 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   j++){.    sqlit
12d80 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
12d90 61 63 63 2c 20 22 25 63 5c 22 25 73 5c 22 22 2c  acc, "%c\"%s\"",
12da0 20 63 53 65 70 2c 20 70 72 61 67 43 4e 61 6d 65   cSep, pragCName
12db0 5b 6a 5d 29 3b 0a 20 20 20 20 63 53 65 70 20 3d  [j]);.    cSep =
12dc0 20 27 2c 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   ',';.  }.  if( 
12dd0 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  i==0 ){.    sqli
12de0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
12df0 26 61 63 63 2c 20 22 28 5c 22 25 73 5c 22 22 2c  &acc, "(\"%s\"",
12e00 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29   pPragma->zName)
12e10 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20  ;.    i++;.  }. 
12e20 20 6a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50   j = 0;.  if( pP
12e30 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
12e40 26 20 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74  & PragFlg_Result
12e50 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
12e60 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26  _str_appendall(&
12e70 61 63 63 2c 20 22 2c 61 72 67 20 48 49 44 44 45  acc, ",arg HIDDE
12e80 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  N");.    j++;.  
12e90 7d 0a 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d  }.  if( pPragma-
12ea0 3e 6d 50 72 61 67 46 6c 67 20 26 20 28 50 72 61  >mPragFlg & (Pra
12eb0 67 46 6c 67 5f 53 63 68 65 6d 61 4f 70 74 7c 50  gFlg_SchemaOpt|P
12ec0 72 61 67 46 6c 67 5f 53 63 68 65 6d 61 52 65 71  ragFlg_SchemaReq
12ed0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
12ee0 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26  _str_appendall(&
12ef0 61 63 63 2c 20 22 2c 73 63 68 65 6d 61 20 48 49  acc, ",schema HI
12f00 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b  DDEN");.    j++;
12f10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
12f20 74 72 5f 61 70 70 65 6e 64 28 26 61 63 63 2c 20  tr_append(&acc, 
12f30 22 29 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  ")", 1);.  sqlit
12f40 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
12f50 28 26 61 63 63 29 3b 0a 20 20 61 73 73 65 72 74  (&acc);.  assert
12f60 28 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c  ( strlen(zBuf) <
12f70 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20   sizeof(zBuf)-1 
12f80 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
12f90 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64  3_declare_vtab(d
12fa0 62 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20  b, zBuf);.  if( 
12fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12fc0 0a 20 20 20 20 70 54 61 62 20 3d 20 28 50 72 61  .    pTab = (Pra
12fd0 67 6d 61 56 74 61 62 2a 29 73 71 6c 69 74 65 33  gmaVtab*)sqlite3
12fe0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50  _malloc(sizeof(P
12ff0 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20  ragmaVtab));.   
13000 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
13010 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13020 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
13030 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
13040 28 70 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66  (pTab, 0, sizeof
13050 28 50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20  (PragmaVtab));. 
13060 20 20 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65       pTab->pName
13070 20 3d 20 70 50 72 61 67 6d 61 3b 0a 20 20 20 20   = pPragma;.    
13080 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b    pTab->db = db;
13090 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 48 69  .      pTab->iHi
130a0 64 64 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20  dden = i;.      
130b0 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20  pTab->nHidden = 
130c0 6a 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  j;.    }.  }else
130d0 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73  {.    *pzErr = s
130e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
130f0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
13100 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20  msg(db));.  }.. 
13110 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69   *ppVtab = (sqli
13120 74 65 33 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a  te3_vtab*)pTab;.
13130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13140 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69  /* .** Pragma vi
13150 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
13160 6c 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d  le xDisconnect m
13170 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
13180 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 44   int pragmaVtabD
13190 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65  isconnect(sqlite
131a0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
131b0 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54    PragmaVtab *pT
131c0 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  ab = (PragmaVtab
131d0 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74  *)pVtab;.  sqlit
131e0 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20  e3_free(pTab);. 
131f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13200 4b 3b 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20  K;.}../* Figure 
13210 6f 75 74 20 74 68 65 20 62 65 73 74 20 69 6e 64  out the best ind
13220 65 78 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61  ex to use to sea
13230 72 63 68 20 61 20 70 72 61 67 6d 61 20 76 69 72  rch a pragma vir
13240 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
13250 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 74 20  * There are not 
13260 72 65 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78  really any index
13270 20 63 68 6f 69 63 65 73 2e 20 20 42 75 74 20 77   choices.  But w
13280 65 20 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72  e want to encour
13290 61 67 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79  age the.** query
132a0 20 70 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76 65   planner to give
132b0 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
132c0 6f 6e 20 61 73 20 6d 61 6e 79 20 68 69 64 64 65  on as many hidde
132d0 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 0a  n parameters as.
132e0 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64  ** possible, and
132f0 20 65 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74   especially on t
13300 68 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20  he first hidden 
13310 70 61 72 61 6d 65 74 65 72 2e 20 20 53 6f 20 72  parameter.  So r
13320 65 74 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20  eturn a.** high 
13330 63 6f 73 74 20 69 66 20 68 69 64 64 65 6e 20 70  cost if hidden p
13340 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e  arameters are un
13350 63 6f 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a  constrained..*/.
13360 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
13370 61 56 74 61 62 42 65 73 74 49 6e 64 65 78 28 73  aVtabBestIndex(s
13380 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62  qlite3_vtab *tab
13390 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
133a0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b  info *pIdxInfo){
133b0 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70  .  PragmaVtab *p
133c0 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Tab = (PragmaVta
133d0 62 2a 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20  b*)tab;.  const 
133e0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
133f0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
13400 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  *pConstraint;.  
13410 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
13420 73 65 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78  seen[2];..  pIdx
13430 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
13440 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  ost = (double)1;
13450 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 48 69  .  if( pTab->nHi
13460 64 64 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72  dden==0 ){ retur
13470 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20  n SQLITE_OK; }. 
13480 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   pConstraint = p
13490 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
134a0 61 69 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20  aint;.  seen[0] 
134b0 3d 20 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d  = 0;.  seen[1] =
134c0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
134d0 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
134e0 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f  traint; i++, pCo
134f0 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20  nstraint++){.   
13500 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
13510 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f  ->usable==0 ) co
13520 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
13530 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21  pConstraint->op!
13540 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
13550 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f  NSTRAINT_EQ ) co
13560 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
13570 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f  pConstraint->iCo
13580 6c 75 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69  lumn < pTab->iHi
13590 64 64 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  dden ) continue;
135a0 0a 20 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72  .    j = pConstr
135b0 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20  aint->iColumn - 
135c0 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20  pTab->iHidden;. 
135d0 20 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20 32     assert( j < 2
135e0 20 29 3b 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20   );.    seen[j] 
135f0 3d 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28  = i+1;.  }.  if(
13600 20 73 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20   seen[0]==0 ){. 
13610 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
13620 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f  imatedCost = (do
13630 75 62 6c 65 29 32 31 34 37 34 38 33 36 34 37 3b  uble)2147483647;
13640 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
13650 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32  stimatedRows = 2
13660 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20 20 72  147483647;.    r
13670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13680 0a 20 20 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b  .  }.  j = seen[
13690 30 5d 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f  0]-1;.  pIdxInfo
136a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
136b0 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[j].argvIndex 
136c0 3d 20 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 1;.  pIdxInfo-
136d0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
136e0 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20  e[j].omit = 1;. 
136f0 20 69 66 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20   if( seen[1]==0 
13700 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13710 4f 4b 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  OK;.  pIdxInfo->
13720 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
13730 28 64 6f 75 62 6c 65 29 32 30 3b 0a 20 20 70 49  (double)20;.  pI
13740 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
13750 64 52 6f 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20  dRows = 20;.  j 
13760 3d 20 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70  = seen[1]-1;.  p
13770 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
13780 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67  aintUsage[j].arg
13790 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 70 49  vIndex = 2;.  pI
137a0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
137b0 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74  intUsage[j].omit
137c0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
137d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
137e0 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
137f0 73 6f 72 20 66 6f 72 20 74 68 65 20 70 72 61 67  sor for the prag
13800 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
13810 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
13820 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 28 73 71  ragmaVtabOpen(sq
13830 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
13840 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  b, sqlite3_vtab_
13850 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f  cursor **ppCurso
13860 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  r){.  PragmaVtab
13870 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20  Cursor *pCsr;.  
13880 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
13890 61 62 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65  abCursor*)sqlite
138a0 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
138b0 2a 70 43 73 72 29 29 3b 0a 20 20 69 66 28 20 70  *pCsr));.  if( p
138c0 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Csr==0 ) return 
138d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
138e0 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20  memset(pCsr, 0, 
138f0 73 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61  sizeof(PragmaVta
13900 62 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73  bCursor));.  pCs
13910 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20  r->base.pVtab = 
13920 70 56 74 61 62 3b 0a 20 20 2a 70 70 43 75 72 73  pVtab;.  *ppCurs
13930 6f 72 20 3d 20 26 70 43 73 72 2d 3e 62 61 73 65  or = &pCsr->base
13940 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13950 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61  E_OK;.}../* Clea
13960 72 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72  r all content fr
13970 6f 6d 20 70 72 61 67 6d 61 20 76 69 72 74 75 61  om pragma virtua
13980 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20  l table cursor. 
13990 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
139a0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43  ragmaVtabCursorC
139b0 6c 65 61 72 28 50 72 61 67 6d 61 56 74 61 62 43  lear(PragmaVtabC
139c0 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20  ursor *pCsr){.  
139d0 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
139e0 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e  _finalize(pCsr->
139f0 70 50 72 61 67 6d 61 29 3b 0a 20 20 70 43 73 72  pPragma);.  pCsr
13a00 2d 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20  ->pPragma = 0;. 
13a10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
13a20 79 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72  ySize(pCsr->azAr
13a30 67 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  g); i++){.    sq
13a40 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d  lite3_free(pCsr-
13a50 3e 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  >azArg[i]);.    
13a60 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d  pCsr->azArg[i] =
13a70 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c   0;.  }.}../* Cl
13a80 6f 73 65 20 61 20 70 72 61 67 6d 61 20 76 69 72  ose a pragma vir
13a90 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f  tual table curso
13aa0 72 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r */.static int 
13ab0 70 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 28  pragmaVtabClose(
13ac0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13ad0 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 50 72 61  sor *cur){.  Pra
13ae0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
13af0 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
13b00 62 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  bCursor*)cur;.  
13b10 70 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  pragmaVtabCursor
13b20 43 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20 73  Clear(pCsr);.  s
13b30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72  qlite3_free(pCsr
13b40 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
13b50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76  TE_OK;.}../* Adv
13b60 61 6e 63 65 20 74 68 65 20 70 72 61 67 6d 61 20  ance the pragma 
13b70 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
13b80 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
13b90 20 72 6f 77 20 2a 2f 0a 73 74 61 74 69 63 20 69   row */.static i
13ba0 6e 74 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78  nt pragmaVtabNex
13bb0 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  t(sqlite3_vtab_c
13bc0 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
13bd0 6f 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  or){.  PragmaVta
13be0 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  bCursor *pCsr = 
13bf0 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
13c00 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r*)pVtabCursor;.
13c10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13c20 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  E_OK;..  /* Incr
13c30 65 6d 65 6e 74 20 74 68 65 20 78 52 6f 77 69 64  ement the xRowid
13c40 20 76 61 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72   value */.  pCsr
13c50 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73  ->iRowid++;.  as
13c60 73 65 72 74 28 20 70 43 73 72 2d 3e 70 50 72 61  sert( pCsr->pPra
13c70 67 6d 61 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  gma );.  if( SQL
13c80 49 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33  ITE_ROW!=sqlite3
13c90 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 50 72 61  _step(pCsr->pPra
13ca0 67 6d 61 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  gma) ){.    rc =
13cb0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
13cc0 65 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29  e(pCsr->pPragma)
13cd0 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 50 72 61  ;.    pCsr->pPra
13ce0 67 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 72 61  gma = 0;.    pra
13cf0 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
13d00 61 72 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20  ar(pCsr);.  }.  
13d10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13d20 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74   .** Pragma virt
13d30 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
13d40 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e   xFilter method.
13d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13d60 72 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72 28  ragmaVtabFilter(
13d70 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
13d80 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
13d90 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e  sor, .  int idxN
13da0 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  um, const char *
13db0 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72  idxStr,.  int ar
13dc0 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
13dd0 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72  e **argv.){.  Pr
13de0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
13df0 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
13e00 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43  abCursor*)pVtabC
13e10 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56  ursor;.  PragmaV
13e20 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61  tab *pTab = (Pra
13e30 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62 43  gmaVtab*)(pVtabC
13e40 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20  ursor->pVtab);. 
13e50 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
13e60 2c 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  , j;.  StrAccum 
13e70 61 63 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  acc;.  char *zSq
13e80 6c 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  l;..  UNUSED_PAR
13e90 41 4d 45 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a  AMETER(idxNum);.
13ea0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
13eb0 45 52 28 69 64 78 53 74 72 29 3b 0a 20 20 70 72  ER(idxStr);.  pr
13ec0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c  agmaVtabCursorCl
13ed0 65 61 72 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d  ear(pCsr);.  j =
13ee0 20 28 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d   (pTab->pName->m
13ef0 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c  PragFlg & PragFl
13f00 67 5f 52 65 73 75 6c 74 31 29 21 3d 30 20 3f 20  g_Result1)!=0 ? 
13f10 30 20 3a 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  0 : 1;.  for(i=0
13f20 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a  ; i<argc; i++, j
13f30 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
13f40 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f  har *zText = (co
13f50 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
13f60 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
13f70 76 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  v[i]);.    asser
13f80 74 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 70  t( j<ArraySize(p
13f90 43 73 72 2d 3e 61 7a 41 72 67 29 20 29 3b 0a 20  Csr->azArg) );. 
13fa0 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d     assert( pCsr-
13fb0 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 3b 0a  >azArg[j]==0 );.
13fc0 20 20 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b      if( zText ){
13fd0 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61 7a 41  .      pCsr->azA
13fe0 72 67 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rg[j] = sqlite3_
13ff0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 54  mprintf("%s", zT
14000 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
14010 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d  pCsr->azArg[j]==
14020 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
14030 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
14040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14050 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
14060 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20  AccumInit(&acc, 
14070 30 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 64  0, 0, 0, pTab->d
14080 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
14090 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
140a0 48 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  H]);.  sqlite3_s
140b0 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63  tr_appendall(&ac
140c0 63 2c 20 22 50 52 41 47 4d 41 20 22 29 3b 0a 20  c, "PRAGMA ");. 
140d0 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72 67   if( pCsr->azArg
140e0 5b 31 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  [1] ){.    sqlit
140f0 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
14100 61 63 63 2c 20 22 25 51 2e 22 2c 20 70 43 73 72  acc, "%Q.", pCsr
14110 2d 3e 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  ->azArg[1]);.  }
14120 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61  .  sqlite3_str_a
14130 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 70  ppendall(&acc, p
14140 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d  Tab->pName->zNam
14150 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  e);.  if( pCsr->
14160 61 7a 41 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20  azArg[0] ){.    
14170 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
14180 6e 64 66 28 26 61 63 63 2c 20 22 3d 25 51 22 2c  ndf(&acc, "=%Q",
14190 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29   pCsr->azArg[0])
141a0 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73  ;.  }.  zSql = s
141b0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
141c0 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20 69 66  nish(&acc);.  if
141d0 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75  ( zSql==0 ) retu
141e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
141f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
14200 70 72 65 70 61 72 65 5f 76 32 28 70 54 61 62 2d  prepare_v2(pTab-
14210 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
14220 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30  pCsr->pPragma, 0
14230 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
14240 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72  e(zSql);.  if( r
14250 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14260 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a      pTab->base.z
14270 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
14280 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
14290 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54  qlite3_errmsg(pT
142a0 61 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 72 65  ab->db));.    re
142b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
142c0 65 74 75 72 6e 20 70 72 61 67 6d 61 56 74 61 62  eturn pragmaVtab
142d0 4e 65 78 74 28 70 56 74 61 62 43 75 72 73 6f 72  Next(pVtabCursor
142e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67  );.}../*.** Prag
142f0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
14300 20 6d 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65 74   module xEof met
14310 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
14320 6e 74 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66  nt pragmaVtabEof
14330 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
14340 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
14350 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  r){.  PragmaVtab
14360 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
14370 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
14380 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
14390 20 72 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 70   return (pCsr->p
143a0 50 72 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f  Pragma==0);.}../
143b0 2a 20 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65  * The xColumn me
143c0 74 68 6f 64 20 73 69 6d 70 6c 79 20 72 65 74 75  thod simply retu
143d0 72 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f  rns the correspo
143e0 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f  nding column fro
143f0 6d 0a 2a 2a 20 74 68 65 20 50 52 41 47 4d 41 2e  m.** the PRAGMA.
14400 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
14410 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d   pragmaVtabColum
14420 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  n(.  sqlite3_vta
14430 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
14440 75 72 73 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65  ursor, .  sqlite
14450 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
14460 0a 20 20 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72  .  int i.){.  Pr
14470 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a  agmaVtabCursor *
14480 70 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74  pCsr = (PragmaVt
14490 61 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43  abCursor*)pVtabC
144a0 75 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56  ursor;.  PragmaV
144b0 74 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61  tab *pTab = (Pra
144c0 67 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62 43  gmaVtab*)(pVtabC
144d0 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20  ursor->pVtab);. 
144e0 20 69 66 28 20 69 3c 70 54 61 62 2d 3e 69 48 69   if( i<pTab->iHi
144f0 64 64 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  dden ){.    sqli
14500 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
14510 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f  (ctx, sqlite3_co
14520 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d  lumn_value(pCsr-
14530 3e 70 50 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20  >pPragma, i));. 
14540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
14550 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
14560 63 74 78 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67  ctx, pCsr->azArg
14570 5b 69 2d 70 54 61 62 2d 3e 69 48 69 64 64 65 6e  [i-pTab->iHidden
14580 5d 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e  ],-1,SQLITE_TRAN
14590 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65  SIENT);.  }.  re
145a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
145b0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61  }../* .** Pragma
145c0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
145d0 6f 64 75 6c 65 20 78 52 6f 77 69 64 20 6d 65 74  odule xRowid met
145e0 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
145f0 6e 74 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77  nt pragmaVtabRow
14600 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  id(sqlite3_vtab_
14610 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
14620 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  sor, sqlite_int6
14630 34 20 2a 70 29 7b 0a 20 20 50 72 61 67 6d 61 56  4 *p){.  PragmaV
14640 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20  tabCursor *pCsr 
14650 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  = (PragmaVtabCur
14660 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72  sor*)pVtabCursor
14670 3b 0a 20 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69  ;.  *p = pCsr->i
14680 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  Rowid;.  return 
14690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
146a0 20 54 68 65 20 70 72 61 67 6d 61 20 76 69 72 74   The pragma virt
146b0 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  ual table object
146c0 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
146d0 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
146e0 70 72 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65  pragmaVtabModule
146f0 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20   = {.  0,       
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
14720 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14740 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63    /* xCreate - c
14750 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f  reate a table */
14760 0a 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e  .  pragmaVtabCon
14770 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  nect,           
14780 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f  /* xConnect - co
14790 6e 6e 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73  nnect to an exis
147a0 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ting table */.  
147b0 70 72 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e  pragmaVtabBestIn
147c0 64 65 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  dex,         /* 
147d0 78 42 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74  xBestIndex - Det
147e0 65 72 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74  ermine search st
147f0 72 61 74 65 67 79 20 2a 2f 0a 20 20 70 72 61 67  rategy */.  prag
14800 6d 61 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74  maVtabDisconnect
14810 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73  ,        /* xDis
14820 63 6f 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e  connect - Discon
14830 6e 65 63 74 20 66 72 6f 6d 20 61 20 74 61 62 6c  nect from a tabl
14840 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20      /* xDestroy 
14870 2d 20 44 72 6f 70 20 61 20 74 61 62 6c 65 20 2a  - Drop a table *
14880 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4f 70  /.  pragmaVtabOp
14890 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
148a0 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e   /* xOpen - open
148b0 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70   a cursor */.  p
148c0 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20  ragmaVtabClose, 
148d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
148e0 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20  Close - close a 
148f0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67  cursor */.  prag
14900 6d 61 56 74 61 62 46 69 6c 74 65 72 2c 20 20 20  maVtabFilter,   
14910 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
14920 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20  ter - configure 
14930 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73  scan constraints
14940 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
14950 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Next,           
14960 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64     /* xNext - ad
14970 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a  vance a cursor *
14980 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 45 6f  /.  pragmaVtabEo
14990 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
149a0 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72   /* xEof */.  pr
149b0 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20  agmaVtabColumn, 
149c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
149d0 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74  olumn - read dat
149e0 61 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61  a */.  pragmaVta
149f0 62 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  bRowid,         
14a00 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20      /* xRowid - 
14a10 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30  read data */.  0
14a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14a40 55 70 64 61 74 65 20 2d 20 77 72 69 74 65 20 64  Update - write d
14a50 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ata */.  0,     
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20        /* xBegin 
14a80 2d 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  - begin transact
14a90 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d        /* xSync -
14ac0 20 73 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f   sync transactio
14ad0 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14af0 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d      /* xCommit -
14b00 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74   commit transact
14b10 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ion */.  0,     
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b30 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
14b40 63 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72  ck - rollback tr
14b50 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30  ansaction */.  0
14b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14b80 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66  FindFunction - f
14b90 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
14ba0 69 6e 67 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ing */.  0,     
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65        /* xRename
14bd0 20 2d 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61   - rename the ta
14be0 62 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ble */.  0,     
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f        /* xSavepo
14c10 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  int */.  0,     
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73        /* xReleas
14c40 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
14c70 54 6f 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  To */.  0       
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 20 20 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e       /* xShadowN
14ca0 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ame */.};../*.**
14cb0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
14cc0 20 7a 54 61 62 4e 61 6d 65 20 69 73 20 72 65 61   zTabName is rea
14cd0 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lly the name of 
14ce0 61 20 70 72 61 67 6d 61 2e 20 20 49 66 20 69 74  a pragma.  If it
14cf0 20 69 73 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67   is,.** then reg
14d00 69 73 74 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f  ister an eponymo
14d10 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
14d20 20 66 6f 72 20 74 68 61 74 20 70 72 61 67 6d 61   for that pragma
14d30 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61   and return.** a
14d40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14d50 4d 6f 64 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f  Module object fo
14d60 72 20 74 68 65 20 6e 65 77 20 76 69 72 74 75 61  r the new virtua
14d70 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75  l table..*/.Modu
14d80 6c 65 20 2a 73 71 6c 69 74 65 33 50 72 61 67 6d  le *sqlite3Pragm
14d90 61 56 74 61 62 52 65 67 69 73 74 65 72 28 73 71  aVtabRegister(sq
14da0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
14db0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
14dc0 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d   const PragmaNam
14dd0 65 20 2a 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65  e *pName;.  asse
14de0 72 74 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  rt( sqlite3_strn
14df0 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61  icmp(zName, "pra
14e00 67 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a  gma_", 7)==0 );.
14e10 20 20 70 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61    pName = pragma
14e20 4c 6f 63 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b  Locate(zName+7);
14e30 0a 20 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20  .  if( pName==0 
14e40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
14e50 28 20 28 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46  ( (pName->mPragF
14e60 6c 67 20 26 20 28 50 72 61 67 46 6c 67 5f 52 65  lg & (PragFlg_Re
14e70 73 75 6c 74 30 7c 50 72 61 67 46 6c 67 5f 52 65  sult0|PragFlg_Re
14e80 73 75 6c 74 31 29 29 3d 3d 30 20 29 20 72 65 74  sult1))==0 ) ret
14e90 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
14ea0 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
14eb0 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a  (&db->aModule, z
14ec0 4e 61 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65  Name)==0 );.  re
14ed0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 74 61 62  turn sqlite3Vtab
14ee0 43 72 65 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c  CreateModule(db,
14ef0 20 7a 4e 61 6d 65 2c 20 26 70 72 61 67 6d 61 56   zName, &pragmaV
14f00 74 61 62 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64  tabModule, (void
14f10 2a 29 70 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a  *)pName, 0);.}..
14f20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14f30 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
14f40 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  LE */..#endif /*
14f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41   SQLITE_OMIT_PRA
14f60 47 4d 41 20 2a 2f 0a                             GMA */.