/ Hex Artifact Content
Login

Artifact 20811b404b6d302a1bedd4b8af8aab2794c5e87ba1f5cb6b42dbc3266ad9c603:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 61  esult row with a
2400: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
2410: 20 73 74 72 69 6e 67 20 68 65 6c 64 20 69 6e 20   string held in 
2420: 72 65 67 69 73 74 65 72 20 33 2e 20 20 44 65 63  register 3.  Dec
2430: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 73 75 6c  rement the resul
2440: 74 20 63 6f 75 6e 74 20 69 6e 20 72 65 67 69 73  t count in regis
2450: 74 65 72 20 31 0a 2a 2a 20 61 6e 64 20 68 61 6c  ter 1.** and hal
2460: 74 20 69 66 20 74 68 65 20 6d 61 78 69 6d 75 6d  t if the maximum
2470: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
2480: 74 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  t rows have been
2490: 20 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74   issued..*/.stat
24a0: 69 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79  ic int integrity
24b0: 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56  CheckResultRow(V
24c0: 64 62 65 20 2a 76 29 7b 0a 20 20 69 6e 74 20 61  dbe *v){.  int a
24d0: 64 64 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ddr;.  sqlite3Vd
24e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
24f0: 65 73 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b  esultRow, 3, 1);
2500: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2520: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 73 71 6c 69  P_IfPos, 1, sqli
2530: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2540: 64 72 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 56  dr(v)+2, 1);.  V
2550: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2570: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
2580: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
25a0: 20 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d   a pragma statem
25b0: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61  ent.  .**.** Pra
25c0: 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73  gmas are of this
25d0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
25e0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
25f0: 2e 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a  .]id [= value].*
2600: 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66  *.** The identif
2610: 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  ier might also b
2620: 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65  e a string.  The
2630: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
2640: 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74  ng, and.** ident
2650: 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62  ifier, or a numb
2660: 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61  er.  If minusFla
2670: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
2680: 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  the value is.** 
2690: 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61  a number that wa
26a0: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
26b0: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
26c0: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69  * If the left si
26d0: 64 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e  de is "database.
26e0: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
26f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
2700: 6d 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69  me.** and pId2 i
2710: 73 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68  s the id.  If th
2720: 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a  e left side is j
2730: 75 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49  ust "id" then pI
2740: 64 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20  d1 is the.** id 
2750: 61 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20  and pId2 is any 
2760: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f  empty string..*/
2770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61  .void sqlite3Pra
2780: 67 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gma(.  Parse *pP
2790: 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  arse, .  Token *
27a0: 70 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20  pId1,        /* 
27b0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 73  First part of [s
27c0: 63 68 65 6d 61 2e 5d 69 64 20 66 69 65 6c 64 20  chema.]id field 
27d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32  */.  Token *pId2
27e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  ,        /* Seco
27f0: 6e 64 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65  nd part of [sche
2800: 6d 61 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72  ma.]id field, or
2810: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
2820: 20 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f   *pValue,      /
2830: 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c  * Token for <val
2840: 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ue>, or NULL */.
2850: 20 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20    int minusFlag 
2860: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2870: 20 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63   a '-' sign prec
2880: 65 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a  eded <value> */.
2890: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74  ){.  char *zLeft
28a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
28b0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
28c0: 46 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20  F-8 string <id> 
28d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68  */.  char *zRigh
28e0: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  t = 0;      /* N
28f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2900: 46 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75  F-8 string <valu
2910: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
2920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2930: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64   = 0;   /* The d
2940: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
2950: 20 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20    Token *pId;   
2960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2970: 74 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65  ter to <id> toke
2980: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 63  n */.  char *aFc
2990: 6e 74 6c 5b 34 5d 3b 20 20 20 20 20 20 20 2f 2a  ntl[4];       /*
29a0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 53 51 4c   Argument to SQL
29b0: 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41  ITE_FCNTL_PRAGMA
29c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 44 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66  Database index f
29f0: 6f 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f  or <database> */
2a00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 2f 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  /* return value 
2a30: 66 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54  form SQLITE_FCNT
2a40: 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71  L_PRAGMA */.  sq
2a50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2a60: 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68  se->db;    /* Th
2a70: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2a80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70  ction */.  Db *p
2a90: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2ab0: 70 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65  pecific database
2ac0: 20 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20   being pragmaed 
2ad0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
2ae0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2af0: 61 72 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61  arse);  /* Prepa
2b00: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
2b10: 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d 61 4e  .  const PragmaN
2b20: 61 6d 65 20 2a 70 50 72 61 67 6d 61 3b 20 20 20  ame *pPragma;   
2b30: 2f 2a 20 54 68 65 20 70 72 61 67 6d 61 20 2a 2f  /* The pragma */
2b40: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2b50: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2b60: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
2b70: 76 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  v);.  pParse->nM
2b80: 65 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e  em = 2;..  /* In
2b90: 74 65 72 70 72 65 74 20 74 68 65 20 5b 73 63 68  terpret the [sch
2ba0: 65 6d 61 2e 5d 20 70 61 72 74 20 6f 66 20 74 68  ema.] part of th
2bb0: 65 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  e pragma stateme
2bc0: 6e 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20  nt. iDb is the. 
2bd0: 20 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65   ** index of the
2be0: 20 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70   database this p
2bf0: 72 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61  ragma is being a
2c00: 70 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e  pplied to in db.
2c10: 61 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20  aDb[]. */.  iDb 
2c20: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
2c30: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64  Name(pParse, pId
2c40: 31 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a  1, pId2, &pId);.
2c50: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
2c60: 74 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64  turn;.  pDb = &d
2c70: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
2c80: 2f 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64  /* If the temp d
2c90: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
2ca0: 20 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65   explicitly name
2cb0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2cc0: 20 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d   .  ** pragma, m
2cd0: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f  ake sure it is o
2ce0: 70 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  pen. .  */.  if(
2cf0: 20 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74   iDb==1 && sqlit
2d00: 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
2d10: 73 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  se(pParse) ){.  
2d20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2d30: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   zLeft = sqlite3
2d40: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
2d50: 2c 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a  , pId);.  if( !z
2d60: 4c 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Left ) return;. 
2d70: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
2d80: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
2d90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2da0: 2c 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29  , "-%T", pValue)
2db0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2dc0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e  Right = sqlite3N
2dd0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2de0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20   pValue);.  }.. 
2df0: 20 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b   assert( pId2 );
2e00: 0a 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e  .  zDb = pId2->n
2e10: 3e 30 20 3f 20 70 44 62 2d 3e 7a 44 62 53 4e 61  >0 ? pDb->zDbSNa
2e20: 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 73 71  me : 0;.  if( sq
2e30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
2e40: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 50 52  Parse, SQLITE_PR
2e50: 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69  AGMA, zLeft, zRi
2e60: 67 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ght, zDb) ){.   
2e70: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
2e80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64  ;.  }..  /* Send
2e90: 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   an SQLITE_FCNTL
2ea0: 5f 50 52 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e  _PRAGMA file-con
2eb0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e 64 65  trol to the unde
2ec0: 72 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20  rlying VFS.  ** 
2ed0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20  connection.  If 
2ee0: 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
2ef0: 45 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d  E_OK, then assum
2f00: 65 20 74 68 61 74 20 74 68 65 20 56 46 53 0a 20  e that the VFS. 
2f10: 20 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68 65 20   ** handled the 
2f20: 70 72 61 67 6d 61 20 61 6e 64 20 67 65 6e 65 72  pragma and gener
2f30: 61 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70  ate a no-op prep
2f40: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
2f50: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
2f60: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31  ENTATION-OF: R-1
2f70: 32 32 33 38 2d 35 35 31 32 30 20 57 68 65 6e 65  2238-55120 Whene
2f80: 76 65 72 20 61 20 50 52 41 47 4d 41 20 73 74 61  ver a PRAGMA sta
2f90: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
2fa0: 2c 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49 54 45  ,.  ** an SQLITE
2fb0: 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69  _FCNTL_PRAGMA fi
2fc0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 73 65  le control is se
2fd0: 6e 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 73  nt to the open s
2fe0: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20 2a 2a  qlite3_file.  **
2ff0: 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
3000: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  nding to the dat
3010: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 77 68  abase file to wh
3020: 69 63 68 20 74 68 65 20 70 72 61 67 6d 61 0a 20  ich the pragma. 
3030: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
3040: 66 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fers..  **.  ** 
3050: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
3060: 46 3a 20 52 2d 32 39 38 37 35 2d 33 31 36 37 38  F: R-29875-31678
3070: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
3080: 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
3090: 4c 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20 66 69  L_PRAGMA.  ** fi
30a0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20 61 6e  le control is an
30b0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
30c0: 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20 28 63  rs to strings (c
30d0: 68 61 72 2a 2a 29 20 69 6e 20 77 68 69 63 68 20  har**) in which 
30e0: 74 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e 64 20  the.  ** second 
30f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
3100: 72 72 61 79 20 69 73 20 74 68 65 20 6e 61 6d 65  rray is the name
3110: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 61   of the pragma a
3120: 6e 64 20 74 68 65 20 74 68 69 72 64 0a 20 20 2a  nd the third.  *
3130: 2a 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65  * element is the
3140: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3150: 20 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c 4c 20   pragma or NULL 
3160: 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 68 61  if the pragma ha
3170: 73 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75 6d 65  s no.  ** argume
3180: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63 6e 74  nt..  */.  aFcnt
3190: 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46 63 6e  l[0] = 0;.  aFcn
31a0: 74 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20  tl[1] = zLeft;. 
31b0: 20 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69   aFcntl[2] = zRi
31c0: 67 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b 33 5d  ght;.  aFcntl[3]
31d0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
31e0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
31f0: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
3200: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
3210: 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
3220: 43 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28 76 6f  CNTL_PRAGMA, (vo
3230: 69 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20 20 69  id*)aFcntl);.  i
3240: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3250: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
3260: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
3270: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3280: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
3290: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
32a0: 45 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 53 51  E, aFcntl[0], SQ
32b0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
32c0: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
32d0: 65 54 65 78 74 28 76 2c 20 61 46 63 6e 74 6c 5b  eText(v, aFcntl[
32e0: 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0]);.    sqlite3
32f0: 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29  _free(aFcntl[0])
3300: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d  ;.    goto pragm
3310: 61 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  a_out;.  }.  if(
3320: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
3330: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20  OUND ){.    if( 
3340: 61 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20  aFcntl[0] ){.   
3350: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3360: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
3370: 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20   aFcntl[0]);.   
3380: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3390: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
33a0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  }.    pParse->nE
33b0: 72 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65  rr++;.    pParse
33c0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67  ->rc = rc;.    g
33d0: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
33e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
33f0: 20 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74   the pragma in t
3400: 68 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20  he lookup table 
3410: 2a 2f 0a 20 20 70 50 72 61 67 6d 61 20 3d 20 70  */.  pPragma = p
3420: 72 61 67 6d 61 4c 6f 63 61 74 65 28 7a 4c 65 66  ragmaLocate(zLef
3430: 74 29 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d  t);.  if( pPragm
3440: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 61 67  a==0 ) goto prag
3450: 6d 61 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61  ma_out;..  /* Ma
3460: 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
3470: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6c  base schema is l
3480: 6f 61 64 65 64 20 69 66 20 74 68 65 20 70 72 61  oaded if the pra
3490: 67 6d 61 20 72 65 71 75 69 72 65 73 20 74 68 61  gma requires tha
34a0: 74 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61  t */.  if( (pPra
34b0: 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
34c0: 50 72 61 67 46 6c 67 5f 4e 65 65 64 53 63 68 65  PragFlg_NeedSche
34d0: 6d 61 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  ma)!=0 ){.    if
34e0: 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
34f0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
3500: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
3510: 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
3520: 72 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  r the result col
3530: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 70 72  umn names for pr
3540: 61 67 6d 61 73 20 74 68 61 74 20 72 65 74 75 72  agmas that retur
3550: 6e 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  n results */.  i
3560: 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72  f( (pPragma->mPr
3570: 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
3580: 4e 6f 43 6f 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20  NoColumns)==0 . 
3590: 20 20 26 26 20 28 28 70 50 72 61 67 6d 61 2d 3e    && ((pPragma->
35a0: 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
35b0: 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d  lg_NoColumns1)==
35c0: 30 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 29 0a  0 || zRight==0).
35d0: 20 20 29 7b 0a 20 20 20 20 73 65 74 50 72 61 67    ){.    setPrag
35e0: 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61  maResultColumnNa
35f0: 6d 65 73 28 76 2c 20 70 50 72 61 67 6d 61 29 3b  mes(v, pPragma);
3600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
3610: 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
3620: 74 65 20 70 72 61 67 6d 61 20 68 61 6e 64 6c 65  te pragma handle
3630: 72 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  r */.  switch( p
3640: 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70  Pragma->ePragTyp
3650: 20 29 7b 0a 20 20 0a 23 69 66 20 21 64 65 66 69   ){.  .#if !defi
3660: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3670: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 26  PAGER_PRAGMAS) &
3680: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
3690: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
36a0: 44 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  D).  /*.  **  PR
36b0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 64 65  AGMA [schema.]de
36c0: 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65  fault_cache_size
36d0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
36e0: 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74 5f 63  chema.]default_c
36f0: 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a  ache_size=N.  **
3700: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
3710: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
3720: 20 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74   current persist
3730: 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ent setting for 
3740: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
3750: 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76  che size.  The v
3760: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
3770: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
3780: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65  ber of.  ** page
3790: 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
37a0: 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  che.  The second
37b0: 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20   form sets both 
37c0: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
37d0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
37e0: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
37f0: 65 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63  ersistent page c
3800: 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a  ache size value.
3810: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74    ** stored in t
3820: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3830: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65  ..  **.  ** Olde
3840: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
3850: 4c 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20 74  Lite would set t
3860: 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65  he default cache
3870: 20 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a 20   size to a.  ** 
3880: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
3890: 74 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e 63  to indicate sync
38a0: 68 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54 68  hronous=OFF.  Th
38b0: 65 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68 72  ese days, synchr
38c0: 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61 6c  onous.  ** is al
38d0: 77 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61 75  ways on by defau
38e0: 6c 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  lt regardless of
38f0: 20 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68 65   the sign of the
3900: 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a 20   default cache. 
3910: 20 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20 63   ** size.  But c
3920: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65 20  ontinue to take 
3930: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
3940: 75 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  ue of the defaul
3950: 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a  t cache.  ** siz
3960: 65 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c 20  e of historical 
3970: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20  compatibility.. 
3980: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
3990: 79 70 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  yp_DEFAULT_CACHE
39a0: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 74 61  _SIZE: {.    sta
39b0: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
39c0: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
39d0: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73  LINENO(2);.    s
39e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
39f0: 4f 70 4c 69 73 74 20 67 65 74 43 61 63 68 65 53  OpList getCacheS
3a00: 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ize[] = {.      
3a10: 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  { OP_Transaction
3a20: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30  , 0, 0,        0
3a30: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
3a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
3a50: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  */.      { OP_Re
3a60: 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31 2c  adCookie,  0, 1,
3a70: 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 44 45          BTREE_DE
3a80: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
3a90: 7d 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20  },  /* 1 */.    
3aa0: 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20    { OP_IfPos,   
3ab0: 20 20 20 20 31 2c 20 38 2c 20 20 20 20 20 20 20      1, 8,       
3ac0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
3ad0: 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20  Integer,     0, 
3ae0: 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  2,        0},.  
3af0: 20 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61 63      { OP_Subtrac
3b00: 74 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20  t,    1, 2,     
3b10: 20 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     1},.      { O
3b20: 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31  P_IfPos,       1
3b30: 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 8,        0},.
3b40: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
3b50: 65 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  er,     0, 1,   
3b60: 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20 20       0},        
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 6 */.      {
3b90: 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
3ba0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
3bb0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73  ,.      { OP_Res
3bc0: 75 6c 74 52 6f 77 2c 20 20 20 31 2c 20 31 2c 20  ultRow,   1, 1, 
3bd0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
3be0: 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f  ;.    VdbeOp *aO
3bf0: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  p;.    sqlite3Vd
3c00: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
3c10: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52  Db);.    if( !zR
3c20: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 50  ight ){.      pP
3c30: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
3c40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3c50: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
3c60: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
3c70: 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
3c80: 7a 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ze));.      aOp 
3c90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3ca0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
3cb0: 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65  ize(getCacheSize
3cc0: 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 2c  ), getCacheSize,
3cd0: 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 69 66 28   iLn);.      if(
3ce0: 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c 4c 4f 43   ONLY_IF_REALLOC
3cf0: 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d 30 29 20  _STRESS(aOp==0) 
3d00: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61  ) break;.      a
3d10: 4f 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[0].p1 = iDb;.
3d20: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20        aOp[1].p1 
3d30: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
3d40: 5b 36 5d 2e 70 31 20 3d 20 53 51 4c 49 54 45 5f  [6].p1 = SQLITE_
3d50: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
3d60: 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ZE;.    }else{. 
3d70: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
3d80: 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
3d90: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
3da0: 68 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ht));.      sqli
3db0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
3dc0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
3dd0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
3de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3df0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
3e00: 20 69 44 62 2c 20 42 54 52 45 45 5f 44 45 46 41   iDb, BTREE_DEFA
3e10: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20  ULT_CACHE_SIZE, 
3e20: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73  size);.      ass
3e30: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3e40: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3e50: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
3e60: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
3e70: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
3e80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3e90: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
3ea0: 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e  (pDb->pBt, pDb->
3eb0: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
3ec0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
3ed0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
3ee0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
3ef0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20  T_PAGER_PRAGMAS 
3f00: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
3f10: 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23  DEPRECATED */..#
3f20: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3f30: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
3f40: 41 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a  AGMAS).  /*.  **
3f50: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
3f60: 2e 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20 2a 2a  .]page_size.  **
3f70: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
3f80: 2e 5d 70 61 67 65 5f 73 69 7a 65 3d 4e 0a 20 20  .]page_size=N.  
3f90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
3fa0: 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74  t form reports t
3fb0: 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
3fc0: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
3fd0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
3fe0: 7a 65 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  ze in bytes.  Th
3ff0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
4000: 74 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ts the.  ** data
4010: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 76  base page size v
4020: 61 6c 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65  alue.  The value
4030: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 73 65 74   can only be set
4040: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74   if.  ** the dat
4050: 61 62 61 73 65 20 68 61 73 20 6e 6f 74 20 79 65  abase has not ye
4060: 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2e 0a  t been created..
4070: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
4080: 54 79 70 5f 50 41 47 45 5f 53 49 5a 45 3a 20 7b  Typ_PAGE_SIZE: {
4090: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
40a0: 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20  = pDb->pBt;.    
40b0: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
40c0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
40d0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  t ){.      int s
40e0: 69 7a 65 20 3d 20 41 4c 57 41 59 53 28 70 42 74  ize = ALWAYS(pBt
40f0: 29 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  ) ? sqlite3Btree
4100: 47 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 29  GetPageSize(pBt)
4110: 20 3a 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   : 0;.      retu
4120: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
4130: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
4140: 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  .      /* Malloc
4150: 20 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20 73   may fail when s
4160: 65 74 74 69 6e 67 20 74 68 65 20 70 61 67 65 2d  etting the page-
4170: 73 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20 69  size, as there i
4180: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20  s an internal.  
4190: 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74 68      ** buffer th
41a0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f 64  at the pager mod
41b0: 75 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69 6e  ule resizes usin
41c0: 67 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  g sqlite3_reallo
41d0: 63 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  c()..      */.  
41e0: 20 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65      db->nextPage
41f0: 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74  size = sqlite3At
4200: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
4210: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
4220: 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
4230: 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
4240: 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
4250: 65 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20 20  e,-1,0) ){.     
4260: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
4270: 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  lt(db);.      }.
4280: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
4290: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
42a0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42b0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20  ]secure_delete. 
42c0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
42d0: 65 6d 61 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65  ema.]secure_dele
42e0: 74 65 3d 4f 4e 2f 4f 46 46 2f 46 41 53 54 0a 20  te=ON/OFF/FAST. 
42f0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
4300: 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20  st form reports 
4310: 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
4320: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
4330: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 66   secure_delete f
4340: 6c 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  lag.  The second
4350: 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68   form changes th
4360: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
4370: 20 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69 6e    ** flag settin
4380: 67 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74 68  g and reports th
4390: 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a  e new value..  *
43a0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
43b0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20  _SECURE_DELETE: 
43c0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
43d0: 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20   = pDb->pBt;.   
43e0: 20 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20   int b = -1;.   
43f0: 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20   assert( pBt!=0 
4400: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
4410: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
4420: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
4430: 52 69 67 68 74 2c 20 22 66 61 73 74 22 29 3d 3d  Right, "fast")==
4440: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 20 3d  0 ){.        b =
4450: 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   2;.      }else{
4460: 0a 20 20 20 20 20 20 20 20 62 20 3d 20 73 71 6c  .        b = sql
4470: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
4480: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
4490: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
44a0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62   pId2->n==0 && b
44b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
44c0: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
44d0: 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
44e0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
44f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
4500: 72 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62  reDelete(db->aDb
4510: 5b 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20  [ii].pBt, b);.  
4520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4530: 62 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  b = sqlite3Btree
4540: 53 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74  SecureDelete(pBt
4550: 2c 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , b);.    return
4560: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b  SingleInt(v, b);
4570: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4580: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4590: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f  MA [schema.]max_
45a0: 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20  page_count.  ** 
45b0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
45c0: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
45d0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
45e0: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
45f0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
4600: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
4610: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
4620: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
4630: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4640: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
4650: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
4660: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
4670: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
4680: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4690: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
46a0: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
46b0: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
46c0: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
46d0: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
46e0: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
46f0: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
4700: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
4710: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
4720: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
4730: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
4740: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
4750: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
4760: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4770: 61 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20  a.]page_count.  
4780: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
4790: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
47a0: 65 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  es in the specif
47b0: 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ied database..  
47c0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
47d0: 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a  p_PAGE_COUNT: {.
47e0: 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20      int iReg;.  
47f0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
4800: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
4810: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67  , iDb);.    iReg
4820: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4830: 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  m;.    if( sqlit
4840: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
4850: 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20  0])=='p' ){.    
4860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4870: 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f  Op2(v, OP_Pageco
4880: 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b  unt, iDb, iReg);
4890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
48a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
48b0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63  Op3(v, OP_MaxPgc
48c0: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a  nt, iDb, iReg, .
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
48f0: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
4900: 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20  toi(zRight)));. 
4910: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
4920: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4930: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67  _ResultRow, iReg
4940: 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 1);.    break;
4950: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4960: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4970: 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20  ]locking_mode.  
4980: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4990: 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ma.]locking_mode
49a0: 20 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75   = (normal|exclu
49b0: 73 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73  sive).  */.  cas
49c0: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e  e PragTyp_LOCKIN
49d0: 47 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f  G_MODE: {.    co
49e0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
49f0: 20 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69   "normal";.    i
4a00: 6e 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f  nt eMode = getLo
4a10: 63 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74  ckingMode(zRight
4a20: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32  );..    if( pId2
4a30: 2d 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d  ->n==0 && eMode=
4a40: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4a50: 44 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20  DE_QUERY ){.    
4a60: 20 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41    /* Simple "PRA
4a70: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4a80: 3b 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ;" statement. Th
4a90: 69 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f  is is a query fo
4aa0: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
4ab0: 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c  urrent default l
4ac0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69  ocking mode (whi
4ad0: 63 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ch may be differ
4ae0: 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ent to.      ** 
4af0: 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
4b00: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
4b10: 61 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f  abase)..      */
4b20: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64  .      eMode = d
4b30: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b  b->dfltLockMode;
4b40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
4b60: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d  .      if( pId2-
4b70: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >n==0 ){.       
4b80: 20 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   /* This indicat
4b90: 65 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62  es that no datab
4ba0: 61 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65  ase name was spe
4bb0: 63 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20  cified as part. 
4bc0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
4bd0: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e   PRAGMA command.
4be0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4bf0: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d  e locking-mode m
4c00: 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
4c10: 2a 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74  * set on all att
4c20: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c  ached databases,
4c30: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
4c40: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20  main db file..  
4c50: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4c60: 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71   ** Also, the sq
4c70: 6c 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f  lite3.dfltLockMo
4c80: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  de variable is s
4c90: 65 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20  et so that.     
4ca0: 20 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71     ** any subseq
4cb0: 75 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20  uently attached 
4cc0: 64 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75  databases also u
4cd0: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
4ce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
4cf0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  ing mode..      
4d00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
4d10: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
4d20: 65 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44  ert(pDb==&db->aD
4d30: 62 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  b[0]);.        f
4d40: 6f 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e  or(ii=2; ii<db->
4d50: 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
4d60: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
4d70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4d80: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4da0: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4db0: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4dc0: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  de);.        }. 
4dd0: 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c         db->dfltL
4de0: 6f 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  ockMode = (u8)eM
4df0: 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
4e00: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
4e10: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
4e20: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65  b->pBt);.      e
4e30: 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Mode = sqlite3Pa
4e40: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
4e50: 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  Pager, eMode);. 
4e60: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
4e70: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
4e80: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
4e90: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
4ea0: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4eb0: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
4ec0: 49 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65  IVE );.    if( e
4ed0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4ee0: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4ef0: 45 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20  E ){.      zRet 
4f00: 3d 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20  = "exclusive";. 
4f10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
4f20: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65  ingleText(v, zRe
4f30: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
4f40: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4f50: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
4f60: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a  ournal_mode.  **
4f70: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4f80: 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  .]journal_mode =
4f90: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
4fa0: 20 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65             (dele
4fb0: 74 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74  te|persist|off|t
4fc0: 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77  runcate|memory|w
4fd0: 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63  al|off).  */.  c
4fe0: 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52  ase PragTyp_JOUR
4ff0: 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20  NAL_MODE: {.    
5000: 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20  int eMode;      
5010: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
5020: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
5030: 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f  E_XXX symbols */
5040: 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
5050: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5060: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69  ounter */..    i
5070: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
5080: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
5090: 65 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20  e is no "=MODE" 
50a0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
50b0: 6d 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66  ma, do a query f
50c0: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
50d0: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a  current mode */.
50e0: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41        eMode = PA
50f0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
5100: 51 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65  QUERY;.    }else
5110: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
5120: 61 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20  ar *zMode;.     
5130: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
5140: 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
5150: 3b 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64  ;.      for(eMod
5160: 65 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71  e=0; (zMode = sq
5170: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
5180: 6e 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b  name(eMode))!=0;
5190: 20 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20   eMode++){.     
51a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
51b0: 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a  rNICmp(zRight, z
51c0: 4d 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Mode, n)==0 ) br
51d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
51e0: 20 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b     if( !zMode ){
51f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
5200: 68 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  he "=MODE" part 
5210: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
5220: 6e 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c  ny known journal
5230: 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a   mode,.        *
5240: 2a 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72  * then do a quer
5250: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f  y */.        eMo
5260: 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
5270: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20  ALMODE_QUERY;.  
5280: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5290: 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
52a0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
52b0: 52 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30  RY && pId2->n==0
52c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
52d0: 76 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75  vert "PRAGMA jou
52e0: 72 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20  rnal_mode" into 
52f0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
5300: 72 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20  rnal_mode" */.  
5310: 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20      iDb = 0;.   
5320: 20 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a     pId2->n = 1;.
5330: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
5340: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
5350: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
5360: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  if( db->aDb[ii].
5370: 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20  pBt && (ii==iDb 
5380: 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29  || pId2->n==0) )
5390: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
53a0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
53b0: 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73  , ii);.        s
53c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
53d0: 28 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  (v, OP_JournalMo
53e0: 64 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65  de, ii, 1, eMode
53f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5400: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5410: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
5420: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
5430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
5440: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
5450: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5460: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a  l_size_limit.  *
5470: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
5480: 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  a.]journal_size_
5490: 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  limit=N.  **.  *
54a0: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
54b0: 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72   size limit on r
54c0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
54d0: 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  files..  */.  ca
54e0: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
54f0: 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b  AL_SIZE_LIMIT: {
5500: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
5510: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
5520: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
5530: 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  ;.    i64 iLimit
5540: 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a   = -2;.    if( z
5550: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
5560: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
5570: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  I64(zRight, &iLi
5580: 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mit);.      if( 
5590: 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d  iLimit<-1 ) iLim
55a0: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  it = -1;.    }. 
55b0: 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
55c0: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
55d0: 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c  izeLimit(pPager,
55e0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65   iLimit);.    re
55f0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
5600: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72   iLimit);.    br
5610: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  eak;.  }..#endif
5620: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5630: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
5640: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5650: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5660: 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50  o_vacuum.  **  P
5670: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
5680: 75 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a  uto_vacuum=N.  *
5690: 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65  *.  ** Get or se
56a0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
56b0: 68 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74  he database 'aut
56c0: 6f 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65  o-vacuum' parame
56d0: 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  ter..  ** The va
56e0: 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20  lue is one of:  
56f0: 30 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20  0 NONE 1 FULL 2 
5700: 49 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f  INCREMENTAL.  */
5710: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5720: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
5730: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
5740: 55 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20  UTO_VACUUM: {.  
5750: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
5760: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  Db->pBt;.    ass
5770: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
5780: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
5790: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
57a0: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
57b0: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
57c0: 63 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20  cuum(pBt));.    
57d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
57e0: 20 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f   eAuto = getAuto
57f0: 56 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a  Vacuum(zRight);.
5800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41        assert( eA
5810: 75 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c  uto>=0 && eAuto<
5820: 3d 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  =2 );.      db->
5830: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75  nextAutovac = (u
5840: 38 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f  8)eAuto;.      /
5850: 2a 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61  * Call SetAutoVa
5860: 63 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e  cuum() to set in
5870: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74  itialize the int
5880: 65 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20  ernal auto and. 
5890: 20 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63       ** incr-vac
58a0: 75 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20  uum flags. This 
58b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
58c0: 61 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ase this connect
58d0: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65  ion.      ** cre
58e0: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
58f0: 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d  e file. It is im
5900: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20  portant that it 
5910: 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  is created.     
5920: 20 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76   ** as an auto-v
5930: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62  acuum capable db
5940: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5950: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5960: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
5970: 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20  pBt, eAuto);.   
5980: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5990: 45 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d  E_OK && (eAuto==
59a0: 31 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29  1 || eAuto==2) )
59b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  {.        /* Whe
59c0: 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75  n setting the au
59d0: 74 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to_vacuum mode t
59e0: 6f 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20  o either "full" 
59f0: 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  or .        ** "
5a00: 69 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72  incremental", wr
5a10: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
5a20: 20 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20   meta[6] in the 
5a30: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
5a40: 20 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65   ** file. Before
5a50: 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61   writing to meta
5a60: 5b 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20  [6], check that 
5a70: 6d 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65  meta[3] indicate
5a80: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
5a90: 74 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73  t this really is
5aa0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
5ab0: 63 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65  capable database
5ac0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5ad0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5ae0: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
5af0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
5b00: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  );.        stati
5b10: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
5b20: 73 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20  st setMeta6[] = 
5b30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  {.          { OP
5b40: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
5b50: 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20   0,         1,  
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b70: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
5b80: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61          { OP_Rea
5b90: 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20  dCookie,     0, 
5ba0: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5bb0: 20 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54     BTREE_LARGEST
5bc0: 5f 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20  _ROOT_PAGE},.   
5bd0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20              1,  
5bf0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5c00: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5c10: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
5c20: 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20     { OP_Halt,   
5c30: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
5c40: 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20  K, OE_Abort,    
5c50: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c60: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  3 */.          {
5c70: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
5c80: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42      0,         B
5c90: 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d  TREE_INCR_VACUUM
5ca0: 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  , 0},    /* 4 */
5cb0: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
5cc0: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
5cd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
5ce0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5cf0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
5d00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5d10: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
5d20: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
5d30: 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29  aySize(setMeta6)
5d40: 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d  );.        aOp =
5d50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d60: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5d70: 7a 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65  ze(setMeta6), se
5d80: 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20  tMeta6, iLn);.  
5d90: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
5da0: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
5db0: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
5dc0: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  ;.        aOp[0]
5dd0: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
5de0: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
5df0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
5e00: 32 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b  2].p2 = iAddr+4;
5e10: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e  .        aOp[4].
5e20: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5e30: 20 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41    aOp[4].p3 = eA
5e40: 75 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  uto - 1;.       
5e50: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
5e60: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
5e70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5e80: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e90: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
5ea0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69  RAGMA [schema.]i
5eb0: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
5ec0: 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  m(N).  **.  ** D
5ed0: 6f 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63  o N steps of inc
5ee0: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69  remental vacuumi
5ef0: 6e 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ng on a database
5f00: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5f20: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5f30: 67 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c  gTyp_INCREMENTAL
5f40: 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69  _VACUUM: {.    i
5f50: 6e 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b  nt iLimit, addr;
5f60: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
5f70: 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65  =0 || !sqlite3Ge
5f80: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
5f90: 69 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69  iLimit) || iLimi
5fa0: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  t<=0 ){.      iL
5fb0: 69 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66  imit = 0x7ffffff
5fc0: 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  f;.    }.    sql
5fd0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5fe0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5ff0: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
6000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6010: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c  , OP_Integer, iL
6020: 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  imit, 1);.    ad
6030: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
6040: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63  AddOp1(v, OP_Inc
6050: 72 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56  rVacuum, iDb); V
6060: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6080: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp1(v, OP_Resu
6090: 6c 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73  ltRow, 1);.    s
60a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
60b0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
60c0: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
60d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
60e0: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
60f0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
6100: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6110: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
6120: 61 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b  addr);.    break
6130: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
6140: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6150: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
6160: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6170: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6180: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
6190: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
61a0: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
61b0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
61c0: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
61d0: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
61e0: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
61f0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
6200: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
6210: 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c  m sets the local
6220: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
6230: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66   size value.  If
6240: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
6250: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
6260: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
6270: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
6280: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
6290: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
62a0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
62b0: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
62c0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
62d0: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
62e0: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
62f0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
6300: 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49  PragTyp_CACHE_SI
6310: 5a 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE: {.    assert
6320: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
6330: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
6340: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6350: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6360: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6370: 28 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  (v, pDb->pSchema
6380: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
6390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
63a0: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
63b0: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
63c0: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
63d0: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  ma->cache_size =
63e0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
63f0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
6400: 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  eSize(pDb->pBt, 
6410: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
6420: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
6430: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6440: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6450: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6460: 65 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52  e_spill.  **  PR
6470: 41 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c  AGMA cache_spill
6480: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50  =BOOLEAN.  **  P
6490: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63  RAGMA [schema.]c
64a0: 61 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a  ache_spill=N.  *
64b0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
64c0: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
64d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
64e0: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
64f0: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
6500: 73 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20  spill size. The 
6510: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e  second form turn
6520: 73 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e  s cache spill on
6530: 0a 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57  .  ** or off.  W
6540: 68 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63  hen turnning cac
6550: 68 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65  he spill on, the
6560: 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
6570: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
6580: 20 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68   cache_size.  Th
6590: 65 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74  e third form set
65a0: 73 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74  s a spill size t
65b0: 68 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  hat.  ** may be 
65c0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74  different form t
65d0: 68 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  he cache size.. 
65e0: 20 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69   ** If N is posi
65f0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
6600: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
6610: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6620: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
6630: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
6640: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6650: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6660: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6670: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6680: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6690: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20  f memory..  **. 
66a0: 20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   ** If the numbe
66b0: 72 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c  r of cache_spill
66c0: 20 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74   pages is less t
66d0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
66e0: 66 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a  f.  ** cache_siz
66f0: 65 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c  e pages, no spil
6700: 6c 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69  ling occurs unti
6710: 6c 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  l the page count
6720: 20 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68   exceeds.  ** th
6730: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
6740: 65 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20  e_size pages..  
6750: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68  **.  ** The cach
6760: 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20  e_spill=BOOLEAN 
6770: 73 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20  setting applies 
6780: 74 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  to all attached 
6790: 73 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f  schemas,.  ** no
67a0: 74 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d  t just the schem
67b0: 61 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  a specified..  *
67c0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
67d0: 5f 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a  _CACHE_SPILL: {.
67e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
67f0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
6800: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
6810: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
6820: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
6830: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20  nSingleInt(v,.  
6840: 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67         (db->flag
6850: 73 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65  s & SQLITE_Cache
6860: 53 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20  Spill)==0 ? 0 : 
6870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6880: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6890: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30  lSize(pDb->pBt,0
68a0: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
68b0: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
68c0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
68d0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
68e0: 67 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20  ght, &size) ){. 
68f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6900: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
6910: 70 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b  pDb->pBt, size);
6920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6930: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
6940: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a  lean(zRight, siz
6950: 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  e!=0) ){.       
6960: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6970: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6980: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6990: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
69a0: 26 3d 20 7e 28 75 36 34 29 53 51 4c 49 54 45 5f  &= ~(u64)SQLITE_
69b0: 43 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20  CacheSpill;.    
69c0: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 41 6c 6c    }.      setAll
69d0: 50 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a  PagerFlags(db);.
69e0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
69f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
6a00: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
6a10: 5d 6d 6d 61 70 5f 73 69 7a 65 28 4e 29 0a 20 20  ]mmap_size(N).  
6a20: 2a 2a 0a 20 20 2a 2a 20 55 73 65 64 20 74 6f 20  **.  ** Used to 
6a30: 73 65 74 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  set mapping size
6a40: 20 6c 69 6d 69 74 2e 20 54 68 65 20 6d 61 70 70   limit. The mapp
6a50: 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 20 69  ing size limit i
6a60: 73 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 6c  s.  ** used to l
6a70: 69 6d 69 74 20 74 68 65 20 61 67 67 72 65 67 61  imit the aggrega
6a80: 74 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 6d  te size of all m
6a90: 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65 67  emory mapped reg
6aa0: 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ions of the.  **
6ab0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
6ac0: 49 66 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  If this paramete
6ad0: 72 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  r is set to zero
6ae0: 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
6af0: 70 70 69 6e 67 0a 20 20 2a 2a 20 69 73 20 6e 6f  pping.  ** is no
6b00: 74 20 75 73 65 64 20 61 74 20 61 6c 6c 2e 20 20  t used at all.  
6b10: 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65  If N is negative
6b20: 2c 20 74 68 65 6e 20 74 68 65 20 64 65 66 61 75  , then the defau
6b30: 6c 74 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20 20  lt memory map.  
6b40: 2a 2a 20 6c 69 6d 69 74 20 64 65 74 65 72 6d 69  ** limit determi
6b50: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63  ned by sqlite3_c
6b60: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
6b70: 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 29 20 69  FIG_MMAP_SIZE) i
6b80: 73 20 73 65 74 2e 0a 20 20 2a 2a 20 54 68 65 20  s set..  ** The 
6b90: 70 61 72 61 6d 65 74 65 72 20 4e 20 69 73 20 6d  parameter N is m
6ba0: 65 61 73 75 72 65 64 20 69 6e 20 62 79 74 65 73  easured in bytes
6bb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
6bc0: 20 76 61 6c 75 65 20 69 73 20 61 64 76 69 73 6f   value is adviso
6bd0: 72 79 2e 20 20 54 68 65 20 75 6e 64 65 72 6c 79  ry.  The underly
6be0: 69 6e 67 20 56 46 53 20 69 73 20 66 72 65 65 20  ing VFS is free 
6bf0: 74 6f 20 6d 65 6d 6f 72 79 20 6d 61 70 0a 20 20  to memory map.  
6c00: 2a 2a 20 61 73 20 6c 69 74 74 6c 65 20 6f 72 20  ** as little or 
6c10: 61 73 20 6d 75 63 68 20 61 73 20 69 74 20 77 61  as much as it wa
6c20: 6e 74 73 2e 20 20 45 78 63 65 70 74 2c 20 69 66  nts.  Except, if
6c30: 20 4e 20 69 73 20 73 65 74 20 74 6f 20 30 20 74   N is set to 0 t
6c40: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 75 70 70  hen the.  ** upp
6c50: 65 72 20 6c 61 79 65 72 73 20 77 69 6c 6c 20 6e  er layers will n
6c60: 65 76 65 72 20 69 6e 76 6f 6b 65 20 74 68 65 20  ever invoke the 
6c70: 78 46 65 74 63 68 20 69 6e 74 65 72 66 61 63 65  xFetch interface
6c80: 73 20 74 6f 20 74 68 65 20 56 46 53 2e 0a 20 20  s to the VFS..  
6c90: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
6ca0: 70 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  p_MMAP_SIZE: {. 
6cb0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
6cc0: 20 73 7a 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f   sz;.#if SQLITE_
6cd0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
6ce0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
6cf0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
6d00: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
6d10: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
6d20: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
6d30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
6d40: 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69  ecOrHexToI64(zRi
6d50: 67 68 74 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20  ght, &sz);.     
6d60: 20 69 66 28 20 73 7a 3c 30 20 29 20 73 7a 20 3d   if( sz<0 ) sz =
6d70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
6d80: 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 20  nfig.szMmap;.   
6d90: 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e 3d 3d     if( pId2->n==
6da0: 30 20 29 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d  0 ) db->szMmap =
6db0: 20 73 7a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   sz;.      for(i
6dc0: 69 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e  i=db->nDb-1; ii>
6dd0: 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20  =0; ii--){.     
6de0: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
6df0: 69 5d 2e 70 42 74 20 26 26 20 28 69 69 3d 3d 69  i].pBt && (ii==i
6e00: 44 62 20 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30  Db || pId2->n==0
6e10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
6e20: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
6e30: 61 70 4c 69 6d 69 74 28 64 62 2d 3e 61 44 62 5b  apLimit(db->aDb[
6e40: 69 69 5d 2e 70 42 74 2c 20 73 7a 29 3b 0a 20 20  ii].pBt, sz);.  
6e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6e60: 20 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 2d      }.    sz = -
6e70: 31 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  1;.    rc = sqli
6e80: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
6e90: 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45  (db, zDb, SQLITE
6ea0: 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
6eb0: 2c 20 26 73 7a 29 3b 0a 23 65 6c 73 65 0a 20 20  , &sz);.#else.  
6ec0: 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 72 63    sz = 0;.    rc
6ed0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
6ee0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d  ndif.    if( rc=
6ef0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6f00: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
6f10: 49 6e 74 28 76 2c 20 73 7a 29 3b 0a 20 20 20 20  Int(v, sz);.    
6f20: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
6f30: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
6f40: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
6f50: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Err++;.      pPa
6f60: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
6f70: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
6f80: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
6f90: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
6fa0: 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  e.  **   PRAGMA 
6fb0: 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 22 64 65  temp_store = "de
6fc0: 66 61 75 6c 74 22 7c 22 6d 65 6d 6f 72 79 22 7c  fault"|"memory"|
6fd0: 22 66 69 6c 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  "file".  **.  **
6fe0: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
6ff0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
7000: 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65  f the temp_store
7010: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
7020: 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20  .  ** the local 
7030: 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d  value does not m
7040: 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ake changes to t
7050: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64  he disk file and
7060: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a   the default.  *
7070: 2a 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  * value will be 
7080: 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78  restored the nex
7090: 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
70a0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2e 0a 20  ase is opened.. 
70b0: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
70c0: 61 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  at it is possibl
70d0: 65 20 66 6f 72 20 74 68 65 20 6c 69 62 72 61 72  e for the librar
70e0: 79 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  y compile-time o
70f0: 70 74 69 6f 6e 73 20 74 6f 0a 20 20 2a 2a 20 6f  ptions to.  ** o
7100: 76 65 72 72 69 64 65 20 74 68 69 73 20 73 65 74  verride this set
7110: 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ting.  */.  case
7120: 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53 54   PragTyp_TEMP_ST
7130: 4f 52 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ORE: {.    if( !
7140: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7150: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
7160: 76 2c 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  v, db->temp_stor
7170: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
7180: 20 20 20 20 20 63 68 61 6e 67 65 54 65 6d 70 53       changeTempS
7190: 74 6f 72 61 67 65 28 70 50 61 72 73 65 2c 20 7a  torage(pParse, z
71a0: 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Right);.    }.  
71b0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
71c0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
71d0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
71e0: 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52 41  ctory.  **   PRA
71f0: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
7200: 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22 64  irectory = ""|"d
7210: 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a 20  irectory_name". 
7220: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
7230: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
7240: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65   value of the te
7250: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
7260: 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69  ry flag.  Changi
7270: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  ng.  ** the valu
7280: 65 20 73 65 74 73 20 61 20 73 70 65 63 69 66 69  e sets a specifi
7290: 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 62  c directory to b
72a0: 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f  e used for tempo
72b0: 72 61 72 79 20 66 69 6c 65 73 2e 0a 20 20 2a 2a  rary files..  **
72c0: 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75   Setting to a nu
72d0: 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74  ll string revert
72e0: 73 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  s to the default
72f0: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
7300: 74 6f 72 79 20 73 65 61 72 63 68 2e 0a 20 20 2a  tory search..  *
7310: 2a 20 49 66 20 74 65 6d 70 6f 72 61 72 79 20 64  * If temporary d
7320: 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e  irectory is chan
7330: 67 65 64 2c 20 74 68 65 6e 20 69 6e 76 61 6c 69  ged, then invali
7340: 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 2e  dateTempStorage.
7350: 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73  .  **.  */.  cas
7360: 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53  e PragTyp_TEMP_S
7370: 54 4f 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20  TORE_DIRECTORY: 
7380: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
7390: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
73a0: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73  nSingleText(v, s
73b0: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
73c0: 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73  ctory);.    }els
73d0: 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e{.#ifndef SQLIT
73e0: 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
73f0: 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29   if( zRight[0] )
7400: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
7410: 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
7420: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
7430: 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74  db->pVfs, zRight
7440: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
7450: 52 45 41 44 57 52 49 54 45 2c 20 26 72 65 73 29  READWRITE, &res)
7460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
7470: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  !=SQLITE_OK || r
7480: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
7490: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
74a0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20  sg(pParse, "not 
74b0: 61 20 77 72 69 74 61 62 6c 65 20 64 69 72 65 63  a writable direc
74c0: 74 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20  tory");.        
74d0: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
74e0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
74f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53     }.      if( S
7500: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
7510: 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 53  ==0.       || (S
7520: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
7530: 3d 3d 31 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f  ==1 && db->temp_
7540: 73 74 6f 72 65 3c 3d 31 29 0a 20 20 20 20 20 20  store<=1).      
7550: 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d 50   || (SQLITE_TEMP
7560: 5f 53 54 4f 52 45 3d 3d 32 20 26 26 20 64 62 2d  _STORE==2 && db-
7570: 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 31 29 0a  >temp_store==1).
7580: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
7590: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
75a0: 74 6f 72 61 67 65 28 70 50 61 72 73 65 29 3b 0a  torage(pParse);.
75b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
75c0: 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74  lite3_free(sqlit
75d0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
75e0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  y);.      if( zR
75f0: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
7600: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f     sqlite3_temp_
7610: 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69  directory = sqli
7620: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
7630: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , zRight);.     
7640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7650: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
7660: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20  ectory = 0;.    
7670: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
7680: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f  LITE_OMIT_WSD */
7690: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
76a0: 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
76b0: 45 5f 4f 53 5f 57 49 4e 0a 20 20 2f 2a 0a 20 20  E_OS_WIN.  /*.  
76c0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 64 61 74 61  **   PRAGMA data
76d0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
76e0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 64  .  **   PRAGMA d
76f0: 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
7700: 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74  ory = ""|"direct
7710: 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20  ory_name".  **. 
7720: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
7730: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
7740: 65 20 6f 66 20 74 68 65 20 64 61 74 61 5f 73 74  e of the data_st
7750: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c  ore_directory fl
7760: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7770: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7780: 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72  s a specific dir
7790: 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65  ectory to be use
77a0: 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  d for database f
77b0: 69 6c 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 77  iles that.  ** w
77c0: 65 72 65 20 73 70 65 63 69 66 69 65 64 20 77 69  ere specified wi
77d0: 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
77e0: 74 68 6e 61 6d 65 2e 20 20 53 65 74 74 69 6e 67  thname.  Setting
77f0: 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e   to a null strin
7800: 67 20 72 65 76 65 72 74 73 0a 20 20 2a 2a 20 74  g reverts.  ** t
7810: 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 61  o the default da
7820: 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  tabase directory
7830: 2c 20 77 68 69 63 68 20 66 6f 72 20 64 61 74 61  , which for data
7840: 62 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69  base files speci
7850: 66 69 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 61  fied with.  ** a
7860: 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 77   relative path w
7870: 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 62 65 20  ill probably be 
7880: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72  based on the cur
7890: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 66  rent directory f
78a0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  or the.  ** proc
78b0: 65 73 73 2e 20 20 44 61 74 61 62 61 73 65 20 66  ess.  Database f
78c0: 69 6c 65 20 73 70 65 63 69 66 69 65 64 20 77 69  ile specified wi
78d0: 74 68 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  th an absolute p
78e0: 61 74 68 20 61 72 65 20 6e 6f 74 20 69 6d 70 61  ath are not impa
78f0: 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 69  cted.  ** by thi
7900: 73 20 73 65 74 74 69 6e 67 2c 20 72 65 67 61 72  s setting, regar
7910: 64 6c 65 73 73 20 6f 66 20 69 74 73 20 76 61 6c  dless of its val
7920: 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20  ue..  **.  */.  
7930: 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 41 54  case PragTyp_DAT
7940: 41 5f 53 54 4f 52 45 5f 44 49 52 45 43 54 4f 52  A_STORE_DIRECTOR
7950: 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52  Y: {.    if( !zR
7960: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65  ight ){.      re
7970: 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76  turnSingleText(v
7980: 2c 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  , sqlite3_data_d
7990: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d  irectory);.    }
79a0: 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51  else{.#ifndef SQ
79b0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
79c0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
79d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ] ){.        int
79e0: 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
79f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
7a00: 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69  ss(db->pVfs, zRi
7a10: 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ght, SQLITE_ACCE
7a20: 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72  SS_READWRITE, &r
7a30: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
7a40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
7a50: 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  | res==0 ){.    
7a60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7a70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
7a80: 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20 64 69  ot a writable di
7a90: 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20  rectory");.     
7aa0: 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61       goto pragma
7ab0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
7ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
7ad0: 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74  lite3_free(sqlit
7ae0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7af0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  y);.      if( zR
7b00: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
7b10: 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
7b20: 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69  directory = sqli
7b30: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
7b40: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , zRight);.     
7b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b60: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
7b70: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20  ectory = 0;.    
7b80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
7b90: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f  LITE_OMIT_WSD */
7ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
7bb0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
7bc0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7bd0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
7be0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
7bf0: 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70   [schema.]lock_p
7c00: 72 6f 78 79 5f 66 69 6c 65 0a 20 20 2a 2a 20 20  roxy_file.  **  
7c10: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
7c20: 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
7c30: 20 3d 20 22 3a 61 75 74 6f 3a 22 7c 22 6c 6f 63   = ":auto:"|"loc
7c40: 6b 5f 66 69 6c 65 5f 70 61 74 68 22 0a 20 20 2a  k_file_path".  *
7c50: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72  *.  ** Return or
7c60: 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   set the value o
7c70: 66 20 74 68 65 20 6c 6f 63 6b 5f 70 72 6f 78 79  f the lock_proxy
7c80: 5f 66 69 6c 65 20 66 6c 61 67 2e 20 20 43 68 61  _file flag.  Cha
7c90: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76  nging.  ** the v
7ca0: 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63  alue sets a spec
7cb0: 69 66 69 63 20 66 69 6c 65 20 74 6f 20 62 65 20  ific file to be 
7cc0: 75 73 65 64 20 66 6f 72 20 64 61 74 61 62 61 73  used for databas
7cd0: 65 20 61 63 63 65 73 73 20 6c 6f 63 6b 73 2e 0a  e access locks..
7ce0: 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65    **.  */.  case
7cf0: 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 50 52   PragTyp_LOCK_PR
7d00: 4f 58 59 5f 46 49 4c 45 3a 20 7b 0a 20 20 20 20  OXY_FILE: {.    
7d10: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7d20: 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
7d30: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
7d40: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
7d50: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 72  ;.      char *pr
7d60: 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 20 3d 20  oxy_file_path = 
7d70: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 73 71 6c 69  NULL;.      sqli
7d80: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
7d90: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
7da0: 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
7db0: 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
7dc0: 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65  ontrolHint(pFile
7dd0: 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
7de0: 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20  KPROXYFILE, .   
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 20 20 20 20 20 26 70 72 6f 78 79 5f 66          &proxy_f
7e10: 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20 20  ile_path);.     
7e20: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
7e30: 74 28 76 2c 20 70 72 6f 78 79 5f 66 69 6c 65 5f  t(v, proxy_file_
7e40: 70 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65  path);.    }else
7e50: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
7e60: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
7e70: 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70  treePager(pDb->p
7e80: 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
7e90: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d  e3_file *pFile =
7ea0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
7eb0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
7ec0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
7ed0: 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b  if( zRight[0] ){
7ee0: 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71 6c  .        res=sql
7ef0: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7f00: 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  l(pFile, SQLITE_
7f10: 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
7f20: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 20 20 20 20 20 20 7a 52 69 67 68 74 29           zRight)
7f50: 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
7f60: 0a 20 20 20 20 20 20 20 20 72 65 73 3d 73 71 6c  .        res=sql
7f70: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7f80: 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  l(pFile, SQLITE_
7f90: 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
7fa0: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a           NULL);.
7fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7fe0: 28 20 72 65 73 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( res!=SQLITE_OK
7ff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8000: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8010: 73 65 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73  se, "failed to s
8020: 65 74 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69  et lock proxy fi
8030: 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  le");.        go
8040: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
8050: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8060: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
8070: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
8080: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
8090: 45 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 0a  E */      .    .
80a0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
80b0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63  MA [schema.]sync
80c0: 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20 50  hronous.  **   P
80d0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73  RAGMA [schema.]s
80e0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c 4f  ynchronous=OFF|O
80f0: 4e 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 7c 45 58  N|NORMAL|FULL|EX
8100: 54 52 41 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  TRA.  **.  ** Re
8110: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
8120: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
8130: 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66  he synchronous f
8140: 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20  lag.  Changing. 
8150: 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61   ** the local va
8160: 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  lue does not mak
8170: 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
8180: 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74   disk file and t
8190: 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
81a0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65  value will be re
81b0: 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20  stored the next 
81c0: 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
81d0: 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64  e is.  ** opened
81e0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
81f0: 61 67 54 79 70 5f 53 59 4e 43 48 52 4f 4e 4f 55  agTyp_SYNCHRONOU
8200: 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a 52  S: {.    if( !zR
8210: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65  ight ){.      re
8220: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
8230: 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
8240: 65 6c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  el-1);.    }else
8250: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d  {.      if( !db-
8260: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
8270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8280: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
8290: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 61 66              "Saf
82a0: 65 74 79 20 6c 65 76 65 6c 20 6d 61 79 20 6e 6f  ety level may no
82b0: 74 20 62 65 20 63 68 61 6e 67 65 64 20 69 6e 73  t be changed ins
82c0: 69 64 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ide a transactio
82d0: 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n");.      }else
82e0: 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20   if( iDb!=1 ){. 
82f0: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 76 65         int iLeve
8300: 6c 20 3d 20 28 67 65 74 53 61 66 65 74 79 4c 65  l = (getSafetyLe
8310: 76 65 6c 28 7a 52 69 67 68 74 2c 30 2c 31 29 2b  vel(zRight,0,1)+
8320: 31 29 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  1) & PAGER_SYNCH
8330: 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 20  RONOUS_MASK;.   
8340: 20 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3d       if( iLevel=
8350: 3d 30 20 29 20 69 4c 65 76 65 6c 20 3d 20 31 3b  =0 ) iLevel = 1;
8360: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61  .        pDb->sa
8370: 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 69 4c 65  fety_level = iLe
8380: 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 70 44 62  vel;.        pDb
8390: 2d 3e 62 53 79 6e 63 53 65 74 20 3d 20 31 3b 0a  ->bSyncSet = 1;.
83a0: 20 20 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61          setAllPa
83b0: 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20  gerFlags(db);.  
83c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
83d0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
83e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
83f0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a  _PAGER_PRAGMAS *
8400: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
8410: 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47  E_OMIT_FLAG_PRAG
8420: 4d 41 53 0a 20 20 63 61 73 65 20 50 72 61 67 54  MAS.  case PragT
8430: 79 70 5f 46 4c 41 47 3a 20 7b 0a 20 20 20 20 69  yp_FLAG: {.    i
8440: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
8450: 20 20 20 20 20 20 73 65 74 50 72 61 67 6d 61 52        setPragmaR
8460: 65 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  esultColumnNames
8470: 28 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20  (v, pPragma);.  
8480: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
8490: 49 6e 74 28 76 2c 20 28 64 62 2d 3e 66 6c 61 67  Int(v, (db->flag
84a0: 73 20 26 20 70 50 72 61 67 6d 61 2d 3e 69 41 72  s & pPragma->iAr
84b0: 67 29 21 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  g)!=0 );.    }el
84c0: 73 65 7b 0a 20 20 20 20 20 20 75 36 34 20 6d 61  se{.      u64 ma
84d0: 73 6b 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69 41  sk = pPragma->iA
84e0: 72 67 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  rg;    /* Mask o
84f0: 66 20 62 69 74 73 20 74 6f 20 73 65 74 20 6f 72  f bits to set or
8500: 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 20 20 20   clear. */.     
8510: 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
8520: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
8530: 20 20 2f 2a 20 46 6f 72 65 69 67 6e 20 6b 65 79    /* Foreign key
8540: 20 73 75 70 70 6f 72 74 20 6d 61 79 20 6e 6f 74   support may not
8550: 20 62 65 20 65 6e 61 62 6c 65 64 20 6f 72 20 64   be enabled or d
8560: 69 73 61 62 6c 65 64 20 77 68 69 6c 65 20 6e 6f  isabled while no
8570: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
8580: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65  auto-commit mode
8590: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61  .  */.        ma
85a0: 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 46  sk &= ~(SQLITE_F
85b0: 6f 72 65 69 67 6e 4b 65 79 73 29 3b 0a 20 20 20  oreignKeys);.   
85c0: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
85d0: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
85e0: 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 64 62  ION.      if( db
85f0: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
8600: 3d 3d 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a  ==UAUTH_User ){.
8610: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
8620: 74 20 61 6c 6c 6f 77 20 6e 6f 6e 2d 61 64 6d 69  t allow non-admi
8630: 6e 20 75 73 65 72 73 20 74 6f 20 6d 6f 64 69 66  n users to modif
8640: 79 20 74 68 65 20 73 63 68 65 6d 61 20 61 72 62  y the schema arb
8650: 69 74 72 61 72 69 6c 79 20 2a 2f 0a 20 20 20 20  itrarily */.    
8660: 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53 51      mask &= ~(SQ
8670: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
8680: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
8690: 66 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  f..      if( sql
86a0: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
86b0: 52 69 67 68 74 2c 20 30 29 20 29 7b 0a 20 20 20  Right, 0) ){.   
86c0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
86d0: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 65  = mask;.      }e
86e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  lse{.        db-
86f0: 3e 66 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  >flags &= ~mask;
8700: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 61 73  .        if( mas
8710: 6b 3d 3d 53 51 4c 49 54 45 5f 44 65 66 65 72 46  k==SQLITE_DeferF
8720: 4b 73 20 29 20 64 62 2d 3e 6e 44 65 66 65 72 72  Ks ) db->nDeferr
8730: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
8740: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
8750: 20 4d 61 6e 79 20 6f 66 20 74 68 65 20 66 6c 61   Many of the fla
8760: 67 2d 70 72 61 67 6d 61 73 20 6d 6f 64 69 66 79  g-pragmas modify
8770: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
8780: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 0a  ted by the SQL .
8790: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
87a0: 72 20 28 65 67 2e 20 63 6f 75 6e 74 5f 63 68 61  r (eg. count_cha
87b0: 6e 67 65 73 29 2e 20 53 6f 20 61 64 64 20 61 6e  nges). So add an
87c0: 20 6f 70 63 6f 64 65 20 74 6f 20 65 78 70 69 72   opcode to expir
87d0: 65 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 63  e all.      ** c
87e0: 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74  ompiled SQL stat
87f0: 65 6d 65 6e 74 73 20 61 66 74 65 72 20 6d 6f 64  ements after mod
8800: 69 66 79 69 6e 67 20 61 20 70 72 61 67 6d 61 20  ifying a pragma 
8810: 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  value..      */.
8820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8830: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78  eAddOp0(v, OP_Ex
8840: 70 69 72 65 29 3b 0a 20 20 20 20 20 20 73 65 74  pire);.      set
8850: 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62  AllPagerFlags(db
8860: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
8870: 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ak;.  }.#endif /
8880: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  * SQLITE_OMIT_FL
8890: 41 47 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  AG_PRAGMAS */..#
88a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
88b0: 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41  IT_SCHEMA_PRAGMA
88c0: 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  S.  /*.  **   PR
88d0: 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28  AGMA table_info(
88e0: 3c 74 61 62 6c 65 3e 29 0a 20 20 2a 2a 0a 20 20  <table>).  **.  
88f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6e 67  ** Return a sing
8900: 6c 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20  le row for each 
8910: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6e 61  column of the na
8920: 6d 65 64 20 74 61 62 6c 65 2e 20 54 68 65 20 63  med table. The c
8930: 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74  olumns of.  ** t
8940: 68 65 20 72 65 74 75 72 6e 65 64 20 64 61 74 61  he returned data
8950: 20 73 65 74 20 61 72 65 3a 0a 20 20 2a 2a 0a 20   set are:.  **. 
8960: 20 2a 2a 20 63 69 64 3a 20 20 20 20 20 20 20 20   ** cid:        
8970: 43 6f 6c 75 6d 6e 20 69 64 20 28 6e 75 6d 62 65  Column id (numbe
8980: 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  red from left to
8990: 20 72 69 67 68 74 2c 20 73 74 61 72 74 69 6e 67   right, starting
89a0: 20 61 74 20 30 29 0a 20 20 2a 2a 20 6e 61 6d 65   at 0).  ** name
89b0: 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e  :       Column n
89c0: 61 6d 65 0a 20 20 2a 2a 20 74 79 70 65 3a 20 20  ame.  ** type:  
89d0: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 64 65 63 6c       Column decl
89e0: 61 72 61 74 69 6f 6e 20 74 79 70 65 2e 0a 20 20  aration type..  
89f0: 2a 2a 20 6e 6f 74 6e 75 6c 6c 3a 20 20 20 20 54  ** notnull:    T
8a00: 72 75 65 20 69 66 20 27 4e 4f 54 20 4e 55 4c 4c  rue if 'NOT NULL
8a10: 27 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6c  ' is part of col
8a20: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
8a30: 20 20 2a 2a 20 64 66 6c 74 5f 76 61 6c 75 65 3a    ** dflt_value:
8a40: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
8a50: 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ue for the colum
8a60: 6e 2c 20 69 66 20 61 6e 79 2e 0a 20 20 2a 2a 20  n, if any..  ** 
8a70: 70 6b 3a 20 20 20 20 20 20 20 20 20 4e 6f 6e 2d  pk:         Non-
8a80: 7a 65 72 6f 20 66 6f 72 20 50 4b 20 66 69 65 6c  zero for PK fiel
8a90: 64 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ds..  */.  case 
8aa0: 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f 49 4e  PragTyp_TABLE_IN
8ab0: 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29  FO: if( zRight )
8ac0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
8ad0: 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  b;.    pTab = sq
8ae0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
8af0: 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54 45 5f  (pParse, LOCATE_
8b00: 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c 20 7a  NOERR, zRight, z
8b10: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Db);.    if( pTa
8b20: 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  b ){.      int i
8b30: 54 61 62 44 62 20 3d 20 73 71 6c 69 74 65 33 53  TabDb = sqlite3S
8b40: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
8b50: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
8b60: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b  .      int i, k;
8b70: 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64 64  .      int nHidd
8b80: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 6f  en = 0;.      Co
8b90: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  lumn *pCol;.    
8ba0: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
8bb0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
8bc0: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
8bd0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
8be0: 3d 20 37 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 7;.      sqlit
8bf0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
8c00: 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62 44  ma(pParse, iTabD
8c10: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
8c20: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
8c30: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
8c40: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
8c50: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
8c60: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
8c70: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
8c80: 20 20 20 20 20 20 20 69 6e 74 20 69 73 48 69 64         int isHid
8c90: 64 65 6e 20 3d 20 49 73 48 69 64 64 65 6e 43 6f  den = IsHiddenCo
8ca0: 6c 75 6d 6e 28 70 43 6f 6c 29 3b 0a 20 20 20 20  lumn(pCol);.    
8cb0: 20 20 20 20 69 66 28 20 69 73 48 69 64 64 65 6e      if( isHidden
8cc0: 20 26 26 20 70 50 72 61 67 6d 61 2d 3e 69 41 72   && pPragma->iAr
8cd0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
8ce0: 20 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20    nHidden++;.   
8cf0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8d00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8d10: 20 20 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f     if( (pCol->co
8d20: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
8d30: 5f 50 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a  _PRIMKEY)==0 ){.
8d40: 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b            k = 0;
8d50: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
8d60: 66 28 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20  f( pPk==0 ){.   
8d70: 20 20 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20         k = 1;.  
8d80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8d90: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20         for(k=1; 
8da0: 6b 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26  k<=pTab->nCol &&
8db0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b   pPk->aiColumn[k
8dc0: 2d 31 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20  -1]!=i; k++){}. 
8dd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8de0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70   assert( pCol->p
8df0: 44 66 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d  Dflt==0 || pCol-
8e00: 3e 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pDflt->op==TK_S
8e10: 50 41 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  PAN );.        s
8e20: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
8e30: 6f 61 64 28 76 2c 20 31 2c 20 70 50 72 61 67 6d  oad(v, 1, pPragm
8e40: 61 2d 3e 69 41 72 67 20 3f 20 22 69 73 73 69 73  a->iArg ? "issis
8e50: 69 69 22 20 3a 20 22 69 73 73 69 73 69 22 2c 0a  ii" : "issisi",.
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
8e70: 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20 20 20  -nHidden,.      
8e80: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
8e90: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
8ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75       sqlite3Colu
8eb0: 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c  mnType(pCol,""),
8ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ed0: 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20  pCol->notNull ? 
8ee0: 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  1 : 0,.         
8ef0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
8f00: 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d  t ? pCol->pDflt-
8f10: 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20  >u.zToken : 0,. 
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 2c                k,
8f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8f40: 69 73 48 69 64 64 65 6e 29 3b 0a 20 20 20 20 20  isHidden);.     
8f50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
8f60: 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66 20 53 51  reak;..#ifdef SQ
8f70: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 63 61 73  LITE_DEBUG.  cas
8f80: 65 20 50 72 61 67 54 79 70 5f 53 54 41 54 53 3a  e PragTyp_STATS:
8f90: 20 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49   {.    Index *pI
8fa0: 64 78 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d  dx;.    HashElem
8fb0: 20 2a 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   *i;.    pParse-
8fc0: 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 73  >nMem = 5;.    s
8fd0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
8fe0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
8ff0: 44 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73  Db);.    for(i=s
9000: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9010: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
9020: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
9030: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
9040: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
9050: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
9060: 61 74 61 28 69 29 3b 0a 20 20 20 20 20 20 73 71  ata(i);.      sq
9070: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9080: 61 64 28 76 2c 20 31 2c 20 22 73 73 69 69 69 22  ad(v, 1, "ssiii"
9090: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
90a0: 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
90b0: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
90c0: 20 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f     pTab->szTabRo
90d0: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  w,.           pT
90e0: 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 2c 0a  ab->nRowLogEst,.
90f0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
9100: 3e 74 61 62 46 6c 61 67 73 29 3b 0a 20 20 20 20  >tabFlags);.    
9110: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
9120: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
9130: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
9140: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9150: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
9160: 2c 20 32 2c 20 22 73 69 69 69 58 22 2c 0a 20 20  , 2, "siiiX",.  
9170: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 7a           pIdx->z
9180: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
9190: 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 2c   pIdx->szIdxRow,
91a0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
91b0: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
91c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64  ,.           pId
91d0: 78 2d 3e 68 61 73 53 74 61 74 31 29 3b 0a 20 20  x->hasStat1);.  
91e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
91f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
9200: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 35 29 3b 0a  sultRow, 1, 5);.
9210: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9220: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
9230: 66 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  f..  case PragTy
9240: 70 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a 20 69 66  p_INDEX_INFO: if
9250: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
9260: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
9270: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
9280: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
9290: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52  FindIndex(db, zR
92a0: 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ight, zDb);.    
92b0: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
92c0: 20 20 69 6e 74 20 69 49 64 78 44 62 20 3d 20 73    int iIdxDb = s
92d0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
92e0: 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70 53  dex(db, pIdx->pS
92f0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 69 6e  chema);.      in
9300: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d  t i;.      int m
9310: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  x;.      if( pPr
9320: 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20  agma->iArg ){.  
9330: 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
9340: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77  index_xinfo (new
9350: 65 72 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20  er version with 
9360: 6d 6f 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f  more rows and co
9370: 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20  lumns) */.      
9380: 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f    mx = pIdx->nCo
9390: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50  lumn;.        pP
93a0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a  arse->nMem = 6;.
93b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
93c0: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
93d0: 6e 64 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63  ndex_info (legac
93e0: 79 20 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20  y version) */.  
93f0: 20 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d        mx = pIdx-
9400: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
9410: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
9420: 20 33 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   3;.      }.    
9430: 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70    pTab = pIdx->p
9440: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c  Table;.      sql
9450: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
9460: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 49 64  hema(pParse, iId
9470: 78 44 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65  xDb);.      asse
9480: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  rt( pParse->nMem
9490: 3c 3d 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61 67  <=pPragma->nPrag
94a0: 43 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 66  CName );.      f
94b0: 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 3b 20 69 2b  or(i=0; i<mx; i+
94c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20  +){.        i16 
94d0: 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43  cnum = pIdx->aiC
94e0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
94f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9500: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69  tiLoad(v, 1, "ii
9510: 73 58 22 2c 20 69 2c 20 63 6e 75 6d 2c 0a 20 20  sX", i, cnum,.  
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 20 20 20 20 20 20 20 20 63 6e 75 6d 3c             cnum<
9540: 30 20 3f 20 30 20 3a 20 70 54 61 62 2d 3e 61 43  0 ? 0 : pTab->aC
9550: 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 29 3b  ol[cnum].zName);
9560: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
9570: 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20  agma->iArg ){.  
9580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9590: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
95a0: 34 2c 20 22 69 73 69 58 22 2c 0a 20 20 20 20 20  4, "isiX",.     
95b0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 6f         pIdx->aSo
95c0: 72 74 4f 72 64 65 72 5b 69 5d 2c 0a 20 20 20 20  rtOrder[i],.    
95d0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
95e0: 43 6f 6c 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20  Coll[i],.       
95f0: 20 20 20 20 20 69 3c 70 49 64 78 2d 3e 6e 4b 65       i<pIdx->nKe
9600: 79 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  yCol);.        }
9610: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9620: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9630: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 70  _ResultRow, 1, p
9640: 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
9650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9660: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65    break;..  case
9670: 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 4c   PragTyp_INDEX_L
9680: 49 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20  IST: if( zRight 
9690: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
96a0: 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
96b0: 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  Tab;.    int i;.
96c0: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
96d0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
96e0: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
96f0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
9700: 20 20 20 20 69 6e 74 20 69 54 61 62 44 62 20 3d      int iTabDb =
9710: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
9720: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
9730: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
9740: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35  pParse->nMem = 5
9750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
9760: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
9770: 70 50 61 72 73 65 2c 20 69 54 61 62 44 62 29 3b  pParse, iTabDb);
9780: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
9790: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 69 3d  pTab->pIndex, i=
97a0: 30 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  0; pIdx; pIdx=pI
97b0: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
97c0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
97d0: 68 61 72 20 2a 61 7a 4f 72 69 67 69 6e 5b 5d 20  har *azOrigin[] 
97e0: 3d 20 7b 20 22 63 22 2c 20 22 75 22 2c 20 22 70  = { "c", "u", "p
97f0: 6b 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 73 71  k" };.        sq
9800: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9810: 61 64 28 76 2c 20 31 2c 20 22 69 73 69 73 69 22  ad(v, 1, "isisi"
9820: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a  ,.           i,.
9830: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9840: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
9850: 20 20 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78     IsUniqueIndex
9860: 28 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20  (pIdx),.        
9870: 20 20 20 61 7a 4f 72 69 67 69 6e 5b 70 49 64 78     azOrigin[pIdx
9880: 2d 3e 69 64 78 54 79 70 65 5d 2c 0a 20 20 20 20  ->idxType],.    
9890: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 50 61         pIdx->pPa
98a0: 72 74 49 64 78 57 68 65 72 65 21 3d 30 29 3b 0a  rtIdxWhere!=0);.
98b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
98c0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61  }.  break;..  ca
98d0: 73 65 20 50 72 61 67 54 79 70 5f 44 41 54 41 42  se PragTyp_DATAB
98e0: 41 53 45 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20  ASE_LIST: {.    
98f0: 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73  int i;.    pPars
9900: 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20  e->nMem = 3;.   
9910: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
9920: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
9930: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
9940: 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  pBt==0 ) continu
9950: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
9960: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53   db->aDb[i].zDbS
9970: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  Name!=0 );.     
9980: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9990: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 73  iLoad(v, 1, "iss
99a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 69 2c 0a 20  ",.         i,. 
99b0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
99c0: 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 0a 20 20 20  i].zDbSName,.   
99d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
99e0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
99f0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a  ->aDb[i].pBt));.
9a00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9a10: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
9a20: 79 70 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53  yp_COLLATION_LIS
9a30: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  T: {.    int i =
9a40: 20 30 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d   0;.    HashElem
9a50: 20 2a 70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   *p;.    pParse-
9a60: 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66  >nMem = 2;.    f
9a70: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
9a80: 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  irst(&db->aCollS
9a90: 65 71 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  eq); p; p=sqlite
9aa0: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
9ab0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9ac0: 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29  ll = (CollSeq *)
9ad0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
9ae0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9af0: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9b00: 20 31 2c 20 22 69 73 22 2c 20 69 2b 2b 2c 20 70   1, "is", i++, p
9b10: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
9b20: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9b30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9b40: 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52  INTROSPECTION_PR
9b50: 41 47 4d 41 53 0a 20 20 63 61 73 65 20 50 72 61  AGMAS.  case Pra
9b60: 67 54 79 70 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49  gTyp_FUNCTION_LI
9b70: 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ST: {.    int i;
9b80: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a  .    HashElem *j
9b90: 3b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  ;.    FuncDef *p
9ba0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
9bb0: 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28  em = 2;.    for(
9bc0: 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 46 55  i=0; i<SQLITE_FU
9bd0: 4e 43 5f 48 41 53 48 5f 53 5a 3b 20 69 2b 2b 29  NC_HASH_SZ; i++)
9be0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71  {.      for(p=sq
9bf0: 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63  lite3BuiltinFunc
9c00: 74 69 6f 6e 73 2e 61 5b 69 5d 3b 20 70 3b 20 70  tions.a[i]; p; p
9c10: 3d 70 2d 3e 75 2e 70 48 61 73 68 20 29 7b 0a 20  =p->u.pHash ){. 
9c20: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 75         if( p->fu
9c30: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
9c40: 5f 46 55 4e 43 5f 49 4e 54 45 52 4e 41 4c 20 29  _FUNC_INTERNAL )
9c50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9c60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9c70: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
9c80: 69 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 31 29  i", p->zName, 1)
9c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ca0: 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74 65      for(j=sqlite
9cb0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9cc0: 46 75 6e 63 29 3b 20 6a 3b 20 6a 3d 73 71 6c 69  Func); j; j=sqli
9cd0: 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b 0a  teHashNext(j)){.
9ce0: 20 20 20 20 20 20 70 20 3d 20 28 46 75 6e 63 44        p = (FuncD
9cf0: 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  ef*)sqliteHashDa
9d00: 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ta(j);.      sql
9d10: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9d20: 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70 2d  d(v, 1, "si", p-
9d30: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
9d40: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
9d50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9d60: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
9d70: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9d80: 4d 4f 44 55 4c 45 5f 4c 49 53 54 3a 20 7b 0a 20  MODULE_LIST: {. 
9d90: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a     HashElem *j;.
9da0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9db0: 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 1;.    for(j=
9dc0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9dd0: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 6a  &db->aModule); j
9de0: 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; j=sqliteHashNe
9df0: 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 4d 6f  xt(j)){.      Mo
9e00: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
9e10: 64 75 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  dule*)sqliteHash
9e20: 44 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73  Data(j);.      s
9e30: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9e40: 6f 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20 70  oad(v, 1, "s", p
9e50: 4d 6f 64 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Mod->zName);.   
9e60: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9e70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9e80: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
9e90: 4c 45 20 2a 2f 0a 0a 20 20 63 61 73 65 20 50 72  LE */..  case Pr
9ea0: 61 67 54 79 70 5f 50 52 41 47 4d 41 5f 4c 49 53  agTyp_PRAGMA_LIS
9eb0: 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  T: {.    int i;.
9ec0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
9ed0: 72 72 61 79 53 69 7a 65 28 61 50 72 61 67 6d 61  rraySize(aPragma
9ee0: 4e 61 6d 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Name); i++){.   
9ef0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9f00: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73  ltiLoad(v, 1, "s
9f10: 22 2c 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 69  ", aPragmaName[i
9f20: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
9f30: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
9f40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e  dif /* SQLITE_IN
9f50: 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41 47  TROSPECTION_PRAG
9f60: 4d 41 53 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  MAS */..#endif /
9f70: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  * SQLITE_OMIT_SC
9f80: 48 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  HEMA_PRAGMAS */.
9f90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9fa0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
9fb0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9fc0: 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54  FOREIGN_KEY_LIST
9fd0: 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a  : if( zRight ){.
9fe0: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20      FKey *pFK;. 
9ff0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
a000: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
a010: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
a020: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
a030: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
a040: 20 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e      pFK = pTab->
a050: 70 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28  pFKey;.      if(
a060: 20 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20   pFK ){.        
a070: 69 6e 74 20 69 54 61 62 44 62 20 3d 20 73 71 6c  int iTabDb = sql
a080: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
a090: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
a0a0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  ema);.        in
a0b0: 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  t i = 0; .      
a0c0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
a0d0: 20 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   8;.        sqli
a0e0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
a0f0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61 62  ema(pParse, iTab
a100: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  Db);.        whi
a110: 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20  le(pFK){.       
a120: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
a130: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
a140: 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  FK->nCol; j++){.
a150: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a160: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
a170: 28 76 2c 20 31 2c 20 22 69 69 73 73 73 73 73 73  (v, 1, "iissssss
a180: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a190: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 0a 20              j,. 
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20    pFK->zTo,.    
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
a1e0: 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61  Tab->aCol[pFK->a
a1f0: 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e  Col[j].iFrom].zN
a200: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
a210: 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f          pFK->aCo
a220: 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20  l[j].zCol,.     
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
a240: 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41  tionName(pFK->aA
a250: 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f  ction[1]),  /* O
a260: 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20  N UPDATE */.    
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
a280: 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61  ctionName(pFK->a
a290: 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20  Action[0]),  /* 
a2a0: 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20  ON DELETE */.   
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20 20  "NONE");.       
a2d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2b     }.          +
a2e0: 2b 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  +i;.          pF
a2f0: 4b 20 3d 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72  K = pFK->pNextFr
a300: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  om;.        }.  
a310: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a320: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
a330: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
a340: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
a350: 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  KEY) */..#ifndef
a360: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
a370: 45 49 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66  EIGN_KEY.#ifndef
a380: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
a390: 47 47 45 52 0a 20 20 63 61 73 65 20 50 72 61 67  GGER.  case Prag
a3a0: 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f  Typ_FOREIGN_KEY_
a3b0: 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65  CHECK: {.    FKe
a3c0: 79 20 2a 70 46 4b 3b 20 20 20 20 20 20 20 20 20  y *pFK;         
a3d0: 20 20 20 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e      /* A foreign
a3e0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
a3f0: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
a400: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
a410: 20 43 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e   Child table con
a420: 74 61 69 6e 20 22 52 45 46 45 52 45 4e 43 45 53  tain "REFERENCES
a430: 22 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20  " keyword */.   
a440: 20 54 61 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b   Table *pParent;
a450: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
a460: 74 20 74 61 62 6c 65 20 74 68 61 74 20 63 68 69  t table that chi
a470: 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  ld points to */.
a480: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
a490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a4a0: 64 65 78 20 69 6e 20 74 68 65 20 70 61 72 65 6e  dex in the paren
a4b0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  t table */.    i
a4c0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
a4d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a4e0: 75 6e 74 65 72 3a 20 20 46 6f 72 65 69 67 6e 20  unter:  Foreign 
a4f0: 6b 65 79 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  key number for p
a500: 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  Tab */.    int j
a510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a520: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a530: 72 3a 20 20 46 69 65 6c 64 20 6f 66 20 74 68 65  r:  Field of the
a540: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a   foreign key */.
a550: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b      HashElem *k;
a560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a570: 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78  op counter:  Nex
a580: 74 20 74 61 62 6c 65 20 69 6e 20 73 63 68 65 6d  t table in schem
a590: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20  a */.    int x; 
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 2f 2a 20 72 65 73 75 6c 74 20 76 61 72 69 61 62  /* result variab
a5c0: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  le */.    int re
a5d0: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
a5e0: 20 2f 2a 20 33 20 72 65 67 69 73 74 65 72 73 20   /* 3 registers 
a5f0: 74 6f 20 68 6f 6c 64 20 61 20 72 65 73 75 6c 74  to hold a result
a600: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
a610: 72 65 67 4b 65 79 3b 20 20 20 20 20 20 20 20 20  regKey;         
a620: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
a630: 6f 20 68 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63  o hold key for c
a640: 68 65 63 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a  hecking the FK *
a650: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
a660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a670: 52 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  Registers to hol
a680: 64 20 61 20 72 6f 77 20 66 72 6f 6d 20 70 54 61  d a row from pTa
a690: 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  b */.    int add
a6a0: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
a6b0: 2f 2a 20 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70  /* Top of a loop
a6c0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 65 69 67   checking foreig
a6d0: 6e 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e  n keys */.    in
a6e0: 74 20 61 64 64 72 4f 6b 3b 20 20 20 20 20 20 20  t addrOk;       
a6f0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
a700: 65 20 69 66 20 74 68 65 20 6b 65 79 20 69 73 20  e if the key is 
a710: 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61  OK */.    int *a
a720: 69 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  iCols;          
a730: 20 2f 2a 20 63 68 69 6c 64 20 74 6f 20 70 61 72   /* child to par
a740: 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69  ent column mappi
a750: 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65  ng */..    regRe
a760: 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
a770: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
a780: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20  e->nMem += 4;.  
a790: 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61    regKey = ++pPa
a7a0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
a7b0: 65 67 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  egRow = ++pParse
a7c0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 6b 20 3d 20  ->nMem;.    k = 
a7d0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
a7e0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
a7f0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
a800: 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 20 29 7b  .    while( k ){
a810: 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 44  .      int iTabD
a820: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  b;.      if( zRi
a830: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ght ){.        p
a840: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
a850: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
a860: 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29   0, zRight, zDb)
a870: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b  ;.        k = 0;
a880: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a890: 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
a8a0: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
a8b0: 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20  ata(k);.        
a8c0: 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65  k = sqliteHashNe
a8d0: 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xt(k);.      }. 
a8e0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
a8f0: 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d   || pTab->pFKey=
a900: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
a910: 20 20 20 20 20 69 54 61 62 44 62 20 3d 20 73 71       iTabDb = sq
a920: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
a930: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
a940: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
a950: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
a960: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 54 61  hema(pParse, iTa
a970: 62 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bDb);.      sqli
a980: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
a990: 72 73 65 2c 20 69 54 61 62 44 62 2c 20 70 54 61  rse, iTabDb, pTa
a9a0: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
a9b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
a9c0: 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 72  if( pTab->nCol+r
a9d0: 65 67 52 6f 77 3e 70 50 61 72 73 65 2d 3e 6e 4d  egRow>pParse->nM
a9e0: 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em ) pParse->nMe
a9f0: 6d 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b  m = pTab->nCol +
aa00: 20 72 65 67 52 6f 77 3b 0a 20 20 20 20 20 20 73   regRow;.      s
aa10: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
aa20: 70 50 61 72 73 65 2c 20 30 2c 20 69 54 61 62 44  pParse, 0, iTabD
aa30: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
aa40: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  Read);.      sql
aa50: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
aa60: 6e 67 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2c  ng(v, regResult,
aa70: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
aa80: 20 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46       for(i=1, pF
aa90: 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70  K=pTab->pFKey; p
aaa0: 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b  FK; i++, pFK=pFK
aab0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
aac0: 20 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20        pParent = 
aad0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
aae0: 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a  (db, pFK->zTo, z
aaf0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Db);.        if(
ab00: 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 63 6f   pParent==0 ) co
ab10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
ab20: 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  pIdx = 0;.      
ab30: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
ab40: 63 6b 28 70 50 61 72 73 65 2c 20 69 54 61 62 44  ck(pParse, iTabD
ab50: 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75 6d  b, pParent->tnum
ab60: 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a 4e  , 0, pParent->zN
ab70: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20  ame);.        x 
ab80: 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74  = sqlite3FkLocat
ab90: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
aba0: 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49  Parent, pFK, &pI
abb0: 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  dx, 0);.        
abc0: 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20  if( x==0 ){.    
abd0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d        if( pIdx==
abe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
abf0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
ac00: 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 54 61  e(pParse, i, iTa
ac10: 62 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50  bDb, pParent, OP
ac20: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
ac30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ac40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ac50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ac60: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49  _OpenRead, i, pI
ac70: 64 78 2d 3e 74 6e 75 6d 2c 20 69 54 61 62 44 62  dx->tnum, iTabDb
ac80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
ac90: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
aca0: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
acb0: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
acc0: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
acd0: 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30  .          k = 0
ace0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
acf0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
ad00: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
ad10: 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  t( pParse->nErr>
ad20: 30 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b 0a 20  0 || pFK==0 );. 
ad30: 20 20 20 20 20 69 66 28 20 70 46 4b 20 29 20 62       if( pFK ) b
ad40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
ad50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29  pParse->nTab<i )
ad60: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
ad70: 69 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  i;.      addrTop
ad80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ad90: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
ada0: 64 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  d, 0); VdbeCover
adb0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  age(v);.      fo
adc0: 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d  r(i=1, pFK=pTab-
add0: 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b  >pFKey; pFK; i++
ade0: 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74  , pFK=pFK->pNext
adf0: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70  From){.        p
ae00: 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  Parent = sqlite3
ae10: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46  FindTable(db, pF
ae20: 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20  K->zTo, zDb);.  
ae30: 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a        pIdx = 0;.
ae40: 20 20 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3d          aiCols =
ae50: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
ae60: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20  pParent ){.     
ae70: 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
ae80: 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50  FkLocateIndex(pP
ae90: 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  arse, pParent, p
aea0: 46 4b 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f  FK, &pIdx, &aiCo
aeb0: 6c 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ls);.          a
aec0: 73 73 65 72 74 28 20 78 3d 3d 30 20 29 3b 0a 20  ssert( x==0 );. 
aed0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
aee0: 20 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65   addrOk = sqlite
aef0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
af00: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 20  Parse);..       
af10: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
af20: 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 63 68  e to read the ch
af30: 69 6c 64 20 6b 65 79 20 76 61 6c 75 65 73 20 69  ild key values i
af40: 6e 74 6f 20 72 65 67 69 73 74 65 72 73 0a 20 20  nto registers.  
af50: 20 20 20 20 20 20 2a 2a 20 72 65 67 52 6f 77 2e        ** regRow.
af60: 2e 72 65 67 52 6f 77 2b 6e 2e 20 49 66 20 61 6e  .regRow+n. If an
af70: 79 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6b  y of the child k
af80: 65 79 20 76 61 6c 75 65 73 20 61 72 65 20 4e 55  ey values are NU
af90: 4c 4c 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  LL, this .      
afa0: 20 20 2a 2a 20 72 6f 77 20 63 61 6e 6e 6f 74 20    ** row cannot 
afb0: 63 61 75 73 65 20 61 6e 20 46 4b 20 76 69 6f 6c  cause an FK viol
afc0: 61 74 69 6f 6e 2e 20 4a 75 6d 70 20 64 69 72 65  ation. Jump dire
afd0: 63 74 6c 79 20 74 6f 20 61 64 64 72 4f 6b 20 69  ctly to addrOk i
afe0: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  n .        ** th
aff0: 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  is case. */.    
b000: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
b010: 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  FK->nCol; j++){.
b020: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
b030: 6f 6c 20 3d 20 61 69 43 6f 6c 73 20 3f 20 61 69  ol = aiCols ? ai
b040: 43 6f 6c 73 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61  Cols[j] : pFK->a
b050: 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 3b 0a 20 20  Col[j].iFrom;.  
b060: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b070: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
b080: 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
b090: 20 30 2c 20 69 43 6f 6c 2c 20 72 65 67 52 6f 77   0, iCol, regRow
b0a0: 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  +j);.          s
b0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b0c0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
b0d0: 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f 6b 29  egRow+j, addrOk)
b0e0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b0f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
b100: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
b110: 65 20 63 6f 64 65 20 74 6f 20 71 75 65 72 79 20  e code to query 
b120: 74 68 65 20 70 61 72 65 6e 74 20 69 6e 64 65 78  the parent index
b130: 20 66 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20   for a matching 
b140: 70 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  parent.        *
b150: 2a 20 6b 65 79 2e 20 49 66 20 61 20 6d 61 74 63  * key. If a matc
b160: 68 20 69 73 20 66 6f 75 6e 64 2c 20 6a 75 6d 70  h is found, jump
b170: 20 74 6f 20 61 64 64 72 4f 6b 2e 20 2a 2f 0a 20   to addrOk. */. 
b180: 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20         if( pIdx 
b190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
b1b0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b1c0: 20 72 65 67 52 6f 77 2c 20 70 46 4b 2d 3e 6e 43   regRow, pFK->nC
b1d0: 6f 6c 2c 20 72 65 67 4b 65 79 2c 0a 20 20 20 20  ol, regKey,.    
b1e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b1f0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
b200: 72 28 64 62 2c 70 49 64 78 29 2c 20 70 46 4b 2d  r(db,pIdx), pFK-
b210: 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  >nCol);.        
b220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b230: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
b240: 6e 64 2c 20 69 2c 20 61 64 64 72 4f 6b 2c 20 72  nd, i, addrOk, r
b250: 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  egKey, 0);.     
b260: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b270: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  e(v);.        }e
b280: 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 20  lse if( pParent 
b290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
b2a0: 20 6a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64   jmp = sqlite3Vd
b2b0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b2c0: 2b 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +2;.          sq
b2d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b2e0: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
b2f0: 20 69 2c 20 6a 6d 70 2c 20 72 65 67 52 6f 77 29   i, jmp, regRow)
b300: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
b320: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
b330: 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20  addrOk);.       
b340: 20 20 20 61 73 73 65 72 74 28 20 70 46 4b 2d 3e     assert( pFK->
b350: 6e 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nCol==1 );.     
b360: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
b370: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b380: 6f 20 72 65 70 6f 72 74 20 61 6e 20 46 4b 20 76  o report an FK v
b390: 69 6f 6c 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  iolation to the 
b3a0: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20  caller. */.     
b3b0: 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
b3c0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
b3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b3e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
b3f0: 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31  , 0, regResult+1
b400: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b410: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
b420: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b430: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
b440: 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20  Result+1);.     
b450: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
b460: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
b470: 64 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2b 32  d(v, regResult+2
b480: 2c 20 22 73 69 58 22 2c 20 70 46 4b 2d 3e 7a 54  , "siX", pFK->zT
b490: 6f 2c 20 69 2d 31 29 3b 0a 20 20 20 20 20 20 20  o, i-1);.       
b4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b4b0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
b4c0: 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 34  ow, regResult, 4
b4d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b4e0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
b4f0: 65 6c 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20  el(v, addrOk);. 
b500: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
b510: 46 72 65 65 28 64 62 2c 20 61 69 43 6f 6c 73 29  Free(db, aiCols)
b520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b540: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c  2(v, OP_Next, 0,
b550: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
b560: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b580: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
b590: 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  op);.    }.  }. 
b5a0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
b5b0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
b5c0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
b5d0: 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  */.#endif /* !de
b5e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b5f0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
b600: 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  /..#ifndef NDEBU
b610: 47 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  G.  case PragTyp
b620: 5f 50 41 52 53 45 52 5f 54 52 41 43 45 3a 20 7b  _PARSER_TRACE: {
b630: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
b640: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
b650: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
b660: 52 69 67 68 74 2c 20 30 29 20 29 7b 0a 20 20 20  Right, 0) ){.   
b670: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 72 73       sqlite3Pars
b680: 65 72 54 72 61 63 65 28 73 74 64 6f 75 74 2c 20  erTrace(stdout, 
b690: 22 70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20  "parser: ");.   
b6a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b6b0: 20 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 54    sqlite3ParserT
b6c0: 72 61 63 65 28 30 2c 20 30 29 3b 0a 20 20 20 20  race(0, 0);.    
b6d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b6e0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20  break;.#endif.. 
b6f0: 20 2f 2a 20 52 65 69 6e 73 74 61 6c 6c 20 74 68   /* Reinstall th
b700: 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20  e LIKE and GLOB 
b710: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65 20  functions.  The 
b720: 76 61 72 69 61 6e 74 20 6f 66 20 4c 49 4b 45 0a  variant of LIKE.
b730: 20 20 2a 2a 20 75 73 65 64 20 77 69 6c 6c 20 62    ** used will b
b740: 65 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65  e case sensitive
b750: 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e   or not dependin
b760: 67 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a 20 20  g on the RHS..  
b770: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
b780: 70 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45  p_CASE_SENSITIVE
b790: 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20 20 69 66 28  _LIKE: {.    if(
b7a0: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
b7b0: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
b7c0: 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 64 62  LikeFunctions(db
b7d0: 2c 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  , sqlite3GetBool
b7e0: 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 29 3b  ean(zRight, 0));
b7f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
b800: 61 6b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ak;..#ifndef SQL
b810: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
b820: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 0a 23 20  ECK_ERROR_MAX.# 
b830: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e  define SQLITE_IN
b840: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52  TEGRITY_CHECK_ER
b850: 52 4f 52 5f 4d 41 58 20 31 30 30 0a 23 65 6e 64  ROR_MAX 100.#end
b860: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
b870: 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
b880: 59 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 20 20 20  Y_CHECK.  /*    
b890: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
b8a0: 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 20 20 20 50  _check.  **    P
b8b0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
b8c0: 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a 20 20 20  check(N).  **   
b8d0: 20 50 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68   PRAGMA quick_ch
b8e0: 65 63 6b 0a 20 20 2a 2a 20 20 20 20 50 52 41 47  eck.  **    PRAG
b8f0: 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 28 4e  MA quick_check(N
b900: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 65 72 69  ).  **.  ** Veri
b910: 66 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  fy the integrity
b920: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
b930: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
b940: 22 71 75 69 63 6b 5f 63 68 65 63 6b 22 20 69 73  "quick_check" is
b950: 20 72 65 64 75 63 65 64 20 76 65 72 73 69 6f 6e   reduced version
b960: 20 6f 66 20 0a 20 20 2a 2a 20 69 6e 74 65 67 72   of .  ** integr
b970: 69 74 79 5f 63 68 65 63 6b 20 64 65 73 69 67 6e  ity_check design
b980: 65 64 20 74 6f 20 64 65 74 65 63 74 20 6d 6f 73  ed to detect mos
b990: 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  t database corru
b9a0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 6f  ption.  ** witho
b9b0: 75 74 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  ut the overhead 
b9c0: 6f 66 20 63 72 6f 73 73 2d 63 68 65 63 6b 69 6e  of cross-checkin
b9d0: 67 20 69 6e 64 65 78 65 73 2e 20 20 51 75 69 63  g indexes.  Quic
b9e0: 6b 5f 63 68 65 63 6b 0a 20 20 2a 2a 20 69 73 20  k_check.  ** is 
b9f0: 6c 69 6e 65 61 72 20 74 69 6d 65 20 77 68 65 72  linear time wher
ba00: 65 61 73 65 20 69 6e 74 65 67 72 69 74 79 5f 63  ease integrity_c
ba10: 68 65 63 6b 20 69 73 20 4f 28 4e 6c 6f 67 4e 29  heck is O(NlogN)
ba20: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
ba30: 61 67 54 79 70 5f 49 4e 54 45 47 52 49 54 59 5f  agTyp_INTEGRITY_
ba40: 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20 69 6e 74  CHECK: {.    int
ba50: 20 69 2c 20 6a 2c 20 61 64 64 72 2c 20 6d 78 45   i, j, addr, mxE
ba60: 72 72 3b 0a 0a 20 20 20 20 69 6e 74 20 69 73 51  rr;..    int isQ
ba70: 75 69 63 6b 20 3d 20 28 73 71 6c 69 74 65 33 54  uick = (sqlite3T
ba80: 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29  olower(zLeft[0])
ba90: 3d 3d 27 71 27 29 3b 0a 0a 20 20 20 20 2f 2a 20  =='q');..    /* 
baa0: 49 66 20 74 68 65 20 50 52 41 47 4d 41 20 63 6f  If the PRAGMA co
bab0: 6d 6d 61 6e 64 20 77 61 73 20 6f 66 20 74 68 65  mmand was of the
bac0: 20 66 6f 72 6d 20 22 50 52 41 47 4d 41 20 3c 64   form "PRAGMA <d
bad0: 62 3e 2e 69 6e 74 65 67 72 69 74 79 5f 63 68 65  b>.integrity_che
bae0: 63 6b 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  ck",.    ** then
baf0: 20 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 74   iDb is set to t
bb00: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
bb10: 64 61 74 61 62 61 73 65 20 69 64 65 6e 74 69 66  database identif
bb20: 69 65 64 20 62 79 20 3c 64 62 3e 2e 0a 20 20 20  ied by <db>..   
bb30: 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
bb40: 2c 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  , the integrity 
bb50: 6f 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20  of database iDb 
bb60: 6f 6e 6c 79 20 69 73 20 76 65 72 69 66 69 65 64  only is verified
bb70: 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 56   by.    ** the V
bb80: 44 42 45 20 63 72 65 61 74 65 64 20 62 65 6c 6f  DBE created belo
bb90: 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
bba0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
bbb0: 68 65 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 73  he command was s
bbc0: 69 6d 70 6c 79 20 22 50 52 41 47 4d 41 20 69 6e  imply "PRAGMA in
bbd0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 20 28  tegrity_check" (
bbe0: 6f 72 0a 20 20 20 20 2a 2a 20 22 50 52 41 47 4d  or.    ** "PRAGM
bbf0: 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 22 29 2c  A quick_check"),
bc00: 20 74 68 65 6e 20 69 44 62 20 69 73 20 73 65 74   then iDb is set
bc10: 20 74 6f 20 30 2e 20 49 6e 20 74 68 69 73 20 63   to 0. In this c
bc20: 61 73 65 2c 20 73 65 74 20 69 44 62 0a 20 20 20  ase, set iDb.   
bc30: 20 2a 2a 20 74 6f 20 2d 31 20 68 65 72 65 2c 20   ** to -1 here, 
bc40: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
bc50: 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
bc60: 20 76 65 72 69 66 79 20 74 68 65 20 69 6e 74 65   verify the inte
bc70: 67 72 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20  grity.    ** of 
bc80: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
bc90: 61 62 61 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20  abases.  */.    
bca0: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29  assert( iDb>=0 )
bcb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
bcc0: 62 3d 3d 30 20 7c 7c 20 70 49 64 32 2d 3e 7a 20  b==0 || pId2->z 
bcd0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d  );.    if( pId2-
bce0: 3e 7a 3d 3d 30 20 29 20 69 44 62 20 3d 20 2d 31  >z==0 ) iDb = -1
bcf0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ;..    /* Initia
bd00: 6c 69 7a 65 20 74 68 65 20 56 44 42 45 20 70 72  lize the VDBE pr
bd10: 6f 67 72 61 6d 20 2a 2f 0a 20 20 20 20 70 50 61  ogram */.    pPa
bd20: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 0a  rse->nMem = 6;..
bd30: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d      /* Set the m
bd40: 61 78 69 6d 75 6d 20 65 72 72 6f 72 20 63 6f 75  aximum error cou
bd50: 6e 74 20 2a 2f 0a 20 20 20 20 6d 78 45 72 72 20  nt */.    mxErr 
bd60: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49  = SQLITE_INTEGRI
bd70: 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d  TY_CHECK_ERROR_M
bd80: 41 58 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  AX;.    if( zRig
bd90: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
bda0: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67  te3GetInt32(zRig
bdb0: 68 74 2c 20 26 6d 78 45 72 72 29 3b 0a 20 20 20  ht, &mxErr);.   
bdc0: 20 20 20 69 66 28 20 6d 78 45 72 72 3c 3d 30 20     if( mxErr<=0 
bdd0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 45 72 72  ){.        mxErr
bde0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52   = SQLITE_INTEGR
bdf0: 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f  ITY_CHECK_ERROR_
be00: 4d 41 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MAX;.      }.   
be10: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
be20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
be30: 6e 74 65 67 65 72 2c 20 6d 78 45 72 72 2d 31 2c  nteger, mxErr-1,
be40: 20 31 29 3b 20 2f 2a 20 72 65 67 5b 31 5d 20 68   1); /* reg[1] h
be50: 6f 6c 64 73 20 65 72 72 6f 72 73 20 6c 65 66 74  olds errors left
be60: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 61   */..    /* Do a
be70: 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  n integrity chec
be80: 6b 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61  k on each databa
be90: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 66  se file */.    f
bea0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
beb0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 48  b; i++){.      H
bec0: 61 73 68 45 6c 65 6d 20 2a 78 3b 20 20 20 20 20  ashElem *x;     
bed0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
bee0: 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ver tables in th
bef0: 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20  e schema */.    
bf00: 20 20 48 61 73 68 20 2a 70 54 62 6c 73 3b 20 20    Hash *pTbls;  
bf10: 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 61 6c 6c     /* Set of all
bf20: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73   tables in the s
bf30: 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 20 20 69  chema */.      i
bf40: 6e 74 20 2a 61 52 6f 6f 74 3b 20 20 20 20 20 20  nt *aRoot;      
bf50: 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6f 74  /* Array of root
bf60: 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6f 66   page numbers of
bf70: 20 61 6c 6c 20 62 74 72 65 65 73 20 2a 2f 0a 20   all btrees */. 
bf80: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30       int cnt = 0
bf90: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
bfa0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52  of entries in aR
bfb0: 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 69  oot[] */.      i
bfc0: 6e 74 20 6d 78 49 64 78 20 3d 20 30 3b 20 20 20  nt mxIdx = 0;   
bfd0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
bfe0: 72 20 6f 66 20 69 6e 64 65 78 65 73 20 66 6f 72  r of indexes for
bff0: 20 61 6e 79 20 74 61 62 6c 65 20 2a 2f 0a 0a 20   any table */.. 
c000: 20 20 20 20 20 69 66 28 20 4f 4d 49 54 5f 54 45       if( OMIT_TE
c010: 4d 50 44 42 20 26 26 20 69 3d 3d 31 20 29 20 63  MPDB && i==1 ) c
c020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
c030: 66 28 20 69 44 62 3e 3d 30 20 26 26 20 69 21 3d  f( iDb>=0 && i!=
c040: 69 44 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  iDb ) continue;.
c050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
c060: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
c070: 50 61 72 73 65 2c 20 69 29 3b 0a 0a 20 20 20 20  Parse, i);..    
c080: 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67    /* Do an integ
c090: 72 69 74 79 20 63 68 65 63 6b 20 6f 66 20 74 68  rity check of th
c0a0: 65 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 2a  e B-Tree.      *
c0b0: 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 67 69 6e  *.      ** Begin
c0c0: 20 62 79 20 66 69 6e 64 69 6e 67 20 74 68 65 20   by finding the 
c0d0: 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65  root pages numbe
c0e0: 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  rs.      ** for 
c0f0: 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
c100: 6e 64 69 63 65 73 20 69 6e 20 74 68 65 20 64 61  ndices in the da
c110: 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
c120: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
c130: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
c140: 78 48 65 6c 64 28 64 62 2c 20 69 2c 20 30 29 20  xHeld(db, i, 0) 
c150: 29 3b 0a 20 20 20 20 20 20 70 54 62 6c 73 20 3d  );.      pTbls =
c160: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63   &db->aDb[i].pSc
c170: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
c180: 20 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20       for(cnt=0, 
c190: 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  x=sqliteHashFirs
c1a0: 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73  t(pTbls); x; x=s
c1b0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29  qliteHashNext(x)
c1c0: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
c1d0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
c1e0: 61 73 68 44 61 74 61 28 78 29 3b 20 20 2f 2a 20  ashData(x);  /* 
c1f0: 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
c200: 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
c210: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
c220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
c230: 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 20 2a   index on pTab *
c240: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 49  /.        int nI
c250: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
c260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c270: 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73  umber of indexes
c280: 20 6f 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   on pTab */.    
c290: 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
c2a0: 28 70 54 61 62 29 20 29 20 63 6e 74 2b 2b 3b 0a  (pTab) ) cnt++;.
c2b0: 20 20 20 20 20 20 20 20 66 6f 72 28 6e 49 64 78          for(nIdx
c2c0: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
c2d0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
c2e0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e  x=pIdx->pNext, n
c2f0: 49 64 78 2b 2b 29 7b 20 63 6e 74 2b 2b 3b 20 7d  Idx++){ cnt++; }
c300: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 64  .        if( nId
c310: 78 3e 6d 78 49 64 78 20 29 20 6d 78 49 64 78 20  x>mxIdx ) mxIdx 
c320: 3d 20 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = nIdx;.      }.
c330: 20 20 20 20 20 20 61 52 6f 6f 74 20 3d 20 73 71        aRoot = sq
c340: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c350: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
c360: 74 29 2a 28 63 6e 74 2b 31 29 29 3b 0a 20 20 20  t)*(cnt+1));.   
c370: 20 20 20 69 66 28 20 61 52 6f 6f 74 3d 3d 30 20     if( aRoot==0 
c380: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
c390: 6f 72 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69  or(cnt=0, x=sqli
c3a0: 74 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c  teHashFirst(pTbl
c3b0: 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48  s); x; x=sqliteH
c3c0: 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20  ashNext(x)){.   
c3d0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
c3e0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
c3f0: 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e  a(x);.        In
c400: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20  dex *pIdx;.     
c410: 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
c420: 70 54 61 62 29 20 29 20 61 52 6f 6f 74 5b 2b 2b  pTab) ) aRoot[++
c430: 63 6e 74 5d 20 3d 20 70 54 61 62 2d 3e 74 6e 75  cnt] = pTab->tnu
c440: 6d 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  m;.        for(p
c450: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
c460: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
c470: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
c480: 20 20 20 20 20 61 52 6f 6f 74 5b 2b 2b 63 6e 74       aRoot[++cnt
c490: 5d 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  ] = pIdx->tnum;.
c4a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c4b0: 7d 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b 30 5d  }.      aRoot[0]
c4c0: 20 3d 20 63 6e 74 3b 0a 0a 20 20 20 20 20 20 2f   = cnt;..      /
c4d0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 73 75 66 66  * Make sure suff
c4e0: 69 63 69 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  icient number of
c4f0: 20 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20   registers have 
c500: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
c510: 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  /.      pParse->
c520: 6e 4d 65 6d 20 3d 20 4d 41 58 28 20 70 50 61 72  nMem = MAX( pPar
c530: 73 65 2d 3e 6e 4d 65 6d 2c 20 38 2b 6d 78 49 64  se->nMem, 8+mxId
c540: 78 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  x );.      sqlit
c550: 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
c560: 63 68 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  che(pParse);..  
c570: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 62 2d      /* Do the b-
c580: 74 72 65 65 20 69 6e 74 65 67 72 69 74 79 20 63  tree integrity c
c590: 68 65 63 6b 73 20 2a 2f 0a 20 20 20 20 20 20 73  hecks */.      s
c5a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
c5b0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 72 69 74 79  (v, OP_Integrity
c5c0: 43 6b 2c 20 32 2c 20 63 6e 74 2c 20 31 2c 20 28  Ck, 2, cnt, 1, (
c5d0: 63 68 61 72 2a 29 61 52 6f 6f 74 2c 50 34 5f 49  char*)aRoot,P4_I
c5e0: 4e 54 41 52 52 41 59 29 3b 0a 20 20 20 20 20 20  NTARRAY);.      
c5f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
c600: 65 50 35 28 76 2c 20 28 75 38 29 69 29 3b 0a 20  eP5(v, (u8)i);. 
c610: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
c620: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c630: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32 29 3b 20   OP_IsNull, 2); 
c640: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
c650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c660: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
c670: 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c  tring8, 0, 3, 0,
c680: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
c690: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2a 2a  3MPrintf(db, "**
c6a0: 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 25 73  * in database %s
c6b0: 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e 61 44 62   ***\n", db->aDb
c6c0: 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 29 2c 0a 20  [i].zDbSName),. 
c6d0: 20 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d          P4_DYNAM
c6e0: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
c6f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c700: 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 33 2c  OP_Concat, 2, 3,
c710: 20 33 29 3b 0a 20 20 20 20 20 20 69 6e 74 65 67   3);.      integ
c720: 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52  rityCheckResultR
c730: 6f 77 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow(v);.      sql
c740: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c750: 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20 20 20  (v, addr);..    
c760: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
c770: 6c 6c 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  ll the indices a
c780: 72 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 63  re constructed c
c790: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20  orrectly..      
c7a0: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 78 3d 73  */.      for(x=s
c7b0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
c7c0: 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69  Tbls); x; x=sqli
c7d0: 74 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a  teHashNext(x)){.
c7e0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
c7f0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
c800: 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20  Data(x);.       
c810: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 2a 70   Index *pIdx, *p
c820: 50 6b 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65  Pk;.        Inde
c830: 78 20 2a 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  x *pPrior = 0;. 
c840: 20 20 20 20 20 20 20 69 6e 74 20 6c 6f 6f 70 54         int loopT
c850: 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  op;.        int 
c860: 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75  iDataCur, iIdxCu
c870: 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  r;.        int r
c880: 31 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 20 20 20  1 = -1;..       
c890: 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3c   if( pTab->tnum<
c8a0: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  1 ) continue;  /
c8b0: 2a 20 53 6b 69 70 20 56 49 45 57 73 20 6f 72 20  * Skip VIEWs or 
c8c0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 73 20 2a  VIRTUAL TABLEs *
c8d0: 2f 0a 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20  /.        pPk = 
c8e0: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 3f  HasRowid(pTab) ?
c8f0: 20 30 20 3a 20 73 71 6c 69 74 65 33 50 72 69 6d   0 : sqlite3Prim
c900: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
c910: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c920: 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e  e3OpenTableAndIn
c930: 64 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54  dices(pParse, pT
c940: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  ab, OP_OpenRead,
c950: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 20 20 20 31 2c 20 30 2c 20 26 69 44         1, 0, &iD
c980: 61 74 61 43 75 72 2c 20 26 69 49 64 78 43 75 72  ataCur, &iIdxCur
c990: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 72 65  );.        /* re
c9a0: 67 5b 37 5d 20 63 6f 75 6e 74 73 20 74 68 65 20  g[7] counts the 
c9b0: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
c9c0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
c9d0: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67 5b 38          ** reg[8
c9e0: 2b 69 5d 20 63 6f 75 6e 74 73 20 74 68 65 20 6e  +i] counts the n
c9f0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
ca00: 20 69 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64   in the i-th ind
ca10: 65 78 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ex .        */. 
ca20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ca30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
ca40: 6e 74 65 67 65 72 2c 20 30 2c 20 37 29 3b 0a 20  nteger, 0, 7);. 
ca50: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
ca60: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
ca70: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
ca80: 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b  dx->pNext, j++){
ca90: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
caa0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cab0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 38  OP_Integer, 0, 8
cac0: 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65 78 20 65 6e  +j); /* index en
cad0: 74 72 69 65 73 20 63 6f 75 6e 74 65 72 20 2a 2f  tries counter */
cae0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
caf0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
cb00: 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a  e->nMem>=8+j );.
cb10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
cb20: 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e  sqlite3NoTempsIn
cb30: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 31 2c 37  Range(pParse,1,7
cb40: 2b 6a 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73  +j) );.        s
cb50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cb60: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
cb70: 44 61 74 61 43 75 72 2c 20 30 29 3b 20 56 64 62  DataCur, 0); Vdb
cb80: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
cb90: 20 20 20 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20        loopTop = 
cba0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cbb0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
cbc0: 37 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  7, 1);.        i
cbd0: 66 28 20 21 69 73 51 75 69 63 6b 20 29 7b 0a 20  f( !isQuick ){. 
cbe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 6e 69           /* Sani
cbf0: 74 79 20 63 68 65 63 6b 20 6f 6e 20 72 65 63 6f  ty check on reco
cc00: 72 64 20 68 65 61 64 65 72 20 64 65 63 6f 64 69  rd header decodi
cc10: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
cc20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cc30: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
cc40: 69 44 61 74 61 43 75 72 2c 20 70 54 61 62 2d 3e  iDataCur, pTab->
cc50: 6e 43 6f 6c 2d 31 2c 20 33 29 3b 0a 20 20 20 20  nCol-1, 3);.    
cc60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cc70: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
cc80: 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
cc90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cca0: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
ccb0: 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f   all NOT NULL co
ccc0: 6c 75 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72 65  lumns really are
ccd0: 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20   NOT NULL */.   
cce0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
ccf0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
cd00: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
cd10: 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20   *zErr;.        
cd20: 20 20 69 6e 74 20 6a 6d 70 32 3b 0a 20 20 20 20    int jmp2;.    
cd30: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
cd40: 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69  b->iPKey ) conti
cd50: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
cd60: 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  f( pTab->aCol[j]
cd70: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f  .notNull==0 ) co
cd80: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
cd90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
cda0: 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
cdb0: 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61  e(v, pTab, iData
cdc0: 43 75 72 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20  Cur, j, 3);.    
cdd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cde0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
cdf0: 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
ce00: 20 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d            jmp2 =
ce10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ce20: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
ce30: 2c 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 3); VdbeCovera
ce40: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
ce50: 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d   zErr = sqlite3M
ce60: 50 72 69 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c  Printf(db, "NULL
ce70: 20 76 61 6c 75 65 20 69 6e 20 25 73 2e 25 73 22   value in %s.%s"
ce80: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pTab->zName,. 
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
ceb0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
cec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ced0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
cee0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
cef0: 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f   3, 0, zErr, P4_
cf00: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
cf10: 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65      integrityChe
cf20: 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 29 3b 0a  ckResultRow(v);.
cf30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cf40: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
cf50: 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20   jmp2);.        
cf60: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72  }.        /* Ver
cf70: 69 66 79 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  ify CHECK constr
cf80: 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
cf90: 20 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63   if( pTab->pChec
cfa0: 6b 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  k && (db->flags 
cfb0: 26 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43  & SQLITE_IgnoreC
cfc0: 68 65 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20  hecks)==0 ){.   
cfd0: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
cfe0: 2a 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  *pCheck = sqlite
cff0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
d000: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 30   pTab->pCheck, 0
d010: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
d020: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d030: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
d040: 20 20 20 20 69 6e 74 20 61 64 64 72 43 6b 46 61      int addrCkFa
d050: 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ult = sqlite3Vdb
d060: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
d070: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
d080: 69 6e 74 20 61 64 64 72 43 6b 4f 6b 20 3d 20 73  int addrCkOk = s
d090: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d0a0: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
d0b0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
d0c0: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Err;.           
d0d0: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
d0e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
d0f0: 66 54 61 62 20 3d 20 69 44 61 74 61 43 75 72 20  fTab = iDataCur 
d100: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  + 1;.           
d110: 20 66 6f 72 28 6b 3d 70 43 68 65 63 6b 2d 3e 6e   for(k=pCheck->n
d120: 45 78 70 72 2d 31 3b 20 6b 3e 30 3b 20 6b 2d 2d  Expr-1; k>0; k--
d130: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d140: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
d150: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 68 65  lse(pParse, pChe
d160: 63 6b 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 2c 20  ck->a[k].pExpr, 
d170: 61 64 64 72 43 6b 46 61 75 6c 74 2c 20 30 29 3b  addrCkFault, 0);
d180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d190: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d1a0: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
d1b0: 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 30  rse, pCheck->a[0
d1c0: 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b 4f  ].pExpr, addrCkO
d1d0: 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  k, .            
d1e0: 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49      SQLITE_JUMPI
d1f0: 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
d200: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d210: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
d220: 64 64 72 43 6b 46 61 75 6c 74 29 3b 0a 20 20 20  ddrCkFault);.   
d230: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
d240: 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20  >iSelfTab = 0;. 
d250: 20 20 20 20 20 20 20 20 20 20 20 7a 45 72 72 20             zErr 
d260: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d270: 28 64 62 2c 20 22 43 48 45 43 4b 20 63 6f 6e 73  (db, "CHECK cons
d280: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 20 69 6e  traint failed in
d290: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
d2a0: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
d2b0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
d2c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d2d0: 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
d2e0: 20 30 2c 20 33 2c 20 30 2c 20 7a 45 72 72 2c 20   0, 3, 0, zErr, 
d2f0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
d300: 20 20 20 20 20 20 20 20 20 69 6e 74 65 67 72 69           integri
d310: 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52 6f 77  tyCheckResultRow
d320: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
d330: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
d340: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
d350: 43 6b 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  CkOk);.         
d360: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
d370: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
d380: 74 65 28 64 62 2c 20 70 43 68 65 63 6b 29 3b 0a  te(db, pCheck);.
d390: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d3a0: 20 20 69 66 28 20 21 69 73 51 75 69 63 6b 20 29    if( !isQuick )
d3b0: 7b 20 2f 2a 20 4f 6d 69 74 20 74 68 65 20 72 65  { /* Omit the re
d3c0: 6d 61 69 6e 69 6e 67 20 74 65 73 74 73 20 66 6f  maining tests fo
d3d0: 72 20 71 75 69 63 6b 5f 63 68 65 63 6b 20 2a 2f  r quick_check */
d3e0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  .          /* Va
d3f0: 6c 69 64 61 74 65 20 69 6e 64 65 78 20 65 6e 74  lidate index ent
d400: 72 69 65 73 20 66 6f 72 20 74 68 65 20 63 75 72  ries for the cur
d410: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  rent row */.    
d420: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
d430: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
d440: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
d450: 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a  x->pNext, j++){.
d460: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d470: 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34  jmp2, jmp3, jmp4
d480: 2c 20 6a 6d 70 35 3b 0a 20 20 20 20 20 20 20 20  , jmp5;.        
d490: 20 20 20 20 69 6e 74 20 63 6b 55 6e 69 71 20 3d      int ckUniq =
d4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d4b0: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
d4c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
d4d0: 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74 69  Pk==pIdx ) conti
d4e0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
d4f0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 6e   r1 = sqlite3Gen
d500: 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
d510: 61 72 73 65 2c 20 70 49 64 78 2c 20 69 44 61 74  arse, pIdx, iDat
d520: 61 43 75 72 2c 20 30 2c 20 30 2c 20 26 6a 6d 70  aCur, 0, 0, &jmp
d530: 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
d560: 6f 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  or, r1);.       
d570: 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 49       pPrior = pI
d580: 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx;.            
d590: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d5a0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
d5b0: 38 2b 6a 2c 20 31 29 3b 2f 2a 20 69 6e 63 72 65  8+j, 1);/* incre
d5c0: 6d 65 6e 74 20 65 6e 74 72 79 20 63 6f 75 6e 74  ment entry count
d5d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
d5e0: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  /* Verify that a
d5f0: 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 65 78  n index entry ex
d600: 69 73 74 73 20 66 6f 72 20 74 68 65 20 63 75 72  ists for the cur
d610: 72 65 6e 74 20 74 61 62 6c 65 20 72 6f 77 20 2a  rent table row *
d620: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  /.            jm
d630: 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
d640: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
d650: 46 6f 75 6e 64 2c 20 69 49 64 78 43 75 72 2b 6a  Found, iIdxCur+j
d660: 2c 20 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20 20  , ckUniq, r1,.  
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c        pIdx->nCol
d6a0: 75 6d 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  umn); VdbeCovera
d6b0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
d6c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
d6d0: 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22  adString(v, 3, "
d6e0: 72 6f 77 20 22 29 3b 0a 20 20 20 20 20 20 20 20  row ");.        
d6f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d700: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63  ddOp3(v, OP_Conc
d710: 61 74 2c 20 37 2c 20 33 2c 20 33 29 3b 0a 20 20  at, 7, 3, 3);.  
d720: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d730: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
d740: 76 2c 20 34 2c 20 22 20 6d 69 73 73 69 6e 67 20  v, 4, " missing 
d750: 66 72 6f 6d 20 69 6e 64 65 78 20 22 29 3b 0a 20  from index ");. 
d760: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d770: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d780: 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c  OP_Concat, 4, 3,
d790: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
d7a0: 20 6a 6d 70 35 20 3d 20 73 71 6c 69 74 65 33 56   jmp5 = sqlite3V
d7b0: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
d7c0: 20 34 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29   4, pIdx->zName)
d7d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d7e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d7f0: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c  v, OP_Concat, 4,
d800: 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   3, 3);.        
d810: 20 20 20 20 6a 6d 70 34 20 3d 20 69 6e 74 65 67      jmp4 = integ
d820: 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52  rityCheckResultR
d830: 6f 77 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ow(v);.         
d840: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d850: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29 3b  mpHere(v, jmp2);
d860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
d870: 46 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78  For UNIQUE index
d880: 65 73 2c 20 76 65 72 69 66 79 20 74 68 61 74 20  es, verify that 
d890: 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20 65  only one entry e
d8a0: 78 69 73 74 73 20 77 69 74 68 20 74 68 65 0a 20  xists with the. 
d8b0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75             ** cu
d8c0: 72 72 65 6e 74 20 6b 65 79 2e 20 20 54 68 65 20  rrent key.  The 
d8d0: 65 6e 74 72 79 20 69 73 20 75 6e 69 71 75 65 20  entry is unique 
d8e0: 69 66 20 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d  if (1) any colum
d8f0: 6e 20 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20  n is NULL.      
d900: 20 20 20 20 20 20 2a 2a 20 6f 72 20 28 32 29 20        ** or (2) 
d910: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 68  the next entry h
d920: 61 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  as a different k
d930: 65 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ey */.          
d940: 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e    if( IsUniqueIn
d950: 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20  dex(pIdx) ){.   
d960: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 75             int u
d970: 6e 69 71 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  niqOk = sqlite3V
d980: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
d990: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
d9a0: 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20 20      int jmp6;.  
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d9c0: 6b 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  kk;.            
d9d0: 20 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70    for(kk=0; kk<p
d9e0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b  Idx->nKeyCol; kk
d9f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
da00: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
da10: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
da20: 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
da30: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
da40: 21 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 69 43  !=XN_ROWID && iC
da50: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
da60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da70: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
da80: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
da90: 2e 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74 69  .notNull ) conti
daa0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
dab0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dac0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
dad0: 75 6c 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69 71  ull, r1+kk, uniq
dae0: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Ok);.           
daf0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
db00: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
db10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
db20: 20 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74      jmp6 = sqlit
db30: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
db40: 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72  OP_Next, iIdxCur
db50: 2b 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +j); VdbeCoverag
db60: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
db70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
db80: 6f 74 6f 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a  oto(v, uniqOk);.
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
dba0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
dbb0: 65 28 76 2c 20 6a 6d 70 36 29 3b 0a 20 20 20 20  e(v, jmp6);.    
dbc0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dbd0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
dbe0: 2c 20 4f 50 5f 49 64 78 47 54 2c 20 69 49 64 78  , OP_IdxGT, iIdx
dbf0: 43 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c 20 72  Cur+j, uniqOk, r
dc00: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65 79        pIdx->nKey
dc30: 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Col); VdbeCovera
dc40: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
dc50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc60: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c  LoadString(v, 3,
dc70: 20 22 6e 6f 6e 2d 75 6e 69 71 75 65 20 65 6e 74   "non-unique ent
dc80: 72 79 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a  ry in index ");.
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
dca0: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
dcb0: 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20 20 20   jmp5);.        
dcc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dcd0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
dce0: 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20   uniqOk);.      
dcf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dd00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
dd10: 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 34 29  umpHere(v, jmp4)
dd20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
dd30: 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74  lite3ResolvePart
dd40: 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c  IdxLabel(pParse,
dd50: 20 6a 6d 70 33 29 3b 0a 20 20 20 20 20 20 20 20   jmp3);.        
dd60: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
dd70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dd80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
dd90: 78 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f  xt, iDataCur, lo
dda0: 6f 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65  opTop); VdbeCove
ddb0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
ddc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
ddd0: 48 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d  Here(v, loopTop-
dde0: 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1);.#ifndef SQLI
ddf0: 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
de00: 4e 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  NT.        if( !
de10: 69 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20  isQuick ){.     
de20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
de30: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 32 2c  LoadString(v, 2,
de40: 20 22 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74   "wrong # of ent
de50: 72 69 65 73 20 69 6e 20 69 6e 64 65 78 20 22 29  ries in index ")
de60: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
de70: 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  j=0, pIdx=pTab->
de80: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
de90: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
dea0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
deb0: 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20    if( pPk==pIdx 
dec0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
ded0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dee0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
def0: 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a  Count, iIdxCur+j
df00: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
df10: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
df20: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
df30: 5f 45 71 2c 20 38 2b 6a 2c 20 30 2c 20 33 29 3b  _Eq, 8+j, 0, 3);
df40: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
df50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
df60: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
df70: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e  5(v, SQLITE_NOTN
df80: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULL);.          
df90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
dfa0: 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 70 49  dString(v, 4, pI
dfb0: 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
dfc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dfd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
dfe0: 43 6f 6e 63 61 74 2c 20 34 2c 20 32 2c 20 33 29  Concat, 4, 2, 3)
dff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
e000: 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75  tegrityCheckResu
e010: 6c 74 52 6f 77 28 76 29 3b 0a 20 20 20 20 20 20  ltRow(v);.      
e020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e030: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
e040: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
e050: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
e060: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e070: 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20  BTREECOUNT */.  
e080: 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20      } .    }.   
e090: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
e0a0: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
e0b0: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
e0c0: 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20 73 74 61  NO(2);.      sta
e0d0: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
e0e0: 4c 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20 3d  List endCode[] =
e0f0: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
e100: 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20  AddImm,      1, 
e110: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  0,        0},   
e120: 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20   /* 0 */.       
e130: 20 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c   { OP_IfNotZero,
e140: 20 20 20 31 2c 20 34 2c 20 20 20 20 20 20 20 20     1, 4,        
e150: 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20  0},    /* 1 */. 
e160: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69         { OP_Stri
e170: 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20 20  ng8,     0, 3,  
e180: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
e190: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  2 */.        { O
e1a0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 33  P_ResultRow,   3
e1b0: 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 1,        0}, 
e1c0: 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20     /* 3 */.     
e1d0: 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20     { OP_Halt,   
e1e0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
e1f0: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f    0},    /* 4 */
e200: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  .        { OP_St
e210: 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c  ring8,     0, 3,
e220: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
e230: 2a 20 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 5 */.        {
e240: 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20   OP_Goto,       
e250: 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d   0, 3,        0}
e260: 2c 20 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20  ,    /* 6 */.   
e270: 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65     };.      Vdbe
e280: 4f 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20 20  Op *aOp;..      
e290: 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  aOp = sqlite3Vdb
e2a0: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
e2b0: 72 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29  raySize(endCode)
e2c0: 2c 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29 3b  , endCode, iLn);
e2d0: 0a 20 20 20 20 20 20 69 66 28 20 61 4f 70 20 29  .      if( aOp )
e2e0: 7b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  {.        aOp[0]
e2f0: 2e 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b 0a 20  .p2 = 1-mxErr;. 
e300: 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34         aOp[2].p4
e310: 74 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43  type = P4_STATIC
e320: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d  ;.        aOp[2]
e330: 2e 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20  .p4.z = "ok";.  
e340: 20 20 20 20 20 20 61 4f 70 5b 35 5d 2e 70 34 74        aOp[5].p4t
e350: 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b  ype = P4_STATIC;
e360: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 35 5d 2e  .        aOp[5].
e370: 70 34 2e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  p4.z = (char*)sq
e380: 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
e390: 54 45 5f 43 4f 52 52 55 50 54 29 3b 0a 20 20 20  TE_CORRUPT);.   
e3a0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e3b0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
e3c0: 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65  , 0, sqlite3Vdbe
e3d0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32  CurrentAddr(v)-2
e3e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  );.    }.  }.  b
e3f0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  reak;.#endif /* 
e400: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
e410: 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
e420: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e430: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20  MIT_UTF16.  /*. 
e440: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63   **   PRAGMA enc
e450: 6f 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41  oding.  **   PRA
e460: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22  GMA encoding = "
e470: 75 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c  utf-8"|"utf-16"|
e480: 22 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d  "utf-16le"|"utf-
e490: 31 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  16be".  **.  ** 
e4a0: 49 6e 20 69 74 73 20 66 69 72 73 74 20 66 6f 72  In its first for
e4b0: 6d 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20 72  m, this pragma r
e4c0: 65 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f 64  eturns the encod
e4d0: 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a  ing of the main.
e4e0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49    ** database. I
e4f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
e500: 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65  s not initialize
e510: 64 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  d, it is initial
e520: 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20  ized now..  **. 
e530: 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
e540: 6f 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61 67  orm of this prag
e550: 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ma is a no-op if
e560: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e570: 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73  se file.  ** has
e580: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
e590: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49  n initialized. I
e5a0: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 73  n this case it s
e5b0: 65 74 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a  ets the default.
e5c0: 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68    ** encoding th
e5d0: 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
e5e0: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
e5f0: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 61 20  abase file if a 
e600: 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  new file.  ** is
e610: 20 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e 20   created. If an 
e620: 65 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64 61  existing main da
e630: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
e640: 70 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  pened, then the.
e650: 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65 78    ** default tex
e660: 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74  t encoding for t
e670: 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  he existing data
e680: 62 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20 20  base is used..  
e690: 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20  ** .  ** In all 
e6a0: 63 61 73 65 73 20 6e 65 77 20 64 61 74 61 62 61  cases new databa
e6b0: 73 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  ses created usin
e6c0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
e6d0: 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63 72  mand are.  ** cr
e6e0: 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65  eated to use the
e6f0: 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74 65   same default te
e700: 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 74  xt encoding as t
e710: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e720: 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61  . If.  ** the ma
e730: 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20  in database has 
e740: 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  not been initial
e750: 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65 61  ized and/or crea
e760: 74 65 64 20 77 68 65 6e 20 41 54 54 41 43 48 0a  ted when ATTACH.
e770: 20 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64    ** is executed
e780: 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  , this is done b
e790: 65 66 6f 72 65 20 74 68 65 20 41 54 54 41 43 48  efore the ATTACH
e7a0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a   operation..  **
e7b0: 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65 63  .  ** In the sec
e7c0: 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70 72  ond form this pr
e7d0: 61 67 6d 61 20 73 65 74 73 20 74 68 65 20 74 65  agma sets the te
e7e0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62  xt encoding to b
e7f0: 65 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e  e used in.  ** n
e800: 65 77 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ew database file
e810: 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  s created using 
e820: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61  this database ha
e830: 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79  ndle. It is only
e840: 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66 20  .  ** useful if 
e850: 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74  invoked immediat
e860: 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d 61  ely after the ma
e870: 69 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20 20  in database i.  
e880: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
e890: 70 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20  p_ENCODING: {.  
e8a0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
e8b0: 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a  truct EncName {.
e8c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
e8d0: 65 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 3b  e;.      u8 enc;
e8e0: 0a 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b  .    } encnames[
e8f0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 55  ] = {.      { "U
e900: 54 46 38 22 2c 20 20 20 20 20 53 51 4c 49 54 45  TF8",     SQLITE
e910: 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c 0a  _UTF8        },.
e920: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 38 22 2c        { "UTF-8",
e930: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
e940: 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75         },  /* Mu
e950: 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31  st be element [1
e960: 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54  ] */.      { "UT
e970: 46 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f  F-16le", SQLITE_
e980: 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 20 20  UTF16LE     },  
e990: 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65  /* Must be eleme
e9a0: 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20  nt [2] */.      
e9b0: 7b 20 22 55 54 46 2d 31 36 62 65 22 2c 20 53 51  { "UTF-16be", SQ
e9c0: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20 20  LITE_UTF16BE    
e9d0: 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20   },  /* Must be 
e9e0: 65 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20  element [3] */. 
e9f0: 20 20 20 20 20 7b 20 22 55 54 46 31 36 6c 65 22       { "UTF16le"
ea00: 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ,  SQLITE_UTF16L
ea10: 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b  E     },.      {
ea20: 20 22 55 54 46 31 36 62 65 22 2c 20 20 53 51 4c   "UTF16be",  SQL
ea30: 49 54 45 5f 55 54 46 31 36 42 45 20 20 20 20 20  ITE_UTF16BE     
ea40: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d  },.      { "UTF-
ea50: 31 36 22 2c 20 20 20 30 20 20 20 20 20 20 20 20  16",   0        
ea60: 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20            }, /* 
ea70: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
ea80: 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55  VE */.      { "U
ea90: 54 46 31 36 22 2c 20 20 20 20 30 20 20 20 20 20  TF16",    0     
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20               }, 
eab0: 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  /* SQLITE_UTF16N
eac0: 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b  ATIVE */.      {
ead0: 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20   0, 0 }.    };. 
eae0: 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20     const struct 
eaf0: 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20  EncName *pEnc;. 
eb00: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
eb10: 7b 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20  {    /* "PRAGMA 
eb20: 65 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20  encoding" */.   
eb30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
eb40: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
eb50: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
eb60: 75 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ut;.      assert
eb70: 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54  ( encnames[SQLIT
eb80: 45 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c  E_UTF8].enc==SQL
eb90: 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20  ITE_UTF8 );.    
eba0: 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d    assert( encnam
ebb0: 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  es[SQLITE_UTF16L
ebc0: 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  E].enc==SQLITE_U
ebd0: 54 46 31 36 4c 45 20 29 3b 0a 20 20 20 20 20 20  TF16LE );.      
ebe0: 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73  assert( encnames
ebf0: 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 5d  [SQLITE_UTF16BE]
ec00: 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  .enc==SQLITE_UTF
ec10: 31 36 42 45 20 29 3b 0a 20 20 20 20 20 20 72 65  16BE );.      re
ec20: 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76  turnSingleText(v
ec30: 2c 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70  , encnames[ENC(p
ec40: 50 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d  Parse->db)].zNam
ec50: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20  e);.    }else{  
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41        /* "PRAGMA
ec80: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58 22   encoding = XXX"
ec90: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c   */.      /* Onl
eca0: 79 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  y change the val
ecb0: 75 65 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63  ue of sqlite.enc
ecc0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
ecd0: 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20   handle is not. 
ece0: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
ecf0: 7a 65 64 2e 20 49 66 20 74 68 65 20 6d 61 69 6e  zed. If the main
ed00: 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73   database exists
ed10: 2c 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65  , the new sqlite
ed20: 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20 20 20 20  .enc value.     
ed30: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65 72   ** will be over
ed40: 77 72 69 74 74 65 6e 20 77 68 65 6e 20 74 68 65  written when the
ed50: 20 73 63 68 65 6d 61 20 69 73 20 6e 65 78 74 20   schema is next 
ed60: 6c 6f 61 64 65 64 2e 20 49 66 20 69 74 20 64 6f  loaded. If it do
ed70: 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  es not.      ** 
ed80: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20  already exists, 
ed90: 69 74 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74  it will be creat
eda0: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65  ed to use the ne
edb0: 77 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65  w encoding value
edc0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
edd0: 20 69 66 28 20 0a 20 20 20 20 20 20 20 20 21 28   if( .        !(
ede0: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
edf0: 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
ee00: 61 64 65 64 29 29 20 7c 7c 20 0a 20 20 20 20 20  aded)) || .     
ee10: 20 20 20 44 62 48 61 73 50 72 6f 70 65 72 74 79     DbHasProperty
ee20: 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79  (db, 0, DB_Empty
ee30: 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
ee40: 20 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e      for(pEnc=&en
ee50: 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d  cnames[0]; pEnc-
ee60: 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b  >zName; pEnc++){
ee70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30  .          if( 0
ee80: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
ee90: 28 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a  (zRight, pEnc->z
eea0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
eeb0: 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28       SCHEMA_ENC(
eec0: 64 62 29 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a  db) = ENC(db) =.
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 70 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63  pEnc->enc ? pEnc
eef0: 2d 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55  ->enc : SQLITE_U
ef00: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
ef10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ef20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ef30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
ef40: 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b   !pEnc->zName ){
ef50: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ef60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ef70: 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20  e, "unsupported 
ef80: 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a  encoding: %s", z
ef90: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
efa0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
efb0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
efc0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
efd0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66  IT_UTF16 */..#if
efe0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
eff0: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f  _SCHEMA_VERSION_
f000: 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a  PRAGMAS.  /*.  *
f010: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
f020: 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69  ma.]schema_versi
f030: 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  on.  **   PRAGMA
f040: 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61   [schema.]schema
f050: 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65  _version = <inte
f060: 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ger>.  **.  **  
f070: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
f080: 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20  ]user_version.  
f090: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
f0a0: 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f  ema.]user_versio
f0b0: 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20  n = <integer>.  
f0c0: 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  **.  **   PRAGMA
f0d0: 20 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69   [schema.]freeli
f0e0: 73 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a 20 20  st_count.  **.  
f0f0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
f100: 65 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73 69 6f  ema.]data_versio
f110: 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52  n.  **.  **   PR
f120: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 70  AGMA [schema.]ap
f130: 70 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a  plication_id.  *
f140: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
f150: 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f  ma.]application_
f160: 69 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20  id = <integer>. 
f170: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72 61   **.  ** The pra
f180: 67 6d 61 27 73 20 73 63 68 65 6d 61 5f 76 65 72  gma's schema_ver
f190: 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76 65  sion and user_ve
f1a0: 72 73 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74  rsion are used t
f1b0: 6f 20 73 65 74 20 6f 72 20 67 65 74 0a 20 20 2a  o set or get.  *
f1c0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
f1d0: 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f  he schema-versio
f1e0: 6e 20 61 6e 64 20 75 73 65 72 2d 76 65 72 73 69  n and user-versi
f1f0: 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  on, respectively
f200: 2e 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65 20  . Both.  ** the 
f210: 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61  schema-version a
f220: 6e 64 20 74 68 65 20 75 73 65 72 2d 76 65 72 73  nd the user-vers
f230: 69 6f 6e 20 61 72 65 20 33 32 2d 62 69 74 20 73  ion are 32-bit s
f240: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 0a 20  igned integers. 
f250: 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68   ** stored in th
f260: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
f270: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
f280: 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 69   schema-cookie i
f290: 73 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d  s usually only m
f2a0: 61 6e 69 70 75 6c 61 74 65 64 20 69 6e 74 65 72  anipulated inter
f2b0: 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e  nally by SQLite.
f2c0: 20 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63 72   It.  ** is incr
f2d0: 65 6d 65 6e 74 65 64 20 62 79 20 53 51 4c 69 74  emented by SQLit
f2e0: 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64  e whenever the d
f2f0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69  atabase schema i
f300: 73 20 6d 6f 64 69 66 69 65 64 20 28 62 79 0a 20  s modified (by. 
f310: 20 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f 72 20   ** creating or 
f320: 64 72 6f 70 70 69 6e 67 20 61 20 74 61 62 6c 65  dropping a table
f330: 20 6f 72 20 69 6e 64 65 78 29 2e 20 54 68 65 20   or index). The 
f340: 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 69  schema version i
f350: 73 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 53  s used by.  ** S
f360: 51 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65 20  QLite each time 
f370: 61 20 71 75 65 72 79 20 69 73 20 65 78 65 63 75  a query is execu
f380: 74 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ted to ensure th
f390: 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  at the internal 
f3a0: 63 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68  cache.  ** of th
f3b0: 65 20 73 63 68 65 6d 61 20 75 73 65 64 20 77 68  e schema used wh
f3c0: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65  en compiling the
f3d0: 20 53 51 4c 20 71 75 65 72 79 20 6d 61 74 63 68   SQL query match
f3e0: 65 73 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  es the schema of
f3f0: 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
f400: 73 65 20 61 67 61 69 6e 73 74 20 77 68 69 63 68  se against which
f410: 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 71 75   the compiled qu
f420: 65 72 79 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ery is actually 
f430: 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 53  executed..  ** S
f440: 75 62 76 65 72 74 69 6e 67 20 74 68 69 73 20 6d  ubverting this m
f450: 65 63 68 61 6e 69 73 6d 20 62 79 20 75 73 69 6e  echanism by usin
f460: 67 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d 61  g "PRAGMA schema
f470: 5f 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f 64  _version" to mod
f480: 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68  ify.  ** the sch
f490: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73 20 70  ema-version is p
f4a0: 6f 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67 65  otentially dange
f4b0: 72 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c 65 61  rous and may lea
f4c0: 64 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20 2a  d to program.  *
f4d0: 2a 20 63 72 61 73 68 65 73 20 6f 72 20 64 61 74  * crashes or dat
f4e0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
f4f0: 2e 20 55 73 65 20 77 69 74 68 20 63 61 75 74 69  . Use with cauti
f500: 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  on!.  **.  ** Th
f510: 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 69  e user-version i
f520: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
f530: 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65 2e  nally by SQLite.
f540: 20 49 74 20 6d 61 79 20 62 65 20 75 73 65 64 20   It may be used 
f550: 62 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61 74  by.  ** applicat
f560: 69 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70 75 72  ions for any pur
f570: 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  pose..  */.  cas
f580: 65 20 50 72 61 67 54 79 70 5f 48 45 41 44 45 52  e PragTyp_HEADER
f590: 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 6e  _VALUE: {.    in
f5a0: 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72 61  t iCookie = pPra
f5b0: 67 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a 20 57  gma->iArg;  /* W
f5c0: 68 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20 72  hich cookie to r
f5d0: 65 61 64 20 6f 72 20 77 72 69 74 65 20 2a 2f 0a  ead or write */.
f5e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
f5f0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
f600: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
f610: 20 26 26 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50   && (pPragma->mP
f620: 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67  ragFlg & PragFlg
f630: 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d 30 20 29 7b  _ReadOnly)==0 ){
f640: 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
f650: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  the specified co
f660: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
f670: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
f680: 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 43   VdbeOpList setC
f690: 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  ookie[] = {.    
f6a0: 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63      { OP_Transac
f6b0: 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31 2c 20  tion,    0,  1, 
f6c0: 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a   0},    /* 0 */.
f6d0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74          { OP_Set
f6e0: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20  Cookie,      0, 
f6f0: 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31   0,  0},    /* 1
f700: 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   */.      };.   
f710: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
f720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f730: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
f740: 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61 79  equired(v, Array
f750: 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 29  Size(setCookie))
f760: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
f770: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
f780: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
f790: 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43  setCookie), setC
f7a0: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20  ookie, 0);.     
f7b0: 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41   if( ONLY_IF_REA
f7c0: 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d  LLOC_STRESS(aOp=
f7d0: 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
f7e0: 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 69     aOp[0].p1 = i
f7f0: 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d  Db;.      aOp[1]
f800: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
f810: 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69 43 6f   aOp[1].p2 = iCo
f820: 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f 70 5b  okie;.      aOp[
f830: 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65 33 41  1].p3 = sqlite3A
f840: 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
f850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
f860: 20 52 65 61 64 20 74 68 65 20 73 70 65 63 69 66   Read the specif
f870: 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ied cookie value
f880: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
f890: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
f8a0: 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d  t readCookie[] =
f8b0: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
f8c0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
f8d0: 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20   0,  0,  0},    
f8e0: 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 0 */.        
f8f0: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
f900: 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d        0,  1,  0}
f910: 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20  ,    /* 1 */.   
f920: 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74       { OP_Result
f930: 52 6f 77 2c 20 20 20 20 20 20 20 31 2c 20 20 31  Row,       1,  1
f940: 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b 0a 20  ,  0}.      };. 
f950: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70       VdbeOp *aOp
f960: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f970: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
f980: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
f990: 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69  aySize(readCooki
f9a0: 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d  e));.      aOp =
f9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f9c0: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
f9d0: 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29 2c 72  ze(readCookie),r
f9e0: 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a 20 20  eadCookie,0);.  
f9f0: 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f      if( ONLY_IF_
fa00: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61  REALLOC_STRESS(a
fa10: 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a  Op==0) ) break;.
fa20: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20        aOp[0].p1 
fa30: 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70  = iDb;.      aOp
fa40: 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [1].p1 = iDb;.  
fa50: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20      aOp[1].p3 = 
fa60: 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 73  iCookie;.      s
fa70: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62  qlite3VdbeReusab
fa80: 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  le(v);.    }.  }
fa90: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
faa0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
fab0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f 50  SCHEMA_VERSION_P
fac0: 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64  RAGMAS */..#ifnd
fad0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
fae0: 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
faf0: 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  GS.  /*.  **   P
fb00: 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f 6f 70  RAGMA compile_op
fb10: 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tions.  **.  ** 
fb20: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 73  Return the names
fb30: 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 2d   of all compile-
fb40: 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75 73 65  time options use
fb50: 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  d in this build,
fb60: 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69 6f 6e  .  ** one option
fb70: 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20   per row..  */. 
fb80: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f   case PragTyp_CO
fb90: 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a 20 7b  MPILE_OPTIONS: {
fba0: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
fbb0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fbc0: 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61 72 73 65  zOpt;.    pParse
fbd0: 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 20 20  ->nMem = 1;.    
fbe0: 77 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73  while( (zOpt = s
fbf0: 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
fc00: 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d  tion_get(i++))!=
fc10: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
fc20: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
fc30: 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20  (v, 1, zOpt);.  
fc40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fc50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
fc60: 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20  ltRow, 1, 1);.  
fc70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
fc80: 64 62 65 52 65 75 73 61 62 6c 65 28 76 29 3b 0a  dbeReusable(v);.
fc90: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
fca0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
fcb0: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
fcc0: 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66 6e 64  _DIAGS */..#ifnd
fcd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
fce0: 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  AL.  /*.  **   P
fcf0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 77  RAGMA [schema.]w
fd00: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20  al_checkpoint = 
fd10: 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73  passive|full|res
fd20: 74 61 72 74 7c 74 72 75 6e 63 61 74 65 0a 20 20  tart|truncate.  
fd30: 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70 6f 69  **.  ** Checkpoi
fd40: 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  nt the database.
fd50: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
fd60: 67 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b 50 4f  gTyp_WAL_CHECKPO
fd70: 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  INT: {.    int i
fd80: 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44  Bt = (pId2->z?iD
fd90: 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b:SQLITE_MAX_ATT
fda0: 41 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74 20  ACHED);.    int 
fdb0: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
fdc0: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
fdd0: 45 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  E;.    if( zRigh
fde0: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
fdf0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
fe00: 69 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30  ight, "full")==0
fe10: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
fe20: 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  e = SQLITE_CHECK
fe30: 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20  POINT_FULL;.    
fe40: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
fe50: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
fe60: 74 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d 30  t, "restart")==0
fe70: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
fe80: 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  e = SQLITE_CHECK
fe90: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20  POINT_RESTART;. 
fea0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
feb0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
fec0: 69 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65 22  ight, "truncate"
fed0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fee0: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
fef0: 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
ff00: 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
ff10: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  }.    pParse->nM
ff20: 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69  em = 3;.    sqli
ff30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ff40: 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20   OP_Checkpoint, 
ff50: 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a  iBt, eMode, 1);.
ff60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ff70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
ff80: 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20  ltRow, 1, 3);.  
ff90: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a  }.  break;..  /*
ffa0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77  .  **   PRAGMA w
ffb0: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
ffc0: 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  t.  **   PRAGMA 
ffd0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
ffe0: 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  nt = N.  **.  **
fff0: 20 43 6f 6e 66 69 67 75 72 65 20 61 20 64 61 74   Configure a dat
10000 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10010 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
10020 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 20 64  y checkpoint a d
10030 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 66 74  atabase.  ** aft
10040 65 72 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  er accumulating 
10050 4e 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  N frames in the 
10060 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79 20 66 6f  log. Or query fo
10070 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  r the current va
10080 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20  lue.  ** of N.. 
10090 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
100a0 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b  yp_WAL_AUTOCHECK
100b0 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28  POINT: {.    if(
100c0 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
100d0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
100e0 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
100f0 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
10100 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ht));.    }.    
10110 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
10120 76 2c 20 0a 20 20 20 20 20 20 20 64 62 2d 3e 78  v, .       db->x
10130 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73 71 6c  WalCallback==sql
10140 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
10150 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  ok ? .          
10160 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
10170 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72 67 29 20  NT(db->pWalArg) 
10180 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  : 0);.  }.  brea
10190 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a  k;.#endif..  /*.
101a0 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 68 72    **  PRAGMA shr
101b0 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a 2a 0a  ink_memory.  **.
101c0 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
101d0 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34 35 2d  ION-OF: R-23445-
101e0 34 36 31 30 39 20 54 68 69 73 20 70 72 61 67 6d  46109 This pragm
101f0 61 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  a causes the dat
10200 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65  abase.  ** conne
10210 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68 20 69  ction on which i
10220 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  t is invoked to 
10230 66 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20  free up as much 
10240 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a 20 20 2a  memory as it.  *
10250 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c 69 6e  * can, by callin
10260 67 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c  g sqlite3_db_rel
10270 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e 0a 20  ease_memory().. 
10280 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
10290 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f 52 59  yp_SHRINK_MEMORY
102a0 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
102b0 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
102c0 79 28 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b  y(db);.    break
102d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
102e0 20 20 50 52 41 47 4d 41 20 6f 70 74 69 6d 69 7a    PRAGMA optimiz
102f0 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f  e.  **  PRAGMA o
10300 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20  ptimize(MASK).  
10310 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d  **  PRAGMA schem
10320 61 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a 2a 20  a.optimize.  ** 
10330 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61 2e 6f   PRAGMA schema.o
10340 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a 20 20  ptimize(MASK).  
10350 2a 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70 74 20  **.  ** Attempt 
10360 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20  to optimize the 
10370 64 61 74 61 62 61 73 65 2e 20 20 41 6c 6c 20 73  database.  All s
10380 63 68 65 6d 61 73 20 61 72 65 20 6f 70 74 69 6d  chemas are optim
10390 69 7a 65 64 20 69 6e 20 74 68 65 20 66 69 72 73  ized in the firs
103a0 74 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72 6d 73  t.  ** two forms
103b0 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 20 73  , and only the s
103c0 70 65 63 69 66 69 65 64 20 73 63 68 65 6d 61 20  pecified schema 
103d0 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20  is optimized in 
103e0 74 68 65 20 6c 61 74 74 65 72 20 74 77 6f 2e 0a  the latter two..
103f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65    **.  ** The de
10400 74 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d 69 7a  tails of optimiz
10410 61 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ations performed
10420 20 62 79 20 74 68 69 73 20 70 72 61 67 6d 61 20   by this pragma 
10430 61 72 65 20 65 78 70 65 63 74 65 64 0a 20 20 2a  are expected.  *
10440 2a 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 64 20  * to change and 
10450 69 6d 70 72 6f 76 65 20 6f 76 65 72 20 74 69 6d  improve over tim
10460 65 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73  e.  Applications
10470 20 73 68 6f 75 6c 64 20 61 6e 74 69 63 69 70 61   should anticipa
10480 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 69  te that.  ** thi
10490 73 20 70 72 61 67 6d 61 20 77 69 6c 6c 20 70 65  s pragma will pe
104a0 72 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69 6d 69  rform new optimi
104b0 7a 61 74 69 6f 6e 73 20 69 6e 20 66 75 74 75 72  zations in futur
104c0 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20 2a 2a  e releases..  **
104d0 0a 20 20 2a 2a 20 54 68 65 20 6f 70 74 69 6f 6e  .  ** The option
104e0 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  al argument is a
104f0 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
10500 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70 65 72  mizations to per
10510 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
10520 20 20 20 30 78 30 30 30 31 20 20 20 20 44 65 62     0x0001    Deb
10530 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 44 6f  ugging mode.  Do
10540 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 70 65   not actually pe
10550 72 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69 6d 69  rform any optimi
10560 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20 20 20  zations.  **    
10570 20 20 20 20 20 20 20 20 20 20 62 75 74 20 69 6e            but in
10580 73 74 65 61 64 20 72 65 74 75 72 6e 20 6f 6e 65  stead return one
10590 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 6f   line of text fo
105a0 72 20 65 61 63 68 20 6f 70 74 69 6d 69 7a 61 74  r each optimizat
105b0 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ion.  **        
105c0 20 20 20 20 20 20 74 68 61 74 20 77 6f 75 6c 64        that would
105d0 20 68 61 76 65 20 62 65 65 6e 20 64 6f 6e 65 2e   have been done.
105e0 20 20 4f 66 66 20 62 79 20 64 65 66 61 75 6c 74    Off by default
105f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30  ..  **.  **    0
10600 78 30 30 30 32 20 20 20 20 52 75 6e 20 41 4e 41  x0002    Run ANA
10610 4c 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73 20 74  LYZE on tables t
10620 68 61 74 20 6d 69 67 68 74 20 62 65 6e 65 66 69  hat might benefi
10630 74 2e 20 20 4f 6e 20 62 79 20 64 65 66 61 75 6c  t.  On by defaul
10640 74 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  t..  **         
10650 20 20 20 20 20 53 65 65 20 62 65 6c 6f 77 20 66       See below f
10660 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
10670 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  formation..  **.
10680 20 20 2a 2a 20 20 20 20 30 78 30 30 30 34 20 20    **    0x0004  
10690 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70 6c 65    (Not yet imple
106a0 6d 65 6e 74 65 64 29 20 52 65 63 6f 72 64 20 75  mented) Record u
106b0 73 61 67 65 20 61 6e 64 20 70 65 72 66 6f 72 6d  sage and perform
106c0 61 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20 20 20  ance .  **      
106d0 20 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74          informat
106e0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ion from the cur
106f0 72 65 6e 74 20 73 65 73 73 69 6f 6e 20 69 6e 20  rent session in 
10700 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  the.  **        
10710 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
10720 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 77  ile so that it w
10730 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62 6c 65  ill be available
10740 20 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22 0a 20   to "optimize". 
10750 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
10760 20 70 72 61 67 6d 61 73 20 72 75 6e 20 62 79 20   pragmas run by 
10770 66 75 74 75 72 65 20 64 61 74 61 62 61 73 65 20  future database 
10780 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a  connections..  *
10790 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 38  *.  **    0x0008
107a0 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70      (Not yet imp
107b0 6c 65 6d 65 6e 74 65 64 29 20 43 72 65 61 74 65  lemented) Create
107c0 20 69 6e 64 65 78 65 73 20 74 68 61 74 20 6d 69   indexes that mi
107d0 67 68 74 20 68 61 76 65 0a 20 20 2a 2a 20 20 20  ght have.  **   
107e0 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e 20             been 
107f0 68 65 6c 70 66 75 6c 20 74 6f 20 72 65 63 65 6e  helpful to recen
10800 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 0a 20  t queries.  **. 
10810 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
10820 4d 41 53 4b 20 69 73 20 61 6e 64 20 61 6c 77 61  MASK is and alwa
10830 79 73 20 73 68 61 6c 6c 20 62 65 20 30 78 66 66  ys shall be 0xff
10840 66 65 2e 20 20 30 78 66 66 66 65 20 6d 65 61 6e  fe.  0xfffe mean
10850 73 20 70 65 72 66 6f 72 6d 20 61 6c 6c 0a 20 20  s perform all.  
10860 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69  ** of the optimi
10870 7a 61 74 69 6f 6e 73 20 6c 69 73 74 65 64 20 61  zations listed a
10880 62 6f 76 65 20 65 78 63 65 70 74 20 44 65 62 75  bove except Debu
10890 67 20 4d 6f 64 65 2c 20 69 6e 63 6c 75 64 69 6e  g Mode, includin
108a0 67 20 6e 65 77 0a 20 20 2a 2a 20 6f 70 74 69 6d  g new.  ** optim
108b0 69 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 68 61  izations that ha
108c0 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
108d0 69 6e 76 65 6e 74 65 64 2e 20 20 49 66 20 6e 65  invented.  If ne
108e0 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  w optimizations 
108f0 61 72 65 0a 20 20 2a 2a 20 65 76 65 72 20 61 64  are.  ** ever ad
10900 64 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ded that should 
10910 62 65 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c  be off by defaul
10920 74 2c 20 74 68 6f 73 65 20 6f 66 66 2d 62 79 2d  t, those off-by-
10930 64 65 66 61 75 6c 74 20 0a 20 20 2a 2a 20 6f 70  default .  ** op
10940 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 69 6c 6c  timizations will
10950 20 68 61 76 65 20 62 69 74 6d 61 73 6b 73 20 6f   have bitmasks o
10960 66 20 30 78 31 30 30 30 30 20 6f 72 20 6c 61 72  f 0x10000 or lar
10970 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ger..  **.  ** D
10980 45 54 45 52 4d 49 4e 41 54 49 4f 4e 20 4f 46 20  ETERMINATION OF 
10990 57 48 45 4e 20 54 4f 20 52 55 4e 20 41 4e 41 4c  WHEN TO RUN ANAL
109a0 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  YZE.  **.  ** In
109b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
109c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20 74  lementation, a t
109d0 61 62 6c 65 20 69 73 20 61 6e 61 6c 79 7a 65 64  able is analyzed
109e0 20 69 66 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20   if only if all 
109f0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  of.  ** the foll
10a00 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
10a10 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 29 20 4d 41    **.  ** (1) MA
10a20 53 4b 20 62 69 74 20 30 78 30 32 20 69 73 20 73  SK bit 0x02 is s
10a30 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 32  et..  **.  ** (2
10a40 29 20 54 68 65 20 71 75 65 72 79 20 70 6c 61 6e  ) The query plan
10a50 6e 65 72 20 75 73 65 64 20 73 71 6c 69 74 65 5f  ner used sqlite_
10a60 73 74 61 74 31 2d 73 74 79 6c 65 20 73 74 61 74  stat1-style stat
10a70 69 73 74 69 63 73 20 66 6f 72 20 6f 6e 65 20 6f  istics for one o
10a80 72 0a 20 20 2a 2a 20 20 20 20 20 6d 6f 72 65 20  r.  **     more 
10a90 69 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20 74  indexes of the t
10aa0 61 62 6c 65 20 61 74 20 73 6f 6d 65 20 70 6f 69  able at some poi
10ab0 6e 74 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69  nt during the li
10ac0 66 65 74 69 6d 65 20 6f 66 0a 20 20 2a 2a 20 20  fetime of.  **  
10ad0 20 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63     the current c
10ae0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  onnection..  **.
10af0 20 20 2a 2a 20 28 33 29 20 4f 6e 65 20 6f 72 20    ** (3) One or 
10b00 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20  more indexes of 
10b10 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 63 75  the table are cu
10b20 72 72 65 6e 74 6c 79 20 75 6e 61 6e 61 6c 79 7a  rrently unanalyz
10b30 65 64 20 4f 52 0a 20 20 2a 2a 20 20 20 20 20 74  ed OR.  **     t
10b40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
10b50 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 68  s in the table h
10b60 61 73 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  as increased by 
10b70 32 35 20 74 69 6d 65 73 20 6f 72 20 6d 6f 72 65  25 times or more
10b80 0a 20 20 2a 2a 20 20 20 20 20 73 69 6e 63 65 20  .  **     since 
10b90 74 68 65 20 6c 61 73 74 20 74 69 6d 65 20 41 4e  the last time AN
10ba0 41 4c 59 5a 45 20 77 61 73 20 72 75 6e 2e 0a 20  ALYZE was run.. 
10bb0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c   **.  ** The rul
10bc0 65 73 20 66 6f 72 20 77 68 65 6e 20 74 61 62 6c  es for when tabl
10bd0 65 73 20 61 72 65 20 61 6e 61 6c 79 7a 65 64 20  es are analyzed 
10be0 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 63 68  are likely to ch
10bf0 61 6e 67 65 20 69 6e 0a 20 20 2a 2a 20 66 75 74  ange in.  ** fut
10c00 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20  ure releases..  
10c10 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
10c20 70 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b 0a 20 20  p_OPTIMIZE: {.  
10c30 20 20 69 6e 74 20 69 44 62 4c 61 73 74 3b 20 20    int iDbLast;  
10c40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
10c50 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 70 6f 69   termination poi
10c60 6e 74 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d  nt for the schem
10c70 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e  a loop */.    in
10c80 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20  t iTabCur;      
10c90 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
10ca0 6f 72 20 61 20 74 61 62 6c 65 20 77 68 6f 73 65  or a table whose
10cb0 20 73 69 7a 65 20 6e 65 65 64 73 20 63 68 65 63   size needs chec
10cc0 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 48 61 73 68  king */.    Hash
10cd0 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
10ce0 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20     /* Loop over 
10cf0 74 61 62 6c 65 73 20 6f 66 20 61 20 73 63 68 65  tables of a sche
10d00 6d 61 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61  ma */.    Schema
10d10 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20 20 20   *pSchema;      
10d20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
10d30 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 54 61  schema */.    Ta
10d40 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
10d50 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
10d60 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f  in the schema */
10d70 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
10d80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
10d90 6e 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74  n index of the t
10da0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4c 6f 67 45  able */.    LogE
10db0 73 74 20 73 7a 54 68 72 65 73 68 6f 6c 64 3b 20  st szThreshold; 
10dc0 20 20 20 2f 2a 20 53 69 7a 65 20 74 68 72 65 73     /* Size thres
10dd0 68 6f 6c 64 20 61 62 6f 76 65 20 77 68 69 63 68  hold above which
10de0 20 72 65 61 6e 61 6c 79 73 69 73 20 69 73 20 6e   reanalysis is n
10df0 65 65 64 64 20 2a 2f 0a 20 20 20 20 63 68 61 72  eedd */.    char
10e00 20 2a 7a 53 75 62 53 71 6c 3b 20 20 20 20 20 20   *zSubSql;      
10e10 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
10e20 65 6e 74 20 66 6f 72 20 74 68 65 20 4f 50 5f 53  ent for the OP_S
10e30 71 6c 45 78 65 63 20 6f 70 63 6f 64 65 20 2a 2f  qlExec opcode */
10e40 0a 20 20 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b  .    u32 opMask;
10e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
10e60 61 73 6b 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ask of operation
10e70 73 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a  s to perform */.
10e80 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
10e90 29 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20  ){.      opMask 
10ea0 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 41 74  = (u32)sqlite3At
10eb0 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
10ec0 20 20 69 66 28 20 28 6f 70 4d 61 73 6b 20 26 20    if( (opMask & 
10ed0 30 78 30 32 29 3d 3d 30 20 29 20 62 72 65 61 6b  0x02)==0 ) break
10ee0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10ef0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 30 78 66 66     opMask = 0xff
10f00 66 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54  fe;.    }.    iT
10f10 61 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  abCur = pParse->
10f20 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 66 6f 72 28  nTab++;.    for(
10f30 69 44 62 4c 61 73 74 20 3d 20 7a 44 62 3f 69 44  iDbLast = zDb?iD
10f40 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b:db->nDb-1; iDb
10f50 3c 3d 69 44 62 4c 61 73 74 3b 20 69 44 62 2b 2b  <=iDbLast; iDb++
10f60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  ){.      if( iDb
10f70 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==1 ) continue;.
10f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
10f90 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
10fa0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
10fb0 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e    pSchema = db->
10fc0 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
10fd0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73 71  ;.      for(k=sq
10fe0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
10ff0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
11000 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73  ; k; k=sqliteHas
11010 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
11020 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
11030 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
11040 28 6b 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  (k);..        /*
11050 20 49 66 20 74 61 62 6c 65 20 70 54 61 62 20 68   If table pTab h
11060 61 73 20 6e 6f 74 20 62 65 65 6e 20 75 73 65 64  as not been used
11070 20 69 6e 20 61 20 77 61 79 20 74 68 61 74 20 77   in a way that w
11080 6f 75 6c 64 20 62 65 6e 65 66 69 74 20 66 72 6f  ould benefit fro
11090 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76  m.        ** hav
110a0 69 6e 67 20 61 6e 61 6c 79 73 69 73 20 73 74 61  ing analysis sta
110b0 74 69 73 74 69 63 73 20 64 75 72 69 6e 67 20 74  tistics during t
110c0 68 65 20 63 75 72 72 65 6e 74 20 73 65 73 73 69  he current sessi
110d0 6f 6e 2c 20 74 68 65 6e 20 73 6b 69 70 20 69 74  on, then skip it
110e0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  ..        ** Thi
110f0 73 20 61 6c 73 6f 20 68 61 73 20 74 68 65 20 65  s also has the e
11100 66 66 65 63 74 20 6f 66 20 73 6b 69 70 70 69 6e  ffect of skippin
11110 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  g virtual tables
11120 20 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a 20 20   and views */.  
11130 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 2d        if( (pTab-
11140 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 53  >tabFlags & TF_S
11150 74 61 74 73 55 73 65 64 29 3d 3d 30 20 29 20 63  tatsUsed)==0 ) c
11160 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20  ontinue;..      
11170 20 20 2f 2a 20 52 65 61 6e 61 6c 79 7a 65 20 69    /* Reanalyze i
11180 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 32  f the table is 2
11190 35 20 74 69 6d 65 73 20 6c 61 72 67 65 72 20 74  5 times larger t
111a0 68 61 6e 20 74 68 65 20 6c 61 73 74 20 61 6e 61  han the last ana
111b0 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20 20 20 20  lysis */.       
111c0 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 70   szThreshold = p
111d0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
111e0 2b 20 34 36 3b 20 61 73 73 65 72 74 28 20 73 71  + 46; assert( sq
111f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 3d  lite3LogEst(25)=
11200 3d 34 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66  =46 );.        f
11210 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
11220 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
11230 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
11240 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 49           if( !pI
11250 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 7b 0a  dx->hasStat1 ){.
11260 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 54 68              szTh
11270 72 65 73 68 6f 6c 64 20 3d 20 30 3b 20 2f 2a 20  reshold = 0; /* 
11280 41 6c 77 61 79 73 20 61 6e 61 6c 79 7a 65 20 69  Always analyze i
11290 66 20 61 6e 79 20 69 6e 64 65 78 20 6c 61 63 6b  f any index lack
112a0 73 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  s statistics */.
112b0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
112c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
112d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
112e0 20 69 66 28 20 73 7a 54 68 72 65 73 68 6f 6c 64   if( szThreshold
112f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11300 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
11310 50 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20  Parse, iTabCur, 
11320 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
11330 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20  enRead);.       
11340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11350 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 53 6d 61  dOp3(v, OP_IfSma
11360 6c 6c 65 72 2c 20 69 54 61 62 43 75 72 2c 20 0a  ller, iTabCur, .
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11390 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
113a0 76 29 2b 32 2b 28 6f 70 4d 61 73 6b 26 31 29 2c  v)+2+(opMask&1),
113b0 20 73 7a 54 68 72 65 73 68 6f 6c 64 29 3b 0a 20   szThreshold);. 
113c0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
113d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
113e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 75 62    }.        zSub
113f0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
11400 69 6e 74 66 28 64 62 2c 20 22 41 4e 41 4c 59 5a  intf(db, "ANALYZ
11410 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5c 22 22  E \"%w\".\"%w\""
11420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
11450 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  zDbSName, pTab->
11460 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
11470 69 66 28 20 6f 70 4d 61 73 6b 20 26 20 30 78 30  if( opMask & 0x0
11480 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  1 ){.          i
11490 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
114a0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
114b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
114c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
114d0 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
114e0 20 72 31 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c   r1, 0, zSubSql,
114f0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
11500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11510 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11520 52 65 73 75 6c 74 52 6f 77 2c 20 72 31 2c 20 31  ResultRow, r1, 1
11530 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
11540 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11550 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11560 20 4f 50 5f 53 71 6c 45 78 65 63 2c 20 30 2c 20   OP_SqlExec, 0, 
11570 30 2c 20 30 2c 20 7a 53 75 62 53 71 6c 2c 20 50  0, 0, zSubSql, P
11580 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
11590 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
115a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
115b0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
115c0 45 78 70 69 72 65 29 3b 0a 20 20 20 20 62 72 65  Expire);.    bre
115d0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
115e0 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79  **   PRAGMA busy
115f0 5f 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20 20  _timeout.  **   
11600 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65  PRAGMA busy_time
11610 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a  out = N.  **.  *
11620 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 62  * Call sqlite3_b
11630 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20  usy_timeout(db, 
11640 4e 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  N).  Return the 
11650 63 75 72 72 65 6e 74 20 74 69 6d 65 6f 75 74 20  current timeout 
11660 76 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f 6e  value.  ** if on
11670 65 20 69 73 20 73 65 74 2e 20 20 49 66 20 6e 6f  e is set.  If no
11680 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6f 72   busy handler or
11690 20 61 20 64 69 66 66 65 72 65 6e 74 20 62 75 73   a different bus
116a0 79 20 68 61 6e 64 6c 65 72 20 69 73 20 73 65 74  y handler is set
116b0 0a 20 20 2a 2a 20 74 68 65 6e 20 30 20 69 73 20  .  ** then 0 is 
116c0 72 65 74 75 72 6e 65 64 2e 20 20 53 65 74 74 69  returned.  Setti
116d0 6e 67 20 74 68 65 20 62 75 73 79 5f 74 69 6d 65  ng the busy_time
116e0 6f 75 74 20 74 6f 20 30 20 6f 72 20 6e 65 67 61  out to 0 or nega
116f0 74 69 76 65 0a 20 20 2a 2a 20 64 69 73 61 62 6c  tive.  ** disabl
11700 65 73 20 74 68 65 20 74 69 6d 65 6f 75 74 2e 0a  es the timeout..
11710 20 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50 72    */.  /*case Pr
11720 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45 4f  agTyp_BUSY_TIMEO
11730 55 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b 0a  UT*/ default: {.
11740 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 61      assert( pPra
11750 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d 50  gma->ePragTyp==P
11760 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45  ragTyp_BUSY_TIME
11770 4f 55 54 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  OUT );.    if( z
11780 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
11790 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
117a0 6f 75 74 28 64 62 2c 20 73 71 6c 69 74 65 33 41  out(db, sqlite3A
117b0 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20 20  toi(zRight));.  
117c0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
117d0 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d 3e 62  ngleInt(v, db->b
117e0 75 73 79 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20  usyTimeout);.   
117f0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
11800 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
11810 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 0a  soft_heap_limit.
11820 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f    **   PRAGMA so
11830 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3d 20  ft_heap_limit = 
11840 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  N.  **.  ** IMPL
11850 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
11860 2d 32 36 33 34 33 2d 34 35 39 33 30 20 54 68 69  -26343-45930 Thi
11870 73 20 70 72 61 67 6d 61 20 69 6e 76 6f 6b 65 73  s pragma invokes
11880 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
11890 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
118a0 74 36 34 28 29 20 69 6e 74 65 72 66 61 63 65 20  t64() interface 
118b0 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e  with the argumen
118c0 74 20 4e 2c 20 69 66 20 4e 20 69 73 0a 20 20 2a  t N, if N is.  *
118d0 2a 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20  * specified and 
118e0 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  is a non-negativ
118f0 65 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 20  e integer..  ** 
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 36 34 34 35 31 2d 30 37 31 36 33  F: R-64451-07163
11920 20 54 68 65 20 73 6f 66 74 5f 68 65 61 70 5f 6c   The soft_heap_l
11930 69 6d 69 74 20 70 72 61 67 6d 61 20 61 6c 77 61  imit pragma alwa
11940 79 73 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  ys.  ** returns 
11950 74 68 65 20 73 61 6d 65 20 69 6e 74 65 67 65 72  the same integer
11960 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72   that would be r
11970 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 20  eturned by the. 
11980 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6f 66 74   ** sqlite3_soft
11990 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31  _heap_limit64(-1
119a0 29 20 43 2d 6c 61 6e 67 75 61 67 65 20 66 75 6e  ) C-language fun
119b0 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
119c0 73 65 20 50 72 61 67 54 79 70 5f 53 4f 46 54 5f  se PragTyp_SOFT_
119d0 48 45 41 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20  HEAP_LIMIT: {.  
119e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
119f0 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  N;.    if( zRigh
11a00 74 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f  t && sqlite3DecO
11a10 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74  rHexToI64(zRight
11a20 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &N)==SQLITE_OK
11a30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11a40 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
11a50 74 36 34 28 4e 29 3b 0a 20 20 20 20 7d 0a 20 20  t64(N);.    }.  
11a60 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
11a70 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 73 6f 66  t(v, sqlite3_sof
11a80 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 2d  t_heap_limit64(-
11a90 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  1));.    break;.
11aa0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
11ab0 20 50 52 41 47 4d 41 20 74 68 72 65 61 64 73 0a   PRAGMA threads.
11ac0 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68    **   PRAGMA th
11ad0 72 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a 20  reads = N.  **. 
11ae0 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68   ** Configure th
11af0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
11b00 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61   of worker threa
11b10 64 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ds.  Return the 
11b20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d  new.  ** maximum
11b30 2c 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  , which might be
11b40 20 6c 65 73 73 20 74 68 61 6e 20 72 65 71 75 65   less than reque
11b50 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  sted..  */.  cas
11b60 65 20 50 72 61 67 54 79 70 5f 54 48 52 45 41 44  e PragTyp_THREAD
11b70 53 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S: {.    sqlite3
11b80 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66  _int64 N;.    if
11b90 28 20 7a 52 69 67 68 74 0a 20 20 20 20 20 26 26  ( zRight.     &&
11ba0 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
11bb0 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 4e  ToI64(zRight, &N
11bc0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
11bd0 20 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29 7b    && N>=0.    ){
11be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
11bf0 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  imit(db, SQLITE_
11c00 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
11c10 45 41 44 53 2c 20 28 69 6e 74 29 28 4e 26 30 78  EADS, (int)(N&0x
11c20 37 66 66 66 66 66 66 66 29 29 3b 0a 20 20 20 20  7fffffff));.    
11c30 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
11c40 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33  leInt(v, sqlite3
11c50 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54  _limit(db, SQLIT
11c60 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
11c70 48 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20 20  HREADS, -1));.  
11c80 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69    break;.  }..#i
11c90 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
11ca0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
11cb0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
11cc0 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72 74    /*.  ** Report
11cd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
11ce0 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73 20  te of file logs 
11cf0 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
11d00 73 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  s.  */.  case Pr
11d10 61 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54 55  agTyp_LOCK_STATU
11d20 53 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  S: {.    static 
11d30 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
11d40 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d  t azLockName[] =
11d50 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b   {.      "unlock
11d60 65 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20 22  ed", "shared", "
11d70 72 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e 64  reserved", "pend
11d80 69 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76 65  ing", "exclusive
11d90 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ".    };.    int
11da0 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   i;.    pParse->
11db0 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f  nMem = 2;.    fo
11dc0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
11dd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
11de0 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 20 20  ree *pBt;.      
11df0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
11e00 74 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  te = "unknown";.
11e10 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
11e20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
11e30 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29 20  ].zDbSName==0 ) 
11e40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11e50 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
11e60 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
11e70 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  pBt==0 || sqlite
11e80 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
11e90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
11ea0 53 74 61 74 65 20 3d 20 22 63 6c 6f 73 65 64 22  State = "closed"
11eb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11ec0 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  ( sqlite3_file_c
11ed0 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20 64  ontrol(db, i ? d
11ee0 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
11ef0 6d 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20 20  me : 0, .       
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
11f20 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
11f30 54 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54  TATE, &j)==SQLIT
11f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11f50 20 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b   zState = azLock
11f60 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  Name[j];.      }
11f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11f80 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
11f90 2c 20 22 73 73 22 2c 20 64 62 2d 3e 61 44 62 5b  , "ss", db->aDb[
11fa0 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 7a 53 74  i].zDbSName, zSt
11fb0 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ate);.    }.    
11fc0 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
11fd0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
11fe0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a 20  _HAS_CODEC.  /* 
11ff0 50 72 61 67 6d 61 20 20 20 20 20 20 20 20 69 41  Pragma        iA
12000 72 67 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  rg.  ** --------
12010 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a  --   ------.  **
12020 20 20 6b 65 79 20 20 20 20 20 20 20 20 20 20 20    key           
12030 30 0a 20 20 2a 2a 20 20 72 65 6b 65 79 20 20 20  0.  **  rekey   
12040 20 20 20 20 20 20 31 0a 20 20 2a 2a 20 20 68 65        1.  **  he
12050 78 6b 65 79 20 20 20 20 20 20 20 20 32 0a 20 20  xkey        2.  
12060 2a 2a 20 20 68 65 78 72 65 6b 65 79 20 20 20 20  **  hexrekey    
12070 20 20 33 0a 20 20 2a 2a 20 20 74 65 78 74 6b 65    3.  **  textke
12080 79 20 20 20 20 20 20 20 34 0a 20 20 2a 2a 20 20  y       4.  **  
12090 74 65 78 74 72 65 6b 65 79 20 20 20 20 20 35 0a  textrekey     5.
120a0 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
120b0 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20 20 69  Typ_KEY: {.    i
120c0 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
120d0 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 61 67     int n = pPrag
120e0 6d 61 2d 3e 69 41 72 67 3c 34 20 3f 20 73 71 6c  ma->iArg<4 ? sql
120f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52 69  ite3Strlen30(zRi
12100 67 68 74 29 20 3a 20 2d 31 3b 0a 20 20 20 20 20  ght) : -1;.     
12110 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 69   if( (pPragma->i
12120 41 72 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a 20  Arg & 1)==0 ){. 
12130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b         sqlite3_k
12140 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
12150 52 69 67 68 74 2c 20 6e 29 3b 0a 20 20 20 20 20  Right, n);.     
12160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12170 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32  sqlite3_rekey_v2
12180 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74  (db, zDb, zRight
12190 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
121a0 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
121b0 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79   }.  case PragTy
121c0 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20 20  p_HEXKEY: {.    
121d0 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
121e0 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20      u8 iByte;.  
121f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
12200 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a   char zKey[40];.
12210 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69        for(i=0, i
12220 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  Byte=0; i<sizeof
12230 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c 69  (zKey)*2 && sqli
12240 74 65 33 49 73 78 64 69 67 69 74 28 7a 52 69 67  te3Isxdigit(zRig
12250 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ht[i]); i++){.  
12260 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69        iByte = (i
12270 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74  Byte<<4) + sqlit
12280 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67 68  e3HexToInt(zRigh
12290 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t[i]);.        i
122a0 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b  f( (i&1)!=0 ) zK
122b0 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b  ey[i/2] = iByte;
122c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
122d0 66 28 20 28 70 50 72 61 67 6d 61 2d 3e 69 41 72  f( (pPragma->iAr
122e0 67 20 26 20 31 29 3d 3d 30 20 29 7b 0a 20 20 20  g & 1)==0 ){.   
122f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79       sqlite3_key
12300 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65  _v2(db, zDb, zKe
12310 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d  y, i/2);.      }
12320 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
12330 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64  lite3_rekey_v2(d
12340 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f  b, zDb, zKey, i/
12350 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
12360 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
12370 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
12380 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
12390 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64  ODEC) || defined
123a0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
123b0 45 52 4f 44 29 0a 20 20 63 61 73 65 20 50 72 61  EROD).  case Pra
123c0 67 54 79 70 5f 41 43 54 49 56 41 54 45 5f 45 58  gTyp_ACTIVATE_EX
123d0 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a 52  TENSIONS: if( zR
123e0 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53  ight ){.#ifdef S
123f0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
12400 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
12410 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  trNICmp(zRight, 
12420 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b  "see-", 4)==0 ){
12430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61  .      sqlite3_a
12440 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69  ctivate_see(&zRi
12450 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23  ght[4]);.    }.#
12460 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
12470 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44  ITE_ENABLE_CEROD
12480 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12490 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c  StrNICmp(zRight,
124a0 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30   "cerod-", 6)==0
124b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
124c0 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64  3_activate_cerod
124d0 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20  (&zRight[6]);.  
124e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
124f0 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a   break;.#endif..
12500 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68    } /* End of th
12510 65 20 50 52 41 47 4d 41 20 73 77 69 74 63 68 20  e PRAGMA switch 
12520 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
12530 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 69 73 20  lowing block is 
12540 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53  a no-op unless S
12550 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
12560 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c 79  efined. Its only
12570 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 69 73  .  ** purpose is
12580 20 74 6f 20 65 78 65 63 75 74 65 20 61 73 73 65   to execute asse
12590 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
125a0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 69  to verify that i
125b0 66 20 74 68 65 0a 20 20 2a 2a 20 50 72 61 67 46  f the.  ** PragF
125c0 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20 66 6c  lg_NoColumns1 fl
125d0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
125e0 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  e caller specifi
125f0 65 64 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a 20  ed an argument. 
12600 20 2a 2a 20 74 6f 20 74 68 65 20 50 52 41 47 4d   ** to the PRAGM
12610 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  A, the implement
12620 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 61 64  ation has not ad
12630 64 65 64 20 61 6e 79 20 4f 50 5f 52 65 73 75 6c  ded any OP_Resul
12640 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e 73 74 72  tRow .  ** instr
12650 75 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 56  uctions to the V
12660 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  M.  */.  if( (pP
12670 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
12680 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75  & PragFlg_NoColu
12690 6d 6e 73 31 29 20 26 26 20 7a 52 69 67 68 74 20  mns1) && zRight 
126a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
126b0 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74  beVerifyNoResult
126c0 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a 70 72 61  Row(v);.  }..pra
126d0 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  gma_out:.  sqlit
126e0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4c 65  e3DbFree(db, zLe
126f0 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ft);.  sqlite3Db
12700 46 72 65 65 28 64 62 2c 20 7a 52 69 67 68 74 29  Free(db, zRight)
12710 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
12720 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12730 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ABLE./**********
12740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12780 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ***.** Implement
12790 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 70 6f 6e  ation of an epon
127a0 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
127b0 62 6c 65 20 74 68 61 74 20 72 75 6e 73 20 61 20  ble that runs a 
127c0 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a 74 79  pragma..**.*/.ty
127d0 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72 61  pedef struct Pra
127e0 67 6d 61 56 74 61 62 20 50 72 61 67 6d 61 56 74  gmaVtab PragmaVt
127f0 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ab;.typedef stru
12800 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  ct PragmaVtabCur
12810 73 6f 72 20 50 72 61 67 6d 61 56 74 61 62 43 75  sor PragmaVtabCu
12820 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 50 72 61  rsor;.struct Pra
12830 67 6d 61 56 74 61 62 20 7b 0a 20 20 73 71 6c 69  gmaVtab {.  sqli
12840 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20  te3_vtab base;  
12850 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c        /* Base cl
12860 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69  ass.  Must be fi
12870 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rst */.  sqlite3
12880 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
12890 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
128a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
128b0 20 77 68 69 63 68 20 69 74 20 62 65 6c 6f 6e 67   which it belong
128c0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50 72 61  s */.  const Pra
128d0 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 20  gmaName *pName; 
128e0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
128f0 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75 38 20 6e  pragma */.  u8 n
12900 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20  Hidden;         
12910 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12920 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  of hidden column
12930 73 20 2a 2f 0a 20 20 75 38 20 69 48 69 64 64 65  s */.  u8 iHidde
12940 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
12950 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
12960 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 63 6f   first hidden co
12970 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  lumn */.};.struc
12980 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73  t PragmaVtabCurs
12990 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  or {.  sqlite3_v
129a0 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b  tab_cursor base;
129b0 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20   /* Base class. 
129c0 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   Must be first *
129d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
129e0 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 20 2f 2a   *pPragma;    /*
129f0 20 54 68 65 20 70 72 61 67 6d 61 20 73 74 61 74   The pragma stat
12a00 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a  ement to run */.
12a10 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
12a20 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 43  Rowid;      /* C
12a30 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
12a40 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 32 5d    char *azArg[2]
12a50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
12a60 61 6c 75 65 20 6f 66 20 74 68 65 20 61 72 67 75  alue of the argu
12a70 6d 65 6e 74 20 61 6e 64 20 73 63 68 65 6d 61 20  ment and schema 
12a80 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 50 72  */.};../* .** Pr
12a90 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
12aa0 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e 65  le module xConne
12ab0 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  ct method..*/.st
12ac0 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
12ad0 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71  tabConnect(.  sq
12ae0 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
12af0 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
12b00 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
12b10 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
12b20 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
12b30 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
12b40 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  zErr.){.  const 
12b50 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72 61  PragmaName *pPra
12b60 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20 50 72 61  gma = (const Pra
12b70 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78 3b 0a 20  gmaName*)pAux;. 
12b80 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
12b90 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  b = 0;.  int rc;
12ba0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
12bb0 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a  har cSep = '(';.
12bc0 20 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b 0a    StrAccum acc;.
12bd0 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
12be0 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
12bf0 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55  METER(argc);.  U
12c00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12c10 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  argv);.  sqlite3
12c20 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63  StrAccumInit(&ac
12c30 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a 65  c, 0, zBuf, size
12c40 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20 20  of(zBuf), 0);.  
12c50 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
12c60 6e 64 61 6c 6c 28 26 61 63 63 2c 20 22 43 52 45  ndall(&acc, "CRE
12c70 41 54 45 20 54 41 42 4c 45 20 78 22 29 3b 0a 20  ATE TABLE x");. 
12c80 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 50 72 61   for(i=0, j=pPra
12c90 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61 6d 65 3b  gma->iPragCName;
12ca0 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e 50 72 61   i<pPragma->nPra
12cb0 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a 2b 2b  gCName; i++, j++
12cc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
12cd0 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63 2c  tr_appendf(&acc,
12ce0 20 22 25 63 5c 22 25 73 5c 22 22 2c 20 63 53 65   "%c\"%s\"", cSe
12cf0 70 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a 5d 29  p, pragCName[j])
12d00 3b 0a 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27  ;.    cSep = ','
12d10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d 30  ;.  }.  if( i==0
12d20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12d30 73 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63  str_appendf(&acc
12d40 2c 20 22 28 5c 22 25 73 5c 22 22 2c 20 70 50 72  , "(\"%s\"", pPr
12d50 61 67 6d 61 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  agma->zName);.  
12d60 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6a 20 3d    i++;.  }.  j =
12d70 20 30 3b 0a 20 20 69 66 28 20 70 50 72 61 67 6d   0;.  if( pPragm
12d80 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72  a->mPragFlg & Pr
12d90 61 67 46 6c 67 5f 52 65 73 75 6c 74 31 20 29 7b  agFlg_Result1 ){
12da0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
12db0 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c  _appendall(&acc,
12dc0 20 22 2c 61 72 67 20 48 49 44 44 45 4e 22 29 3b   ",arg HIDDEN");
12dd0 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
12de0 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72  if( pPragma->mPr
12df0 61 67 46 6c 67 20 26 20 28 50 72 61 67 46 6c 67  agFlg & (PragFlg
12e00 5f 53 63 68 65 6d 61 4f 70 74 7c 50 72 61 67 46  _SchemaOpt|PragF
12e10 6c 67 5f 53 63 68 65 6d 61 52 65 71 29 20 29 7b  lg_SchemaReq) ){
12e20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
12e30 5f 61 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c  _appendall(&acc,
12e40 20 22 2c 73 63 68 65 6d 61 20 48 49 44 44 45 4e   ",schema HIDDEN
12e50 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d  ");.    j++;.  }
12e60 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61  .  sqlite3_str_a
12e70 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29 22 2c  ppend(&acc, ")",
12e80 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   1);.  sqlite3St
12e90 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63  rAccumFinish(&ac
12ea0 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74  c);.  assert( st
12eb0 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73 69 7a  rlen(zBuf) < siz
12ec0 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b 0a 20  eof(zBuf)-1 );. 
12ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
12ee0 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 7a  clare_vtab(db, z
12ef0 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Buf);.  if( rc==
12f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12f10 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56   pTab = (PragmaV
12f20 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  tab*)sqlite3_mal
12f30 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61 67 6d  loc(sizeof(Pragm
12f40 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69 66 28  aVtab));.    if(
12f50 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
12f60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12f70 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
12f80 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 61        memset(pTa
12f90 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61  b, 0, sizeof(Pra
12fa0 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 20  gmaVtab));.     
12fb0 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d 20 70   pTab->pName = p
12fc0 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20 70 54  Pragma;.      pT
12fd0 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  ab->db = db;.   
12fe0 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e     pTab->iHidden
12ff0 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62   = i;.      pTab
13000 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b 0a 20  ->nHidden = j;. 
13010 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
13020 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
13030 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
13040 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
13050 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  db));.  }..  *pp
13060 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f  Vtab = (sqlite3_
13070 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20 72 65  vtab*)pTab;.  re
13080 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
13090 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
130a0 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
130b0 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f  Disconnect metho
130c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
130d0 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f   pragmaVtabDisco
130e0 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74  nnect(sqlite3_vt
130f0 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 50 72  ab *pVtab){.  Pr
13100 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d  agmaVtab *pTab =
13110 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 70 56   (PragmaVtab*)pV
13120 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  tab;.  sqlite3_f
13130 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72 65 74  ree(pTab);.  ret
13140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13150 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20  ../* Figure out 
13160 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74  the best index t
13170 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63 68 20  o use to search 
13180 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  a pragma virtual
13190 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
131a0 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65 61 6c  ere are not real
131b0 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63 68 6f  ly any index cho
131c0 69 63 65 73 2e 20 20 42 75 74 20 77 65 20 77 61  ices.  But we wa
131d0 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  nt to encourage 
131e0 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 6c 61  the.** query pla
131f0 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d 3d 20  nner to give == 
13200 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61  constraints on a
13210 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20 70 61  s many hidden pa
13220 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a 20 70  rameters as.** p
13230 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65 73 70  ossible, and esp
13240 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65 20 66  ecially on the f
13250 69 72 73 74 20 68 69 64 64 65 6e 20 70 61 72 61  irst hidden para
13260 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74 75 72  meter.  So retur
13270 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f 73 74  n a.** high cost
13280 20 69 66 20 68 69 64 64 65 6e 20 70 61 72 61 6d   if hidden param
13290 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f 6e 73  eters are uncons
132a0 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  trained..*/.stat
132b0 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
132c0 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74  bBestIndex(sqlit
132d0 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71  e3_vtab *tab, sq
132e0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
132f0 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 50   *pIdxInfo){.  P
13300 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
13310 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 74  = (PragmaVtab*)t
13320 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  ab;.  const stru
13330 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13340 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f  _constraint *pCo
13350 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20  nstraint;.  int 
13360 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65 65 6e  i, j;.  int seen
13370 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e 66 6f  [2];..  pIdxInfo
13380 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
13390 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69  = (double)1;.  i
133a0 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e  f( pTab->nHidden
133b0 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 53 51  ==0 ){ return SQ
133c0 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70 43 6f  LITE_OK; }.  pCo
133d0 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
133e0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
133f0 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20 30 3b  ;.  seen[0] = 0;
13400 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30 3b 0a  .  seen[1] = 0;.
13410 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
13420 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
13430 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74 72  nt; i++, pConstr
13440 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28  aint++){.    if(
13450 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73   pConstraint->us
13460 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  able==0 ) contin
13470 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ue;.    if( pCon
13480 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51 4c  straint->op!=SQL
13490 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
134a0 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69 6e  AINT_EQ ) contin
134b0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ue;.    if( pCon
134c0 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e  straint->iColumn
134d0 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e   < pTab->iHidden
134e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
134f0 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74   j = pConstraint
13500 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54 61 62  ->iColumn - pTab
13510 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20 20 61  ->iHidden;.    a
13520 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29 3b 0a  ssert( j < 2 );.
13530 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20 69 2b      seen[j] = i+
13540 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 65 65  1;.  }.  if( see
13550 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70  n[0]==0 ){.    p
13560 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
13570 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65  edCost = (double
13580 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20  )2147483647;.   
13590 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
135a0 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34 37 34  atedRows = 21474
135b0 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74 75 72  83647;.    retur
135c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
135d0 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d 2d 31  .  j = seen[0]-1
135e0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
135f0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
13600 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b  ].argvIndex = 1;
13610 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  .  pIdxInfo->aCo
13620 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d  nstraintUsage[j]
13630 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  .omit = 1;.  if(
13640 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20 72 65   seen[1]==0 ) re
13650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13660 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
13670 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
13680 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78 49 6e  ble)20;.  pIdxIn
13690 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
136a0 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20 73 65  s = 20;.  j = se
136b0 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64 78 49  en[1]-1;.  pIdxI
136c0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
136d0 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64  Usage[j].argvInd
136e0 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78 49 6e  ex = 2;.  pIdxIn
136f0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
13700 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31  sage[j].omit = 1
13710 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13720 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61  E_OK;.}../* Crea
13730 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
13740 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61 20 76  for the pragma v
13750 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
13760 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
13770 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69 74 65  aVtabOpen(sqlite
13780 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 73  3_vtab *pVtab, s
13790 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
137a0 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a  or **ppCursor){.
137b0 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
137c0 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43 73 72  or *pCsr;.  pCsr
137d0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
137e0 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61  rsor*)sqlite3_ma
137f0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 43 73  lloc(sizeof(*pCs
13800 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72 3d  r));.  if( pCsr=
13810 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
13820 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
13830 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65  et(pCsr, 0, size
13840 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  of(PragmaVtabCur
13850 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e 62  sor));.  pCsr->b
13860 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56 74 61  ase.pVtab = pVta
13870 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d  b;.  *ppCursor =
13880 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20 20   &pCsr->base;.  
13890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
138a0 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20 61 6c  ;.}../* Clear al
138b0 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70  l content from p
138c0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
138d0 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 73  ble cursor. */.s
138e0 74 61 74 69 63 20 76 6f 69 64 20 70 72 61 67 6d  tatic void pragm
138f0 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
13900 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
13910 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20  r *pCsr){.  int 
13920 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  i;.  sqlite3_fin
13930 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72 61  alize(pCsr->pPra
13940 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e 70 50  gma);.  pCsr->pP
13950 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66 6f 72  ragma = 0;.  for
13960 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
13970 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 3b 20  e(pCsr->azArg); 
13980 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
13990 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 7a 41  3_free(pCsr->azA
139a0 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43 73 72  rg[i]);.    pCsr
139b0 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30 3b 0a  ->azArg[i] = 0;.
139c0 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73 65 20    }.}../* Close 
139d0 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  a pragma virtual
139e0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f   table cursor */
139f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
13a00 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71 6c 69  maVtabClose(sqli
13a10 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
13a20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d 61 56  *cur){.  PragmaV
13a30 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20  tabCursor *pCsr 
13a40 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  = (PragmaVtabCur
13a50 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72 61 67  sor*)cur;.  prag
13a60 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
13a70 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c 69 74  r(pCsr);.  sqlit
13a80 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20  e3_free(pCsr);. 
13a90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13aa0 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65  K;.}../* Advance
13ab0 20 74 68 65 20 70 72 61 67 6d 61 20 76 69 72 74   the pragma virt
13ac0 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
13ad0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
13ae0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
13af0 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28 73 71  ragmaVtabNext(sq
13b00 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
13b10 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b  r *pVtabCursor){
13b20 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13b30 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13b40 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
13b50 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e  VtabCursor;.  in
13b60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13b70 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
13b80 74 20 74 68 65 20 78 52 6f 77 69 64 20 76 61 6c  t the xRowid val
13b90 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 69 52  ue */.  pCsr->iR
13ba0 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65 72 74  owid++;.  assert
13bb0 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20  ( pCsr->pPragma 
13bc0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
13bd0 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW!=sqlite3_ste
13be0 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29  p(pCsr->pPragma)
13bf0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
13c00 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
13c10 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20  sr->pPragma);.  
13c20 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20    pCsr->pPragma 
13c30 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d 61 56  = 0;.    pragmaV
13c40 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28 70  tabCursorClear(p
13c50 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Csr);.  }.  retu
13c60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
13c70 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
13c80 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 46 69  table module xFi
13c90 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  lter method..*/.
13ca0 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
13cb0 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20 20 73  aVtabFilter(.  s
13cc0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13cd0 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
13ce0 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20   .  int idxNum, 
13cf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
13d00 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  tr,.  int argc, 
13d10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
13d20 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67 6d 61  argv.){.  Pragma
13d30 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13d40 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
13d50 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
13d60 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  r;.  PragmaVtab 
13d70 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56  *pTab = (PragmaV
13d80 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73 6f  tab*)(pVtabCurso
13d90 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 6e 74  r->pVtab);.  int
13da0 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   rc;.  int i, j;
13db0 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b  .  StrAccum acc;
13dc0 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 0a  .  char *zSql;..
13dd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
13de0 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20 55 4e  ER(idxNum);.  UN
13df0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
13e00 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67 6d 61  dxStr);.  pragma
13e10 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28  VtabCursorClear(
13e20 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28 70 54  pCsr);.  j = (pT
13e30 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72 61 67  ab->pName->mPrag
13e40 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65  Flg & PragFlg_Re
13e50 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20 3a 20  sult1)!=0 ? 0 : 
13e60 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
13e70 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  argc; i++, j++){
13e80 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13e90 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
13ea0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
13eb0 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
13ec0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  );.    assert( j
13ed0 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d  <ArraySize(pCsr-
13ee0 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20 20 20 61  >azArg) );.    a
13ef0 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 7a 41  ssert( pCsr->azA
13f00 72 67 5b 6a 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  rg[j]==0 );.    
13f10 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
13f20 20 20 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a     pCsr->azArg[j
13f30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
13f40 6e 74 66 28 22 25 73 22 2c 20 7a 54 65 78 74 29  ntf("%s", zText)
13f50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 72  ;.      if( pCsr
13f60 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 7b  ->azArg[j]==0 ){
13f70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13f80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13f90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13fa0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
13fb0 6d 49 6e 69 74 28 26 61 63 63 2c 20 30 2c 20 30  mInit(&acc, 0, 0
13fc0 2c 20 30 2c 20 70 54 61 62 2d 3e 64 62 2d 3e 61  , 0, pTab->db->a
13fd0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
13fe0 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 29 3b  IT_SQL_LENGTH]);
13ff0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61  .  sqlite3_str_a
14000 70 70 65 6e 64 61 6c 6c 28 26 61 63 63 2c 20 22  ppendall(&acc, "
14010 50 52 41 47 4d 41 20 22 29 3b 0a 20 20 69 66 28  PRAGMA ");.  if(
14020 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 31 5d 20   pCsr->azArg[1] 
14030 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
14040 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63 2c  tr_appendf(&acc,
14050 20 22 25 51 2e 22 2c 20 70 43 73 72 2d 3e 61 7a   "%Q.", pCsr->az
14060 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 73  Arg[1]);.  }.  s
14070 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
14080 64 61 6c 6c 28 26 61 63 63 2c 20 70 54 61 62 2d  dall(&acc, pTab-
14090 3e 70 4e 61 6d 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  >pName->zName);.
140a0 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a 41 72    if( pCsr->azAr
140b0 67 5b 30 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  g[0] ){.    sqli
140c0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
140d0 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70 43 73  &acc, "=%Q", pCs
140e0 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  r->azArg[0]);.  
140f0 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  }.  zSql = sqlit
14100 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
14110 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20 7a 53  (&acc);.  if( zS
14120 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ql==0 ) return S
14130 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
14140 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
14150 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64 62 2c  are_v2(pTab->db,
14160 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 73 72   zSql, -1, &pCsr
14170 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b 0a 20  ->pPragma, 0);. 
14180 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
14190 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ql);.  if( rc!=S
141a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
141b0 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d  pTab->base.zErrM
141c0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
141d0 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
141e0 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62 2d 3e  e3_errmsg(pTab->
141f0 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  db));.    return
14200 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
14210 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74  n pragmaVtabNext
14220 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 7d  (pVtabCursor);.}
14230 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ../*.** Pragma v
14240 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
14250 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f 64 2e  ule xEof method.
14260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14270 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73 71 6c  ragmaVtabEof(sql
14280 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
14290 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b 0a   *pVtabCursor){.
142a0 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
142b0 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
142c0 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56  maVtabCursor*)pV
142d0 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72 65 74  tabCursor;.  ret
142e0 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72 61 67  urn (pCsr->pPrag
142f0 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20 54 68  ma==0);.}../* Th
14300 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64  e xColumn method
14310 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20   simply returns 
14320 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
14330 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  g column from.**
14340 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20 0a 2a   the PRAGMA.  .*
14350 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
14360 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28 0a 20  gmaVtabColumn(. 
14370 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
14380 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
14390 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  r, .  sqlite3_co
143a0 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20 20 69  ntext *ctx, .  i
143b0 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67 6d 61  nt i.){.  Pragma
143c0 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
143d0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
143e0 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
143f0 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  r;.  PragmaVtab 
14400 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56  *pTab = (PragmaV
14410 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73 6f  tab*)(pVtabCurso
14420 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 66 28  r->pVtab);.  if(
14430 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64 65 6e   i<pTab->iHidden
14440 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14450 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
14460 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
14470 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 50 72  _value(pCsr->pPr
14480 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d 65 6c  agma, i));.  }el
14490 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
144a0 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
144b0 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 2d 70   pCsr->azArg[i-p
144c0 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c 2d 31  Tab->iHidden],-1
144d0 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
144e0 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T);.  }.  return
144f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14500 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72  * .** Pragma vir
14510 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
14520 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e  e xRowid method.
14530 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14540 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64 28 73  ragmaVtabRowid(s
14550 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
14560 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
14570 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
14580 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
14590 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
145a0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
145b0 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
145c0 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77 69  *p = pCsr->iRowi
145d0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
145e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
145f0 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
14600 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  table object */.
14610 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
14620 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72 61 67  ite3_module prag
14630 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d 20 7b  maVtabModule = {
14640 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
14670 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14690 20 78 43 72 65 61 74 65 20 2d 20 63 72 65 61 74   xCreate - creat
146a0 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  e a table */.  p
146b0 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74  ragmaVtabConnect
146c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
146d0 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65 63  Connect - connec
146e0 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67  t to an existing
146f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67   table */.  prag
14700 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65 78 2c  maVtabBestIndex,
14710 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73           /* xBes
14720 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72 6d 69  tIndex - Determi
14730 6e 65 20 73 65 61 72 63 68 20 73 74 72 61 74 65  ne search strate
14740 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  gy */.  pragmaVt
14750 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20  abDisconnect,   
14760 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e       /* xDisconn
14770 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63 74  ect - Disconnect
14780 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a 2f   from a table */
14790 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147b0 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20 44 72  /* xDestroy - Dr
147c0 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  op a table */.  
147d0 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 2c 20  pragmaVtabOpen, 
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
147f0 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
14800 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d  ursor */.  pragm
14810 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20 20 20  aVtabClose,     
14820 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
14830 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73  e - close a curs
14840 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  or */.  pragmaVt
14850 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20  abFilter,       
14860 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20       /* xFilter 
14870 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e  - configure scan
14880 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
14890 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74    pragmaVtabNext
148a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
148b0 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63  * xNext - advanc
148c0 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
148d0 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c 20 20  pragmaVtabEof,  
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
148f0 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67 6d 61  xEof */.  pragma
14900 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  VtabColumn,     
14910 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d         /* xColum
14920 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  n - read data */
14930 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77  .  pragmaVtabRow
14940 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
14950 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64  /* xRowid - read
14960 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20   data */.  0,   
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14980 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61          /* xUpda
14990 74 65 20 2d 20 77 72 69 74 65 20 64 61 74 61 20  te - write data 
149a0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149c0 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62 65    /* xBegin - be
149d0 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
149e0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79 6e    /* xSync - syn
14a10 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  c transaction */
14a20 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f 6d  /* xCommit - com
14a50 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mit transaction 
14a60 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a80 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2d    /* xRollback -
14a90 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
14aa0 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
14ad0 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63 74  Function - funct
14ae0 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 20  ion overloading 
14af0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20 72    /* xRename - r
14b20 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c 65 20  ename the table 
14b30 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20    /* xSavepoint 
14b60 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b80 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f    /* xRelease */
14b90 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a  /* xRollbackTo *
14bc0 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61 6d 65 20   /* xShadowName 
14bf0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  */.};../*.** Che
14c00 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a 54 61  ck to see if zTa
14c10 62 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c 79 20  bName is really 
14c20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 70 72  the name of a pr
14c30 61 67 6d 61 2e 20 20 49 66 20 69 74 20 69 73 2c  agma.  If it is,
14c40 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69 73 74 65  .** then registe
14c50 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76  r an eponymous v
14c60 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f 72  irtual table for
14c70 20 74 68 61 74 20 70 72 61 67 6d 61 20 61 6e 64   that pragma and
14c80 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
14c90 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 6f 64 75  nter to the Modu
14ca0 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
14cb0 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61  e new virtual ta
14cc0 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65 20 2a  ble..*/.Module *
14cd0 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61  sqlite3PragmaVta
14ce0 62 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65  bRegister(sqlite
14cf0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
14d00 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e  r *zName){.  con
14d10 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
14d20 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
14d30 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
14d40 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f  (zName, "pragma_
14d50 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 4e  ", 7)==0 );.  pN
14d60 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f 63 61  ame = pragmaLoca
14d70 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20 20 69  te(zName+7);.  i
14d80 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( pName==0 ) re
14d90 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
14da0 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26  Name->mPragFlg &
14db0 20 28 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74   (PragFlg_Result
14dc0 30 7c 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74  0|PragFlg_Result
14dd0 31 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  1))==0 ) return 
14de0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
14df0 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
14e00 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65  ->aModule, zName
14e10 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
14e20 20 73 71 6c 69 74 65 33 56 74 61 62 43 72 65 61   sqlite3VtabCrea
14e30 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e 61  teModule(db, zNa
14e40 6d 65 2c 20 26 70 72 61 67 6d 61 56 74 61 62 4d  me, &pragmaVtabM
14e50 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29 70 4e  odule, (void*)pN
14e60 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6e 64  ame, 0);.}..#end
14e70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
14e80 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
14e90 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
14ea0 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20  ITE_OMIT_PRAGMA 
14eb0 2a 2f 0a                                         */.