/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 28f232da1c31db79cbfe4818650c5fd293083a99af8f9f3eafcef254ce97613b:


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 77 68 69 6c 65 28 20  K );.    while( 
1ba0: 28 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20  (n--) > 0 ){.   
1bb0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
1bc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bd0: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
1be0: 6c 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20  lags(pDb->pBt,. 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  (pDb->safety_lev
1c10: 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  el & PAGER_SYNCH
1c20: 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 0a 20 20 20  RONOUS_MASK).   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50  | (db->flags & P
1c50: 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29  AGER_FLAGS_MASK)
1c60: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1c70: 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20    pDb++;.    }. 
1c80: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
1c90: 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72 46  ine setAllPagerF
1ca0: 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d 6f  lags(X)  /* no-o
1cb0: 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  p */.#endif.../*
1cc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75 6d  .** Return a hum
1cd0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d 65  an-readable name
1ce0: 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   for a constrain
1cf0: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63 74  t resolution act
1d00: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
1d10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
1d20: 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20 63  IGN_KEY.static c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69 6f  onst char *actio
1d40: 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e 29  nName(u8 action)
1d50: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1d60: 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68 28  zName;.  switch(
1d70: 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 63   action ){.    c
1d80: 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a 20  ase OE_SetNull: 
1d90: 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e 55   zName = "SET NU
1da0: 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  LL";        brea
1db0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 53  k;.    case OE_S
1dc0: 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20 3d  etDflt:  zName =
1dd0: 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b 20   "SET DEFAULT"; 
1de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1df0: 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a 20  ase OE_Cascade: 
1e00: 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41 44   zName = "CASCAD
1e10: 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  E";         brea
1e20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52  k;.    case OE_R
1e30: 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20 3d  estrict: zName =
1e40: 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20 20   "RESTRICT";    
1e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
1e60: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
1e70: 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43 54   zName = "NO ACT
1e80: 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20 20  ION";  .        
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1ea0: 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f 45  sert( action==OE
1eb0: 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b 0a  _None ); break;.
1ec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
1ed0: 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  me;.}.#endif.../
1ee0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
1ef0: 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
1f00: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
1f10: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63 6f  URNALMODE_XXX co
1f20: 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69 6e  nstants.** defin
1f30: 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20 54  ed in pager.h. T
1f40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1f50: 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69 61  urns the associa
1f60: 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a 2a  ted lowercase.**
1f70: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e 61   journal-mode na
1f80: 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  me..*/.const cha
1f90: 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  r *sqlite3Journa
1fa0: 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65 4d  lModename(int eM
1fb0: 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ode){.  static c
1fc0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d 6f  har * const azMo
1fd0: 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20  deName[] = {.   
1fe0: 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72 73   "delete", "pers
1ff0: 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74 72  ist", "off", "tr
2000: 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72 79  uncate", "memory
2010: 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
2020: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 2c  _OMIT_WAL.     ,
2030: 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20 20   "wal".#endif.  
2040: 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  };.  assert( PAG
2050: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2060: 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61 73  ELETE==0 );.  as
2070: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
2080: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3d  NALMODE_PERSIST=
2090: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
20a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20b0: 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61 73  E_OFF==2 );.  as
20c0: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
20d0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
20e0: 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==3 );.  assert(
20f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2100: 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b 0a  DE_MEMORY==4 );.
2110: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2120: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 3d  JOURNALMODE_WAL=
2130: 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =5 );.  assert( 
2140: 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f 64  eMode>=0 && eMod
2150: 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 4d  e<=ArraySize(azM
2160: 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20 69  odeName) );..  i
2170: 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79 53  f( eMode==ArrayS
2180: 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29 20  ize(azModeName) 
2190: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
21a0: 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65 5b  turn azModeName[
21b0: 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eMode];.}../*.**
21c0: 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d 61   Locate a pragma
21d0: 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61 4e   in the aPragmaN
21e0: 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
21f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72 61  static const Pra
2200: 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61 4c  gmaName *pragmaL
2210: 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72  ocate(const char
2220: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
2230: 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d 20  upr, lwr, mid = 
2240: 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20 30  0, rc;.  lwr = 0
2250: 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79 53  ;.  upr = ArrayS
2260: 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65 29  ize(aPragmaName)
2270: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77 72  -1;.  while( lwr
2280: 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69 64  <=upr ){.    mid
2290: 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
22a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22b0: 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
22c0: 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64 5d  aPragmaName[mid]
22d0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
22e0: 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a   rc==0 ) break;.
22f0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a      if( rc<0 ){.
2300: 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64 20        upr = mid 
2310: 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
2320: 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 20        lwr = mid 
2330: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
2340: 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72 20   return lwr>upr 
2350: 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e 61  ? 0 : &aPragmaNa
2360: 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  me[mid];.}../*.*
2370: 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75 74  * Helper subrout
2380: 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20 69  ine for PRAGMA i
2390: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a 0a  ntegrity_check:.
23a0: 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  **.** Generate c
23b0: 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61 20  ode to output a 
23c0: 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72 65  single-column re
23d0: 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 74 68  sult row with th
23e0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 68 65 6c 64  e result.** held
23f0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65 67   in register reg
2400: 52 65 73 75 6c 74 2e 20 20 44 65 63 72 65 6d 65  Result.  Decreme
2410: 6e 74 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  nt the result co
2420: 75 6e 74 20 61 6e 64 20 68 61 6c 74 20 69 66 0a  unt and halt if.
2430: 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
2440: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
2450: 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 69  rows have been i
2460: 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssued..*/.static
2470: 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43 68   int integrityCh
2480: 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64 62  eckResultRow(Vdb
2490: 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 52 65 73  e *v, int regRes
24a0: 75 6c 74 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ult){.  int addr
24b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
24c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
24d0: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
24e0: 2c 20 31 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  , 1);.  addr = s
24f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2500: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31 2c  (v, OP_IfPos, 1,
2510: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2520: 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 31 29  entAddr(v)+2, 1)
2530: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
2540: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
2550: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48  beAddOp2(v, OP_H
2560: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  alt, 0, 0);.  re
2570: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
2580: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70 72  .** Process a pr
2590: 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  agma statement. 
25a0: 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20   .**.** Pragmas 
25b0: 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d  are of this form
25c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41  :.**.**      PRA
25d0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64 20  GMA [schema.]id 
25e0: 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a 20  [= value].**.** 
25f0: 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d  The identifier m
2600: 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73  ight also be a s
2610: 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75  tring.  The valu
2620: 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61  e is a string, a
2630: 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  nd.** identifier
2640: 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20  , or a number.  
2650: 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20  If minusFlag is 
2660: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76  true, then the v
2670: 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d  alue is.** a num
2680: 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72 65  ber that was pre
2690: 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73  ceded by a minus
26a0: 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   sign..**.** If 
26b0: 74 68 65 20 6c 65 66 74 20 73 69 64 65 20 69 73  the left side is
26c0: 20 22 64 61 74 61 62 61 73 65 2e 69 64 22 20 74   "database.id" t
26d0: 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65 20  hen pId1 is the 
26e0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a  database name.**
26f0: 20 61 6e 64 20 70 49 64 32 20 69 73 20 74 68 65   and pId2 is the
2700: 20 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65 66   id.  If the lef
2710: 74 20 73 69 64 65 20 69 73 20 6a 75 73 74 20 22  t side is just "
2720: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
2730: 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20 70   the.** id and p
2740: 49 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74 79  Id2 is any empty
2750: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64   string..*/.void
2760: 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 0a   sqlite3Pragma(.
2770: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2780: 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31 2c   .  Token *pId1,
2790: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
27a0: 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61   part of [schema
27b0: 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20 20  .]id field */.  
27c0: 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20 20  Token *pId2,    
27d0: 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
27e0: 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d 69  rt of [schema.]i
27f0: 64 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c 4c  d field, or NULL
2800: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56 61   */.  Token *pVa
2810: 6c 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f 6b  lue,      /* Tok
2820: 65 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c 20  en for <value>, 
2830: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
2840: 20 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20 20   minusFlag      
2850: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27 2d   /* True if a '-
2860: 27 20 73 69 67 6e 20 70 72 65 63 65 64 65 64 20  ' sign preceded 
2870: 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20 20  <value> */.){.  
2880: 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b  char *zLeft = 0;
2890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
28a0: 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73  rminated UTF-8 s
28b0: 74 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20 20  tring <id> */.  
28c0: 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30  char *zRight = 0
28d0: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65  ;      /* Nul-te
28e0: 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73  rminated UTF-8 s
28f0: 74 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20 6f  tring <value>, o
2900: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
2910: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b  t char *zDb = 0;
2920: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
2930: 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f 6b  se name */.  Tok
2940: 65 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20  en *pId;        
2950: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2960: 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f 0a  o <id> token */.
2970: 20 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b 34    char *aFcntl[4
2980: 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75  ];       /* Argu
2990: 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f 46  ment to SQLITE_F
29a0: 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a 20  CNTL_PRAGMA */. 
29b0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
29c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
29d0: 61 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c 64  ase index for <d
29e0: 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69 6e  atabase> */.  in
29f0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65             /* re
2a10: 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d 20  turn value form 
2a20: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2a30: 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  GMA */.  sqlite3
2a40: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2a50: 62 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74  b;    /* The dat
2a60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2a70: 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20   */.  Db *pDb;  
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
2aa0: 69 63 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  ic database bein
2ab0: 67 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20 20  g pragmaed */.  
2ac0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
2ad0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
2ae0: 3b 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73  ;  /* Prepared s
2af0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f  tatement */.  co
2b00: 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
2b10: 70 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54 68  pPragma;   /* Th
2b20: 65 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20 69  e pragma */..  i
2b30: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
2b40: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
2b50: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a 20  unOnlyOnce(v);. 
2b60: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
2b70: 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70 72  2;..  /* Interpr
2b80: 65 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e 5d  et the [schema.]
2b90: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61   part of the pra
2ba0: 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 69  gma statement. i
2bb0: 44 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 69  Db is the.  ** i
2bc0: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
2bd0: 62 61 73 65 20 74 68 69 73 20 70 72 61 67 6d 61  base this pragma
2be0: 20 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69 65   is being applie
2bf0: 64 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b 5d  d to in db.aDb[]
2c00: 2e 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c  . */.  iDb = sql
2c10: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
2c20: 70 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70 49  pParse, pId1, pI
2c30: 64 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66 28  d2, &pId);.  if(
2c40: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
2c50: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
2c60: 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49 66  b[iDb];..  /* If
2c70: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
2c80: 73 65 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c  se has been expl
2c90: 69 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73 20  icitly named as 
2ca0: 70 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20 2a  part of the .  *
2cb0: 2a 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20 73  * pragma, make s
2cc0: 75 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e 20  ure it is open. 
2cd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62 3d  .  */.  if( iDb=
2ce0: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70 65  =1 && sqlite3Ope
2cf0: 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50  nTempDatabase(pP
2d00: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
2d10: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65 66  urn;.  }..  zLef
2d20: 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  t = sqlite3NameF
2d30: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49 64  romToken(db, pId
2d40: 29 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74 20  );.  if( !zLeft 
2d50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2d60: 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20  minusFlag ){.   
2d70: 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   zRight = sqlite
2d80: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d 25  3MPrintf(db, "-%
2d90: 54 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d  T", pValue);.  }
2da0: 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74  else{.    zRight
2db0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
2dc0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61 6c  omToken(db, pVal
2dd0: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ue);.  }..  asse
2de0: 72 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a 44  rt( pId2 );.  zD
2df0: 62 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f 20  b = pId2->n>0 ? 
2e00: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a 20  pDb->zDbSName : 
2e10: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
2e20: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
2e30: 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 2c  , SQLITE_PRAGMA,
2e40: 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c 20   zLeft, zRight, 
2e50: 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  zDb) ){.    goto
2e60: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d   pragma_out;.  }
2e70: 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20 53  ..  /* Send an S
2e80: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47  QLITE_FCNTL_PRAG
2e90: 4d 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  MA file-control 
2ea0: 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  to the underlyin
2eb0: 67 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e 65  g VFS.  ** conne
2ec0: 63 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72 65  ction.  If it re
2ed0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2c  turns SQLITE_OK,
2ee0: 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68 61   then assume tha
2ef0: 74 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20 68  t the VFS.  ** h
2f00: 61 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67 6d  andled the pragm
2f10: 61 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61  a and generate a
2f20: 20 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64 20   no-op prepared 
2f30: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a 0a  statement..  **.
2f40: 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
2f50: 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38 2d  ION-OF: R-12238-
2f60: 35 35 31 32 30 20 57 68 65 6e 65 76 65 72 20 61  55120 Whenever a
2f70: 20 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65 6e   PRAGMA statemen
2f80: 74 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20 2a  t is parsed,.  *
2f90: 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e 54  * an SQLITE_FCNT
2fa0: 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63 6f  L_PRAGMA file co
2fb0: 6e 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74 6f  ntrol is sent to
2fc0: 20 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74 65   the open sqlite
2fd0: 33 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a 65  3_file.  ** obje
2fe0: 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
2ff0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
3000: 20 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20 74   file to which t
3010: 68 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20 73  he pragma.  ** s
3020: 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73 2e  tatement refers.
3030: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45  .  **.  ** IMPLE
3040: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
3050: 32 39 38 37 35 2d 33 31 36 37 38 20 54 68 65 20  29875-31678 The 
3060: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
3070: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
3080: 47 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63 6f  GMA.  ** file co
3090: 6e 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72 61  ntrol is an arra
30a0: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
30b0: 20 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a 2a   strings (char**
30c0: 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a 20  ) in which the. 
30d0: 20 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65   ** second eleme
30e0: 6e 74 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  nt of the array 
30f0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
3100: 68 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74 68  he pragma and th
3110: 65 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c 65  e third.  ** ele
3120: 6d 65 6e 74 20 69 73 20 74 68 65 20 61 72 67 75  ment is the argu
3130: 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61 67  ment to the prag
3140: 6d 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  ma or NULL if th
3150: 65 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f 0a  e pragma has no.
3160: 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 20    ** argument.. 
3170: 20 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d 20   */.  aFcntl[0] 
3180: 3d 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31 5d  = 0;.  aFcntl[1]
3190: 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63 6e   = zLeft;.  aFcn
31a0: 74 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b 0a  tl[2] = zRight;.
31b0: 20 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30 3b    aFcntl[3] = 0;
31c0: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
31d0: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
31e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
31f0: 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
3200: 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  b, SQLITE_FCNTL_
3210: 50 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29 61  PRAGMA, (void*)a
3220: 46 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72 63  Fcntl);.  if( rc
3230: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
3240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
3250: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a  tNumCols(v, 1);.
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3270: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
3280: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61 46  COLNAME_NAME, aF
3290: 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45 5f  cntl[0], SQLITE_
32a0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
32b0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74  returnSingleText
32c0: 28 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a  (v, aFcntl[0]);.
32d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
32e0: 28 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20  (aFcntl[0]);.   
32f0: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
3300: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
3310: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
3320: 29 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e 74  ){.    if( aFcnt
3330: 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  l[0] ){.      sq
3340: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3350: 61 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63 6e  arse, "%s", aFcn
3360: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73 71  tl[0]);.      sq
3370: 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e 74  lite3_free(aFcnt
3380: 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l[0]);.    }.   
3390: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
33a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
33b0: 3d 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20 70  = rc;.    goto p
33c0: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ragma_out;.  }..
33d0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
33e0: 70 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c 6f  pragma in the lo
33f0: 6f 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  okup table */.  
3400: 70 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d 61  pPragma = pragma
3410: 4c 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a 20  Locate(zLeft);. 
3420: 20 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30 20   if( pPragma==0 
3430: 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75  ) goto pragma_ou
3440: 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  t;..  /* Make su
3450: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
3460: 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65 64  schema is loaded
3470: 20 69 66 20 74 68 65 20 70 72 61 67 6d 61 20 72   if the pragma r
3480: 65 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f 0a  equires that */.
3490: 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d 3e    if( (pPragma->
34a0: 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
34b0: 6c 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21 3d  lg_NeedSchema)!=
34c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
34d0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
34e0: 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72  Parse) ) goto pr
34f0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  agma_out;.  }.. 
3500: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65   /* Register the
3510: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
3520: 61 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61 73  ames for pragmas
3530: 20 74 68 61 74 20 72 65 74 75 72 6e 20 72 65 73   that return res
3540: 75 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28 70  ults */.  if( (p
3550: 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
3560: 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c   & PragFlg_NoCol
3570: 75 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26 20  umns)==0 .   && 
3580: 28 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67  ((pPragma->mPrag
3590: 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f  Flg & PragFlg_No
35a0: 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c 20  Columns1)==0 || 
35b0: 7a 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b 0a  zRight==0).  ){.
35c0: 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65 73      setPragmaRes
35d0: 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76  ultColumnNames(v
35e0: 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d 0a  , pPragma);.  }.
35f0: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
3600: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 72  e appropriate pr
3610: 61 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f 0a  agma handler */.
3620: 20 20 73 77 69 74 63 68 28 20 70 50 72 61 67 6d    switch( pPragm
3630: 61 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a 20  a->ePragTyp ){. 
3640: 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
3650: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
3660: 5f 50 52 41 47 4d 41 53 29 20 26 26 20 21 64 65  _PRAGMAS) && !de
3670: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3680: 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20 20  T_DEPRECATED).  
3690: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
36a0: 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c 74  [schema.]default
36b0: 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a  _cache_size.  **
36c0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
36d0: 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f  .]default_cache_
36e0: 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  size=N.  **.  **
36f0: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
3700: 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
3710: 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20 73  ent persistent s
3720: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
3730: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
3740: 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ize.  The value 
3750: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
3760: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
3770: 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20  f.  ** pages in 
3780: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
3790: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
37a0: 20 73 65 74 73 20 62 6f 74 68 20 74 68 65 20 63   sets both the c
37b0: 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65  urrent.  ** page
37c0: 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
37d0: 65 20 61 6e 64 20 74 68 65 20 70 65 72 73 69 73  e and the persis
37e0: 74 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20  tent page cache 
37f0: 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  size value.  ** 
3800: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
3810: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
3820: 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65 72  *.  ** Older ver
3830: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
3840: 77 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64 65  would set the de
3850: 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65  fault cache size
3860: 20 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61 74   to a.  ** negat
3870: 69 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69 6e  ive number to in
3880: 64 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e 6f  dicate synchrono
3890: 75 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20 64  us=OFF.  These d
38a0: 61 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73  ays, synchronous
38b0: 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  .  ** is always 
38c0: 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72 65  on by default re
38d0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
38e0: 73 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66 61  sign of the defa
38f0: 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73  ult cache.  ** s
3900: 69 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69 6e  ize.  But contin
3910: 75 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 61  ue to take the a
3920: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66  bsolute value of
3930: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 63   the default cac
3940: 68 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  he.  ** size of 
3950: 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
3960: 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a 20  tibility..  */. 
3970: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 45   case PragTyp_DE
3980: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
3990: 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  : {.    static c
39a0: 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56  onst int iLn = V
39b0: 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e  DBE_OFFSET_LINEN
39c0: 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69 63  O(2);.    static
39d0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
39e0: 74 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d  t getCacheSize[]
39f0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
3a00: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20  Transaction, 0, 
3a10: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  0,        0},   
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20        /* 0 */.  
3a40: 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
3a50: 6b 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20 20  kie,  0, 1,     
3a60: 20 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54     BTREE_DEFAULT
3a70: 5f 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20 2f  _CACHE_SIZE},  /
3a80: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
3a90: 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31  P_IfPos,       1
3aa0: 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 8,        0},.
3ab0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
3ac0: 65 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20  er,     0, 2,   
3ad0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
3ae0: 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20 20   OP_Subtract,   
3af0: 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31 7d   1, 2,        1}
3b00: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 50  ,.      { OP_IfP
3b10: 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c 20  os,       1, 8, 
3b20: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
3b30: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
3b40: 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20     0, 1,        
3b50: 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  0},             
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36              /* 6
3b70: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e   */.      { OP_N
3b80: 6f 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30  oop,        0, 0
3b90: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3ba0: 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f     { OP_ResultRo
3bb0: 77 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20  w,   1, 1,      
3bc0: 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
3bd0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20   VdbeOp *aOp;.  
3be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
3bf0: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
3c00: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
3c10: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
3c20: 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20  >nMem += 2;.    
3c30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72    sqlite3VdbeVer
3c40: 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69  ifyNoMallocRequi
3c50: 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65  red(v, ArraySize
3c60: 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 29 3b  (getCacheSize));
3c70: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c  .      aOp = sql
3c80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3c90: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67  t(v, ArraySize(g
3ca0: 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65  etCacheSize), ge
3cb0: 74 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e 29  tCacheSize, iLn)
3cc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59  ;.      if( ONLY
3cd0: 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  _IF_REALLOC_STRE
3ce0: 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65  SS(aOp==0) ) bre
3cf0: 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d  ak;.      aOp[0]
3d00: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
3d10: 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62   aOp[1].p1 = iDb
3d20: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e 70  ;.      aOp[6].p
3d30: 31 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  1 = SQLITE_DEFAU
3d40: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a 20  LT_CACHE_SIZE;. 
3d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3d60: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
3d70: 65 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69 74  e3AbsInt32(sqlit
3d80: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b  e3Atoi(zRight));
3d90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
3da0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
3db0: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
3dc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3dd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3de0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
3df0: 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43   BTREE_DEFAULT_C
3e00: 41 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65 29  ACHE_SIZE, size)
3e10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3e20: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
3e30: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
3e40: 30 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  0) );.      pDb-
3e50: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
3e60: 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20  size = size;.   
3e70: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
3e80: 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62 2d  etCacheSize(pDb-
3e90: 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68 65  >pBt, pDb->pSche
3ea0: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b  ma->cache_size);
3eb0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
3ec0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
3ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  !SQLITE_OMIT_PAG
3ee0: 45 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21 53  ER_PRAGMAS && !S
3ef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
3f00: 43 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21 64  CATED */..#if !d
3f10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3f20: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
3f30: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ).  /*.  **  PRA
3f40: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67  GMA [schema.]pag
3f50: 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41  e_size.  **  PRA
3f60: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61 67  GMA [schema.]pag
3f70: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
3f80: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
3f90: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
3fa0: 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f  rrent setting fo
3fb0: 72 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  r the.  ** datab
3fc0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ase page size in
3fd0: 20 62 79 74 65 73 2e 20 20 54 68 65 20 73 65 63   bytes.  The sec
3fe0: 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68  ond form sets th
3ff0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
4000: 70 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65 2e  page size value.
4010: 20 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e 20    The value can 
4020: 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a 20  only be set if. 
4030: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
4040: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
4050: 6e 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a  n created..  */.
4060: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50    case PragTyp_P
4070: 41 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  AGE_SIZE: {.    
4080: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62  Btree *pBt = pDb
4090: 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
40a0: 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20  t( pBt!=0 );.   
40b0: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
40c0: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
40d0: 20 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20 73   ALWAYS(pBt) ? s
40e0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
40f0: 67 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30 3b  geSize(pBt) : 0;
4100: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
4110: 67 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29 3b  gleInt(v, size);
4120: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4130: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79 20    /* Malloc may 
4140: 66 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69 6e  fail when settin
4150: 67 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  g the page-size,
4160: 20 61 73 20 74 68 65 72 65 20 69 73 20 61 6e 20   as there is an 
4170: 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20 2a  internal.      *
4180: 2a 20 62 75 66 66 65 72 20 74 68 61 74 20 74 68  * buffer that th
4190: 65 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 72  e pager module r
41a0: 65 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71 6c  esizes using sql
41b0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e 0a  ite3_realloc()..
41c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
41d0: 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20  b->nextPagesize 
41e0: 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  = sqlite3Atoi(zR
41f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ight);.      if(
4200: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73   SQLITE_NOMEM==s
4210: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
4220: 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e  geSize(pBt, db->
4230: 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31 2c  nextPagesize,-1,
4240: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0) ){.        sq
4250: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
4260: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4270: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4280: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4290: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63 75  MA [schema.]secu
42a0: 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 20  re_delete.  **  
42b0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
42c0: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f 4e  secure_delete=ON
42d0: 2f 4f 46 46 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  /OFF.  **.  ** T
42e0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
42f0: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
4300: 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68  t setting for th
4310: 65 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f 64 65  e.  ** secure_de
4320: 6c 65 74 65 20 66 6c 61 67 2e 20 20 54 68 65 20  lete flag.  The 
4330: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61 6e  second form chan
4340: 67 65 73 20 74 68 65 20 73 65 63 75 72 65 5f 64  ges the secure_d
4350: 65 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61 67 20  elete.  ** flag 
4360: 73 65 74 74 69 6e 67 20 61 6e 64 20 72 65 70 6f  setting and repo
4370: 72 74 73 20 74 68 65 6e 65 77 20 76 61 6c 75 65  rts thenew value
4380: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
4390: 61 67 54 79 70 5f 53 45 43 55 52 45 5f 44 45 4c  agTyp_SECURE_DEL
43a0: 45 54 45 3a 20 7b 0a 20 20 20 20 42 74 72 65 65  ETE: {.    Btree
43b0: 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74   *pBt = pDb->pBt
43c0: 3b 0a 20 20 20 20 69 6e 74 20 62 20 3d 20 2d 31  ;.    int b = -1
43d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
43e0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t!=0 );.    if( 
43f0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
4400: 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42 6f  b = sqlite3GetBo
4410: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29  olean(zRight, 0)
4420: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4430: 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e  pId2->n==0 && b>
4440: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
4450: 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
4460: 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20  =0; ii<db->nDb; 
4470: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
4480: 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
4490: 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b  eDelete(db->aDb[
44a0: 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20  ii].pBt, b);.   
44b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
44c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
44d0: 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74 2c  ecureDelete(pBt,
44e0: 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53   b);.    returnS
44f0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b 0a  ingleInt(v, b);.
4500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4510: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
4520: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f 70  A [schema.]max_p
4530: 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20  age_count.  **  
4540: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4550: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e  max_page_count=N
4560: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
4570: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
4580: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  s the current se
4590: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
45a0: 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  ** maximum numbe
45b0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
45c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
45d0: 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f    The .  ** seco
45e0: 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74 73  nd form attempts
45f0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20   to change this 
4600: 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20  setting.  Both. 
4610: 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72 6e   ** forms return
4620: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
4630: 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ting..  **.  ** 
4640: 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  The absolute val
4650: 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64 2e  ue of N is used.
4660: 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75    This is undocu
4670: 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68 74  mented and might
4680: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54  .  ** change.  T
4690: 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  he only purpose 
46a0: 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  is to provide an
46b0: 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65 73   easy way to tes
46c0: 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  t.  ** the sqlit
46d0: 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75 6e  e3AbsInt32() fun
46e0: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ction..  **.  **
46f0: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4700: 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a  .]page_count.  *
4710: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
4720: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
4730: 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  s in the specifi
4740: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
4750: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
4760: 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20  _PAGE_COUNT: {. 
4770: 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 20     int iReg;.   
4780: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
4790: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
47a0: 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67 20   iDb);.    iReg 
47b0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
47c0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
47d0: 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30  3Tolower(zLeft[0
47e0: 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20  ])=='p' ){.     
47f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4800: 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f 75  p2(v, OP_Pagecou
4810: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b 0a  nt, iDb, iReg);.
4820: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4830: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4840: 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63 6e  p3(v, OP_MaxPgcn
4850: 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a 20  t, iDb, iReg, . 
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62         sqlite3Ab
4880: 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41 74  sInt32(sqlite3At
4890: 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20 20  oi(zRight)));.  
48a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
48b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
48c0: 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67 2c  ResultRow, iReg,
48d0: 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a   1);.    break;.
48e0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
48f0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
4900: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a  locking_mode.  *
4910: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4920: 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  a.]locking_mode 
4930: 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73  = (normal|exclus
4940: 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ive).  */.  case
4950: 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47   PragTyp_LOCKING
4960: 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e  _MODE: {.    con
4970: 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
4980: 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e  "normal";.    in
4990: 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63  t eMode = getLoc
49a0: 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29  kingMode(zRight)
49b0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d  ;..    if( pId2-
49c0: 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d  >n==0 && eMode==
49d0: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
49e0: 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20  E_QUERY ){.     
49f0: 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47   /* Simple "PRAG
4a00: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b  MA locking_mode;
4a10: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  " statement. Thi
4a20: 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f 72  s is a query for
4a30: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
4a40: 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f  rrent default lo
4a50: 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63  cking mode (whic
4a60: 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  h may be differe
4a70: 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  nt to.      ** t
4a80: 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
4a90: 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
4aa0: 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  base)..      */.
4ab0: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62        eMode = db
4ac0: 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a  ->dfltLockMode;.
4ad0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4ae0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
4af0: 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e        if( pId2->
4b00: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
4b10: 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  /* This indicate
4b20: 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61  s that no databa
4b30: 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63  se name was spec
4b40: 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20 20  ified as part.  
4b50: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
4b60: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20  PRAGMA command. 
4b70: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
4b80: 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75   locking-mode mu
4b90: 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
4ba0: 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61   set on all atta
4bb0: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 20  ched databases, 
4bc0: 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  as well as the m
4bd0: 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20  ain db file..   
4be0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
4bf0: 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c  ** Also, the sql
4c00: 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64  ite3.dfltLockMod
4c10: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  e variable is se
4c20: 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20  t so that.      
4c30: 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75    ** any subsequ
4c40: 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20 64  ently attached d
4c50: 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73  atabases also us
4c60: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  e the specified.
4c70: 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69          ** locki
4c80: 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20  ng mode..       
4c90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4ca0: 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
4cb0: 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62  rt(pDb==&db->aDb
4cc0: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
4cd0: 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e  r(ii=2; ii<db->n
4ce0: 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  Db; ii++){.     
4cf0: 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
4d00: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
4d10: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29  db->aDb[ii].pBt)
4d20: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4d30: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
4d40: 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64  ode(pPager, eMod
4d50: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
4d60: 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f        db->dfltLo
4d70: 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  ckMode = (u8)eMo
4d80: 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
4d90: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
4da0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
4db0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d  ->pBt);.      eM
4dc0: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ode = sqlite3Pag
4dd0: 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50  erLockingMode(pP
4de0: 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  ager, eMode);.  
4df0: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
4e00: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4e10: 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
4e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
4e30: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
4e40: 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
4e50: 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  VE );.    if( eM
4e60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4e70: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
4e80: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d   ){.      zRet =
4e90: 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20   "exclusive";.  
4ea0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
4eb0: 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65 74  ngleText(v, zRet
4ec0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
4ed0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  }..  /*.  **  PR
4ee0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f  AGMA [schema.]jo
4ef0: 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a 20  urnal_mode.  ** 
4f00: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4f10: 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 0a  ]journal_mode =.
4f20: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
4f30: 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65 74            (delet
4f40: 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74 72  e|persist|off|tr
4f50: 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77 61  uncate|memory|wa
4f60: 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63 61  l|off).  */.  ca
4f70: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
4f80: 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 69  AL_MODE: {.    i
4f90: 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  nt eMode;       
4fa0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
4fb0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
4fc0: 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  _XXX symbols */.
4fd0: 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
4fe0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
4ff0: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69 66  unter */..    if
5000: 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( zRight==0 ){. 
5010: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
5020: 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70   is no "=MODE" p
5030: 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d  art of the pragm
5040: 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66 6f  a, do a query fo
5050: 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  r the.      ** c
5060: 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20  urrent mode */. 
5070: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
5080: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
5090: 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  UERY;.    }else{
50a0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
50b0: 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20  r *zMode;.      
50c0: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
50d0: 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 3b  trlen30(zRight);
50e0: 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64 65  .      for(eMode
50f0: 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c  =0; (zMode = sql
5100: 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e  ite3JournalModen
5110: 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20  ame(eMode))!=0; 
5120: 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20  eMode++){.      
5130: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5140: 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d  NICmp(zRight, zM
5150: 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65  ode, n)==0 ) bre
5160: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5170: 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a    if( !zMode ){.
5180: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
5190: 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 64  e "=MODE" part d
51a0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
51b0: 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20  y known journal 
51c0: 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  mode,.        **
51d0: 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72 79   then do a query
51e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   */.        eMod
51f0: 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
5200: 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20  LMODE_QUERY;.   
5210: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5220: 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  f( eMode==PAGER_
5230: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
5240: 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20  Y && pId2->n==0 
5250: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ){.      /* Conv
5260: 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  ert "PRAGMA jour
5270: 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22  nal_mode" into "
5280: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
5290: 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20  nal_mode" */.   
52a0: 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20 20     iDb = 0;.    
52b0: 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20    pId2->n = 1;. 
52c0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
52d0: 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30  db->nDb-1; ii>=0
52e0: 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  ; ii--){.      i
52f0: 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  f( db->aDb[ii].p
5300: 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c  Bt && (ii==iDb |
5310: 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b  | pId2->n==0) ){
5320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5330: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
5340: 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71   ii);.        sq
5350: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5360: 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  v, OP_JournalMod
5370: 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29  e, ii, 1, eMode)
5380: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
53a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
53b0: 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20  ltRow, 1, 1);.  
53c0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
53d0: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
53e0: 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61 6c  [schema.]journal
53f0: 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a  _size_limit.  **
5400: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
5410: 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c  .]journal_size_l
5420: 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  imit=N.  **.  **
5430: 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20   Get or set the 
5440: 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f  size limit on ro
5450: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
5460: 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  iles..  */.  cas
5470: 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e 41  e PragTyp_JOURNA
5480: 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b 0a  L_SIZE_LIMIT: {.
5490: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
54a0: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
54b0: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
54c0: 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20  .    i64 iLimit 
54d0: 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a 52  = -2;.    if( zR
54e0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
54f0: 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
5500: 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d  64(zRight, &iLim
5510: 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  it);.      if( i
5520: 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69  Limit<-1 ) iLimi
5530: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  t = -1;.    }.  
5540: 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74    iLimit = sqlit
5550: 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
5560: 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c 20  zeLimit(pPager, 
5570: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65 74  iLimit);.    ret
5580: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
5590: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72 65  iLimit);.    bre
55a0: 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20  ak;.  }..#endif 
55b0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  /* SQLITE_OMIT_P
55c0: 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  AGER_PRAGMAS */.
55d0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
55e0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f  MA [schema.]auto
55f0: 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50 52  _vacuum.  **  PR
5600: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75  AGMA [schema.]au
5610: 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a  to_vacuum=N.  **
5620: 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65 74  .  ** Get or set
5630: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
5640: 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74 6f  e database 'auto
5650: 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65 74  -vacuum' paramet
5660: 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  er..  ** The val
5670: 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30  ue is one of:  0
5680: 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20 49   NONE 1 FULL 2 I
5690: 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a  NCREMENTAL.  */.
56a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
56b0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
56c0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41 55   case PragTyp_AU
56d0: 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20  TO_VACUUM: {.   
56e0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
56f0: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
5700: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
5710: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
5720: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
5730: 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65  gleInt(v, sqlite
5740: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
5750: 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20 7d  uum(pBt));.    }
5760: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
5770: 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f 56  eAuto = getAutoV
5780: 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a 20  acuum(zRight);. 
5790: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41 75       assert( eAu
57a0: 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c 3d  to>=0 && eAuto<=
57b0: 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  2 );.      db->n
57c0: 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75 38  extAutovac = (u8
57d0: 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f 2a  )eAuto;.      /*
57e0: 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61 63   Call SetAutoVac
57f0: 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e 69  uum() to set ini
5800: 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74 65  tialize the inte
5810: 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20 20  rnal auto and.  
5820: 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63 75      ** incr-vacu
5830: 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20 69  um flags. This i
5840: 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
5850: 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  se this connecti
5860: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  on.      ** crea
5870: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
5880: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d 70   file. It is imp
5890: 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20 69  ortant that it i
58a0: 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20  s created.      
58b0: 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76 61  ** as an auto-va
58c0: 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62 2e  cuum capable db.
58d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
58e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
58f0: 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70  eSetAutoVacuum(p
5900: 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20 20  Bt, eAuto);.    
5910: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5920: 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d 31  _OK && (eAuto==1
5930: 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29 7b   || eAuto==2) ){
5940: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  .        /* When
5950: 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75 74   setting the aut
5960: 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 6f  o_vacuum mode to
5970: 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20 6f   either "full" o
5980: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 69  r .        ** "i
5990: 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72 69  ncremental", wri
59a0: 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
59b0: 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20 64  meta[6] in the d
59c0: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
59d0: 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65 20  ** file. Before 
59e0: 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61 5b  writing to meta[
59f0: 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20 6d  6], check that m
5a00: 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65 73  eta[3] indicates
5a10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
5a20: 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20   this really is 
5a30: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  an auto-vacuum c
5a40: 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65 2e  apable database.
5a50: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5a60: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5a70: 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f   int iLn = VDBE_
5a80: 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29  OFFSET_LINENO(2)
5a90: 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  ;.        static
5aa0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
5ab0: 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20 7b  t setMeta6[] = {
5ac0: 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  .          { OP_
5ad0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
5ae0: 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20 20  0,         1,   
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d                0}
5b00: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
5b10: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64         { OP_Read
5b20: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20 20  Cookie,     0,  
5b30: 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20         1,       
5b40: 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f    BTREE_LARGEST_
5b50: 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20  ROOT_PAGE},.    
5b60: 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20        { OP_If,  
5b70: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 20             1,   
5b80: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
5b90: 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20           0},    
5ba0: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 2 */.        
5bb0: 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20 20    { OP_Halt,    
5bc0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
5bd0: 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20 20  , OE_Abort,     
5be0: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33       0},    /* 3
5bf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20   */.          { 
5c00: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20  OP_SetCookie,   
5c10: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42 54     0,         BT
5c20: 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d 2c  REE_INCR_VACUUM,
5c30: 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a   0},    /* 4 */.
5c40: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
5c50: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a     VdbeOp *aOp;.
5c60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
5c70: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
5c80: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
5c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5ca0: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
5cb0: 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72 61  Required(v, Arra
5cc0: 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29 29  ySize(setMeta6))
5cd0: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d 20  ;.        aOp = 
5ce0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5cf0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
5d00: 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65 74  e(setMeta6), set
5d10: 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20 20  Meta6, iLn);.   
5d20: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
5d30: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
5d40: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
5d50: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
5d60: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5d70: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
5d80: 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32  b;.        aOp[2
5d90: 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b 0a  ].p2 = iAddr+4;.
5da0: 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e 70          aOp[4].p
5db0: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 20  1 = iDb;.       
5dc0: 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41 75   aOp[4].p3 = eAu
5dd0: 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  to - 1;.        
5de0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
5df0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
5e00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5e10: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
5e20: 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  f..  /*.  **  PR
5e30: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 6e  AGMA [schema.]in
5e40: 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
5e50: 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f  (N).  **.  ** Do
5e60: 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63 72   N steps of incr
5e70: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69 6e  emental vacuumin
5e80: 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 2e  g on a database.
5e90: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
5ea0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
5eb0: 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61 67  CUUM.  case Prag
5ec0: 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 5f  Typ_INCREMENTAL_
5ed0: 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69 6e  VACUUM: {.    in
5ee0: 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b 0a  t iLimit, addr;.
5ef0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d 3d      if( zRight==
5f00: 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65 74  0 || !sqlite3Get
5f10: 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 69  Int32(zRight, &i
5f20: 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69 74  Limit) || iLimit
5f30: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 69  <=0 ){.      iLi
5f40: 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66 66  mit = 0x7fffffff
5f50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5f60: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
5f70: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
5f80: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
5f90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5fa0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c 69   OP_Integer, iLi
5fb0: 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64 64  mit, 1);.    add
5fc0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
5fd0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63 72  ddOp1(v, OP_Incr
5fe0: 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56 64  Vacuum, iDb); Vd
5ff0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6010: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp1(v, OP_Resul
6020: 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73 71  tRow, 1);.    sq
6030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6040: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c  v, OP_AddImm, 1,
6050: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
6060: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6070: 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64 72  P_IfPos, 1, addr
6080: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6090: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
60a0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
60b0: 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ddr);.    break;
60c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
60d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
60e0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20  _PAGER_PRAGMAS. 
60f0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
6100: 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f   [schema.]cache_
6110: 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  size.  **  PRAGM
6120: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6130: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
6140: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
6150: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
6160: 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69  rent local setti
6170: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
6180: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e  page cache size.
6190: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
61a0: 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a   sets the local.
61b0: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
61c0: 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66 20  size value.  If 
61d0: 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74 68  N is positive th
61e0: 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  en that is the. 
61f0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
6200: 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
6210: 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74  .  If N is negat
6220: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ive, then the.  
6230: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
6240: 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20 73  es is adjusted s
6250: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
6260: 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79 74   uses -N kibibyt
6270: 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72  es.  ** of memor
6280: 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  y..  */.  case P
6290: 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49 5a  ragTyp_CACHE_SIZ
62a0: 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E: {.    assert(
62b0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
62c0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
62d0: 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21   0) );.    if( !
62e0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
62f0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
6300: 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  v, pDb->pSchema-
6310: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
6320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
6330: 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65  nt size = sqlite
6340: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
6350: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
6360: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  a->cache_size = 
6370: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
6380: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
6390: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70  Size(pDb->pBt, p
63a0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63  Db->pSchema->cac
63b0: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
63c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
63d0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
63e0: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
63f0: 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52 41  _spill.  **  PRA
6400: 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c 3d  GMA cache_spill=
6410: 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50 52  BOOLEAN.  **  PR
6420: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61  AGMA [schema.]ca
6430: 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a 2a  che_spill=N.  **
6440: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
6450: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
6460: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73   current local s
6470: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
6480: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
6490: 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20 73  pill size. The s
64a0: 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e 73  econd form turns
64b0: 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e 0a   cache spill on.
64c0: 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57 68    ** or off.  Wh
64d0: 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63 68  en turnning cach
64e0: 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65 20  e spill on, the 
64f0: 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  size is set to t
6500: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
6510: 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68 65  cache_size.  The
6520: 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74 73   third form sets
6530: 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74 68   a spill size th
6540: 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 64  at.  ** may be d
6550: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74 68  ifferent form th
6560: 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  e cache size..  
6570: 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69 74  ** If N is posit
6580: 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69 73  ive then that is
6590: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
65a0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
65b0: 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69 73   cache.  If N is
65c0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
65d0: 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
65e0: 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a 75  of pages is adju
65f0: 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  sted so that the
6600: 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20 6b   cache uses -N k
6610: 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66  ibibytes.  ** of
6620: 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20   memory..  **.  
6630: 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
6640: 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c 20   of cache_spill 
6650: 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74 68  pages is less th
6660: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
6670: 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a 65  .  ** cache_size
6680: 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c 6c   pages, no spill
6690: 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69 6c  ing occurs until
66a0: 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 20   the page count 
66b0: 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68 65  exceeds.  ** the
66c0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   number of cache
66d0: 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20 2a  _size pages..  *
66e0: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68 65  *.  ** The cache
66f0: 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20 73  _spill=BOOLEAN s
6700: 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20 74  etting applies t
6710: 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 73  o all attached s
6720: 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f 74  chemas,.  ** not
6730: 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d 61   just the schema
6740: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f   specified..  */
6750: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
6760: 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a 20  CACHE_SPILL: {. 
6770: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
6780: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
6790: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
67a0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
67b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
67c0: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20 20  SingleInt(v,.   
67d0: 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73        (db->flags
67e0: 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53   & SQLITE_CacheS
67f0: 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20 0a  pill)==0 ? 0 : .
6800: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6810: 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c  te3BtreeSetSpill
6820: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30 29  Size(pDb->pBt,0)
6830: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6840: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 31      int size = 1
6850: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
6860: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67  te3GetInt32(zRig
6870: 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 20  ht, &size) ){.  
6880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
6890: 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 70  eeSetSpillSize(p
68a0: 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b 0a  Db->pBt, size);.
68b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
68c0: 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ( sqlite3GetBool
68d0: 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a 65  ean(zRight, size
68e0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
68f0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
6900: 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b 0a  ITE_CacheSpill;.
6910: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6920: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
6930: 3d 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65 53  = ~SQLITE_CacheS
6940: 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pill;.      }.  
6950: 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46      setAllPagerF
6960: 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  lags(db);.    }.
6970: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6980: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6990: 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70 5f  A [schema.]mmap_
69a0: 73 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a  size(N).  **.  *
69b0: 2a 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d 61  * Used to set ma
69c0: 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74  pping size limit
69d0: 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73 69  . The mapping si
69e0: 7a 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a 2a  ze limit is.  **
69f0: 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74   used to limit t
6a00: 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69 7a  he aggregate siz
6a10: 65 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  e of all memory 
6a20: 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20 6f  mapped regions o
6a30: 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  f the.  ** datab
6a40: 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 69  ase file. If thi
6a50: 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  s parameter is s
6a60: 65 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  et to zero, then
6a70: 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 0a   memory mapping.
6a80: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
6a90: 20 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20 69   at all.  If N i
6aa0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
6ab0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65 6d   the default mem
6ac0: 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69 6d  ory map.  ** lim
6ad0: 69 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  it determined by
6ae0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
6af0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
6b00: 41 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74 2e  AP_SIZE) is set.
6b10: 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d 65  .  ** The parame
6b20: 74 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72 65  ter N is measure
6b30: 64 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a 2a  d in bytes..  **
6b40: 0a 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75 65  .  ** This value
6b50: 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54   is advisory.  T
6b60: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46  he underlying VF
6b70: 53 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65 6d  S is free to mem
6b80: 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73 20  ory map.  ** as 
6b90: 6c 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75 63  little or as muc
6ba0: 68 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20 20  h as it wants.  
6bb0: 45 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73 20  Except, if N is 
6bc0: 73 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74 68  set to 0 then th
6bd0: 65 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61 79  e.  ** upper lay
6be0: 65 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 69  ers will never i
6bf0: 6e 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63 68  nvoke the xFetch
6c00: 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20 74   interfaces to t
6c10: 68 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20 63  he VFS..  */.  c
6c20: 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41 50  ase PragTyp_MMAP
6c30: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71 6c  _SIZE: {.    sql
6c40: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 23  ite3_int64 sz;.#
6c50: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
6c60: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61 73  AP_SIZE>0.    as
6c70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
6c80: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
6c90: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
6ca0: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
6cb0: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
6cc0: 20 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65    sqlite3DecOrHe
6cd0: 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26  xToI64(zRight, &
6ce0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  sz);.      if( s
6cf0: 7a 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69 74  z<0 ) sz = sqlit
6d00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
6d10: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28  zMmap;.      if(
6d20: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62   pId2->n==0 ) db
6d30: 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a 20  ->szMmap = sz;. 
6d40: 20 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e       for(ii=db->
6d50: 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69  nDb-1; ii>=0; ii
6d60: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
6d70: 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74   db->aDb[ii].pBt
6d80: 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20   && (ii==iDb || 
6d90: 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20  pId2->n==0) ){. 
6da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6db0: 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
6dc0: 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  t(db->aDb[ii].pB
6dd0: 74 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  t, sz);.        
6de0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6df0: 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20 20      sz = -1;.   
6e00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
6e10: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
6e20: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
6e30: 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29  _MMAP_SIZE, &sz)
6e40: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20 3d  ;.#else.    sz =
6e50: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   0;.    rc = SQL
6e60: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20  ITE_OK;.#endif. 
6e70: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6e80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
6e90: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
6ea0: 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20   sz);.    }else 
6eb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e  if( rc!=SQLITE_N
6ec0: 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  OTFOUND ){.     
6ed0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6ee0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
6ef0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
6f00: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6f10: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
6f20: 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a   temp_store.  **
6f30: 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73     PRAGMA temp_s
6f40: 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22  tore = "default"
6f50: 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22  |"memory"|"file"
6f60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
6f70: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63  n or set the loc
6f80: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
6f90: 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e  temp_store flag.
6fa0: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
6fb0: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
6fc0: 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68  does not make ch
6fd0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73  anges to the dis
6fe0: 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  k file and the d
6ff0: 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75  efault.  ** valu
7000: 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72  e will be restor
7010: 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
7020: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
7030: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20   opened..  **.  
7040: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
7050: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
7060: 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70  the library comp
7070: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
7080: 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64   to.  ** overrid
7090: 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20  e this setting. 
70a0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
70b0: 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20 7b  yp_TEMP_STORE: {
70c0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
70d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
70e0: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62 2d  SingleInt(v, db-
70f0: 3e 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20 20  >temp_store);.  
7100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
7110: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
7120: 28 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74 29  (pParse, zRight)
7130: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
7140: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
7150: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
7160: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a  store_directory.
7170: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65    **   PRAGMA te
7180: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
7190: 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f  ry = ""|"directo
71a0: 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20  ry_name".  **.  
71b0: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
71c0: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
71d0: 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f   of the temp_sto
71e0: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61  re_directory fla
71f0: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
7200: 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73  * the value sets
7210: 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72 65   a specific dire
7220: 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64  ctory to be used
7230: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
7240: 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69  iles..  ** Setti
7250: 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72  ng to a null str
7260: 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20 74  ing reverts to t
7270: 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f  he default tempo
7280: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 73  rary directory s
7290: 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74  earch..  ** If t
72a0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
72b0: 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ry is changed, t
72c0: 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65  hen invalidateTe
72d0: 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a  mpStorage..  **.
72e0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
72f0: 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f 44  Typ_TEMP_STORE_D
7300: 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20  IRECTORY: {.    
7310: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7320: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
7330: 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33  eText(v, sqlite3
7340: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
7350: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
7360: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7370: 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a  _WSD.      if( z
7380: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7390: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
73a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
73b0: 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56  3OsAccess(db->pV
73c0: 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49  fs, zRight, SQLI
73d0: 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
73e0: 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  ITE, &res);.    
73f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7400: 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20  TE_OK || res==0 
7410: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7420: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7430: 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74  rse, "not a writ
7440: 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29  able directory")
7450: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
7460: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
7470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7480: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
7490: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20  TEMP_STORE==0.  
74a0: 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f       || (SQLITE_
74b0: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26  TEMP_STORE==1 &&
74c0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c   db->temp_store<
74d0: 3d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53  =1).       || (S
74e0: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
74f0: 3d 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f  ==2 && db->temp_
7500: 73 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20  store==1).      
7510: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  ){.        inval
7520: 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65  idateTempStorage
7530: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7540: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
7550: 66 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d  free(sqlite3_tem
7560: 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
7570: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
7580: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
7590: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
75a0: 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ory = sqlite3_mp
75b0: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67  rintf("%s", zRig
75c0: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
75d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
75e0: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
75f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
7600: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7610: 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d  MIT_WSD */.    }
7620: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
7630: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7640: 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  IN.  /*.  **   P
7650: 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65  RAGMA data_store
7660: 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20  _directory.  ** 
7670: 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74    PRAGMA data_st
7680: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
7690: 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61  ""|"directory_na
76a0: 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  me".  **.  ** Re
76b0: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
76c0: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
76d0: 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  he data_store_di
76e0: 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43  rectory flag.  C
76f0: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7700: 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70   value sets a sp
7710: 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72 79  ecific directory
7720: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
7730: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 74  database files t
7740: 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70  hat.  ** were sp
7750: 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72  ecified with a r
7760: 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
7770: 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20  .  Setting to a 
7780: 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65  null string reve
7790: 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  rts.  ** to the 
77a0: 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73 65  default database
77b0: 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63   directory, whic
77c0: 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  h for database f
77d0: 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20 77  iles specified w
77e0: 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74  ith.  ** a relat
77f0: 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72  ive path will pr
7800: 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64 20  obably be based 
7810: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  on the current d
7820: 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
7830: 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20  .  ** process.  
7840: 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 70  Database file sp
7850: 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e 20  ecified with an 
7860: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72  absolute path ar
7870: 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20  e not impacted. 
7880: 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74 74   ** by this sett
7890: 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ing, regardless 
78a0: 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20  of its value..  
78b0: 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  **.  */.  case P
78c0: 72 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52  ragTyp_DATA_STOR
78d0: 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20  E_DIRECTORY: {. 
78e0: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
78f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
7900: 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69  ngleText(v, sqli
7910: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
7920: 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ry);.    }else{.
7930: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7940: 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66  MIT_WSD.      if
7950: 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20  ( zRight[0] ){. 
7960: 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a         int res;.
7970: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
7980: 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d  ite3OsAccess(db-
7990: 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53  >pVfs, zRight, S
79a0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
79b0: 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20  DWRITE, &res);. 
79c0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
79d0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d  QLITE_OK || res=
79e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
79f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7a00: 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77  pParse, "not a w
7a10: 72 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72  ritable director
7a20: 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  y");.          g
7a30: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
7a40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7a50: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
7a60: 66 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61 74  free(sqlite3_dat
7a70: 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  a_directory);.  
7a80: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
7a90: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
7aa0: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7ab0: 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ory = sqlite3_mp
7ac0: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67  rintf("%s", zRig
7ad0: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
7ae0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7af0: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
7b00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
7b10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7b20: 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d  MIT_WSD */.    }
7b30: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
7b40: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
7b50: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
7b60: 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 2a  G_STYLE.  /*.  *
7b70: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
7b80: 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  ma.]lock_proxy_f
7b90: 69 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ile.  **   PRAGM
7ba0: 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b 5f  A [schema.]lock_
7bb0: 70 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a 61  proxy_file = ":a
7bc0: 75 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c 65  uto:"|"lock_file
7bd0: 5f 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _path".  **.  **
7be0: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
7bf0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
7c00: 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 20  lock_proxy_file 
7c10: 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a  flag.  Changing.
7c20: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73    ** the value s
7c30: 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20 66  ets a specific f
7c40: 69 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20 66  ile to be used f
7c50: 6f 72 20 64 61 74 61 62 61 73 65 20 61 63 63 65  or database acce
7c60: 73 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a 20  ss locks..  **. 
7c70: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
7c80: 79 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46 49  yp_LOCK_PROXY_FI
7c90: 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21 7a  LE: {.    if( !z
7ca0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50  Right ){.      P
7cb0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
7cc0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
7cd0: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
7ce0: 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69    char *proxy_fi
7cf0: 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  le_path = NULL;.
7d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7d10: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7d20: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7d30: 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
7d40: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
7d50: 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49  Hint(pFile, SQLI
7d60: 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
7d70: 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  FILE, .         
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61    &proxy_file_pa
7da0: 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  th);.      retur
7db0: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 70  nSingleText(v, p
7dc0: 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b  roxy_file_path);
7dd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7de0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
7df0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
7e00: 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ger(pDb->pBt);. 
7e10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
7e20: 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  e *pFile = sqlit
7e30: 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
7e40: 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  er);.      int r
7e50: 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  es;.      if( zR
7e60: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
7e70: 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73     res=sqlite3Os
7e80: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
7e90: 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
7ea0: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ed0: 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20     zRight);.    
7ee0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
7ef0: 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73     res=sqlite3Os
7f00: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
7f10: 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
7f20: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
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 20 20 20 20 20 20 20                  
7f50: 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20     NULL);.      
7f60: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 21  }.      if( res!
7f70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7f80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7f90: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
7fa0: 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63  ailed to set loc
7fb0: 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a  k proxy file");.
7fc0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61          goto pra
7fd0: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  gma_out;.      }
7fe0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
7ff0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8000: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
8010: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20  CKING_STYLE */  
8020: 20 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20      .    .  /*. 
8030: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
8040: 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75  hema.]synchronou
8050: 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  s.  **   PRAGMA 
8060: 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f  [schema.]synchro
8070: 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d  nous=OFF|ON|NORM
8080: 41 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20 20  AL|FULL|EXTRA.  
8090: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f  **.  ** Return o
80a0: 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  r set the local 
80b0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e  value of the syn
80c0: 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20  chronous flag.  
80d0: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
80e0: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f  e local value do
80f0: 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e  es not make chan
8100: 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ges to the disk 
8110: 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a  file and the.  *
8120: 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * default value 
8130: 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64  will be restored
8140: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
8150: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 20  he database is. 
8160: 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f   ** opened..  */
8170: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
8180: 53 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a 20  SYNCHRONOUS: {. 
8190: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
81a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
81b0: 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d 3e  ngleInt(v, pDb->
81c0: 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29 3b  safety_level-1);
81d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
81e0: 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43    if( !db->autoC
81f0: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
8200: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8210: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
8220: 20 20 20 20 20 20 22 53 61 66 65 74 79 20 6c 65        "Safety le
8230: 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  vel may not be c
8240: 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61 20  hanged inside a 
8250: 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20  transaction");. 
8260: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
8270: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db!=1 ){.       
8280: 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28 67   int iLevel = (g
8290: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52  etSafetyLevel(zR
82a0: 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20 50  ight,0,1)+1) & P
82b0: 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
82c0: 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 69  _MASK;.        i
82d0: 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20 69  f( iLevel==0 ) i
82e0: 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20  Level = 1;.     
82f0: 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
8300: 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20  evel = iLevel;. 
8310: 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79 6e         pDb->bSyn
8320: 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  cSet = 1;.      
8330: 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61    setAllPagerFla
8340: 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  gs(db);.      }.
8350: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
8360: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
8370: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
8380: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
8390: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
83a0: 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20 20  _FLAG_PRAGMAS.  
83b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c 41  case PragTyp_FLA
83c0: 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  G: {.    if( zRi
83d0: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
83e0: 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74 43  setPragmaResultC
83f0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50  olumnNames(v, pP
8400: 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72 65  ragma);.      re
8410: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
8420: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70 50   (db->flags & pP
8430: 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20  ragma->iArg)!=0 
8440: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8450: 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 70      int mask = p
8460: 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20  Pragma->iArg;   
8470: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73   /* Mask of bits
8480: 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61 72   to set or clear
8490: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  . */.      if( d
84a0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
84b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
84c0: 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70 6f  oreign key suppo
84d0: 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e  rt may not be en
84e0: 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c 65  abled or disable
84f0: 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20  d while not.    
8500: 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63      ** in auto-c
8510: 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a  ommit mode.  */.
8520: 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20          mask &= 
8530: 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  ~(SQLITE_Foreign
8540: 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Keys);.      }.#
8550: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
8560: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
8570: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68      if( db->auth
8580: 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54  .authLevel==UAUT
8590: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20  H_User ){.      
85a0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
85b0: 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72  w non-admin user
85c0: 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  s to modify the 
85d0: 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72 69  schema arbitrari
85e0: 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61  ly */.        ma
85f0: 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57  sk &= ~(SQLITE_W
8600: 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20 20  riteSchema);.   
8610: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
8620: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
8630: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c  tBoolean(zRight,
8640: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64   0) ){.        d
8650: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  b->flags |= mask
8660: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8670: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
8680: 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
8690: 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c     if( mask==SQL
86a0: 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20 64  ITE_DeferFKs ) d
86b0: 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
86c0: 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ons = 0;.      }
86d0: 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20  ..      /* Many 
86e0: 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61 67  of the flag-prag
86f0: 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20 63  mas modify the c
8700: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
8710: 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20 20   the SQL .      
8720: 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e  ** compiler (eg.
8730: 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e   count_changes).
8740: 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f 64   So add an opcod
8750: 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a  e to expire all.
8760: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
8770: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  d SQL statements
8780: 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e 67   after modifying
8790: 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65 2e   a pragma value.
87a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
87b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
87c0: 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b  0(v, OP_Expire);
87d0: 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67  .      setAllPag
87e0: 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20  erFlags(db);.   
87f0: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
8800: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8810: 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41  TE_OMIT_FLAG_PRA
8820: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
8830: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
8840: 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a  EMA_PRAGMAS.  /*
8850: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
8860: 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c 65  able_info(<table
8870: 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  >).  **.  ** Ret
8880: 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
8890: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
88a0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   of the named ta
88b0: 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 73  ble. The columns
88c0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 74   of.  ** the ret
88d0: 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20 61  urned data set a
88e0: 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 69  re:.  **.  ** ci
88f0: 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  d:        Column
8900: 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66 72   id (numbered fr
8910: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
8920: 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30 29  , starting at 0)
8930: 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20 20  .  ** name:     
8940: 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20 20    Column name.  
8950: 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20 43  ** type:       C
8960: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
8970: 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f 74  n type..  ** not
8980: 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69 66  null:    True if
8990: 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20 70   'NOT NULL' is p
89a0: 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64 65  art of column de
89b0: 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 64  claration.  ** d
89c0: 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20 64  flt_value: The d
89d0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
89e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66 20   the column, if 
89f0: 61 6e 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  any..  */.  case
8a00: 20 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f 49   PragTyp_TABLE_I
8a10: 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20  NFO: if( zRight 
8a20: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
8a30: 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  ab;.    pTab = s
8a40: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
8a50: 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54 45  e(pParse, LOCATE
8a60: 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c 20  _NOERR, zRight, 
8a70: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
8a80: 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab ){.      int 
8a90: 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20  i, k;.      int 
8aa0: 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20 20  nHidden = 0;.   
8ab0: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b     Column *pCol;
8ac0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50  .      Index *pP
8ad0: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
8ae0: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
8af0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
8b00: 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20  nMem = 6;.      
8b10: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
8b20: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
8b30: 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
8b40: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
8b50: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
8b60: 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ab);.      for(i
8b70: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
8b80: 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  Col; i<pTab->nCo
8b90: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
8ba0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48  .        if( IsH
8bb0: 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f 6c  iddenColumn(pCol
8bc0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
8bd0: 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  Hidden++;.      
8be0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8bf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8c00: 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c  if( (pCol->colFl
8c10: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
8c20: 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20 20  IMKEY)==0 ){.   
8c30: 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20         k = 0;.  
8c40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8c50: 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPk==0 ){.      
8c60: 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20 20      k = 1;.     
8c70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8c80: 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d      for(k=1; k<=
8c90: 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70 50  pTab->nCol && pP
8ca0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d  k->aiColumn[k-1]
8cb0: 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20  !=i; k++){}.    
8cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
8cd0: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44 66 6c  sert( pCol->pDfl
8ce0: 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70 44  t==0 || pCol->pD
8cf0: 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e  flt->op==TK_SPAN
8d00: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
8d10: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
8d20: 28 76 2c 20 31 2c 20 22 69 73 73 69 73 69 22 2c  (v, 1, "issisi",
8d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8d40: 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20 20  i-nHidden,.     
8d50: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
8d60: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
8d70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
8d80: 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29  umnType(pCol,"")
8d90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8da0: 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f   pCol->notNull ?
8db0: 20 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20   1 : 0,.        
8dc0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66         pCol->pDf
8dd0: 6c 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  lt ? pCol->pDflt
8de0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c 0a  ->u.zToken : 0,.
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
8e00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8e10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8e20: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
8e30: 20 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   6);.      }.   
8e40: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
8e50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8e60: 45 42 55 47 0a 20 20 63 61 73 65 20 50 72 61 67  EBUG.  case Prag
8e70: 54 79 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20 20  Typ_STATS: {.   
8e80: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
8e90: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
8ea0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
8eb0: 3d 20 35 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 5;.    sqlite3
8ec0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
8ed0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
8ee0: 20 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48     for(i=sqliteH
8ef0: 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
8f00: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
8f10: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
8f20: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 20  hNext(i)){.     
8f30: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
8f40: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
8f50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8f60: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
8f70: 31 2c 20 22 73 73 69 69 69 22 2c 0a 20 20 20 20  1, "ssiii",.    
8f80: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
8f90: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 30  me,.           0
8fa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
8fb0: 62 2d 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20 20  b->szTabRow,.   
8fc0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
8fd0: 6f 77 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20 20  owLogEst,.      
8fe0: 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
8ff0: 61 67 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ags);.      sqli
9000: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9010: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
9020: 2c 20 35 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 5);.      for(
9030: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
9040: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
9050: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
9060: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9070: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20 22  ultiLoad(v, 2, "
9080: 73 69 69 69 22 2c 0a 20 20 20 20 20 20 20 20 20  siii",.         
9090: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20    pIdx->zName,. 
90a0: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
90b0: 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20 20  szIdxRow,.      
90c0: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77       pIdx->aiRow
90d0: 4c 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20 20  LogEst[0],.     
90e0: 20 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73 53        pIdx->hasS
90f0: 74 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20 73  tat1);.        s
9100: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9110: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9120: 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d  , 1, 5);.      }
9130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
9140: 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61  ak;.#endif..  ca
9150: 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58  se PragTyp_INDEX
9160: 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68  _INFO: if( zRigh
9170: 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t ){.    Index *
9180: 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20  pIdx;.    Table 
9190: 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20  *pTab;.    pIdx 
91a0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
91b0: 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a  ex(db, zRight, z
91c0: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  Db);.    if( pId
91d0: 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  x ){.      int i
91e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 3b 0a  ;.      int mx;.
91f0: 20 20 20 20 20 20 69 66 28 20 70 50 72 61 67 6d        if( pPragm
9200: 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20 20 20  a->iArg ){.     
9210: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64     /* PRAGMA ind
9220: 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65 72 20  ex_xinfo (newer 
9230: 76 65 72 73 69 6f 6e 20 77 69 74 68 20 6d 6f 72  version with mor
9240: 65 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75 6d  e rows and colum
9250: 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ns) */.        m
9260: 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  x = pIdx->nColum
9270: 6e 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  n;.        pPars
9280: 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20  e->nMem = 6;.   
9290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
92a0: 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65    /* PRAGMA inde
92b0: 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79 20 76  x_info (legacy v
92c0: 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 20  ersion) */.     
92d0: 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 4b     mx = pIdx->nK
92e0: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  eyCol;.        p
92f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b  Parse->nMem = 3;
9300: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
9310: 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
9320: 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  le;.      sqlite
9330: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
9340: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
9350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9360: 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61  arse->nMem<=pPra
9370: 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 20  gma->nPragCName 
9380: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
9390: 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<mx; i++){.  
93a0: 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20 3d        i16 cnum =
93b0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
93c0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  i];.        sqli
93d0: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
93e0: 28 76 2c 20 31 2c 20 22 69 69 73 22 2c 20 69 2c  (v, 1, "iis", i,
93f0: 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20   cnum,.         
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9410: 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20 3a      cnum<0 ? 0 :
9420: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d   pTab->aCol[cnum
9430: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
9440: 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69    if( pPragma->i
9450: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Arg ){.         
9460: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9470: 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73 69  iLoad(v, 4, "isi
9480: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
9490: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
94a0: 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
94b0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c  pIdx->azColl[i],
94c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 70  .            i<p
94d0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
94e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
94f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9500: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
9510: 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e  ow, 1, pParse->n
9520: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mem);.      }.  
9530: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9540: 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  ..  case PragTyp
9550: 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66 28  _INDEX_LIST: if(
9560: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49   zRight ){.    I
9570: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
9580: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
9590: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 61 62   int i;.    pTab
95a0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
95b0: 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  ble(db, zRight, 
95c0: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
95d0: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  ab ){.      pPar
95e0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20  se->nMem = 5;.  
95f0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
9600: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
9610: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
9620: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
9630: 49 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49 64 78  Index, i=0; pIdx
9640: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
9650: 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, i++){.      
9660: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
9670: 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63 22  Origin[] = { "c"
9680: 2c 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a 20  , "u", "pk" };. 
9690: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
96a0: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
96b0: 2c 20 22 69 73 69 73 69 22 2c 0a 20 20 20 20 20  , "isisi",.     
96c0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
96d0: 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c      pIdx->zName,
96e0: 0a 20 20 20 20 20 20 20 20 20 20 20 49 73 55 6e  .           IsUn
96f0: 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 2c  iqueIndex(pIdx),
9700: 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 4f 72  .           azOr
9710: 69 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54 79  igin[pIdx->idxTy
9720: 70 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pe],.           
9730: 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
9740: 65 72 65 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ere!=0);.       
9750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9760: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
9770: 6f 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20  ow, 1, 5);.     
9780: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
9790: 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72  reak;..  case Pr
97a0: 61 67 54 79 70 5f 44 41 54 41 42 41 53 45 5f 4c  agTyp_DATABASE_L
97b0: 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  IST: {.    int i
97c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
97d0: 65 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72 28  em = 3;.    for(
97e0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
97f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
9800: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d  db->aDb[i].pBt==
9810: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
9820: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
9830: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 21  aDb[i].zDbSName!
9840: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
9850: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9860: 28 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20 20  (v, 1, "iss",.  
9870: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
9880: 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44     db->aDb[i].zD
9890: 62 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  bSName,.        
98a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
98b0: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
98c0: 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 20  [i].pBt));.     
98d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
98e0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
98f0: 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 20 20 7d  ow, 1, 3);.    }
9900: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
9910: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f   case PragTyp_CO
9920: 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a  LLATION_LIST: {.
9930: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
9940: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
9950: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9960: 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 70 3d   = 2;.    for(p=
9970: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9980: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
9990: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
99a0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 43  ext(p)){.      C
99b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
99c0: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
99d0: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
99e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
99f0: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9a00: 69 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d  is", i++, pColl-
9a10: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
9a20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9a30: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9a40: 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 2);.    }. 
9a50: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
9a60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9a70: 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41 53  T_SCHEMA_PRAGMAS
9a80: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
9a90: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
9aa0: 5f 4b 45 59 0a 20 20 63 61 73 65 20 50 72 61 67  _KEY.  case Prag
9ab0: 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f  Typ_FOREIGN_KEY_
9ac0: 4c 49 53 54 3a 20 69 66 28 20 7a 52 69 67 68 74  LIST: if( zRight
9ad0: 20 29 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46   ){.    FKey *pF
9ae0: 4b 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  K;.    Table *pT
9af0: 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  ab;.    pTab = s
9b00: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
9b10: 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29  db, zRight, zDb)
9b20: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
9b30: 7b 0a 20 20 20 20 20 20 70 46 4b 20 3d 20 70 54  {.      pFK = pT
9b40: 61 62 2d 3e 70 46 4b 65 79 3b 0a 20 20 20 20 20  ab->pFKey;.     
9b50: 20 69 66 28 20 70 46 4b 20 29 7b 0a 20 20 20 20   if( pFK ){.    
9b60: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a      int i = 0; .
9b70: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
9b80: 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20 20 20 20 20  nMem = 8;.      
9b90: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
9ba0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
9bb0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
9bc0: 77 68 69 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20  while(pFK){.    
9bd0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
9be0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
9bf0: 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  j<pFK->nCol; j++
9c00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
9c10: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
9c20: 6f 61 64 28 76 2c 20 31 2c 20 22 69 69 73 73 73  oad(v, 1, "iisss
9c30: 73 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sss",.          
9c40: 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20           i,.    
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
9c60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9c70: 20 20 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20       pFK->zTo,. 
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c90: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b    pTab->aCol[pFK
9ca0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d  ->aCol[j].iFrom]
9cb0: 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  .zName,.        
9cc0: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d 3e             pFK->
9cd0: 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20  aCol[j].zCol,.  
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d   actionName(pFK-
9d00: 3e 61 41 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f  >aAction[1]),  /
9d10: 2a 20 4f 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20  * ON UPDATE */. 
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b    actionName(pFK
9d40: 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20  ->aAction[0]),  
9d50: 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a  /* ON DELETE */.
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20     "NONE");.    
9d80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9d90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9da0: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 38 29  ResultRow, 1, 8)
9db0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9dc0: 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20          ++i;.   
9dd0: 20 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46 4b         pFK = pFK
9de0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20  ->pNextFrom;.   
9df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9e00: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
9e10: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
9e20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9e30: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
9e40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9e50: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
9e60: 59 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  Y.#ifndef SQLITE
9e70: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
9e80: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52  case PragTyp_FOR
9e90: 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20  EIGN_KEY_CHECK: 
9ea0: 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b  {.    FKey *pFK;
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ec0: 41 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  A foreign key co
9ed0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
9ee0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
9ef0: 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20         /* Child 
9f00: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52  table contain "R
9f10: 45 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77 6f  EFERENCES" keywo
9f20: 72 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  rd */.    Table 
9f30: 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
9f40: 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65   /* Parent table
9f50: 20 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69 6e   that child poin
9f60: 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64  ts to */.    Ind
9f70: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
9f80: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
9f90: 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
9fa0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   */.    int i;  
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9fc0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20  * Loop counter: 
9fd0: 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d   Foreign key num
9fe0: 62 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  ber for pTab */.
9ff0: 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20      int j;      
a000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a010: 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69 65  op counter:  Fie
a020: 6c 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67  ld of the foreig
a030: 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61 73  n key */.    Has
a040: 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
a050: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
a060: 74 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c 65  ter:  Next table
a070: 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20   in schema */.  
a080: 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20    int x;        
a090: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73 75           /* resu
a0a0: 6c 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  lt variable */. 
a0b0: 20 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74     int regResult
a0c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 72  ;         /* 3 r
a0d0: 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
a0e0: 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
a0f0: 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79 3b  .    int regKey;
a100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a110: 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20  egister to hold 
a120: 6b 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e 67  key for checking
a130: 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69   the FK */.    i
a140: 6e 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20 20  nt regRow;      
a150: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
a160: 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77  rs to hold a row
a170: 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20   from pTab */.  
a180: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
a190: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
a1a0: 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69  of a loop checki
a1b0: 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ng foreign keys 
a1c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f  */.    int addrO
a1d0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
a1e0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
a1f0: 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20  e key is OK */. 
a200: 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20     int *aiCols; 
a210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 69            /* chi
a220: 6c 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c  ld to parent col
a230: 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a  umn mapping */..
a240: 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20      regResult = 
a250: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
a260: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
a270: 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b 65   += 4;.    regKe
a280: 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  y = ++pParse->nM
a290: 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  em;.    regRow =
a2a0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
a2b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
a2c0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
a2d0: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6b  rse, iDb);.    k
a2e0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 72   = sqliteHashFir
a2f0: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d  st(&db->aDb[iDb]
a300: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
a310: 68 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6b  h);.    while( k
a320: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 52   ){.      if( zR
a330: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
a340: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
a350: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
a360: 2c 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  , 0, zRight, zDb
a370: 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30  );.        k = 0
a380: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a390: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54         pTab = (T
a3a0: 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
a3b0: 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20  Data(k);.       
a3c0: 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e   k = sqliteHashN
a3d0: 65 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  ext(k);.      }.
a3e0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
a3f0: 30 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79  0 || pTab->pFKey
a400: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
a410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
a420: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
a430: 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
a440: 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
a450: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
a460: 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50 61  >nCol+regRow>pPa
a470: 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72  rse->nMem ) pPar
a480: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62 2d  se->nMem = pTab-
a490: 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b 0a  >nCol + regRow;.
a4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
a4b0: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  nTable(pParse, 0
a4c0: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
a4d0: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
a4e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
a4f0: 53 74 72 69 6e 67 28 76 2c 20 72 65 67 52 65 73  String(v, regRes
a500: 75 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ult, pTab->zName
a510: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  );.      for(i=1
a520: 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65  , pFK=pTab->pFKe
a530: 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b  y; pFK; i++, pFK
a540: 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  =pFK->pNextFrom)
a550: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65 6e  {.        pParen
a560: 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  t = sqlite3FindT
a570: 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54  able(db, pFK->zT
a580: 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20  o, zDb);.       
a590: 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20   if( pParent==0 
a5a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a5b0: 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
a5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
a5d0: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
a5e0: 44 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75  Db, pParent->tnu
a5f0: 6d 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a  m, 0, pParent->z
a600: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78  Name);.        x
a610: 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61   = sqlite3FkLoca
a620: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
a630: 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70  pParent, pFK, &p
a640: 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Idx, 0);.       
a650: 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20   if( x==0 ){.   
a660: 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 3d         if( pIdx=
a670: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a680: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
a690: 6c 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 44  le(pParse, i, iD
a6a0: 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f 4f  b, pParent, OP_O
a6b0: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
a6c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a6d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a6e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
a6f0: 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49 64 78  penRead, i, pIdx
a700: 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
a710: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a720: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
a730: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
a740: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a750: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a760: 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20        k = 0;.   
a770: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a780: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a790: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a7a0: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20  arse->nErr>0 || 
a7b0: 70 46 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pFK==0 );.      
a7c0: 69 66 28 20 70 46 4b 20 29 20 62 72 65 61 6b 3b  if( pFK ) break;
a7d0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
a7e0: 65 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50 61 72  e->nTab<i ) pPar
a7f0: 73 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20  se->nTab = i;.  
a800: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
a810: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
a820: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29  v, OP_Rewind, 0)
a830: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
a840: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  );.      for(i=1
a850: 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65  , pFK=pTab->pFKe
a860: 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b  y; pFK; i++, pFK
a870: 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  =pFK->pNextFrom)
a880: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65 6e  {.        pParen
a890: 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  t = sqlite3FindT
a8a0: 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54  able(db, pFK->zT
a8b0: 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20  o, zDb);.       
a8c0: 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20   pIdx = 0;.     
a8d0: 20 20 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20     aiCols = 0;. 
a8e0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65         if( pPare
a8f0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
a900: 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63  x = sqlite3FkLoc
a910: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
a920: 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26   pParent, pFK, &
a930: 70 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a  pIdx, &aiCols);.
a940: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
a950: 28 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x==0 );.      
a960: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
a970: 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Ok = sqlite3Vdbe
a980: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
a990: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e        if( pParen
a9a0: 74 20 26 26 20 70 49 64 78 3d 3d 30 20 29 7b 0a  t && pIdx==0 ){.
a9b0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4b            int iK
a9c0: 65 79 20 3d 20 70 46 4b 2d 3e 61 43 6f 6c 5b 30  ey = pFK->aCol[0
a9d0: 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20  ].iFrom;.       
a9e0: 20 20 20 61 73 73 65 72 74 28 20 69 4b 65 79 3e     assert( iKey>
a9f0: 3d 30 20 26 26 20 69 4b 65 79 3c 70 54 61 62 2d  =0 && iKey<pTab-
aa00: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20  >nCol );.       
aa10: 20 20 20 69 66 28 20 69 4b 65 79 21 3d 70 54 61     if( iKey!=pTa
aa20: 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
aa30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
aa40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
aa50: 43 6f 6c 75 6d 6e 2c 20 30 2c 20 69 4b 65 79 2c  Column, 0, iKey,
aa60: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20   regRow);.      
aa70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
aa80: 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
aa90: 61 62 2c 20 69 4b 65 79 2c 20 72 65 67 52 6f 77  ab, iKey, regRow
aaa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
aab0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
aac0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
aad0: 65 67 52 6f 77 2c 20 61 64 64 72 4f 6b 29 3b 20  egRow, addrOk); 
aae0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
aaf0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ab00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
ab10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ab20: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20  v, OP_Rowid, 0, 
ab30: 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  regRow);.       
ab40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
ab50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ab60: 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
ab70: 2c 20 69 2c 20 30 2c 20 72 65 67 52 6f 77 29 3b  , i, 0, regRow);
ab80: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ab90: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
aba0: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
abb0: 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20  ddrOk);.        
abc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
abd0: 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33  pHere(v, sqlite3
abe0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
abf0: 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  v)-2);.        }
ac00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ac10: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e  for(j=0; j<pFK->
ac20: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
ac30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ac40: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
ac50: 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
ac60: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 61 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b  aiCols ? aiCols[
ac90: 6a 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a  j] : pFK->aCol[j
aca0: 5d 2e 69 46 72 6f 6d 2c 20 72 65 67 52 6f 77 2b  ].iFrom, regRow+
acb0: 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j);.            
acc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
acd0: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
ace0: 72 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f 6b  regRow+j, addrOk
acf0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
ad00: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  v);.          }.
ad10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
ad20: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  arent ){.       
ad30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ad40: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
ad50: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
ad60: 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b   pFK->nCol, regK
ad70: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66    sqlite3IndexAf
ada0: 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64  finityStr(db,pId
adb0: 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a  x), pFK->nCol);.
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
add0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
ade0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c  (v, OP_Found, i,
adf0: 20 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c   addrOk, regKey,
ae00: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
ae10: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ae20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ae30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ae40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ae50: 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30  2(v, OP_Rowid, 0
ae60: 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a  , regResult+1);.
ae70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ae80: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
ae90: 72 65 67 52 65 73 75 6c 74 2b 32 2c 20 22 73 69  regResult+2, "si
aea0: 22 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31  ", pFK->zTo, i-1
aeb0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
aec0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
aed0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
aee0: 67 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20  gResult, 4);.   
aef0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
af00: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
af10: 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20  addrOk);.       
af20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
af30: 62 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20  b, aiCols);.    
af40: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
af50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
af60: 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 54  P_Next, 0, addrT
af70: 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  op+1); VdbeCover
af80: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
af90: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
afa0: 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
afb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
afc0: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
afd0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
afe0: 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e  _TRIGGER) */.#en
aff0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
b000: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
b010: 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66  IGN_KEY) */..#if
b020: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 63 61  ndef NDEBUG.  ca
b030: 73 65 20 50 72 61 67 54 79 70 5f 50 41 52 53 45  se PragTyp_PARSE
b040: 52 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  R_TRACE: {.    i
b050: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
b060: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
b070: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c  tBoolean(zRight,
b080: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73   0) ){.        s
b090: 71 6c 69 74 65 33 50 61 72 73 65 72 54 72 61 63  qlite3ParserTrac
b0a0: 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65  e(stdout, "parse
b0b0: 72 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r: ");.      }el
b0c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b0d0: 74 65 33 50 61 72 73 65 72 54 72 61 63 65 28 30  te3ParserTrace(0
b0e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
b0f0: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
b100: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
b110: 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b 45  install the LIKE
b120: 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69   and GLOB functi
b130: 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61 6e  ons.  The varian
b140: 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20 75  t of LIKE.  ** u
b150: 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73 65  sed will be case
b160: 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e 6f   sensitive or no
b170: 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  t depending on t
b180: 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 63  he RHS..  */.  c
b190: 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 53 45  ase PragTyp_CASE
b1a0: 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 3a  _SENSITIVE_LIKE:
b1b0: 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
b1c0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
b1d0: 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75  e3RegisterLikeFu
b1e0: 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c 69  nctions(db, sqli
b1f0: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
b200: 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d  ight, 0));.    }
b210: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
b220: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e  ifndef SQLITE_IN
b230: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52  TEGRITY_CHECK_ER
b240: 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65  ROR_MAX.# define
b250: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54   SQLITE_INTEGRIT
b260: 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41  Y_CHECK_ERROR_MA
b270: 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69  X 100.#endif..#i
b280: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b290: 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
b2a0: 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41 47 4d 41  K.  /*    PRAGMA
b2b0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b2c0: 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20  .  **    PRAGMA 
b2d0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28  integrity_check(
b2e0: 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d  N).  **    PRAGM
b2f0: 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20  A quick_check.  
b300: 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75 69  **    PRAGMA qui
b310: 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a  ck_check(N).  **
b320: 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 65  .  ** Verify the
b330: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
b340: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
b350: 0a 20 20 2a 2a 20 54 68 65 20 22 71 75 69 63 6b  .  ** The "quick
b360: 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64 75 63  _check" is reduc
b370: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  ed version of . 
b380: 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63 68   ** integrity_ch
b390: 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f 20  eck designed to 
b3a0: 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74 61  detect most data
b3b0: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 0a  base corruption.
b3c0: 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68 65    ** without the
b3d0: 20 6f 76 65 72 68 65 61 64 20 6f 66 20 63 72 6f   overhead of cro
b3e0: 73 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e 64 65  ss-checking inde
b3f0: 78 65 73 2e 20 20 51 75 69 63 6b 5f 63 68 65 63  xes.  Quick_chec
b400: 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65 61 72  k.  ** is linear
b410: 20 74 69 6d 65 20 77 68 65 72 65 61 73 65 20 69   time wherease i
b420: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 69  ntegrity_check i
b430: 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f  s O(NlogN)..  */
b440: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
b450: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 3a  INTEGRITY_CHECK:
b460: 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c   {.    int i, j,
b470: 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a 20   addr, mxErr;.. 
b480: 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20 3d     int isQuick =
b490: 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72   (sqlite3Tolower
b4a0: 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29  (zLeft[0])=='q')
b4b0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
b4c0: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20   PRAGMA command 
b4d0: 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  was of the form 
b4e0: 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74  "PRAGMA <db>.int
b4f0: 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20  egrity_check",. 
b500: 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20 69     ** then iDb i
b510: 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
b520: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
b530: 73 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  se identified by
b540: 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e   <db>..    ** In
b550: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
b560: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61 74  integrity of dat
b570: 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20 69  abase iDb only i
b580: 73 20 76 65 72 69 66 69 65 64 20 62 79 0a 20 20  s verified by.  
b590: 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63 72    ** the VDBE cr
b5a0: 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20  eated below..   
b5b0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72   **.    ** Other
b5c0: 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6d  wise, if the com
b5d0: 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79 20  mand was simply 
b5e0: 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  "PRAGMA integrit
b5f0: 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20 20  y_check" (or.   
b600: 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69 63   ** "PRAGMA quic
b610: 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e 20  k_check"), then 
b620: 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 30 2e  iDb is set to 0.
b630: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
b640: 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f  et iDb.    ** to
b650: 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e 64   -1 here, to ind
b660: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 56  icate that the V
b670: 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69 66  DBE should verif
b680: 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 0a  y the integrity.
b690: 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74      ** of all at
b6a0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
b6b0: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
b6c0: 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20  ( iDb>=0 );.    
b6d0: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 7c  assert( iDb==0 |
b6e0: 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20  | pId2->z );.   
b6f0: 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20   if( pId2->z==0 
b700: 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20  ) iDb = -1;..   
b710: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
b720: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
b730: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
b740: 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a  Mem = 6;..    /*
b750: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
b760: 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a   error count */.
b770: 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49      mxErr = SQLI
b780: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
b790: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20  CK_ERROR_MAX;.  
b7a0: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
b7b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
b7c0: 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 6d  Int32(zRight, &m
b7d0: 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28  xErr);.      if(
b7e0: 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20   mxErr<=0 ){.   
b7f0: 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c       mxErr = SQL
b800: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
b810: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20  ECK_ERROR_MAX;. 
b820: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b830: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b840: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
b850: 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b 20 2f  , mxErr-1, 1); /
b860: 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65  * reg[1] holds e
b870: 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20  rrors left */.. 
b880: 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65     /* Do an inte
b890: 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 65  grity check on e
b8a0: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
b8b0: 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
b8c0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
b8d0: 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c 65  ){.      HashEle
b8e0: 6d 20 2a 78 3b 0a 20 20 20 20 20 20 48 61 73 68  m *x;.      Hash
b8f0: 20 2a 70 54 62 6c 73 3b 0a 20 20 20 20 20 20 69   *pTbls;.      i
b900: 6e 74 20 2a 61 52 6f 6f 74 3b 0a 20 20 20 20 20  nt *aRoot;.     
b910: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
b920: 20 20 20 20 69 6e 74 20 6d 78 49 64 78 20 3d 20      int mxIdx = 
b930: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  0;.      int nId
b940: 78 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4f 4d  x;..      if( OM
b950: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 3d 3d  IT_TEMPDB && i==
b960: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  1 ) continue;.  
b970: 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 26      if( iDb>=0 &
b980: 26 20 69 21 3d 69 44 62 20 29 20 63 6f 6e 74 69  & i!=iDb ) conti
b990: 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  nue;..      sqli
b9a0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
b9b0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
b9c0: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20  .      /* Do an 
b9d0: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  integrity check 
b9e0: 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20 20  of the B-Tree.  
b9f0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
ba00: 42 65 67 69 6e 20 62 79 20 66 69 6e 64 69 6e 67  Begin by finding
ba10: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 73 20   the root pages 
ba20: 6e 75 6d 62 65 72 73 0a 20 20 20 20 20 20 2a 2a  numbers.      **
ba30: 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
ba40: 61 6e 64 20 69 6e 64 69 63 65 73 20 69 6e 20 74  and indices in t
ba50: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
ba60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
ba70: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
ba80: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
ba90: 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 54  , 0) );.      pT
baa0: 62 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  bls = &db->aDb[i
bab0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
bac0: 73 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e  sh;.      for(cn
bad0: 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73  t=0, x=sqliteHas
bae0: 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78  hFirst(pTbls); x
baf0: 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; x=sqliteHashNe
bb00: 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(x)){.        
bb10: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
bb20: 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b  liteHashData(x);
bb30: 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
bb40: 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66  pIdx;.        if
bb50: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
bb60: 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20   ) cnt++;.      
bb70: 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49    for(nIdx=0, pI
bb80: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
bb90: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
bba0: 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29  ->pNext, nIdx++)
bbb0: 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20  { cnt++; }.     
bbc0: 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49 64     if( nIdx>mxId
bbd0: 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64 78  x ) mxIdx = nIdx
bbe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bbf0: 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 44  aRoot = sqlite3D
bc00: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
bc10: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e   sizeof(int)*(cn
bc20: 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  t+1));.      if(
bc30: 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61   aRoot==0 ) brea
bc40: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74  k;.      for(cnt
bc50: 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68  =0, x=sqliteHash
bc60: 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b  First(pTbls); x;
bc70: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
bc80: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
bc90: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
bca0: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
bcb0: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
bcc0: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Idx;.        if(
bcd0: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
bce0: 29 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d  ) aRoot[cnt++] =
bcf0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pTab->tnum;.   
bd00: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
bd10: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
bd20: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
bd30: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  xt){.          a
bd40: 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70 49  Root[cnt++] = pI
bd50: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
bd60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bd70: 20 20 61 52 6f 6f 74 5b 63 6e 74 5d 20 3d 20 30    aRoot[cnt] = 0
bd80: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ;..      /* Make
bd90: 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
bda0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   number of regis
bdb0: 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  ters have been a
bdc0: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
bdd0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
bde0: 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d   MAX( pParse->nM
bdf0: 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a 0a  em, 8+mxIdx );..
be00: 20 20 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20        /* Do the 
be10: 62 2d 74 72 65 65 20 69 6e 74 65 67 72 69 74 79  b-tree integrity
be20: 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20 20 20 20   checks */.     
be30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
be40: 70 34 28 76 2c 20 4f 50 5f 49 6e 74 65 67 72 69  p4(v, OP_Integri
be50: 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c 20 31 2c  tyCk, 2, cnt, 1,
be60: 20 28 63 68 61 72 2a 29 61 52 6f 6f 74 2c 50 34   (char*)aRoot,P4
be70: 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 20 20  _INTARRAY);.    
be80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
be90: 6e 67 65 50 35 28 76 2c 20 28 75 38 29 69 29 3b  ngeP5(v, (u8)i);
bea0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
beb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bec0: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32 29  v, OP_IsNull, 2)
bed0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
bee0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bef0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
bf00: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20  _String8, 0, 3, 
bf10: 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  0,.         sqli
bf20: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
bf30: 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20  *** in database 
bf40: 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e 61  %s ***\n", db->a
bf50: 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 29 2c  Db[i].zDbSName),
bf60: 0a 20 20 20 20 20 20 20 20 20 50 34 5f 44 59 4e  .         P4_DYN
bf70: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  AMIC);.      sql
bf80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
bf90: 2c 20 4f 50 5f 4d 6f 76 65 2c 20 32 2c 20 34 2c  , OP_Move, 2, 4,
bfa0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
bfb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bfc0: 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c  OP_Concat, 4, 3,
bfd0: 20 32 29 3b 0a 20 20 20 20 20 20 69 6e 74 65 67   2);.      integ
bfe0: 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52  rityCheckResultR
bff0: 6f 77 28 76 2c 20 32 29 3b 0a 20 20 20 20 20 20  ow(v, 2);.      
c000: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c010: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20  ere(v, addr);.. 
c020: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
c030: 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63 65  e all the indice
c040: 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74 65  s are constructe
c050: 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20  d correctly..   
c060: 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
c070: 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  x=sqliteHashFirs
c080: 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73  t(pTbls); x; x=s
c090: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29  qliteHashNext(x)
c0a0: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
c0b0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
c0c0: 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20  ashData(x);.    
c0d0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c      Index *pIdx,
c0e0: 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20 20 49   *pPk;.        I
c0f0: 6e 64 65 78 20 2a 70 50 72 69 6f 72 20 3d 20 30  ndex *pPrior = 0
c100: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 6f  ;.        int lo
c110: 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  opTop;.        i
c120: 6e 74 20 69 44 61 74 61 43 75 72 2c 20 69 49 64  nt iDataCur, iId
c130: 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  xCur;.        in
c140: 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20 20 20  t r1 = -1;..    
c150: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
c160: 75 6d 3c 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  um<1 ) continue;
c170: 20 20 2f 2a 20 53 6b 69 70 20 56 49 45 57 73 20    /* Skip VIEWs 
c180: 6f 72 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  or VIRTUAL TABLE
c190: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
c1a0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 3d 3d 30   pTab->pCheck==0
c1b0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54  .         && (pT
c1c0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
c1d0: 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 29 3d 3d 30  F_HasNotNull)==0
c1e0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54  .         && (pT
c1f0: 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 7c 7c  ab->pIndex==0 ||
c200: 20 69 73 51 75 69 63 6b 29 0a 20 20 20 20 20 20   isQuick).      
c210: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63    ){.          c
c220: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 4e 6f 20  ontinue;  /* No 
c230: 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b  additional check
c240: 73 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68 69  s needed for thi
c250: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  s table */.     
c260: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 6b     }.        pPk
c270: 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61 62   = HasRowid(pTab
c280: 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 50  ) ? 0 : sqlite3P
c290: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
c2a0: 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Tab);.        sq
c2b0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
c2c0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
c2d0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
c2e0: 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28  TableAndIndices(
c2f0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4f 50  pParse, pTab, OP
c300: 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c 0a 20 20  _OpenRead, 0,.  
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c330: 20 31 2c 20 30 2c 20 26 69 44 61 74 61 43 75 72   1, 0, &iDataCur
c340: 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20  , &iIdxCur);.   
c350: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c360: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c370: 65 67 65 72 2c 20 30 2c 20 37 29 3b 0a 20 20 20  eger, 0, 7);.   
c380: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
c390: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
c3a0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
c3b0: 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20  ->pNext, j++){. 
c3c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c3d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c3e0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 38 2b 6a  _Integer, 0, 8+j
c3f0: 29 3b 20 2f 2a 20 69 6e 64 65 78 20 65 6e 74 72  ); /* index entr
c400: 69 65 73 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ies counter */. 
c410: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c420: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
c430: 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a 20 20  >nMem>=8+j );.  
c440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
c450: 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61  lite3NoTempsInRa
c460: 6e 67 65 28 70 50 61 72 73 65 2c 31 2c 37 2b 6a  nge(pParse,1,7+j
c470: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
c480: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c490: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44 61  , OP_Rewind, iDa
c4a0: 74 61 43 75 72 2c 20 30 29 3b 20 56 64 62 65 43  taCur, 0); VdbeC
c4b0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
c4c0: 20 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73 71      loopTop = sq
c4d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c4e0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 37 2c  v, OP_AddImm, 7,
c4f0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20   1);.        /* 
c500: 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  Verify that all 
c510: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
c520: 20 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54 20   really are NOT 
c530: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  NULL */.        
c540: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
c550: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
c560: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72         char *zEr
c570: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  r;.          int
c580: 20 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20 20 20   jmp2;.         
c590: 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50   if( j==pTab->iP
c5a0: 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Key ) continue;.
c5b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
c5c0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  ab->aCol[j].notN
c5d0: 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ull==0 ) continu
c5e0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e;.          sql
c5f0: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
c600: 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
c610: 70 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20  pTab, iDataCur, 
c620: 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  j, 3);.         
c630: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
c640: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54  geP5(v, OPFLAG_T
c650: 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
c660: 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69       jmp2 = sqli
c670: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c680: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b   OP_NotNull, 3);
c690: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c6a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72 72  ;.          zErr
c6b0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
c6c0: 66 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61 6c 75  f(db, "NULL valu
c6d0: 65 20 69 6e 20 25 73 2e 25 73 22 2c 20 70 54 61  e in %s.%s", pTa
c6e0: 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
c710: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
c720: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c730: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
c740: 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30  String8, 0, 3, 0
c750: 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d  , zErr, P4_DYNAM
c760: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  IC);.          i
c770: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73  ntegrityCheckRes
c780: 75 6c 74 52 6f 77 28 76 2c 20 33 29 3b 0a 20 20  ultRow(v, 3);.  
c790: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c7a0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
c7b0: 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mp2);.        }.
c7c0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
c7d0: 79 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  y CHECK constrai
c7e0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
c7f0: 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20  f( pTab->pCheck 
c800: 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
c810: 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43 68 65  SQLITE_IgnoreChe
c820: 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  cks)==0 ){.     
c830: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
c840: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
c850: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c860: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 30 29 3b  Tab->pCheck, 0);
c870: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
c880: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
c890: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
c8a0: 20 20 69 6e 74 20 61 64 64 72 43 6b 46 61 75 6c    int addrCkFaul
c8b0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
c8c0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
c8d0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64           int add
c8e0: 72 43 6b 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  rCkOk = sqlite3V
c8f0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
c910: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20  r *zErr;.       
c920: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
c930: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
c940: 69 53 65 6c 66 54 61 62 20 3d 20 69 44 61 74 61  iSelfTab = iData
c950: 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Cur;.           
c960: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
c970: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
c980: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
c990: 3d 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 2d 31  =pCheck->nExpr-1
c9a0: 3b 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20  ; k>0; k--){.   
c9b0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c9c0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
c9d0: 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b  arse, pCheck->a[
c9e0: 6b 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b  k].pExpr, addrCk
c9f0: 46 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  Fault, 0);.     
ca00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ca10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ca20: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
ca30: 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45 78 70  Check->a[0].pExp
ca40: 72 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a 20 20  r, addrCkOk, .  
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
ca60: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
ca70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
ca80: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
ca90: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 46  Label(v, addrCkF
caa0: 61 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ault);.         
cab0: 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65     zErr = sqlite
cac0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 48  3MPrintf(db, "CH
cad0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  ECK constraint f
cae0: 61 69 6c 65 64 20 69 6e 20 25 73 22 2c 0a 20 20  ailed in %s",.  
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
cb00: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
cb10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cb20: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
cb30: 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30  String8, 0, 3, 0
cb40: 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d  , zErr, P4_DYNAM
cb50: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
cb60: 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52   integrityCheckR
cb70: 65 73 75 6c 74 52 6f 77 28 76 2c 20 33 29 3b 0a  esultRow(v, 3);.
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
cb90: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
cba0: 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b 29  bel(v, addrCkOk)
cbb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
cbc0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
cbd0: 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
cbe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
cbf0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cc00: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 68 65 63  Delete(db, pChec
cc10: 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  k);.        }.  
cc20: 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74        /* Validat
cc30: 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  e index entries 
cc40: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
cc50: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  row */.        f
cc60: 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61  or(j=0, pIdx=pTa
cc70: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
cc80: 26 26 20 21 69 73 51 75 69 63 6b 3b 20 70 49 64  && !isQuick; pId
cc90: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
cca0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
ccb0: 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a  nt jmp2, jmp3, j
ccc0: 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20 20 20 20  mp4, jmp5;.     
ccd0: 20 20 20 20 20 69 6e 74 20 63 6b 55 6e 69 71 20       int ckUniq 
cce0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
ccf0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
cd00: 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49       if( pPk==pI
cd10: 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  dx ) continue;. 
cd20: 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
cd30: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
cd40: 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
cd50: 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c  dx, iDataCur, 0,
cd60: 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20 20   0, &jmp3,.     
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20    pPrior, r1);. 
cda0: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
cdb0: 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
cdc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cdd0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
cde0: 2c 20 38 2b 6a 2c 20 31 29 3b 20 20 2f 2a 20 69  , 8+j, 1);  /* i
cdf0: 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72 79 20 63  ncrement entry c
ce00: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ount */.        
ce10: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
ce20: 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
ce30: 65 78 69 73 74 73 20 66 6f 72 20 74 68 65 20 63  exists for the c
ce40: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 72 6f 77  urrent table row
ce50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6a 6d   */.          jm
ce60: 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
ce70: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
ce80: 46 6f 75 6e 64 2c 20 69 49 64 78 43 75 72 2b 6a  Found, iIdxCur+j
ce90: 2c 20 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20 20  , ckUniq, r1,.  
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d      pIdx->nColum
ced0: 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  n); VdbeCoverage
cee0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
cef0: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
cf00: 72 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20  ring(v, 3, "row 
cf10: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ");.          sq
cf20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
cf30: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c  v, OP_Concat, 7,
cf40: 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   3, 3);.        
cf50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
cf60: 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 22 20  dString(v, 4, " 
cf70: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64  missing from ind
cf80: 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ex ");.         
cf90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cfa0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
cfb0: 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20   4, 3, 3);.     
cfc0: 20 20 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c 69       jmp5 = sqli
cfd0: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
cfe0: 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e  g(v, 4, pIdx->zN
cff0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
d000: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d010: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
d020: 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20  4, 3, 3);.      
d030: 20 20 20 20 6a 6d 70 34 20 3d 20 69 6e 74 65 67      jmp4 = integ
d040: 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52  rityCheckResultR
d050: 6f 77 28 76 2c 20 33 29 3b 0a 20 20 20 20 20 20  ow(v, 3);.      
d060: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d070: 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29  umpHere(v, jmp2)
d080: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;.          /* F
d090: 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 65  or UNIQUE indexe
d0a0: 73 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 6f  s, verify that o
d0b0: 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20 65 78  nly one entry ex
d0c0: 69 73 74 73 20 77 69 74 68 20 74 68 65 0a 20 20  ists with the.  
d0d0: 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65          ** curre
d0e0: 6e 74 20 6b 65 79 2e 20 20 54 68 65 20 65 6e 74  nt key.  The ent
d0f0: 72 79 20 69 73 20 75 6e 69 71 75 65 20 69 66 20  ry is unique if 
d100: 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69  (1) any column i
d110: 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20  s NULL.         
d120: 20 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20 6e   ** or (2) the n
d130: 65 78 74 20 65 6e 74 72 79 20 68 61 73 20 61 20  ext entry has a 
d140: 64 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a 2f  different key */
d150: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
d160: 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
d170: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x) ){.          
d180: 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73    int uniqOk = s
d190: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d1a0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
d1b0: 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20 20      int jmp6;.  
d1c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 6b            int kk
d1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
d1e0: 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78 2d  r(kk=0; kk<pIdx-
d1f0: 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b  >nKeyCol; kk++){
d200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
d210: 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt iCol = pIdx->
d220: 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20  aiColumn[kk];.  
d230: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
d240: 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f 57  rt( iCol!=XN_ROW
d250: 49 44 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  ID && iCol<pTab-
d260: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20  >nCol );.       
d270: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
d280: 3d 30 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c  =0 && pTab->aCol
d290: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
d2a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d2b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d2c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d2d0: 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c 20  _IsNull, r1+kk, 
d2e0: 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20  uniqOk);.       
d2f0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
d300: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
d310: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d320: 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65 33    jmp6 = sqlite3
d330: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d340: 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2b 6a  _Next, iIdxCur+j
d350: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
d360: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
d370: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
d380: 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20  v, uniqOk);.    
d390: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d3a0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
d3b0: 6d 70 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mp6);.          
d3c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d3d0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
d3e0: 47 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 75  GT, iIdxCur+j, u
d3f0: 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20 20  niqOk, r1,.     
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
d420: 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
d430: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
d440: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d450: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
d460: 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75 65  , 3, "non-unique
d470: 20 65 6e 74 72 79 20 69 6e 20 69 6e 64 65 78 20   entry in index 
d480: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
d490: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
d4a0: 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20  v, jmp5);.      
d4b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d4c0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d4d0: 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20   uniqOk);.      
d4e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d4f0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d500: 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20 20  ere(v, jmp4);.  
d510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
d520: 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
d530: 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70 33 29  el(pParse, jmp3)
d540: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d560: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
d570: 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f 70  , iDataCur, loop
d580: 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Top); VdbeCovera
d590: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
d5a0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
d5b0: 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31 29  re(v, loopTop-1)
d5c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
d5d0: 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
d5e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
d5f0: 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Quick ){.       
d600: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
d610: 61 64 53 74 72 69 6e 67 28 76 2c 20 32 2c 20 22  adString(v, 2, "
d620: 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72 69  wrong # of entri
d630: 65 73 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a  es in index ");.
d640: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
d650: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
d660: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
d670: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
d680: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
d690: 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20  if( pPk==pIdx ) 
d6a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d6b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d6c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
d6d0: 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20  unt, iIdxCur+j, 
d6e0: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
d6f0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d700: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
d710: 71 2c 20 38 2b 6a 2c 20 30 2c 20 33 29 3b 20 56  q, 8+j, 0, 3); V
d720: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d730: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d740: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
d750: 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c  v, SQLITE_NOTNUL
d760: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  L);.            
d770: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
d780: 74 72 69 6e 67 28 76 2c 20 33 2c 20 70 49 64 78  tring(v, 3, pIdx
d790: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
d7a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d7b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
d7c0: 6e 63 61 74 2c 20 33 2c 20 32 2c 20 37 29 3b 0a  ncat, 3, 2, 7);.
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
d7e0: 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74  grityCheckResult
d7f0: 52 6f 77 28 76 2c 20 37 29 3b 0a 20 20 20 20 20  Row(v, 7);.     
d800: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d810: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d820: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dr);.          }
d830: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
d840: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d850: 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20  _BTREECOUNT */. 
d860: 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20       } .    }.  
d870: 20 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63    {.      static
d880: 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d   const int iLn =
d890: 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e   VDBE_OFFSET_LIN
d8a0: 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20 73 74  ENO(2);.      st
d8b0: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
d8c0: 70 4c 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20  pList endCode[] 
d8d0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
d8e0: 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c  _AddImm,      1,
d8f0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
d900: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
d910: 20 20 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f    { OP_IfNotZero
d920: 2c 20 20 20 31 2c 20 34 2c 20 20 20 20 20 20 20  ,   1, 4,       
d930: 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a   0},    /* 1 */.
d940: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72          { OP_Str
d950: 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20  ing8,     0, 3, 
d960: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
d970: 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   2 */.        { 
d980: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20  OP_ResultRow,   
d990: 33 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  3, 1,        0},
d9a0: 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20      /* 3 */.    
d9b0: 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f    };.      VdbeO
d9c0: 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61  p *aOp;..      a
d9d0: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
d9e0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
d9f0: 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c  aySize(endCode),
da00: 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a   endCode, iLn);.
da10: 20 20 20 20 20 20 69 66 28 20 61 4f 70 20 29 7b        if( aOp ){
da20: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
da30: 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b 0a 20 20  p2 = 1-mxErr;.  
da40: 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 74        aOp[2].p4t
da50: 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b  ype = P4_STATIC;
da60: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e  .        aOp[2].
da70: 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20 20  p4.z = "ok";.   
da80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
da90: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
daa0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
dab0: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
dac0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
dad0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a  _OMIT_UTF16.  /*
dae0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65  .  **   PRAGMA e
daf0: 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50  ncoding.  **   P
db00: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
db10: 20 22 75 74 66 2d 38 22 7c 22 75 74 66 2d 31 36   "utf-8"|"utf-16
db20: 22 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22 75 74  "|"utf-16le"|"ut
db30: 66 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a  f-16be".  **.  *
db40: 2a 20 49 6e 20 69 74 73 20 66 69 72 73 74 20 66  * In its first f
db50: 6f 72 6d 2c 20 74 68 69 73 20 70 72 61 67 6d 61  orm, this pragma
db60: 20 72 65 74 75 72 6e 73 20 74 68 65 20 65 6e 63   returns the enc
db70: 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69  oding of the mai
db80: 6e 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  n.  ** database.
db90: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
dba0: 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   is not initiali
dbb0: 7a 65 64 2c 20 69 74 20 69 73 20 69 6e 69 74 69  zed, it is initi
dbc0: 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a  alized now..  **
dbd0: 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
dbe0: 20 66 6f 72 6d 20 6f 66 20 74 68 69 73 20 70 72   form of this pr
dbf0: 61 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20  agma is a no-op 
dc00: 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  if the main data
dc10: 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68  base file.  ** h
dc20: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
dc30: 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  een initialized.
dc40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
dc50: 20 73 65 74 73 20 74 68 65 20 64 65 66 61 75 6c   sets the defaul
dc60: 74 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  t.  ** encoding 
dc70: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
dc80: 64 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  d for the main d
dc90: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
dca0: 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
dcb0: 69 73 20 63 72 65 61 74 65 64 2e 20 49 66 20 61  is created. If a
dcc0: 6e 20 65 78 69 73 74 69 6e 67 20 6d 61 69 6e 20  n existing main 
dcd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
dce0: 20 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20 74 68   opened, then th
dcf0: 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 74  e.  ** default t
dd00: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ext encoding for
dd10: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61   the existing da
dd20: 74 61 62 61 73 65 20 69 73 20 75 73 65 64 2e 0a  tabase is used..
dd30: 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c    ** .  ** In al
dd40: 6c 20 63 61 73 65 73 20 6e 65 77 20 64 61 74 61  l cases new data
dd50: 62 61 73 65 73 20 63 72 65 61 74 65 64 20 75 73  bases created us
dd60: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
dd70: 6f 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20  ommand are.  ** 
dd80: 63 72 65 61 74 65 64 20 74 6f 20 75 73 65 20 74  created to use t
dd90: 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20  he same default 
dda0: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 73  text encoding as
ddb0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
ddc0: 73 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65 20  se. If.  ** the 
ddd0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 68 61  main database ha
dde0: 73 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74 69  s not been initi
ddf0: 61 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72  alized and/or cr
de00: 65 61 74 65 64 20 77 68 65 6e 20 41 54 54 41 43  eated when ATTAC
de10: 48 0a 20 20 2a 2a 20 69 73 20 65 78 65 63 75 74  H.  ** is execut
de20: 65 64 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65  ed, this is done
de30: 20 62 65 66 6f 72 65 20 74 68 65 20 41 54 54 41   before the ATTA
de40: 43 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  CH operation..  
de50: 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 73  **.  ** In the s
de60: 65 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73 20  econd form this 
de70: 70 72 61 67 6d 61 20 73 65 74 73 20 74 68 65 20  pragma sets the 
de80: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f  text encoding to
de90: 20 62 65 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a   be used in.  **
dea0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69   new database fi
deb0: 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  les created usin
dec0: 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  g this database 
ded0: 68 61 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e  handle. It is on
dee0: 6c 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20 69  ly.  ** useful i
def0: 66 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69  f invoked immedi
df00: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
df10: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 0a  main database i.
df20: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
df30: 54 79 70 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a  Typ_ENCODING: {.
df40: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
df50: 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20   struct EncName 
df60: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
df70: 61 6d 65 3b 0a 20 20 20 20 20 20 75 38 20 65 6e  ame;.      u8 en
df80: 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65  c;.    } encname
df90: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  s[] = {.      { 
dfa0: 22 55 54 46 38 22 2c 20 20 20 20 20 53 51 4c 49  "UTF8",     SQLI
dfb0: 54 45 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d  TE_UTF8        }
dfc0: 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 38  ,.      { "UTF-8
dfd0: 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46  ",    SQLITE_UTF
dfe0: 38 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20  8        },  /* 
dff0: 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20  Must be element 
e000: 5b 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22  [1] */.      { "
e010: 55 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54  UTF-16le", SQLIT
e020: 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c  E_UTF16LE     },
e030: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65    /* Must be ele
e040: 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20  ment [2] */.    
e050: 20 20 7b 20 22 55 54 46 2d 31 36 62 65 22 2c 20    { "UTF-16be", 
e060: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20  SQLITE_UTF16BE  
e070: 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62     },  /* Must b
e080: 65 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f  e element [3] */
e090: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 6c  .      { "UTF16l
e0a0: 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31  e",  SQLITE_UTF1
e0b0: 36 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  6LE     },.     
e0c0: 20 7b 20 22 55 54 46 31 36 62 65 22 2c 20 20 53   { "UTF16be",  S
e0d0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20  QLITE_UTF16BE   
e0e0: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54    },.      { "UT
e0f0: 46 2d 31 36 22 2c 20 20 20 30 20 20 20 20 20 20  F-16",   0      
e100: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f              }, /
e110: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
e120: 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20  TIVE */.      { 
e130: 22 55 54 46 31 36 22 2c 20 20 20 20 30 20 20 20  "UTF16",    0   
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
e150: 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31  , /* SQLITE_UTF1
e160: 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20  6NATIVE */.     
e170: 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b   { 0, 0 }.    };
e180: 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .    const struc
e190: 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b  t EncName *pEnc;
e1a0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
e1b0: 20 29 7b 20 20 20 20 2f 2a 20 22 50 52 41 47 4d   ){    /* "PRAGM
e1c0: 41 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20  A encoding" */. 
e1d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e1e0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
e1f0: 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61  e) ) goto pragma
e200: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 61 73 73 65  _out;.      asse
e210: 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c  rt( encnames[SQL
e220: 49 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53  ITE_UTF8].enc==S
e230: 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20  QLITE_UTF8 );.  
e240: 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e      assert( encn
e250: 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31  ames[SQLITE_UTF1
e260: 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45  6LE].enc==SQLITE
e270: 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 20 20  _UTF16LE );.    
e280: 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d    assert( encnam
e290: 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 42  es[SQLITE_UTF16B
e2a0: 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  E].enc==SQLITE_U
e2b0: 54 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20 20  TF16BE );.      
e2c0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74  returnSingleText
e2d0: 28 76 2c 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43  (v, encnames[ENC
e2e0: 28 70 50 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e  (pParse->db)].zN
e2f0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 20 20 20 20 2f 2a 20 22 50 52 41 47          /* "PRAG
e320: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58  MA encoding = XX
e330: 58 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f  X" */.      /* O
e340: 6e 6c 79 20 63 68 61 6e 67 65 20 74 68 65 20 76  nly change the v
e350: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 2e 65  alue of sqlite.e
e360: 6e 63 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nc if the databa
e370: 73 65 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74  se handle is not
e380: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  .      ** initia
e390: 6c 69 7a 65 64 2e 20 49 66 20 74 68 65 20 6d 61  lized. If the ma
e3a0: 69 6e 20 64 61 74 61 62 61 73 65 20 65 78 69 73  in database exis
e3b0: 74 73 2c 20 74 68 65 20 6e 65 77 20 73 71 6c 69  ts, the new sqli
e3c0: 74 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20 20  te.enc value.   
e3d0: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76     ** will be ov
e3e0: 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 20 74  erwritten when t
e3f0: 68 65 20 73 63 68 65 6d 61 20 69 73 20 6e 65 78  he schema is nex
e400: 74 20 6c 6f 61 64 65 64 2e 20 49 66 20 69 74 20  t loaded. If it 
e410: 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  does not.      *
e420: 2a 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  * already exists
e430: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 72 65  , it will be cre
e440: 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  ated to use the 
e450: 6e 65 77 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c  new encoding val
e460: 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ue..      */.   
e470: 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 20 20     if( .        
e480: 21 28 44 62 48 61 73 50 72 6f 70 65 72 74 79 28  !(DbHasProperty(
e490: 64 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  db, 0, DB_Schema
e4a0: 4c 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20 20 20  Loaded)) || .   
e4b0: 20 20 20 20 20 44 62 48 61 73 50 72 6f 70 65 72       DbHasProper
e4c0: 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70  ty(db, 0, DB_Emp
e4d0: 74 79 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  ty) .      ){.  
e4e0: 20 20 20 20 20 20 66 6f 72 28 70 45 6e 63 3d 26        for(pEnc=&
e4f0: 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e  encnames[0]; pEn
e500: 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b  c->zName; pEnc++
e510: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
e520: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
e530: 6d 70 28 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d  mp(zRight, pEnc-
e540: 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  >zName) ){.     
e550: 20 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e         SCHEMA_EN
e560: 43 28 64 62 29 20 3d 20 45 4e 43 28 64 62 29 20  C(db) = ENC(db) 
e570: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
e580: 20 20 70 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45    pEnc->enc ? pE
e590: 6e 63 2d 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45  nc->enc : SQLITE
e5a0: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
e5b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
e5c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e5d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
e5e0: 66 28 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20  f( !pEnc->zName 
e5f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
e600: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e610: 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65  rse, "unsupporte
e620: 64 20 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c  d encoding: %s",
e630: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
e640: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e650: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
e660: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e670: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
e680: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e690: 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  IT_SCHEMA_VERSIO
e6a0: 4e 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20  N_PRAGMAS.  /*. 
e6b0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
e6c0: 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72  hema.]schema_ver
e6d0: 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47  sion.  **   PRAG
e6e0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65  MA [schema.]sche
e6f0: 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e  ma_version = <in
e700: 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a  teger>.  **.  **
e710: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
e720: 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a  a.]user_version.
e730: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
e740: 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73  chema.]user_vers
e750: 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a  ion = <integer>.
e760: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    **.  **   PRAG
e770: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65  MA [schema.]free
e780: 6c 69 73 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a  list_count.  **.
e790: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
e7a0: 63 68 65 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73  chema.]data_vers
e7b0: 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ion.  **.  **   
e7c0: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
e7d0: 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20  application_id. 
e7e0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
e7f0: 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f  hema.]applicatio
e800: 6e 5f 69 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e  n_id = <integer>
e810: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  **.  ** The p
e820: 72 61 67 6d 61 27 73 20 73 63 68 65 6d 61 5f 76  ragma's schema_v
e830: 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f  ersion and user_
e840: 76 65 72 73 69 6f 6e 20 61 72 65 20 75 73 65 64  version are used
e850: 20 74 6f 20 73 65 74 20 6f 72 20 67 65 74 0a 20   to set or get. 
e860: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
e870: 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73   the schema-vers
e880: 69 6f 6e 20 61 6e 64 20 75 73 65 72 2d 76 65 72  ion and user-ver
e890: 73 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65  sion, respective
e8a0: 6c 79 2e 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68  ly. Both.  ** th
e8b0: 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e  e schema-version
e8c0: 20 61 6e 64 20 74 68 65 20 75 73 65 72 2d 76 65   and the user-ve
e8d0: 72 73 69 6f 6e 20 61 72 65 20 33 32 2d 62 69 74  rsion are 32-bit
e8e0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73   signed integers
e8f0: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
e900: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
e910: 64 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  der..  **.  ** T
e920: 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  he schema-cookie
e930: 20 69 73 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79   is usually only
e940: 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 69 6e 74   manipulated int
e950: 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74  ernally by SQLit
e960: 65 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e  e. It.  ** is in
e970: 63 72 65 6d 65 6e 74 65 64 20 62 79 20 53 51 4c  cremented by SQL
e980: 69 74 65 20 77 68 65 6e 65 76 65 72 20 74 68 65  ite whenever the
e990: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
e9a0: 20 69 73 20 6d 6f 64 69 66 69 65 64 20 28 62 79   is modified (by
e9b0: 0a 20 20 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f  .  ** creating o
e9c0: 72 20 64 72 6f 70 70 69 6e 67 20 61 20 74 61 62  r dropping a tab
e9d0: 6c 65 20 6f 72 20 69 6e 64 65 78 29 2e 20 54 68  le or index). Th
e9e0: 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
e9f0: 20 69 73 20 75 73 65 64 20 62 79 0a 20 20 2a 2a   is used by.  **
ea00: 20 53 51 4c 69 74 65 20 65 61 63 68 20 74 69 6d   SQLite each tim
ea10: 65 20 61 20 71 75 65 72 79 20 69 73 20 65 78 65  e a query is exe
ea20: 63 75 74 65 64 20 74 6f 20 65 6e 73 75 72 65 20  cuted to ensure 
ea30: 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61  that the interna
ea40: 6c 20 63 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20  l cache.  ** of 
ea50: 74 68 65 20 73 63 68 65 6d 61 20 75 73 65 64 20  the schema used 
ea60: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74  when compiling t
ea70: 68 65 20 53 51 4c 20 71 75 65 72 79 20 6d 61 74  he SQL query mat
ea80: 63 68 65 73 20 74 68 65 20 73 63 68 65 6d 61 20  ches the schema 
ea90: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  of.  ** the data
eaa0: 62 61 73 65 20 61 67 61 69 6e 73 74 20 77 68 69  base against whi
eab0: 63 68 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20  ch the compiled 
eac0: 71 75 65 72 79 20 69 73 20 61 63 74 75 61 6c 6c  query is actuall
ead0: 79 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a  y executed..  **
eae0: 20 53 75 62 76 65 72 74 69 6e 67 20 74 68 69 73   Subverting this
eaf0: 20 6d 65 63 68 61 6e 69 73 6d 20 62 79 20 75 73   mechanism by us
eb00: 69 6e 67 20 22 50 52 41 47 4d 41 20 73 63 68 65  ing "PRAGMA sche
eb10: 6d 61 5f 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d  ma_version" to m
eb20: 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73  odify.  ** the s
eb30: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73  chema-version is
eb40: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e   potentially dan
eb50: 67 65 72 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c  gerous and may l
eb60: 65 61 64 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20  ead to program. 
eb70: 20 2a 2a 20 63 72 61 73 68 65 73 20 6f 72 20 64   ** crashes or d
eb80: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
eb90: 6f 6e 2e 20 55 73 65 20 77 69 74 68 20 63 61 75  on. Use with cau
eba0: 74 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion!.  **.  ** 
ebb0: 54 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e  The user-version
ebc0: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
ebd0: 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74  ernally by SQLit
ebe0: 65 2e 20 49 74 20 6d 61 79 20 62 65 20 75 73 65  e. It may be use
ebf0: 64 20 62 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63  d by.  ** applic
ec00: 61 74 69 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70  ations for any p
ec10: 75 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  urpose..  */.  c
ec20: 61 73 65 20 50 72 61 67 54 79 70 5f 48 45 41 44  ase PragTyp_HEAD
ec30: 45 52 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  ER_VALUE: {.    
ec40: 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50  int iCookie = pP
ec50: 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a  ragma->iArg;  /*
ec60: 20 57 68 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f   Which cookie to
ec70: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 2a   read or write *
ec80: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
ec90: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
eca0: 62 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  b);.    if( zRig
ecb0: 68 74 20 26 26 20 28 70 50 72 61 67 6d 61 2d 3e  ht && (pPragma->
ecc0: 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
ecd0: 6c 67 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d 30 20  lg_ReadOnly)==0 
ece0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ){.      /* Writ
ecf0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
ed00: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a  cookie value */.
ed10: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
ed20: 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65  st VdbeOpList se
ed30: 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20  tCookie[] = {.  
ed40: 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73        { OP_Trans
ed50: 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31  action,    0,  1
ed60: 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a  ,  0},    /* 0 *
ed70: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53  /.        { OP_S
ed80: 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30  etCookie,      0
ed90: 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a  ,  0,  0},    /*
eda0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20   1 */.      };. 
edb0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70       VdbeOp *aOp
edc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
edd0: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
ede0: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
edf0: 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65  aySize(setCookie
ee00: 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  ));.      aOp = 
ee10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ee20: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
ee30: 65 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65  e(setCookie), se
ee40: 74 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  tCookie, 0);.   
ee50: 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52     if( ONLY_IF_R
ee60: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f  EALLOC_STRESS(aO
ee70: 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  p==0) ) break;. 
ee80: 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d       aOp[0].p1 =
ee90: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
eea0: 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  1].p1 = iDb;.   
eeb0: 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69     aOp[1].p2 = i
eec0: 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f  Cookie;.      aO
eed0: 70 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65  p[1].p3 = sqlite
eee0: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
eef0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ef00: 2f 2a 20 52 65 61 64 20 74 68 65 20 73 70 65 63  /* Read the spec
ef10: 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c  ified cookie val
ef20: 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  ue */.      stat
ef30: 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
ef40: 69 73 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d  ist readCookie[]
ef50: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f   = {.        { O
ef60: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20  P_Transaction,  
ef70: 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20     0,  0,  0},  
ef80: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
ef90: 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69    { OP_ReadCooki
efa0: 65 2c 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20  e,      0,  1,  
efb0: 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20  0},    /* 1 */. 
efc0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75         { OP_Resu
efd0: 6c 74 52 6f 77 2c 20 20 20 20 20 20 20 31 2c 20  ltRow,       1, 
efe0: 20 31 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b   1,  0}.      };
eff0: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61  .      VdbeOp *a
f000: 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Op;.      sqlite
f010: 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c  3VdbeVerifyNoMal
f020: 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41  locRequired(v, A
f030: 72 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f  rraySize(readCoo
f040: 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70  kie));.      aOp
f050: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f060: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
f070: 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29  Size(readCookie)
f080: 2c 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a  ,readCookie,0);.
f090: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
f0a0: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
f0b0: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
f0c0: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70  ;.      aOp[0].p
f0d0: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61  1 = iDb;.      a
f0e0: 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[1].p1 = iDb;.
f0f0: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20        aOp[1].p3 
f100: 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  = iCookie;.     
f110: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73   sqlite3VdbeReus
f120: 61 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  able(v);.    }. 
f130: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
f140: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f150: 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  T_SCHEMA_VERSION
f160: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
f170: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f180: 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
f190: 49 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  IAGS.  /*.  **  
f1a0: 20 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f   PRAGMA compile_
f1b0: 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a  options.  **.  *
f1c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
f1d0: 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c  es of all compil
f1e0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75  e-time options u
f1f0: 73 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  sed in this buil
f200: 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69  d,.  ** one opti
f210: 6f 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f  on per row..  */
f220: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
f230: 43 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a  COMPILE_OPTIONS:
f240: 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30   {.    int i = 0
f250: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f260: 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61 72   *zOpt;.    pPar
f270: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20  se->nMem = 1;.  
f280: 20 20 77 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d    while( (zOpt =
f290: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
f2a0: 6f 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29  option_get(i++))
f2b0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
f2c0: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
f2d0: 6e 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a  ng(v, 1, zOpt);.
f2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f2f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f300: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a  sultRow, 1, 1);.
f310: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f320: 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 76 29  3VdbeReusable(v)
f330: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  ;.  }.  break;.#
f340: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f350: 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
f360: 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66  ON_DIAGS */..#if
f370: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f380: 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  _WAL.  /*.  **  
f390: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
f3a0: 5d 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  ]wal_checkpoint 
f3b0: 3d 20 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72  = passive|full|r
f3c0: 65 73 74 61 72 74 7c 74 72 75 6e 63 61 74 65 0a  estart|truncate.
f3d0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70    **.  ** Checkp
f3e0: 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  oint the databas
f3f0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e..  */.  case P
f400: 72 61 67 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b  ragTyp_WAL_CHECK
f410: 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74  POINT: {.    int
f420: 20 69 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f   iBt = (pId2->z?
f430: 69 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41  iDb:SQLITE_MAX_A
f440: 54 54 41 43 48 45 44 29 3b 0a 20 20 20 20 69 6e  TTACHED);.    in
f450: 74 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  t eMode = SQLITE
f460: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
f470: 49 56 45 3b 0a 20 20 20 20 69 66 28 20 7a 52 69  IVE;.    if( zRi
f480: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ght ){.      if(
f490: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f4a0: 7a 52 69 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d  zRight, "full")=
f4b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
f4c0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45  ode = SQLITE_CHE
f4d0: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20  CKPOINT_FULL;.  
f4e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
f4f0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
f500: 67 68 74 2c 20 22 72 65 73 74 61 72 74 22 29 3d  ght, "restart")=
f510: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
f520: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45  ode = SQLITE_CHE
f530: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b  CKPOINT_RESTART;
f540: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f550: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f560: 7a 52 69 67 68 74 2c 20 22 74 72 75 6e 63 61 74  zRight, "truncat
f570: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
f580: 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45    eMode = SQLITE
f590: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e  _CHECKPOINT_TRUN
f5a0: 43 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CATE;.      }.  
f5b0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
f5c0: 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71  nMem = 3;.    sq
f5d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f5e0: 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  v, OP_Checkpoint
f5f0: 2c 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29  , iBt, eMode, 1)
f600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f610: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f620: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a  sultRow, 1, 3);.
f630: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20    }.  break;..  
f640: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
f650: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
f660: 69 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  int.  **   PRAGM
f670: 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  A wal_autocheckp
f680: 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  oint = N.  **.  
f690: 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 20 64  ** Configure a d
f6a0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
f6b0: 6f 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  on to automatica
f6c0: 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 61  lly checkpoint a
f6d0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
f6e0: 66 74 65 72 20 61 63 63 75 6d 75 6c 61 74 69 6e  fter accumulatin
f6f0: 67 20 4e 20 66 72 61 6d 65 73 20 69 6e 20 74 68  g N frames in th
f700: 65 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79 20  e log. Or query 
f710: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
f720: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e  value.  ** of N.
f730: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
f740: 67 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45  gTyp_WAL_AUTOCHE
f750: 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69  CKPOINT: {.    i
f760: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
f770: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61     sqlite3_wal_a
f780: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
f790: 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  , sqlite3Atoi(zR
f7a0: 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ight));.    }.  
f7b0: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
f7c0: 74 28 76 2c 20 0a 20 20 20 20 20 20 20 64 62 2d  t(v, .       db-
f7d0: 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73  >xWalCallback==s
f7e0: 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
f7f0: 48 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20 20  Hook ? .        
f800: 20 20 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f     SQLITE_PTR_TO
f810: 5f 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72 67  _INT(db->pWalArg
f820: 29 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72  ) : 0);.  }.  br
f830: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  eak;.#endif..  /
f840: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73  *.  **  PRAGMA s
f850: 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a  hrink_memory.  *
f860: 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
f870: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34  ATION-OF: R-2344
f880: 35 2d 34 36 31 30 39 20 54 68 69 73 20 70 72 61  5-46109 This pra
f890: 67 6d 61 20 63 61 75 73 65 73 20 74 68 65 20 64  gma causes the d
f8a0: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e  atabase.  ** con
f8b0: 6e 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68  nection on which
f8c0: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 74   it is invoked t
f8d0: 6f 20 66 72 65 65 20 75 70 20 61 73 20 6d 75 63  o free up as muc
f8e0: 68 20 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a 20  h memory as it. 
f8f0: 20 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c   ** can, by call
f900: 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  ing sqlite3_db_r
f910: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e  elease_memory().
f920: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
f930: 67 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f  gTyp_SHRINK_MEMO
f940: 52 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  RY: {.    sqlite
f950: 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
f960: 6f 72 79 28 64 62 29 3b 0a 20 20 20 20 62 72 65  ory(db);.    bre
f970: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
f980: 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70 74 69 6d  **  PRAGMA optim
f990: 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
f9a0: 20 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a   optimize(MASK).
f9b0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68    **  PRAGMA sch
f9c0: 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a  ema.optimize.  *
f9d0: 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61  *  PRAGMA schema
f9e0: 2e 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a  .optimize(MASK).
f9f0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70    **.  ** Attemp
fa00: 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68  t to optimize th
fa10: 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 6c 6c  e database.  All
fa20: 20 73 63 68 65 6d 61 73 20 61 72 65 20 6f 70 74   schemas are opt
fa30: 69 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 66 69  imized in the fi
fa40: 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72  rst.  ** two for
fa50: 6d 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  ms, and only the
fa60: 20 73 70 65 63 69 66 69 65 64 20 73 63 68 65 6d   specified schem
fa70: 61 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 69  a is optimized i
fa80: 6e 20 74 68 65 20 6c 61 74 74 65 72 20 74 77 6f  n the latter two
fa90: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
faa0: 64 65 74 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d  details of optim
fab0: 69 7a 61 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  izations perform
fac0: 65 64 20 62 79 20 74 68 69 73 20 70 72 61 67 6d  ed by this pragm
fad0: 61 20 61 72 65 20 65 78 70 65 63 74 65 64 0a 20  a are expected. 
fae0: 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 61 6e   ** to change an
faf0: 64 20 69 6d 70 72 6f 76 65 20 6f 76 65 72 20 74  d improve over t
fb00: 69 6d 65 2e 20 20 41 70 70 6c 69 63 61 74 69 6f  ime.  Applicatio
fb10: 6e 73 20 73 68 6f 75 6c 64 20 61 6e 74 69 63 69  ns should antici
fb20: 70 61 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74  pate that.  ** t
fb30: 68 69 73 20 70 72 61 67 6d 61 20 77 69 6c 6c 20  his pragma will 
fb40: 70 65 72 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69  perform new opti
fb50: 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 66 75 74  mizations in fut
fb60: 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20  ure releases..  
fb70: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 70 74 69  **.  ** The opti
fb80: 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73  onal argument is
fb90: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70   a bitmask of op
fba0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70  timizations to p
fbb0: 65 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  erform:.  **.  *
fbc0: 2a 20 20 20 20 30 78 30 30 30 31 20 20 20 20 44  *    0x0001    D
fbd0: 65 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20  ebugging mode.  
fbe0: 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  Do not actually 
fbf0: 70 65 72 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69  perform any opti
fc00: 6d 69 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20  mizations.  **  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20              but 
fc20: 69 6e 73 74 65 61 64 20 72 65 74 75 72 6e 20 6f  instead return o
fc30: 6e 65 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20  ne line of text 
fc40: 66 6f 72 20 65 61 63 68 20 6f 70 74 69 6d 69 7a  for each optimiz
fc50: 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20  ation.  **      
fc60: 20 20 20 20 20 20 20 20 74 68 61 74 20 77 6f 75          that wou
fc70: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 64 6f 6e  ld have been don
fc80: 65 2e 20 20 4f 66 66 20 62 79 20 64 65 66 61 75  e.  Off by defau
fc90: 6c 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  lt..  **.  **   
fca0: 20 30 78 30 30 30 32 20 20 20 20 52 75 6e 20 41   0x0002    Run A
fcb0: 4e 41 4c 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73  NALYZE on tables
fcc0: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 6e 65   that might bene
fcd0: 66 69 74 2e 20 20 4f 6e 20 62 79 20 64 65 66 61  fit.  On by defa
fce0: 75 6c 74 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  ult..  **       
fcf0: 20 20 20 20 20 20 20 53 65 65 20 62 65 6c 6f 77         See below
fd00: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
fd10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
fd20: 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 34  *.  **    0x0004
fd30: 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70      (Not yet imp
fd40: 6c 65 6d 65 6e 74 65 64 29 20 52 65 63 6f 72 64  lemented) Record
fd50: 20 75 73 61 67 65 20 61 6e 64 20 70 65 72 66 6f   usage and perfo
fd60: 72 6d 61 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20  rmance .  **    
fd70: 20 20 20 20 20 20 20 20 20 20 69 6e 66 6f 72 6d            inform
fd80: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63  ation from the c
fd90: 75 72 72 65 6e 74 20 73 65 73 73 69 6f 6e 20 69  urrent session i
fda0: 6e 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  n the.  **      
fdb0: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
fdc0: 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
fdd0: 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62   will be availab
fde0: 6c 65 20 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22  le to "optimize"
fdf0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
fe00: 20 20 20 70 72 61 67 6d 61 73 20 72 75 6e 20 62     pragmas run b
fe10: 79 20 66 75 74 75 72 65 20 64 61 74 61 62 61 73  y future databas
fe20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  e connections.. 
fe30: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30   **.  **    0x00
fe40: 30 38 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69  08    (Not yet i
fe50: 6d 70 6c 65 6d 65 6e 74 65 64 29 20 43 72 65 61  mplemented) Crea
fe60: 74 65 20 69 6e 64 65 78 65 73 20 74 68 61 74 20  te indexes that 
fe70: 6d 69 67 68 74 20 68 61 76 65 0a 20 20 2a 2a 20  might have.  ** 
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65               bee
fe90: 6e 20 68 65 6c 70 66 75 6c 20 74 6f 20 72 65 63  n helpful to rec
fea0: 65 6e 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a  ent queries.  **
feb0: 0a 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  .  ** The defaul
fec0: 74 20 4d 41 53 4b 20 69 73 20 61 6e 64 20 61 6c  t MASK is and al
fed0: 77 61 79 73 20 73 68 61 6c 6c 20 62 65 20 30 78  ways shall be 0x
fee0: 66 66 66 65 2e 20 20 30 78 66 66 66 65 20 6d 65  fffe.  0xfffe me
fef0: 61 6e 73 20 70 65 72 66 6f 72 6d 20 61 6c 6c 20  ans perform all 
ff00: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74     ** of the opt
ff10: 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 73 74 65  imizations liste
ff20: 64 20 61 62 6f 76 65 20 65 78 63 65 70 74 20 44  d above except D
ff30: 65 62 75 67 20 4d 6f 64 65 2c 20 69 6e 63 6c 75  ebug Mode, inclu
ff40: 64 69 6e 67 20 6e 65 77 0a 20 20 2a 2a 20 6f 70  ding new.  ** op
ff50: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61 74  timizations that
ff60: 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
ff70: 65 6e 20 69 6e 76 65 6e 74 65 64 2e 20 20 49 66  en invented.  If
ff80: 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f   new optimizatio
ff90: 6e 73 20 61 72 65 0a 20 20 2a 2a 20 65 76 65 72  ns are.  ** ever
ffa0: 20 61 64 64 65 64 20 74 68 61 74 20 73 68 6f 75   added that shou
ffb0: 6c 64 20 62 65 20 6f 66 66 20 62 79 20 64 65 66  ld be off by def
ffc0: 61 75 6c 74 2c 20 74 68 6f 73 65 20 6f 66 66 2d  ault, those off-
ffd0: 62 79 2d 64 65 66 61 75 6c 74 20 0a 20 20 2a 2a  by-default .  **
ffe0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
fff0: 69 6c 6c 20 68 61 76 65 20 62 69 74 6d 61 73 6b  ill have bitmask
10000 73 20 6f 66 20 30 78 31 30 30 30 30 20 6f 72 20  s of 0x10000 or 
10010 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  larger..  **.  *
10020 2a 20 44 45 54 45 52 4d 49 4e 41 54 49 4f 4e 20  * DETERMINATION 
10030 4f 46 20 57 48 45 4e 20 54 4f 20 52 55 4e 20 41  OF WHEN TO RUN A
10040 4e 41 4c 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a  NALYZE.  **.  **
10050 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
10060 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
10070 61 20 74 61 62 6c 65 20 69 73 20 61 6e 61 6c 79  a table is analy
10080 7a 65 64 20 69 66 20 6f 6e 6c 79 20 69 66 20 61  zed if only if a
10090 6c 6c 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66  ll of.  ** the f
100a0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
100b0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 29  e:.  **.  ** (1)
100c0 20 4d 41 53 4b 20 62 69 74 20 30 78 30 32 20 69   MASK bit 0x02 i
100d0 73 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  s set..  **.  **
100e0 20 28 32 29 20 54 68 65 20 71 75 65 72 79 20 70   (2) The query p
100f0 6c 61 6e 6e 65 72 20 75 73 65 64 20 73 71 6c 69  lanner used sqli
10100 74 65 5f 73 74 61 74 31 2d 73 74 79 6c 65 20 73  te_stat1-style s
10110 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 6f 6e  tatistics for on
10120 65 20 6f 72 0a 20 20 2a 2a 20 20 20 20 20 6d 6f  e or.  **     mo
10130 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 68  re indexes of th
10140 65 20 74 61 62 6c 65 20 61 74 20 73 6f 6d 65 20  e table at some 
10150 70 6f 69 6e 74 20 64 75 72 69 6e 67 20 74 68 65  point during the
10160 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 20 20 2a   lifetime of.  *
10170 2a 20 20 20 20 20 74 68 65 20 63 75 72 72 65 6e  *     the curren
10180 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  t connection..  
10190 2a 2a 0a 20 20 2a 2a 20 28 33 29 20 4f 6e 65 20  **.  ** (3) One 
101a0 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
101b0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  of the table are
101c0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 61 6e 61   currently unana
101d0 6c 79 7a 65 64 20 4f 52 0a 20 20 2a 2a 20 20 20  lyzed OR.  **   
101e0 20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    the number of 
101f0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
10200 65 20 68 61 73 20 69 6e 63 72 65 61 73 65 64 20  e has increased 
10210 62 79 20 32 35 20 74 69 6d 65 73 20 6f 72 20 6d  by 25 times or m
10220 6f 72 65 0a 20 20 2a 2a 20 20 20 20 20 73 69 6e  ore.  **     sin
10230 63 65 20 74 68 65 20 6c 61 73 74 20 74 69 6d 65  ce the last time
10240 20 41 4e 41 4c 59 5a 45 20 77 61 73 20 72 75 6e   ANALYZE was run
10250 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
10260 72 75 6c 65 73 20 66 6f 72 20 77 68 65 6e 20 74  rules for when t
10270 61 62 6c 65 73 20 61 72 65 20 61 6e 61 6c 79 7a  ables are analyz
10280 65 64 20 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f  ed are likely to
10290 20 63 68 61 6e 67 65 20 69 6e 0a 20 20 2a 2a 20   change in.  ** 
102a0 66 75 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e  future releases.
102b0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
102c0 67 54 79 70 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b  gTyp_OPTIMIZE: {
102d0 0a 20 20 20 20 69 6e 74 20 69 44 62 4c 61 73 74  .    int iDbLast
102e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
102f0 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
10300 70 6f 69 6e 74 20 66 6f 72 20 74 68 65 20 73 63  point for the sc
10310 68 65 6d 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  hema loop */.   
10320 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20   int iTabCur;   
10330 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
10340 72 20 66 6f 72 20 61 20 74 61 62 6c 65 20 77 68  r for a table wh
10350 6f 73 65 20 73 69 7a 65 20 6e 65 65 64 73 20 63  ose size needs c
10360 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 48  hecking */.    H
10370 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
10380 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76        /* Loop ov
10390 65 72 20 74 61 62 6c 65 73 20 6f 66 20 61 20 73  er tables of a s
103a0 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 53 63 68  chema */.    Sch
103b0 65 6d 61 20 2a 70 53 63 68 65 6d 61 3b 20 20 20  ema *pSchema;   
103c0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
103d0 6e 74 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  nt schema */.   
103e0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
103f0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
10400 6c 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  le in the schema
10410 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
10420 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
10430 2a 20 41 6e 20 69 6e 64 65 78 20 6f 66 20 74 68  * An index of th
10440 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4c  e table */.    L
10450 6f 67 45 73 74 20 73 7a 54 68 72 65 73 68 6f 6c  ogEst szThreshol
10460 64 3b 20 20 20 20 2f 2a 20 53 69 7a 65 20 74 68  d;    /* Size th
10470 72 65 73 68 6f 6c 64 20 61 62 6f 76 65 20 77 68  reshold above wh
10480 69 63 68 20 72 65 61 6e 61 6c 79 73 69 73 20 69  ich reanalysis i
10490 73 20 6e 65 65 64 64 20 2a 2f 0a 20 20 20 20 63  s needd */.    c
104a0 68 61 72 20 2a 7a 53 75 62 53 71 6c 3b 20 20 20  har *zSubSql;   
104b0 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
104c0 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 4f  tement for the O
104d0 50 5f 53 71 6c 45 78 65 63 20 6f 70 63 6f 64 65  P_SqlExec opcode
104e0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6f 70 4d 61   */.    u32 opMa
104f0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
10500 2a 20 4d 61 73 6b 20 6f 66 20 6f 70 65 72 61 74  * Mask of operat
10510 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d 20  ions to perform 
10520 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67  */..    if( zRig
10530 68 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 4d 61  ht ){.      opMa
10540 73 6b 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65  sk = (u32)sqlite
10550 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
10560 20 20 20 20 20 69 66 28 20 28 6f 70 4d 61 73 6b       if( (opMask
10570 20 26 20 30 78 30 32 29 3d 3d 30 20 29 20 62 72   & 0x02)==0 ) br
10580 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
10590 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 30        opMask = 0
105a0 78 66 66 66 65 3b 0a 20 20 20 20 7d 0a 20 20 20  xfffe;.    }.   
105b0 20 69 54 61 62 43 75 72 20 3d 20 70 50 61 72 73   iTabCur = pPars
105c0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 66  e->nTab++;.    f
105d0 6f 72 28 69 44 62 4c 61 73 74 20 3d 20 7a 44 62  or(iDbLast = zDb
105e0 3f 69 44 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20  ?iDb:db->nDb-1; 
105f0 69 44 62 3c 3d 69 44 62 4c 61 73 74 3b 20 69 44  iDb<=iDbLast; iD
10600 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b++){.      if( 
10610 69 44 62 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  iDb==1 ) continu
10620 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
10630 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
10640 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
10650 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 64       pSchema = d
10660 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
10670 65 6d 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ema;.      for(k
10680 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
10690 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  (&pSchema->tblHa
106a0 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  sh); k; k=sqlite
106b0 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
106c0 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
106d0 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
106e0 61 74 61 28 6b 29 3b 0a 0a 20 20 20 20 20 20 20  ata(k);..       
106f0 20 2f 2a 20 49 66 20 74 61 62 6c 65 20 70 54 61   /* If table pTa
10700 62 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 75  b has not been u
10710 73 65 64 20 69 6e 20 61 20 77 61 79 20 74 68 61  sed in a way tha
10720 74 20 77 6f 75 6c 64 20 62 65 6e 65 66 69 74 20  t would benefit 
10730 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20  from.        ** 
10740 68 61 76 69 6e 67 20 61 6e 61 6c 79 73 69 73 20  having analysis 
10750 73 74 61 74 69 73 74 69 63 73 20 64 75 72 69 6e  statistics durin
10760 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
10770 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 6b 69 70  ssion, then skip
10780 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20   it..        ** 
10790 54 68 69 73 20 61 6c 73 6f 20 68 61 73 20 74 68  This also has th
107a0 65 20 65 66 66 65 63 74 20 6f 66 20 73 6b 69 70  e effect of skip
107b0 70 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62  ping virtual tab
107c0 6c 65 73 20 61 6e 64 20 76 69 65 77 73 20 2a 2f  les and views */
107d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
107e0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
107f0 46 5f 53 74 61 74 73 55 73 65 64 29 3d 3d 30 20  F_StatsUsed)==0 
10800 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
10810 20 20 20 20 20 2f 2a 20 52 65 61 6e 61 6c 79 7a       /* Reanalyz
10820 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  e if the table i
10830 73 20 32 35 20 74 69 6d 65 73 20 6c 61 72 67 65  s 25 times large
10840 72 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20  r than the last 
10850 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20  analysis */.    
10860 20 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20      szThreshold 
10870 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
10880 73 74 20 2b 20 34 36 3b 20 61 73 73 65 72 74 28  st + 46; assert(
10890 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32   sqlite3LogEst(2
108a0 35 29 3d 3d 34 36 20 29 3b 0a 20 20 20 20 20 20  5)==46 );.      
108b0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
108c0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
108d0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
108e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
108f0 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20  !pIdx->hasStat1 
10900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
10910 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 30 3b 20  zThreshold = 0; 
10920 2f 2a 20 41 6c 77 61 79 73 20 61 6e 61 6c 79 7a  /* Always analyz
10930 65 20 69 66 20 61 6e 79 20 69 6e 64 65 78 20 6c  e if any index l
10940 61 63 6b 73 20 73 74 61 74 69 73 74 69 63 73 20  acks statistics 
10950 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
10960 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
10970 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
10980 20 20 20 20 69 66 28 20 73 7a 54 68 72 65 73 68      if( szThresh
10990 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  old ){.         
109a0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
109b0 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 43 75  e(pParse, iTabCu
109c0 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  r, iDb, pTab, OP
109d0 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
109e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
109f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
10a00 53 6d 61 6c 6c 65 72 2c 20 69 54 61 62 43 75 72  Smaller, iTabCur
10a10 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10a20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10a30 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10a40 64 72 28 76 29 2b 32 2b 28 6f 70 4d 61 73 6b 26  dr(v)+2+(opMask&
10a50 31 29 2c 20 73 7a 54 68 72 65 73 68 6f 6c 64 29  1), szThreshold)
10a60 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
10a70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
10a90 53 75 62 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  SubSql = sqlite3
10aa0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 41 4e 41  MPrintf(db, "ANA
10ab0 4c 59 5a 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77  LYZE \"%w\".\"%w
10ac0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ae0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
10af0 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61  b].zDbSName, pTa
10b00 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
10b10 20 20 20 69 66 28 20 6f 70 4d 61 73 6b 20 26 20     if( opMask & 
10b20 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20  0x01 ){.        
10b30 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
10b40 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
10b50 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
10b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
10b80 20 30 2c 20 72 31 2c 20 30 2c 20 7a 53 75 62 53   0, r1, 0, zSubS
10b90 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ql, P4_DYNAMIC);
10ba0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10bb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10bc0 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 31  OP_ResultRow, r1
10bd0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
10be0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
10bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10c00 28 76 2c 20 4f 50 5f 53 71 6c 45 78 65 63 2c 20  (v, OP_SqlExec, 
10c10 30 2c 20 30 2c 20 30 2c 20 7a 53 75 62 53 71 6c  0, 0, 0, zSubSql
10c20 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
10c30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10c40 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10c50 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
10c60 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20  OP_Expire);.    
10c70 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10c80 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62  .  **   PRAGMA b
10c90 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a 2a  usy_timeout.  **
10ca0 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74     PRAGMA busy_t
10cb0 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a  imeout = N.  **.
10cc0 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65    ** Call sqlite
10cd0 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64  3_busy_timeout(d
10ce0 62 2c 20 4e 29 2e 20 20 52 65 74 75 72 6e 20 74  b, N).  Return t
10cf0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 6f  he current timeo
10d00 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 66  ut value.  ** if
10d10 20 6f 6e 65 20 69 73 20 73 65 74 2e 20 20 49 66   one is set.  If
10d20 20 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c 65 72   no busy handler
10d30 20 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20   or a different 
10d40 62 75 73 79 20 68 61 6e 64 6c 65 72 20 69 73 20  busy handler is 
10d50 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30 20  set.  ** then 0 
10d60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 53 65  is returned.  Se
10d70 74 74 69 6e 67 20 74 68 65 20 62 75 73 79 5f 74  tting the busy_t
10d80 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f 72 20 6e  imeout to 0 or n
10d90 65 67 61 74 69 76 65 0a 20 20 2a 2a 20 64 69 73  egative.  ** dis
10da0 61 62 6c 65 73 20 74 68 65 20 74 69 6d 65 6f 75  ables the timeou
10db0 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73 65  t..  */.  /*case
10dc0 20 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49   PragTyp_BUSY_TI
10dd0 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74 3a  MEOUT*/ default:
10de0 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   {.    assert( p
10df0 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70  Pragma->ePragTyp
10e00 3d 3d 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54  ==PragTyp_BUSY_T
10e10 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20 20 69 66  IMEOUT );.    if
10e20 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
10e30 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
10e40 69 6d 65 6f 75 74 28 64 62 2c 20 73 71 6c 69 74  imeout(db, sqlit
10e50 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b  e3Atoi(zRight));
10e60 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10e70 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62  nSingleInt(v, db
10e80 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 29 3b 0a  ->busyTimeout);.
10e90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10ea0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
10eb0 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  MA soft_heap_lim
10ec0 69 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  it.  **   PRAGMA
10ed0 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74   soft_heap_limit
10ee0 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   = N.  **.  ** I
10ef0 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
10f00 3a 20 52 2d 32 36 33 34 33 2d 34 35 39 33 30 20  : R-26343-45930 
10f10 54 68 69 73 20 70 72 61 67 6d 61 20 69 6e 76 6f  This pragma invo
10f20 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  kes the.  ** sql
10f30 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
10f40 69 6d 69 74 36 34 28 29 20 69 6e 74 65 72 66 61  imit64() interfa
10f50 63 65 20 77 69 74 68 20 74 68 65 20 61 72 67 75  ce with the argu
10f60 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73 0a  ment N, if N is.
10f70 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61    ** specified a
10f80 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61  nd is a non-nega
10f90 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20  tive integer..  
10fa0 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
10fb0 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30 37  N-OF: R-64451-07
10fc0 31 36 33 20 54 68 65 20 73 6f 66 74 5f 68 65 61  163 The soft_hea
10fd0 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61 20 61  p_limit pragma a
10fe0 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65 74 75 72  lways.  ** retur
10ff0 6e 73 20 74 68 65 20 73 61 6d 65 20 69 6e 74 65  ns the same inte
11000 67 65 72 20 74 68 61 74 20 77 6f 75 6c 64 20 62  ger that would b
11010 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
11020 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73  e.  ** sqlite3_s
11030 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34  oft_heap_limit64
11040 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67 65 20  (-1) C-language 
11050 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
11060 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 4f   case PragTyp_SO
11070 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20 7b  FT_HEAP_LIMIT: {
11080 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
11090 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52  64 N;.    if( zR
110a0 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 33 44  ight && sqlite3D
110b0 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69  ecOrHexToI64(zRi
110c0 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45  ght, &N)==SQLITE
110d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
110e0 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
110f0 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20 20 7d  imit64(N);.    }
11100 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
11110 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f  eInt(v, sqlite3_
11120 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
11130 34 28 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61  4(-1));.    brea
11140 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
11150 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72 65 61  *   PRAGMA threa
11160 64 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  ds.  **   PRAGMA
11170 20 74 68 72 65 61 64 73 20 3d 20 4e 0a 20 20 2a   threads = N.  *
11180 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65  *.  ** Configure
11190 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
111a0 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68  ber of worker th
111b0 72 65 61 64 73 2e 20 20 52 65 74 75 72 6e 20 74  reads.  Return t
111c0 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78 69  he new.  ** maxi
111d0 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69 67 68 74  mum, which might
111e0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 72 65   be less than re
111f0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
11200 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 48 52  case PragTyp_THR
11210 45 41 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c 69  EADS: {.    sqli
11220 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20  te3_int64 N;.   
11230 20 69 66 28 20 7a 52 69 67 68 74 0a 20 20 20 20   if( zRight.    
11240 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72   && sqlite3DecOr
11250 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c  HexToI64(zRight,
11260 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a   &N)==SQLITE_OK.
11270 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20 20       && N>=0.   
11280 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11290 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49  3_limit(db, SQLI
112a0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
112b0 54 48 52 45 41 44 53 2c 20 28 69 6e 74 29 28 4e  THREADS, (int)(N
112c0 26 30 78 37 66 66 66 66 66 66 66 29 29 3b 0a 20  &0x7fffffff));. 
112d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
112e0 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69  ingleInt(v, sqli
112f0 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51  te3_limit(db, SQ
11300 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
11310 52 5f 54 48 52 45 41 44 53 2c 20 2d 31 29 29 3b  R_THREADS, -1));
11320 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11330 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
11340 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
11350 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
11360 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70  T).  /*.  ** Rep
11370 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  ort the current 
11380 73 74 61 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f  state of file lo
11390 67 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  gs for all datab
113a0 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ases.  */.  case
113b0 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53 54   PragTyp_LOCK_ST
113c0 41 54 55 53 3a 20 7b 0a 20 20 20 20 73 74 61 74  ATUS: {.    stat
113d0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
113e0 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b  onst azLockName[
113f0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c  ] = {.      "unl
11400 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65 64 22  ocked", "shared"
11410 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20 22 70  , "reserved", "p
11420 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c 75 73  ending", "exclus
11430 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ive".    };.    
11440 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73  int i;.    pPars
11450 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20  e->nMem = 2;.   
11460 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11470 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11480 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20   Btree *pBt;.   
11490 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
114a0 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e  State = "unknown
114b0 22 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  ";.      int j;.
114c0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
114d0 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30  b[i].zDbSName==0
114e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
114f0 20 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62     pBt = db->aDb
11500 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11510 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c  f( pBt==0 || sql
11520 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
11530 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Bt)==0 ){.      
11540 20 20 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f 73    zState = "clos
11550 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ed";.      }else
11560 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6c   if( sqlite3_fil
11570 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20  e_control(db, i 
11580 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62  ? db->aDb[i].zDb
11590 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20 20  SName : 0, .    
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
115d0 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53 51  CKSTATE, &j)==SQ
115e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
115f0 20 20 20 20 7a 53 74 61 74 65 20 3d 20 61 7a 4c      zState = azL
11600 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20  ockName[j];.    
11610 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
11620 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
11630 2c 20 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e 61  , 1, "ss", db->a
11640 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  Db[i].zDbSName, 
11650 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 73  zState);.      s
11660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11670 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
11680 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 2);.    }. 
11690 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
116a0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
116b0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
116c0 63 61 73 65 20 50 72 61 67 54 79 70 5f 4b 45 59  case PragTyp_KEY
116d0 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
116e0 68 74 20 29 20 73 71 6c 69 74 65 33 5f 6b 65 79  ht ) sqlite3_key
116f0 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69  _v2(db, zDb, zRi
11700 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ght, sqlite3Strl
11710 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b 0a 20  en30(zRight));. 
11720 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
11730 63 61 73 65 20 50 72 61 67 54 79 70 5f 52 45 4b  case PragTyp_REK
11740 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  EY: {.    if( zR
11750 69 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f 72  ight ) sqlite3_r
11760 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  ekey_v2(db, zDb,
11770 20 7a 52 69 67 68 74 2c 20 73 71 6c 69 74 65 33   zRight, sqlite3
11780 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
11790 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
117a0 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  }.  case PragTyp
117b0 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20 20 69  _HEXKEY: {.    i
117c0 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
117d0 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20 20     u8 iByte;.   
117e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
117f0 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20  char zKey[40];. 
11800 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42       for(i=0, iB
11810 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  yte=0; i<sizeof(
11820 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c 69 74  zKey)*2 && sqlit
11830 65 33 49 73 78 64 69 67 69 74 28 7a 52 69 67 68  e3Isxdigit(zRigh
11840 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[i]); i++){.   
11850 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69 42       iByte = (iB
11860 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65  yte<<4) + sqlite
11870 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67 68 74  3HexToInt(zRight
11880 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [i]);.        if
11890 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b 65  ( (i&1)!=0 ) zKe
118a0 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a  y[i/2] = iByte;.
118b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
118c0 28 20 28 7a 4c 65 66 74 5b 33 5d 20 26 20 30 78  ( (zLeft[3] & 0x
118d0 66 29 3d 3d 30 78 62 20 29 7b 0a 20 20 20 20 20  f)==0xb ){.     
118e0 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76     sqlite3_key_v
118f0 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c  2(db, zDb, zKey,
11900 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c   i/2);.      }el
11910 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
11920 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c  te3_rekey_v2(db,
11930 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29   zDb, zKey, i/2)
11940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11950 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
11960 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
11970 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
11980 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  EC) || defined(S
11990 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52  QLITE_ENABLE_CER
119a0 4f 44 29 0a 20 20 63 61 73 65 20 50 72 61 67 54  OD).  case PragT
119b0 79 70 5f 41 43 54 49 56 41 54 45 5f 45 58 54 45  yp_ACTIVATE_EXTE
119c0 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a 52 69 67  NSIONS: if( zRig
119d0 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ht ){.#ifdef SQL
119e0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
119f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11a00 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 73  NICmp(zRight, "s
11a10 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  ee-", 4)==0 ){. 
11a20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63 74       sqlite3_act
11a30 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69 67 68  ivate_see(&zRigh
11a40 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  t[4]);.    }.#en
11a50 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
11a60 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 0a 20  E_ENABLE_CEROD. 
11a70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
11a80 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  rNICmp(zRight, "
11a90 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30 20 29  cerod-", 6)==0 )
11aa0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11ab0 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64 28 26  activate_cerod(&
11ac0 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20 20 20  zRight[6]);.    
11ad0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62  }.#endif.  }.  b
11ae0 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  reak;.#endif..  
11af0 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  } /* End of the 
11b00 50 52 41 47 4d 41 20 73 77 69 74 63 68 20 2a 2f  PRAGMA switch */
11b10 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
11b20 77 69 6e 67 20 62 6c 6f 63 6b 20 69 73 20 61 20  wing block is a 
11b30 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c  no-op unless SQL
11b40 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
11b50 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c 79 0a 20  ined. Its only. 
11b60 20 2a 2a 20 70 75 72 70 6f 73 65 20 69 73 20 74   ** purpose is t
11b70 6f 20 65 78 65 63 75 74 65 20 61 73 73 65 72 74  o execute assert
11b80 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
11b90 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20   verify that if 
11ba0 74 68 65 0a 20 20 2a 2a 20 50 72 61 67 46 6c 67  the.  ** PragFlg
11bb0 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20 66 6c 61 67  _NoColumns1 flag
11bc0 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
11bd0 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
11be0 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a   an argument.  *
11bf0 2a 20 74 6f 20 74 68 65 20 50 52 41 47 4d 41 2c  * to the PRAGMA,
11c00 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
11c10 69 6f 6e 20 68 61 73 20 6e 6f 74 20 61 64 64 65  ion has not adde
11c20 64 20 61 6e 79 20 4f 50 5f 52 65 73 75 6c 74 52  d any OP_ResultR
11c30 6f 77 20 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  ow .  ** instruc
11c40 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 56 4d 2e  tions to the VM.
11c50 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61    */.  if( (pPra
11c60 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
11c70 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e  PragFlg_NoColumn
11c80 73 31 29 20 26 26 20 7a 52 69 67 68 74 20 29 7b  s1) && zRight ){
11c90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11ca0 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f  VerifyNoResultRo
11cb0 77 28 76 29 3b 0a 20 20 7d 0a 0a 70 72 61 67 6d  w(v);.  }..pragm
11cc0 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  a_out:.  sqlite3
11cd0 44 62 46 72 65 65 28 64 62 2c 20 7a 4c 65 66 74  DbFree(db, zLeft
11ce0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
11cf0 65 65 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a  ee(db, zRight);.
11d00 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
11d10 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11d20 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  LE./************
11d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d70 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
11d80 69 6f 6e 20 6f 66 20 61 6e 20 65 70 6f 6e 79 6d  ion of an eponym
11d90 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ous virtual tabl
11da0 65 20 74 68 61 74 20 72 75 6e 73 20 61 20 70 72  e that runs a pr
11db0 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a 74 79 70 65  agma..**.*/.type
11dc0 64 65 66 20 73 74 72 75 63 74 20 50 72 61 67 6d  def struct Pragm
11dd0 61 56 74 61 62 20 50 72 61 67 6d 61 56 74 61 62  aVtab PragmaVtab
11de0 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
11df0 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   PragmaVtabCurso
11e00 72 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73  r PragmaVtabCurs
11e10 6f 72 3b 0a 73 74 72 75 63 74 20 50 72 61 67 6d  or;.struct Pragm
11e20 61 56 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65  aVtab {.  sqlite
11e30 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20 20 20  3_vtab base;    
11e40 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73      /* Base clas
11e50 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72 73  s.  Must be firs
11e60 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
11e70 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
11e80 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
11e90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 77   connection to w
11ea0 68 69 63 68 20 69 74 20 62 65 6c 6f 6e 67 73 20  hich it belongs 
11eb0 2a 2f 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d  */.  const Pragm
11ec0 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 20 20 2f  aName *pName;  /
11ed0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
11ee0 61 67 6d 61 20 2a 2f 0a 20 20 75 38 20 6e 48 69  agma */.  u8 nHi
11ef0 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  dden;           
11f00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11f10 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20   hidden columns 
11f20 2a 2f 0a 20 20 75 38 20 69 48 69 64 64 65 6e 3b  */.  u8 iHidden;
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f40 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 66  * Index of the f
11f50 69 72 73 74 20 68 69 64 64 65 6e 20 63 6f 6c 75  irst hidden colu
11f60 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  mn */.};.struct 
11f70 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
11f80 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
11f90 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 20 2f  b_cursor base; /
11fa0 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d  * Base class.  M
11fb0 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a  ust be first */.
11fc0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11fd0 70 50 72 61 67 6d 61 3b 20 20 20 20 2f 2a 20 54  pPragma;    /* T
11fe0 68 65 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d  he pragma statem
11ff0 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20  ent to run */.  
12000 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f  sqlite_int64 iRo
12010 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 43 75 72  wid;      /* Cur
12020 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20  rent rowid */.  
12030 63 68 61 72 20 2a 61 7a 41 72 67 5b 32 5d 3b 20  char *azArg[2]; 
12040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
12050 75 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ue of the argume
12060 6e 74 20 61 6e 64 20 73 63 68 65 6d 61 20 2a 2f  nt and schema */
12070 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67  .};../* .** Prag
12080 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
12090 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e 65 63 74   module xConnect
120a0 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
120b0 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
120c0 62 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69  bConnect(.  sqli
120d0 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
120e0 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67  *pAux,.  int arg
120f0 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  c, const char *c
12100 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c  onst*argv,.  sql
12110 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74  ite3_vtab **ppVt
12120 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  ab,.  char **pzE
12130 72 72 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72  rr.){.  const Pr
12140 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72 61 67 6d  agmaName *pPragm
12150 61 20 3d 20 28 63 6f 6e 73 74 20 50 72 61 67 6d  a = (const Pragm
12160 61 4e 61 6d 65 2a 29 70 41 75 78 3b 0a 20 20 50  aName*)pAux;.  P
12170 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
12180 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
12190 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
121a0 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a 20 20  r cSep = '(';.  
121b0 53 74 72 41 63 63 75 6d 20 61 63 63 3b 0a 20 20  StrAccum acc;.  
121c0 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a  char zBuf[200];.
121d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
121e0 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55 4e 55  TER(argc);.  UNU
121f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
12200 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  gv);.  sqlite3St
12210 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c  rAccumInit(&acc,
12220 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a 65 6f 66   0, zBuf, sizeof
12230 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20 20 73 71  (zBuf), 0);.  sq
12240 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
12250 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 43 52  endAll(&acc, "CR
12260 45 41 54 45 20 54 41 42 4c 45 20 78 22 29 3b 0a  EATE TABLE x");.
12270 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 50 72    for(i=0, j=pPr
12280 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61 6d 65  agma->iPragCName
12290 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e 50 72  ; i<pPragma->nPr
122a0 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a 2b  agCName; i++, j+
122b0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58  +){.    sqlite3X
122c0 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22 25 63  Printf(&acc, "%c
122d0 5c 22 25 73 5c 22 22 2c 20 63 53 65 70 2c 20 70  \"%s\"", cSep, p
122e0 72 61 67 43 4e 61 6d 65 5b 6a 5d 29 3b 0a 20 20  ragCName[j]);.  
122f0 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20    cSep = ',';.  
12300 7d 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a  }.  if( i==0 ){.
12310 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
12320 74 66 28 26 61 63 63 2c 20 22 28 5c 22 25 73 5c  tf(&acc, "(\"%s\
12330 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61  "", pPragma->zNa
12340 6d 65 29 3b 0a 20 20 20 20 63 53 65 70 20 3d 20  me);.    cSep = 
12350 27 2c 27 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  ',';.    i++;.  
12360 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 69 66 28  }.  j = 0;.  if(
12370 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46   pPragma->mPragF
12380 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65 73  lg & PragFlg_Res
12390 75 6c 74 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  ult1 ){.    sqli
123a0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
123b0 64 41 6c 6c 28 26 61 63 63 2c 20 22 2c 61 72 67  dAll(&acc, ",arg
123c0 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a   HIDDEN");.    j
123d0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ++;.  }.  if( pP
123e0 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
123f0 26 20 28 50 72 61 67 46 6c 67 5f 53 63 68 65 6d  & (PragFlg_Schem
12400 61 4f 70 74 7c 50 72 61 67 46 6c 67 5f 53 63 68  aOpt|PragFlg_Sch
12410 65 6d 61 52 65 71 29 20 29 7b 0a 20 20 20 20 73  emaReq) ){.    s
12420 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
12430 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 2c  pendAll(&acc, ",
12440 73 63 68 65 6d 61 20 48 49 44 44 45 4e 22 29 3b  schema HIDDEN");
12450 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
12460 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
12470 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29 22 2c  ppend(&acc, ")",
12480 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   1);.  sqlite3St
12490 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63  rAccumFinish(&ac
124a0 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74  c);.  assert( st
124b0 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73 69 7a  rlen(zBuf) < siz
124c0 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b 0a 20  eof(zBuf)-1 );. 
124d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
124e0 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 7a  clare_vtab(db, z
124f0 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Buf);.  if( rc==
12500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12510 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56   pTab = (PragmaV
12520 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  tab*)sqlite3_mal
12530 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61 67 6d  loc(sizeof(Pragm
12540 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69 66 28  aVtab));.    if(
12550 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
12560 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12570 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
12580 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 61        memset(pTa
12590 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61  b, 0, sizeof(Pra
125a0 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 20  gmaVtab));.     
125b0 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d 20 70   pTab->pName = p
125c0 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20 70 54  Pragma;.      pT
125d0 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  ab->db = db;.   
125e0 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e     pTab->iHidden
125f0 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62   = i;.      pTab
12600 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b 0a 20  ->nHidden = j;. 
12610 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
12620 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
12630 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
12640 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
12650 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  db));.  }..  *pp
12660 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f  Vtab = (sqlite3_
12670 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20 72 65  vtab*)pTab;.  re
12680 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
12690 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
126a0 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
126b0 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f  Disconnect metho
126c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
126d0 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f   pragmaVtabDisco
126e0 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74  nnect(sqlite3_vt
126f0 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 50 72  ab *pVtab){.  Pr
12700 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d  agmaVtab *pTab =
12710 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 70 56   (PragmaVtab*)pV
12720 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  tab;.  sqlite3_f
12730 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72 65 74  ree(pTab);.  ret
12740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12750 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20  ../* Figure out 
12760 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74  the best index t
12770 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63 68 20  o use to search 
12780 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  a pragma virtual
12790 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
127a0 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65 61 6c  ere are not real
127b0 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63 68 6f  ly any index cho
127c0 69 63 65 73 2e 20 20 42 75 74 20 77 65 20 77 61  ices.  But we wa
127d0 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  nt to encourage 
127e0 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 6c 61  the.** query pla
127f0 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d 3d 20  nner to give == 
12800 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61  constraints on a
12810 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20 70 61  s many hidden pa
12820 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a 20 70  rameters as.** p
12830 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65 73 70  ossible, and esp
12840 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65 20 66  ecially on the f
12850 69 72 73 74 20 68 69 64 64 65 6e 20 70 61 72 61  irst hidden para
12860 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74 75 72  meter.  So retur
12870 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f 73 74  n a.** high cost
12880 20 69 66 20 68 69 64 64 65 6e 20 70 61 72 61 6d   if hidden param
12890 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f 6e 73  eters are uncons
128a0 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  trained..*/.stat
128b0 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
128c0 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74  bBestIndex(sqlit
128d0 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71  e3_vtab *tab, sq
128e0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
128f0 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 50   *pIdxInfo){.  P
12900 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
12910 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 74  = (PragmaVtab*)t
12920 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  ab;.  const stru
12930 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
12940 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f  _constraint *pCo
12950 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20  nstraint;.  int 
12960 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65 65 6e  i, j;.  int seen
12970 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e 66 6f  [2];..  pIdxInfo
12980 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
12990 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69  = (double)1;.  i
129a0 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e  f( pTab->nHidden
129b0 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 53 51  ==0 ){ return SQ
129c0 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70 43 6f  LITE_OK; }.  pCo
129d0 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
129e0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
129f0 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20 30 3b  ;.  seen[0] = 0;
12a00 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30 3b 0a  .  seen[1] = 0;.
12a10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
12a20 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
12a30 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74 72  nt; i++, pConstr
12a40 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28  aint++){.    if(
12a50 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73   pConstraint->us
12a60 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  able==0 ) contin
12a70 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ue;.    if( pCon
12a80 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51 4c  straint->op!=SQL
12a90 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12aa0 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69 6e  AINT_EQ ) contin
12ab0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ue;.    if( pCon
12ac0 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e  straint->iColumn
12ad0 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e   < pTab->iHidden
12ae0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12af0 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74   j = pConstraint
12b00 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54 61 62  ->iColumn - pTab
12b10 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20 20 61  ->iHidden;.    a
12b20 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29 3b 0a  ssert( j < 2 );.
12b30 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20 69 2b      seen[j] = i+
12b40 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 65 65  1;.  }.  if( see
12b50 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70  n[0]==0 ){.    p
12b60 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
12b70 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65  edCost = (double
12b80 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20  )2147483647;.   
12b90 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
12ba0 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34 37 34  atedRows = 21474
12bb0 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74 75 72  83647;.    retur
12bc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12bd0 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d 2d 31  .  j = seen[0]-1
12be0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
12bf0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
12c00 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b  ].argvIndex = 1;
12c10 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  .  pIdxInfo->aCo
12c20 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d  nstraintUsage[j]
12c30 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  .omit = 1;.  if(
12c40 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20 72 65   seen[1]==0 ) re
12c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12c60 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
12c70 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
12c80 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78 49 6e  ble)20;.  pIdxIn
12c90 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
12ca0 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20 73 65  s = 20;.  j = se
12cb0 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64 78 49  en[1]-1;.  pIdxI
12cc0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
12cd0 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64  Usage[j].argvInd
12ce0 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78 49 6e  ex = 2;.  pIdxIn
12cf0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
12d00 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31  sage[j].omit = 1
12d10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12d20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61  E_OK;.}../* Crea
12d30 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
12d40 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61 20 76  for the pragma v
12d50 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
12d60 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
12d70 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69 74 65  aVtabOpen(sqlite
12d80 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 73  3_vtab *pVtab, s
12d90 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
12da0 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a  or **ppCursor){.
12db0 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
12dc0 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43 73 72  or *pCsr;.  pCsr
12dd0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
12de0 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61  rsor*)sqlite3_ma
12df0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 43 73  lloc(sizeof(*pCs
12e00 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72 3d  r));.  if( pCsr=
12e10 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
12e20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
12e30 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65  et(pCsr, 0, size
12e40 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  of(PragmaVtabCur
12e50 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e 62  sor));.  pCsr->b
12e60 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56 74 61  ase.pVtab = pVta
12e70 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d  b;.  *ppCursor =
12e80 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20 20   &pCsr->base;.  
12e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12ea0 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20 61 6c  ;.}../* Clear al
12eb0 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70  l content from p
12ec0 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
12ed0 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 73  ble cursor. */.s
12ee0 74 61 74 69 63 20 76 6f 69 64 20 70 72 61 67 6d  tatic void pragm
12ef0 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
12f00 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
12f10 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20  r *pCsr){.  int 
12f20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  i;.  sqlite3_fin
12f30 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72 61  alize(pCsr->pPra
12f40 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e 70 50  gma);.  pCsr->pP
12f50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66 6f 72  ragma = 0;.  for
12f60 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
12f70 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 3b 20  e(pCsr->azArg); 
12f80 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
12f90 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 7a 41  3_free(pCsr->azA
12fa0 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43 73 72  rg[i]);.    pCsr
12fb0 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30 3b 0a  ->azArg[i] = 0;.
12fc0 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73 65 20    }.}../* Close 
12fd0 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  a pragma virtual
12fe0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f   table cursor */
12ff0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
13000 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71 6c 69  maVtabClose(sqli
13010 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
13020 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d 61 56  *cur){.  PragmaV
13030 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20  tabCursor *pCsr 
13040 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  = (PragmaVtabCur
13050 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72 61 67  sor*)cur;.  prag
13060 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
13070 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c 69 74  r(pCsr);.  sqlit
13080 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20  e3_free(pCsr);. 
13090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
130a0 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65  K;.}../* Advance
130b0 20 74 68 65 20 70 72 61 67 6d 61 20 76 69 72 74   the pragma virt
130c0 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
130d0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
130e0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
130f0 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28 73 71  ragmaVtabNext(sq
13100 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
13110 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b  r *pVtabCursor){
13120 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13130 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13140 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
13150 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e  VtabCursor;.  in
13160 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13170 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
13180 74 20 74 68 65 20 78 52 6f 77 69 64 20 76 61 6c  t the xRowid val
13190 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 69 52  ue */.  pCsr->iR
131a0 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65 72 74  owid++;.  assert
131b0 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20  ( pCsr->pPragma 
131c0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
131d0 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW!=sqlite3_ste
131e0 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29  p(pCsr->pPragma)
131f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
13200 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
13210 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20  sr->pPragma);.  
13220 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20    pCsr->pPragma 
13230 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d 61 56  = 0;.    pragmaV
13240 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28 70  tabCursorClear(p
13250 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Csr);.  }.  retu
13260 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
13270 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
13280 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 46 69  table module xFi
13290 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  lter method..*/.
132a0 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
132b0 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20 20 73  aVtabFilter(.  s
132c0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
132d0 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
132e0 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20   .  int idxNum, 
132f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
13300 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  tr,.  int argc, 
13310 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
13320 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67 6d 61  argv.){.  Pragma
13330 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13340 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
13350 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
13360 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  r;.  PragmaVtab 
13370 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56  *pTab = (PragmaV
13380 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73 6f  tab*)(pVtabCurso
13390 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 6e 74  r->pVtab);.  int
133a0 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   rc;.  int i, j;
133b0 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b  .  StrAccum acc;
133c0 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 0a  .  char *zSql;..
133d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
133e0 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20 55 4e  ER(idxNum);.  UN
133f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
13400 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67 6d 61  dxStr);.  pragma
13410 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28  VtabCursorClear(
13420 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28 70 54  pCsr);.  j = (pT
13430 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72 61 67  ab->pName->mPrag
13440 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65  Flg & PragFlg_Re
13450 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20 3a 20  sult1)!=0 ? 0 : 
13460 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
13470 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  argc; i++, j++){
13480 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 41  .    assert( j<A
13490 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d 3e 61  rraySize(pCsr->a
134a0 7a 41 72 67 29 20 29 3b 0a 20 20 20 20 70 43 73  zArg) );.    pCs
134b0 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20 73 71  r->azArg[j] = sq
134c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
134d0 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s", sqlite3_valu
134e0 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 29  e_text(argv[i]))
134f0 3b 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e  ;.    if( pCsr->
13500 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 7b 0a 20  azArg[j]==0 ){. 
13510 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13520 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
13530 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
13540 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20  AccumInit(&acc, 
13550 30 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 64  0, 0, 0, pTab->d
13560 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
13570 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
13580 48 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  H]);.  sqlite3St
13590 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
135a0 26 61 63 63 2c 20 22 50 52 41 47 4d 41 20 22 29  &acc, "PRAGMA ")
135b0 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a  ;.  if( pCsr->az
135c0 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20 20 73 71  Arg[1] ){.    sq
135d0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 61 63  lite3XPrintf(&ac
135e0 63 2c 20 22 25 51 2e 22 2c 20 70 43 73 72 2d 3e  c, "%Q.", pCsr->
135f0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 20  azArg[1]);.  }. 
13600 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
13610 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20  AppendAll(&acc, 
13620 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e 61  pTab->pName->zNa
13630 6d 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d  me);.  if( pCsr-
13640 3e 61 7a 41 72 67 5b 30 5d 20 29 7b 0a 20 20 20  >azArg[0] ){.   
13650 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
13660 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70 43 73  &acc, "=%Q", pCs
13670 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  r->azArg[0]);.  
13680 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  }.  zSql = sqlit
13690 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
136a0 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20 7a 53  (&acc);.  if( zS
136b0 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ql==0 ) return S
136c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
136d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
136e0 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64 62 2c  are_v2(pTab->db,
136f0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 73 72   zSql, -1, &pCsr
13700 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b 0a 20  ->pPragma, 0);. 
13710 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
13720 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ql);.  if( rc!=S
13730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13740 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d  pTab->base.zErrM
13750 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
13760 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
13770 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62 2d 3e  e3_errmsg(pTab->
13780 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  db));.    return
13790 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
137a0 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74  n pragmaVtabNext
137b0 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 7d  (pVtabCursor);.}
137c0 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ../*.** Pragma v
137d0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
137e0 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f 64 2e  ule xEof method.
137f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13800 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73 71 6c  ragmaVtabEof(sql
13810 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
13820 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b 0a   *pVtabCursor){.
13830 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
13840 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
13850 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56  maVtabCursor*)pV
13860 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72 65 74  tabCursor;.  ret
13870 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72 61 67  urn (pCsr->pPrag
13880 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20 54 68  ma==0);.}../* Th
13890 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64  e xColumn method
138a0 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20   simply returns 
138b0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
138c0 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  g column from.**
138d0 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20 0a 2a   the PRAGMA.  .*
138e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
138f0 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28 0a 20  gmaVtabColumn(. 
13900 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
13910 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
13920 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  r, .  sqlite3_co
13930 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20 20 69  ntext *ctx, .  i
13940 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67 6d 61  nt i.){.  Pragma
13950 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13960 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
13970 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
13980 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  r;.  PragmaVtab 
13990 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56  *pTab = (PragmaV
139a0 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73 6f  tab*)(pVtabCurso
139b0 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 66 28  r->pVtab);.  if(
139c0 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64 65 6e   i<pTab->iHidden
139d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
139e0 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
139f0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
13a00 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 50 72  _value(pCsr->pPr
13a10 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d 65 6c  agma, i));.  }el
13a20 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
13a30 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
13a40 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 2d 70   pCsr->azArg[i-p
13a50 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c 2d 31  Tab->iHidden],-1
13a60 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
13a70 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T);.  }.  return
13a80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13a90 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72  * .** Pragma vir
13aa0 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
13ab0 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e  e xRowid method.
13ac0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13ad0 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64 28 73  ragmaVtabRowid(s
13ae0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13af0 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
13b00 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
13b10 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
13b20 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
13b30 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
13b40 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
13b50 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77 69  *p = pCsr->iRowi
13b60 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
13b70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
13b80 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
13b90 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  table object */.
13ba0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
13bb0 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72 61 67  ite3_module prag
13bc0 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d 20 7b  maVtabModule = {
13bd0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bf0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
13c00 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13c20 20 78 43 72 65 61 74 65 20 2d 20 63 72 65 61 74   xCreate - creat
13c30 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  e a table */.  p
13c40 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74  ragmaVtabConnect
13c50 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
13c60 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65 63  Connect - connec
13c70 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67  t to an existing
13c80 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67   table */.  prag
13c90 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65 78 2c  maVtabBestIndex,
13ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73           /* xBes
13cb0 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72 6d 69  tIndex - Determi
13cc0 6e 65 20 73 65 61 72 63 68 20 73 74 72 61 74 65  ne search strate
13cd0 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  gy */.  pragmaVt
13ce0 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20  abDisconnect,   
13cf0 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e       /* xDisconn
13d00 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63 74  ect - Disconnect
13d10 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a 2f   from a table */
13d20 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d40 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20 44 72  /* xDestroy - Dr
13d50 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  op a table */.  
13d60 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 2c 20  pragmaVtabOpen, 
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d80 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
13d90 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d  ursor */.  pragm
13da0 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20 20 20  aVtabClose,     
13db0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
13dc0 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73  e - close a curs
13dd0 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  or */.  pragmaVt
13de0 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20  abFilter,       
13df0 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20       /* xFilter 
13e00 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e  - configure scan
13e10 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
13e20 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74    pragmaVtabNext
13e30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
13e40 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63  * xNext - advanc
13e50 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
13e60 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c 20 20  pragmaVtabEof,  
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e80 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67 6d 61  xEof */.  pragma
13e90 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  VtabColumn,     
13ea0 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d         /* xColum
13eb0 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  n - read data */
13ec0 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77  .  pragmaVtabRow
13ed0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
13ee0 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64  /* xRowid - read
13ef0 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20   data */.  0,   
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61          /* xUpda
13f20 74 65 20 2d 20 77 72 69 74 65 20 64 61 74 61 20  te - write data 
13f30 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f50 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62 65    /* xBegin - be
13f60 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
13f70 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79 6e    /* xSync - syn
13fa0 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  c transaction */
13fb0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f 6d  /* xCommit - com
13fe0 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mit transaction 
13ff0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2d    /* xRollback -
14020 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
14030 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
14040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14050 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
14060 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63 74  Function - funct
14070 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 20  ion overloading 
14080 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140a0 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20 72    /* xRename - r
140b0 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c 65 20  ename the table 
140c0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140e0 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20    /* xSavepoint 
140f0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14110 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f    /* xRelease */
14120 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
14130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14140 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a  /* xRollbackTo *
14150 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  /.};../*.** Chec
14160 6b 20 74 6f 20 73 65 65 20 69 66 20 7a 54 61 62  k to see if zTab
14170 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c 79 20 74  Name is really t
14180 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 70 72 61  he name of a pra
14190 67 6d 61 2e 20 20 49 66 20 69 74 20 69 73 2c 0a  gma.  If it is,.
141a0 2a 2a 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  ** then register
141b0 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69   an eponymous vi
141c0 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f 72 20  rtual table for 
141d0 74 68 61 74 20 70 72 61 67 6d 61 20 61 6e 64 20  that pragma and 
141e0 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
141f0 74 65 72 20 74 6f 20 74 68 65 20 4d 6f 64 75 6c  ter to the Modul
14200 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  e object for the
14210 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61 62   new virtual tab
14220 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65 20 2a 73  le..*/.Module *s
14230 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62  qlite3PragmaVtab
14240 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  Register(sqlite3
14250 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
14260 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73   *zName){.  cons
14270 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e  t PragmaName *pN
14280 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ame;.  assert( s
14290 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
142a0 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22  zName, "pragma_"
142b0 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 4e 61  , 7)==0 );.  pNa
142c0 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f 63 61 74  me = pragmaLocat
142d0 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20 20 69 66  e(zName+7);.  if
142e0 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( pName==0 ) ret
142f0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4e  urn 0;.  if( (pN
14300 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  ame->mPragFlg & 
14310 28 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 30  (PragFlg_Result0
14320 7c 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31  |PragFlg_Result1
14330 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
14340 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
14350 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
14360 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29  >aModule, zName)
14370 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
14380 73 71 6c 69 74 65 33 56 74 61 62 43 72 65 61 74  sqlite3VtabCreat
14390 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e 61 6d  eModule(db, zNam
143a0 65 2c 20 26 70 72 61 67 6d 61 56 74 61 62 4d 6f  e, &pragmaVtabMo
143b0 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29 70 4e 61  dule, (void*)pNa
143c0 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6e 64 69  me, 0);.}..#endi
143d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
143e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
143f0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
14400 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20 2a  TE_OMIT_PRAGMA *
14410 2f 0a                                            /.