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

Artifact 943f71f762d8c7ab5a7b00641308cb9cd5effeddc3c709f0303e394ca8c21228:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 74  esult row with t
2400: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 68 65 6c  he result.** hel
2410: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65  d in register re
2420: 67 52 65 73 75 6c 74 2e 20 20 44 65 63 72 65 6d  gResult.  Decrem
2430: 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74 20 63  ent the result c
2440: 6f 75 6e 74 20 61 6e 64 20 68 61 6c 74 20 69 66  ount and halt if
2450: 0a 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  .** the maximum 
2460: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2470: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2480: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2490: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
24a0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24b0: 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 52 65  be *v, int regRe
24c0: 73 75 6c 74 29 7b 0a 20 20 69 6e 74 20 61 64 64  sult){.  int add
24d0: 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  r;.  sqlite3Vdbe
24e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
24f0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
2500: 74 2c 20 31 29 3b 0a 20 20 61 64 64 72 20 3d 20  t, 1);.  addr = 
2510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2520: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  3(v, OP_IfPos, 1
2530: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2540: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 31  rentAddr(v)+2, 1
2550: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
2560: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
2570: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2580: 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72  Halt, 0, 0);.  r
2590: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
25a0: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
25b0: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
25c0: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
25d0: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
25e0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
25f0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64  AGMA [schema.]id
2600: 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a   [= value].**.**
2610: 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   The identifier 
2620: 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
2630: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c  string.  The val
2640: 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  ue is a string, 
2650: 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  and.** identifie
2660: 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20  r, or a number. 
2670: 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73   If minusFlag is
2680: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
2690: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75  value is.** a nu
26a0: 6d 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72  mber that was pr
26b0: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
26c0: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  s sign..**.** If
26d0: 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 20 69   the left side i
26e0: 73 20 22 64 61 74 61 62 61 73 65 2e 69 64 22 20  s "database.id" 
26f0: 74 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65  then pId1 is the
2700: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
2710: 2a 20 61 6e 64 20 70 49 64 32 20 69 73 20 74 68  * and pId2 is th
2720: 65 20 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65  e id.  If the le
2730: 66 74 20 73 69 64 65 20 69 73 20 6a 75 73 74 20  ft side is just 
2740: 22 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69  "id" then pId1 i
2750: 73 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20  s the.** id and 
2760: 70 49 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74  pId2 is any empt
2770: 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  y string..*/.voi
2780: 64 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28  d sqlite3Pragma(
2790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27a0: 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31  , .  Token *pId1
27b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ,        /* Firs
27c0: 74 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  t part of [schem
27d0: 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20  a.]id field */. 
27e0: 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20   Token *pId2,   
27f0: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
2800: 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d  art of [schema.]
2810: 69 64 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c  id field, or NUL
2820: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56  L */.  Token *pV
2830: 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f  alue,      /* To
2840: 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c  ken for <value>,
2850: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
2860: 74 20 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20  t minusFlag     
2870: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27    /* True if a '
2880: 2d 27 20 73 69 67 6e 20 70 72 65 63 65 64 65 64  -' sign preceded
2890: 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20   <value> */.){. 
28a0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30   char *zLeft = 0
28b0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  ;       /* Nul-t
28c0: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
28d0: 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20  string <id> */. 
28e0: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
28f0: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  0;      /* Nul-t
2900: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
2910: 73 74 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20  string <value>, 
2920: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
2930: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
2940: 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
2950: 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f  ase name */.  To
2960: 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20  ken *pId;       
2970: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2980: 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f  to <id> token */
2990: 0a 20 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b  .  char *aFcntl[
29a0: 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67  4];       /* Arg
29b0: 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f  ument to SQLITE_
29c0: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a  FCNTL_PRAGMA */.
29d0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
29e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
29f0: 62 61 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c  base index for <
2a00: 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69  database> */.  i
2a10: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
2a30: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d  eturn value form
2a40: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
2a50: 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65  AGMA */.  sqlite
2a60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2a70: 64 62 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61  db;    /* The da
2a80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a90: 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  n */.  Db *pDb; 
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
2ac0: 66 69 63 20 64 61 74 61 62 61 73 65 20 62 65 69  fic database bei
2ad0: 6e 67 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20  ng pragmaed */. 
2ae0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
2af0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2b00: 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20  );  /* Prepared 
2b10: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
2b20: 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
2b30: 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54  *pPragma;   /* T
2b40: 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20  he pragma */..  
2b50: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
2b60: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
2b70: 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a  RunOnlyOnce(v);.
2b80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
2b90: 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70   2;..  /* Interp
2ba0: 72 65 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e  ret the [schema.
2bb0: 5d 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72  ] part of the pr
2bc0: 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  agma statement. 
2bd0: 69 44 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  iDb is the.  ** 
2be0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
2bf0: 61 62 61 73 65 20 74 68 69 73 20 70 72 61 67 6d  abase this pragm
2c00: 61 20 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69  a is being appli
2c10: 65 64 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b  ed to in db.aDb[
2c20: 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  ]. */.  iDb = sq
2c30: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
2c40: 28 70 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70  (pParse, pId1, p
2c50: 49 64 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66  Id2, &pId);.  if
2c60: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
2c70: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
2c80: 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49  Db[iDb];..  /* I
2c90: 66 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  f the temp datab
2ca0: 61 73 65 20 68 61 73 20 62 65 65 6e 20 65 78 70  ase has been exp
2cb0: 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73  licitly named as
2cc0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20   part of the .  
2cd0: 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20  ** pragma, make 
2ce0: 73 75 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e  sure it is open.
2cf0: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62   .  */.  if( iDb
2d00: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70  ==1 && sqlite3Op
2d10: 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
2d20: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
2d30: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65  turn;.  }..  zLe
2d40: 66 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ft = sqlite3Name
2d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49  FromToken(db, pI
2d60: 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74  d);.  if( !zLeft
2d70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2d80: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
2d90: 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74    zRight = sqlit
2da0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d  e3MPrintf(db, "-
2db0: 25 54 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  %T", pValue);.  
2dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68  }else{.    zRigh
2dd0: 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  t = sqlite3NameF
2de0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61  romToken(db, pVa
2df0: 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  lue);.  }..  ass
2e00: 65 72 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a  ert( pId2 );.  z
2e10: 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f  Db = pId2->n>0 ?
2e20: 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a   pDb->zDbSName :
2e30: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
2e40: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
2e50: 65 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e, SQLITE_PRAGMA
2e60: 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c  , zLeft, zRight,
2e70: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74   zDb) ){.    got
2e80: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
2e90: 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20  }..  /* Send an 
2ea0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2eb0: 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GMA file-control
2ec0: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
2ed0: 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e  ng VFS.  ** conn
2ee0: 65 63 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72  ection.  If it r
2ef0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2f00: 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68  , then assume th
2f10: 61 74 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20  at the VFS.  ** 
2f20: 68 61 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67  handled the prag
2f30: 6d 61 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ma and generate 
2f40: 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64  a no-op prepared
2f50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a   statement..  **
2f60: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2f70: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38  TION-OF: R-12238
2f80: 2d 35 35 31 32 30 20 57 68 65 6e 65 76 65 72 20  -55120 Whenever 
2f90: 61 20 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65  a PRAGMA stateme
2fa0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20  nt is parsed,.  
2fb0: 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e  ** an SQLITE_FCN
2fc0: 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63  TL_PRAGMA file c
2fd0: 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74  ontrol is sent t
2fe0: 6f 20 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74  o the open sqlit
2ff0: 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a  e3_file.  ** obj
3000: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3010: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
3020: 65 20 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20  e file to which 
3030: 74 68 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20  the pragma.  ** 
3040: 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73  statement refers
3050: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
3060: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
3070: 2d 32 39 38 37 35 2d 33 31 36 37 38 20 54 68 65  -29875-31678 The
3080: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3090: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
30a0: 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63  AGMA.  ** file c
30b0: 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72  ontrol is an arr
30c0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
30d0: 6f 20 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a  o strings (char*
30e0: 2a 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a  *) in which the.
30f0: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d    ** second elem
3100: 65 6e 74 20 6f 66 20 74 68 65 20 61 72 72 61 79  ent of the array
3110: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
3120: 74 68 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74  the pragma and t
3130: 68 65 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c  he third.  ** el
3140: 65 6d 65 6e 74 20 69 73 20 74 68 65 20 61 72 67  ement is the arg
3150: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61  ument to the pra
3160: 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  gma or NULL if t
3170: 68 65 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f  he pragma has no
3180: 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  .  ** argument..
3190: 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d    */.  aFcntl[0]
31a0: 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31   = 0;.  aFcntl[1
31b0: 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63  ] = zLeft;.  aFc
31c0: 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b  ntl[2] = zRight;
31d0: 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30  .  aFcntl[3] = 0
31e0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
31f0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
3200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
3210: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
3220: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
3230: 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29  _PRAGMA, (void*)
3240: 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72  aFcntl);.  if( r
3250: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3270: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
3280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3290: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c  SetColName(v, 0,
32a0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61   COLNAME_NAME, a
32b0: 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45  Fcntl[0], SQLITE
32c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
32d0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
32e0: 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b  t(v, aFcntl[0]);
32f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
3300: 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20  e(aFcntl[0]);.  
3310: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
3320: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  t;.  }.  if( rc!
3330: 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
3340: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e   ){.    if( aFcn
3350: 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  tl[0] ){.      s
3360: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3370: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63  Parse, "%s", aFc
3380: 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73  ntl[0]);.      s
3390: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e  qlite3_free(aFcn
33a0: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  tl[0]);.    }.  
33b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
33c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
33d0: 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20   = rc;.    goto 
33e0: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a  pragma_out;.  }.
33f0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
3400: 20 70 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c   pragma in the l
3410: 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20  ookup table */. 
3420: 20 70 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d   pPragma = pragm
3430: 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a  aLocate(zLeft);.
3440: 20 20 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30    if( pPragma==0
3450: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
3460: 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ut;..  /* Make s
3470: 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
3480: 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65   schema is loade
3490: 64 20 69 66 20 74 68 65 20 70 72 61 67 6d 61 20  d if the pragma 
34a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f  requires that */
34b0: 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
34c0: 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
34d0: 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21  Flg_NeedSchema)!
34e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
34f0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
3500: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
3510: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ragma_out;.  }..
3520: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
3530: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
3540: 6e 61 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61  names for pragma
3550: 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 72 65  s that return re
3560: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28  sults */.  if( (
3570: 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
3580: 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
3590: 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26  lumns)==0 .   &&
35a0: 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61   ((pPragma->mPra
35b0: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
35c0: 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c  oColumns1)==0 ||
35d0: 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b   zRight==0).  ){
35e0: 0a 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65  .    setPragmaRe
35f0: 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  sultColumnNames(
3600: 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d  v, pPragma);.  }
3610: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
3620: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
3630: 72 61 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f  ragma handler */
3640: 0a 20 20 73 77 69 74 63 68 28 20 70 50 72 61 67  .  switch( pPrag
3650: 6d 61 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a  ma->ePragTyp ){.
3660: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
3670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3680: 52 5f 50 52 41 47 4d 41 53 29 20 26 26 20 21 64  R_PRAGMAS) && !d
3690: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
36a0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20  IT_DEPRECATED). 
36b0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
36c0: 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c   [schema.]defaul
36d0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  t_cache_size.  *
36e0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
36f0: 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65  a.]default_cache
3700: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
3710: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
3720: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
3730: 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20  rent persistent 
3740: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
3750: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
3760: 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65  size.  The value
3770: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
3780: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3790: 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e  of.  ** pages in
37a0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
37b0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
37c0: 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68 65 20  m sets both the 
37d0: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67  current.  ** pag
37e0: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
37f0: 75 65 20 61 6e 64 20 74 68 65 20 70 65 72 73 69  ue and the persi
3800: 73 74 65 6e 74 20 70 61 67 65 20 63 61 63 68 65  stent page cache
3810: 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a   size value.  **
3820: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
3830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
3840: 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65  **.  ** Older ve
3850: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
3860: 20 77 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64   would set the d
3870: 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a  efault cache siz
3880: 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61  e to a.  ** nega
3890: 74 69 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69  tive number to i
38a0: 6e 64 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e  ndicate synchron
38b0: 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20  ous=OFF.  These 
38c0: 64 61 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75  days, synchronou
38d0: 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  s.  ** is always
38e0: 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72   on by default r
38f0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
3900: 20 73 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66   sign of the def
3910: 61 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20  ault cache.  ** 
3920: 73 69 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69  size.  But conti
3930: 6e 75 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  nue to take the 
3940: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
3950: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61  f the default ca
3960: 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  che.  ** size of
3970: 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
3980: 61 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a  atibility..  */.
3990: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44    case PragTyp_D
39a0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
39b0: 45 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  E: {.    static 
39c0: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
39d0: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
39e0: 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69  NO(2);.    stati
39f0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
3a00: 73 74 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  st getCacheSize[
3a10: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
3a20: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
3a30: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20         /* 0 */. 
3a60: 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f       { OP_ReadCo
3a70: 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20  okie,  0, 1,    
3a80: 20 20 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c      BTREE_DEFAUL
3a90: 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20  T_CACHE_SIZE},  
3aa0: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
3ab0: 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20  OP_IfPos,       
3ac0: 31 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 8,        0},
3ad0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
3ae0: 67 65 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  ger,     0, 2,  
3af0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3b00: 7b 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20  { OP_Subtract,  
3b10: 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31    1, 2,        1
3b20: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66  },.      { OP_If
3b30: 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c  Pos,       1, 8,
3b40: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3b50: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
3b60: 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20      0, 1,       
3b70: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b90: 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  6 */.      { OP_
3ba0: 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20  Noop,        0, 
3bb0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
3bc0: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
3bd0: 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  ow,   1, 1,     
3be0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
3bf0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
3c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
3c10: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
3c20: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
3c30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
3c40: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
3c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
3c60: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
3c70: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
3c80: 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 29  e(getCacheSize))
3c90: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
3ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3cb0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
3cc0: 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67  getCacheSize), g
3cd0: 65 74 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e  etCacheSize, iLn
3ce0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c  );.      if( ONL
3cf0: 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  Y_IF_REALLOC_STR
3d00: 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72  ESS(aOp==0) ) br
3d10: 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30  eak;.      aOp[0
3d20: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
3d30: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
3d40: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e  b;.      aOp[6].
3d50: 70 31 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  p1 = SQLITE_DEFA
3d60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a  ULT_CACHE_SIZE;.
3d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3d80: 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69   int size = sqli
3d90: 74 65 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69  te3AbsInt32(sqli
3da0: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
3db0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3dc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
3dd0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
3de0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
3df0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3e00: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
3e10: 2c 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f  , BTREE_DEFAULT_
3e20: 43 41 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65  CACHE_SIZE, size
3e30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3e40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3e50: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3e60: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62   0) );.      pDb
3e70: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
3e80: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
3e90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
3ea0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62  SetCacheSize(pDb
3eb0: 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68  ->pBt, pDb->pSch
3ec0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29  ema->cache_size)
3ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
3ee0: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
3ef0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41   !SQLITE_OMIT_PA
3f00: 47 45 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21  GER_PRAGMAS && !
3f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
3f20: 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21  ECATED */..#if !
3f30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3f40: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
3f50: 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  S).  /*.  **  PR
3f60: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f70: 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  ge_size.  **  PR
3f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f90: 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  ge_size=N.  **. 
3fa0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
3fb0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
3fc0: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
3fd0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  or the.  ** data
3fe0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69  base page size i
3ff0: 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20 73 65  n bytes.  The se
4000: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
4010: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
4020: 20 70 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65   page size value
4030: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e  .  The value can
4040: 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a   only be set if.
4050: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
4060: 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
4070: 65 6e 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  en created..  */
4080: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4090: 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  PAGE_SIZE: {.   
40a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
40b0: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
40c0: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
40d0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
40e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
40f0: 3d 20 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20  = ALWAYS(pBt) ? 
4100: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
4110: 61 67 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30  ageSize(pBt) : 0
4120: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
4130: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29  ngleInt(v, size)
4140: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4150: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79     /* Malloc may
4160: 20 66 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69   fail when setti
4170: 6e 67 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ng the page-size
4180: 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61 6e  , as there is an
4190: 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
41a0: 2a 2a 20 62 75 66 66 65 72 20 74 68 61 74 20 74  ** buffer that t
41b0: 68 65 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20  he pager module 
41c0: 72 65 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71  resizes using sq
41d0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e  lite3_realloc().
41e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
41f0: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4200: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
4210: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
4220: 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
4230: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
4240: 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
4250: 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31  >nextPagesize,-1
4260: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ,0) ){.        s
4270: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
4280: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
4290: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
42a0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
42b0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63  GMA [schema.]sec
42c0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
42d0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42e0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f  ]secure_delete=O
42f0: 4e 2f 4f 46 46 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N/OFF.  **.  ** 
4300: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
4310: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
4320: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
4330: 68 65 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f 64  he.  ** secure_d
4340: 65 6c 65 74 65 20 66 6c 61 67 2e 20 20 54 68 65  elete flag.  The
4350: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61   second form cha
4360: 6e 67 65 73 20 74 68 65 20 73 65 63 75 72 65 5f  nges the secure_
4370: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61 67  delete.  ** flag
4380: 20 73 65 74 74 69 6e 67 20 61 6e 64 20 72 65 70   setting and rep
4390: 6f 72 74 73 20 74 68 65 6e 65 77 20 76 61 6c 75  orts thenew valu
43a0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e..  */.  case P
43b0: 72 61 67 54 79 70 5f 53 45 43 55 52 45 5f 44 45  ragTyp_SECURE_DE
43c0: 4c 45 54 45 3a 20 7b 0a 20 20 20 20 42 74 72 65  LETE: {.    Btre
43d0: 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42  e *pBt = pDb->pB
43e0: 74 3b 0a 20 20 20 20 69 6e 74 20 62 20 3d 20 2d  t;.    int b = -
43f0: 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
4400: 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  Bt!=0 );.    if(
4410: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
4420: 20 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42   b = sqlite3GetB
4430: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
4440: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4450: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62   pId2->n==0 && b
4460: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
4470: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
4480: 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
4490: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
44a0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
44b0: 72 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62  reDelete(db->aDb
44c0: 5b 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20  [ii].pBt, b);.  
44d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
44e0: 62 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  b = sqlite3Btree
44f0: 53 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74  SecureDelete(pBt
4500: 2c 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , b);.    return
4510: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b  SingleInt(v, b);
4520: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4530: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4540: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f  MA [schema.]max_
4550: 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20  page_count.  ** 
4560: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4570: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
4580: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
4590: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
45a0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
45b0: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
45c0: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
45d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
45e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
45f0: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
4600: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
4610: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
4620: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
4630: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4640: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
4650: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
4660: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
4670: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
4680: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
4690: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
46a0: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
46b0: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
46c0: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
46d0: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
46e0: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
46f0: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
4700: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
4710: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4720: 61 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20  a.]page_count.  
4730: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
4740: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
4750: 65 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  es in the specif
4760: 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ied database..  
4770: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
4780: 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a  p_PAGE_COUNT: {.
4790: 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20      int iReg;.  
47a0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
47b0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
47c0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67  , iDb);.    iReg
47d0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
47e0: 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  m;.    if( sqlit
47f0: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
4800: 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20  0])=='p' ){.    
4810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4820: 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f  Op2(v, OP_Pageco
4830: 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b  unt, iDb, iReg);
4840: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4860: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63  Op3(v, OP_MaxPgc
4870: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a  nt, iDb, iReg, .
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
48a0: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
48b0: 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20  toi(zRight)));. 
48c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
48d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
48e0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67  _ResultRow, iReg
48f0: 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 1);.    break;
4900: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4910: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4920: 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20  ]locking_mode.  
4930: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4940: 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ma.]locking_mode
4950: 20 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75   = (normal|exclu
4960: 73 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73  sive).  */.  cas
4970: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e  e PragTyp_LOCKIN
4980: 47 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f  G_MODE: {.    co
4990: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
49a0: 20 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69   "normal";.    i
49b0: 6e 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f  nt eMode = getLo
49c0: 63 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74  ckingMode(zRight
49d0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32  );..    if( pId2
49e0: 2d 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d  ->n==0 && eMode=
49f0: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4a00: 44 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20  DE_QUERY ){.    
4a10: 20 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41    /* Simple "PRA
4a20: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4a30: 3b 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ;" statement. Th
4a40: 69 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f  is is a query fo
4a50: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
4a60: 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c  urrent default l
4a70: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69  ocking mode (whi
4a80: 63 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ch may be differ
4a90: 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ent to.      ** 
4aa0: 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
4ab0: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
4ac0: 61 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f  abase)..      */
4ad0: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64  .      eMode = d
4ae0: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b  b->dfltLockMode;
4af0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b00: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
4b10: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d  .      if( pId2-
4b20: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >n==0 ){.       
4b30: 20 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   /* This indicat
4b40: 65 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62  es that no datab
4b50: 61 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65  ase name was spe
4b60: 63 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20  cified as part. 
4b70: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
4b80: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e   PRAGMA command.
4b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4ba0: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d  e locking-mode m
4bb0: 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
4bc0: 2a 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74  * set on all att
4bd0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c  ached databases,
4be0: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
4bf0: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20  main db file..  
4c00: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4c10: 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71   ** Also, the sq
4c20: 6c 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f  lite3.dfltLockMo
4c30: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  de variable is s
4c40: 65 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20  et so that.     
4c50: 20 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71     ** any subseq
4c60: 75 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20  uently attached 
4c70: 64 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75  databases also u
4c80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
4c90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
4ca0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  ing mode..      
4cb0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
4cc0: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
4cd0: 65 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44  ert(pDb==&db->aD
4ce0: 62 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  b[0]);.        f
4cf0: 6f 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e  or(ii=2; ii<db->
4d00: 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
4d10: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
4d20: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4d30: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4d40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4d50: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4d60: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4d70: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  de);.        }. 
4d80: 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c         db->dfltL
4d90: 6f 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  ockMode = (u8)eM
4da0: 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
4db0: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
4dc0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
4dd0: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65  b->pBt);.      e
4de0: 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Mode = sqlite3Pa
4df0: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
4e00: 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  Pager, eMode);. 
4e10: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
4e20: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
4e30: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
4e40: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
4e50: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4e60: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
4e70: 49 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65  IVE );.    if( e
4e80: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4e90: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4ea0: 45 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20  E ){.      zRet 
4eb0: 3d 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20  = "exclusive";. 
4ec0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
4ed0: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65  ingleText(v, zRe
4ee0: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
4ef0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4f00: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
4f10: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a  ournal_mode.  **
4f20: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4f30: 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  .]journal_mode =
4f40: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
4f50: 20 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65             (dele
4f60: 74 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74  te|persist|off|t
4f70: 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77  runcate|memory|w
4f80: 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63  al|off).  */.  c
4f90: 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52  ase PragTyp_JOUR
4fa0: 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20  NAL_MODE: {.    
4fb0: 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20  int eMode;      
4fc0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
4fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
4fe0: 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f  E_XXX symbols */
4ff0: 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
5000: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5010: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69  ounter */..    i
5020: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
5030: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
5040: 65 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20  e is no "=MODE" 
5050: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
5060: 6d 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66  ma, do a query f
5070: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
5080: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a  current mode */.
5090: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41        eMode = PA
50a0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
50b0: 51 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65  QUERY;.    }else
50c0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
50d0: 61 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20  ar *zMode;.     
50e0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
50f0: 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
5100: 3b 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64  ;.      for(eMod
5110: 65 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71  e=0; (zMode = sq
5120: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
5130: 6e 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b  name(eMode))!=0;
5140: 20 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20   eMode++){.     
5150: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
5160: 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a  rNICmp(zRight, z
5170: 4d 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Mode, n)==0 ) br
5180: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5190: 20 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b     if( !zMode ){
51a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
51b0: 68 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  he "=MODE" part 
51c0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
51d0: 6e 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c  ny known journal
51e0: 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a   mode,.        *
51f0: 2a 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72  * then do a quer
5200: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f  y */.        eMo
5210: 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
5220: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20  ALMODE_QUERY;.  
5230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5240: 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
5250: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
5260: 52 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30  RY && pId2->n==0
5270: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
5280: 76 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75  vert "PRAGMA jou
5290: 72 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20  rnal_mode" into 
52a0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
52b0: 72 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20  rnal_mode" */.  
52c0: 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20      iDb = 0;.   
52d0: 20 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a     pId2->n = 1;.
52e0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
52f0: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
5300: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
5310: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  if( db->aDb[ii].
5320: 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20  pBt && (ii==iDb 
5330: 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29  || pId2->n==0) )
5340: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5350: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
5360: 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73  , ii);.        s
5370: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5380: 28 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  (v, OP_JournalMo
5390: 64 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65  de, ii, 1, eMode
53a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
53b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
53c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
53d0: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
53e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
53f0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
5400: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5410: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a  l_size_limit.  *
5420: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
5430: 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  a.]journal_size_
5440: 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  limit=N.  **.  *
5450: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
5460: 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72   size limit on r
5470: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
5480: 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  files..  */.  ca
5490: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
54a0: 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b  AL_SIZE_LIMIT: {
54b0: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
54c0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
54d0: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
54e0: 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  ;.    i64 iLimit
54f0: 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a   = -2;.    if( z
5500: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
5510: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
5520: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  I64(zRight, &iLi
5530: 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mit);.      if( 
5540: 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d  iLimit<-1 ) iLim
5550: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  it = -1;.    }. 
5560: 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
5570: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
5580: 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c  izeLimit(pPager,
5590: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65   iLimit);.    re
55a0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
55b0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72   iLimit);.    br
55c0: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  eak;.  }..#endif
55d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
55e0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
55f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5600: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5610: 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50  o_vacuum.  **  P
5620: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
5630: 75 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a  uto_vacuum=N.  *
5640: 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65  *.  ** Get or se
5650: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
5660: 68 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74  he database 'aut
5670: 6f 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65  o-vacuum' parame
5680: 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  ter..  ** The va
5690: 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20  lue is one of:  
56a0: 30 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20  0 NONE 1 FULL 2 
56b0: 49 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f  INCREMENTAL.  */
56c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
56d0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
56e0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
56f0: 55 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20  UTO_VACUUM: {.  
5700: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
5710: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  Db->pBt;.    ass
5720: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
5730: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
5740: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
5750: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
5760: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
5770: 63 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20  cuum(pBt));.    
5780: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
5790: 20 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f   eAuto = getAuto
57a0: 56 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a  Vacuum(zRight);.
57b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41        assert( eA
57c0: 75 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c  uto>=0 && eAuto<
57d0: 3d 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  =2 );.      db->
57e0: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75  nextAutovac = (u
57f0: 38 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f  8)eAuto;.      /
5800: 2a 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61  * Call SetAutoVa
5810: 63 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e  cuum() to set in
5820: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74  itialize the int
5830: 65 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20  ernal auto and. 
5840: 20 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63       ** incr-vac
5850: 75 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20  uum flags. This 
5860: 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
5870: 61 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ase this connect
5880: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65  ion.      ** cre
5890: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
58a0: 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d  e file. It is im
58b0: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20  portant that it 
58c0: 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  is created.     
58d0: 20 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76   ** as an auto-v
58e0: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62  acuum capable db
58f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5900: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5910: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
5920: 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20  pBt, eAuto);.   
5930: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5940: 45 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d  E_OK && (eAuto==
5950: 31 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29  1 || eAuto==2) )
5960: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  {.        /* Whe
5970: 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75  n setting the au
5980: 74 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to_vacuum mode t
5990: 6f 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20  o either "full" 
59a0: 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  or .        ** "
59b0: 69 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72  incremental", wr
59c0: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
59d0: 20 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20   meta[6] in the 
59e0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
59f0: 20 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65   ** file. Before
5a00: 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61   writing to meta
5a10: 5b 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20  [6], check that 
5a20: 6d 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65  meta[3] indicate
5a30: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
5a40: 74 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73  t this really is
5a50: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
5a60: 63 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65  capable database
5a70: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5a80: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5a90: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
5aa0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
5ab0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  );.        stati
5ac0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
5ad0: 73 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20  st setMeta6[] = 
5ae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  {.          { OP
5af0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
5b00: 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20   0,         1,  
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b20: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
5b30: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61          { OP_Rea
5b40: 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20  dCookie,     0, 
5b50: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5b60: 20 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54     BTREE_LARGEST
5b70: 5f 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20  _ROOT_PAGE},.   
5b80: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20              1,  
5ba0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5bb0: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5bc0: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
5bd0: 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20     { OP_Halt,   
5be0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
5bf0: 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20  K, OE_Abort,    
5c00: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c10: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  3 */.          {
5c20: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
5c30: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42      0,         B
5c40: 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d  TREE_INCR_VACUUM
5c50: 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  , 0},    /* 4 */
5c60: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
5c70: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
5c80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
5c90: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5ca0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
5cb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5cc0: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
5cd0: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
5ce0: 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29  aySize(setMeta6)
5cf0: 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d  );.        aOp =
5d00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d10: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5d20: 7a 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65  ze(setMeta6), se
5d30: 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20  tMeta6, iLn);.  
5d40: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
5d50: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
5d60: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
5d70: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  ;.        aOp[0]
5d80: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
5d90: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
5da0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
5db0: 32 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b  2].p2 = iAddr+4;
5dc0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e  .        aOp[4].
5dd0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5de0: 20 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41    aOp[4].p3 = eA
5df0: 75 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  uto - 1;.       
5e00: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
5e10: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
5e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5e30: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e40: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
5e50: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69  RAGMA [schema.]i
5e60: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
5e70: 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  m(N).  **.  ** D
5e80: 6f 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63  o N steps of inc
5e90: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69  remental vacuumi
5ea0: 6e 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ng on a database
5eb0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5ec0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5ed0: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5ee0: 67 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c  gTyp_INCREMENTAL
5ef0: 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69  _VACUUM: {.    i
5f00: 6e 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b  nt iLimit, addr;
5f10: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
5f20: 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65  =0 || !sqlite3Ge
5f30: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
5f40: 69 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69  iLimit) || iLimi
5f50: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  t<=0 ){.      iL
5f60: 69 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66  imit = 0x7ffffff
5f70: 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  f;.    }.    sql
5f80: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5f90: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5fa0: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
5fb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5fc0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c  , OP_Integer, iL
5fd0: 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  imit, 1);.    ad
5fe0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5ff0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63  AddOp1(v, OP_Inc
6000: 72 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56  rVacuum, iDb); V
6010: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6030: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp1(v, OP_Resu
6040: 6c 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73  ltRow, 1);.    s
6050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6060: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
6070: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
6080: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6090: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
60a0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
60b0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
60c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
60d0: 61 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b  addr);.    break
60e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
60f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6100: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
6110: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6120: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6130: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
6140: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6150: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
6160: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
6170: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
6180: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
6190: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
61a0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
61b0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
61c0: 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c  m sets the local
61d0: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
61e0: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66   size value.  If
61f0: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
6200: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
6210: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
6220: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
6230: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
6240: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
6250: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
6260: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
6270: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
6280: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
6290: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
62a0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
62b0: 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49  PragTyp_CACHE_SI
62c0: 5a 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE: {.    assert
62d0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
62e0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
62f0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6300: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6310: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6320: 28 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  (v, pDb->pSchema
6330: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
6340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6350: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
6360: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
6370: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
6380: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  ma->cache_size =
6390: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
63a0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
63b0: 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  eSize(pDb->pBt, 
63c0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
63d0: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
63e0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
63f0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6400: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6410: 65 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52  e_spill.  **  PR
6420: 41 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c  AGMA cache_spill
6430: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50  =BOOLEAN.  **  P
6440: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63  RAGMA [schema.]c
6450: 61 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a  ache_spill=N.  *
6460: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
6470: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
6480: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
6490: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
64a0: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
64b0: 73 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20  spill size. The 
64c0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e  second form turn
64d0: 73 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e  s cache spill on
64e0: 0a 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57  .  ** or off.  W
64f0: 68 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63  hen turnning cac
6500: 68 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65  he spill on, the
6510: 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
6520: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
6530: 20 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68   cache_size.  Th
6540: 65 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74  e third form set
6550: 73 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74  s a spill size t
6560: 68 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  hat.  ** may be 
6570: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74  different form t
6580: 68 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  he cache size.. 
6590: 20 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69   ** If N is posi
65a0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
65b0: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
65c0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
65d0: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
65e0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
65f0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6600: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6610: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6620: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6630: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6640: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20  f memory..  **. 
6650: 20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   ** If the numbe
6660: 72 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c  r of cache_spill
6670: 20 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74   pages is less t
6680: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
6690: 66 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a  f.  ** cache_siz
66a0: 65 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c  e pages, no spil
66b0: 6c 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69  ling occurs unti
66c0: 6c 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  l the page count
66d0: 20 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68   exceeds.  ** th
66e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
66f0: 65 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20  e_size pages..  
6700: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68  **.  ** The cach
6710: 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20  e_spill=BOOLEAN 
6720: 73 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20  setting applies 
6730: 74 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  to all attached 
6740: 73 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f  schemas,.  ** no
6750: 74 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d  t just the schem
6760: 61 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  a specified..  *
6770: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
6780: 5f 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a  _CACHE_SPILL: {.
6790: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
67a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
67b0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
67c0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
67d0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
67e0: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20  nSingleInt(v,.  
67f0: 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67         (db->flag
6800: 73 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65  s & SQLITE_Cache
6810: 53 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20  Spill)==0 ? 0 : 
6820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6830: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6840: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30  lSize(pDb->pBt,0
6850: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
6860: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
6870: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
6880: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
6890: 67 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20  ght, &size) ){. 
68a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
68b0: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
68c0: 70 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b  pDb->pBt, size);
68d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
68e0: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
68f0: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a  lean(zRight, siz
6900: 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  e!=0) ){.       
6910: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6920: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6930: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6940: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6950: 26 3d 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65  &= ~SQLITE_Cache
6960: 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  Spill;.      }. 
6970: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
6980: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
6990: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
69a0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
69b0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70  MA [schema.]mmap
69c0: 5f 73 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20  _size(N).  **.  
69d0: 2a 2a 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d  ** Used to set m
69e0: 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69  apping size limi
69f0: 74 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73  t. The mapping s
6a00: 69 7a 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a  ize limit is.  *
6a10: 2a 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  * used to limit 
6a20: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69  the aggregate si
6a30: 7a 65 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79  ze of all memory
6a40: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20   mapped regions 
6a50: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  of the.  ** data
6a60: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
6a70: 69 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  is parameter is 
6a80: 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  set to zero, the
6a90: 6e 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  n memory mapping
6aa0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
6ab0: 64 20 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20  d at all.  If N 
6ac0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
6ad0: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65  n the default me
6ae0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69  mory map.  ** li
6af0: 6d 69 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62  mit determined b
6b00: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
6b10: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
6b20: 4d 41 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74  MAP_SIZE) is set
6b30: 2e 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d  ..  ** The param
6b40: 65 74 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72  eter N is measur
6b50: 65 64 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a  ed in bytes..  *
6b60: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75  *.  ** This valu
6b70: 65 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20  e is advisory.  
6b80: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  The underlying V
6b90: 46 53 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65  FS is free to me
6ba0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73  mory map.  ** as
6bb0: 20 6c 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75   little or as mu
6bc0: 63 68 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20  ch as it wants. 
6bd0: 20 45 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73   Except, if N is
6be0: 20 73 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74   set to 0 then t
6bf0: 68 65 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61  he.  ** upper la
6c00: 79 65 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20  yers will never 
6c10: 69 6e 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63  invoke the xFetc
6c20: 68 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20  h interfaces to 
6c30: 74 68 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20  the VFS..  */.  
6c40: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41  case PragTyp_MMA
6c50: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71  P_SIZE: {.    sq
6c60: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
6c70: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
6c80: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61  MAP_SIZE>0.    a
6c90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
6ca0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
6cb0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
6cc0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
6cd0: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
6ce0: 20 20 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48     sqlite3DecOrH
6cf0: 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20  exToI64(zRight, 
6d00: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
6d10: 73 7a 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69  sz<0 ) sz = sqli
6d20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
6d30: 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66  szMmap;.      if
6d40: 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64  ( pId2->n==0 ) d
6d50: 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a  b->szMmap = sz;.
6d60: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d        for(ii=db-
6d70: 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69  >nDb-1; ii>=0; i
6d80: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i--){.        if
6d90: 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  ( db->aDb[ii].pB
6da0: 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c  t && (ii==iDb ||
6db0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a   pId2->n==0) ){.
6dc0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6dd0: 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
6de0: 69 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  it(db->aDb[ii].p
6df0: 42 74 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  Bt, sz);.       
6e00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6e10: 0a 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20  .    sz = -1;.  
6e20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
6e30: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
6e40: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  zDb, SQLITE_FCNT
6e50: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
6e60: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20  );.#else.    sz 
6e70: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 0;.    rc = SQ
6e80: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
6e90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6ea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6eb0: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
6ec0: 2c 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , sz);.    }else
6ed0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6ee0: 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
6ef0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6f00: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6f10: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  rc = rc;.    }. 
6f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6f30: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
6f40: 41 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a  A temp_store.  *
6f50: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
6f60: 73 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74  store = "default
6f70: 22 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65  "|"memory"|"file
6f80: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
6f90: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
6fa0: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
6fb0: 20 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67   temp_store flag
6fc0: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
6fd0: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
6fe0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63   does not make c
6ff0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69  hanges to the di
7000: 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  sk file and the 
7010: 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c  default.  ** val
7020: 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f  ue will be resto
7030: 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d  red the next tim
7040: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
7050: 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20  s opened..  **. 
7060: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74   ** Note that it
7070: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
7080: 20 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d   the library com
7090: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
70a0: 73 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69  s to.  ** overri
70b0: 64 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a  de this setting.
70c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
70d0: 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20  Typ_TEMP_STORE: 
70e0: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
70f0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
7100: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62  nSingleInt(v, db
7110: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20  ->temp_store);. 
7120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7130: 63 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67  changeTempStorag
7140: 65 28 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74  e(pParse, zRight
7150: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
7160: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
7170: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
7180: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
7190: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
71a0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
71b0: 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74  ory = ""|"direct
71c0: 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20  ory_name".  **. 
71d0: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
71e0: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
71f0: 65 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74  e of the temp_st
7200: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c  ore_directory fl
7210: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7220: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7230: 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72  s a specific dir
7240: 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65  ectory to be use
7250: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
7260: 66 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74  files..  ** Sett
7270: 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74  ing to a null st
7280: 72 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20  ring reverts to 
7290: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70  the default temp
72a0: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
72b0: 73 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20  search..  ** If 
72c0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
72d0: 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ory is changed, 
72e0: 74 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54  then invalidateT
72f0: 65 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a  empStorage..  **
7300: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7310: 67 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f  gTyp_TEMP_STORE_
7320: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7330: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7340: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7350: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
7360: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7370: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
7380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7390: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
73a0: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
73b0: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
73c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
73d0: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
73e0: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
73f0: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
7400: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
7410: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7420: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
7430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7440: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7450: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
7460: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
7470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
7480: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
7490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
74a0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
74b0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20  _TEMP_STORE==0. 
74c0: 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45        || (SQLITE
74d0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26  _TEMP_STORE==1 &
74e0: 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  & db->temp_store
74f0: 3c 3d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  <=1).       || (
7500: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7510: 45 3d 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70  E==2 && db->temp
7520: 5f 73 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20  _store==1).     
7530: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
7540: 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67  lidateTempStorag
7550: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
7560: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7570: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65  _free(sqlite3_te
7580: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
7590: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
75a0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
75b0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
75c0: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
75d0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
75e0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
75f0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7600: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7610: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7620: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7630: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7640: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7650: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7660: 57 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  WIN.  /*.  **   
7670: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
7680: 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a  e_directory.  **
7690: 20 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73     PRAGMA data_s
76a0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d  tore_directory =
76b0: 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e   ""|"directory_n
76c0: 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ame".  **.  ** R
76d0: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
76e0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
76f0: 74 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  the data_store_d
7700: 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20  irectory flag.  
7710: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7720: 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73  e value sets a s
7730: 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72  pecific director
7740: 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  y to be used for
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
7760: 74 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73  that.  ** were s
7770: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20  pecified with a 
7780: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
7790: 65 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61  e.  Setting to a
77a0: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76   null string rev
77b0: 65 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  erts.  ** to the
77c0: 20 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73   default databas
77d0: 65 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69  e directory, whi
77e0: 63 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ch for database 
77f0: 66 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20  files specified 
7800: 77 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61  with.  ** a rela
7810: 74 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70  tive path will p
7820: 72 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64  robably be based
7830: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
7840: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
7850: 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20  e.  ** process. 
7860: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   Database file s
7870: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e  pecified with an
7880: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61   absolute path a
7890: 72 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a  re not impacted.
78a0: 20 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74    ** by this set
78b0: 74 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73  ting, regardless
78c0: 20 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20   of its value.. 
78d0: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
78e0: 50 72 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f  PragTyp_DATA_STO
78f0: 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a  RE_DIRECTORY: {.
7900: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
7910: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
7920: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c  ingleText(v, sql
7930: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7940: 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ory);.    }else{
7950: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7960: 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69  OMIT_WSD.      i
7970: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
7980: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
7990: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
79a0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62  lite3OsAccess(db
79b0: 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20  ->pVfs, zRight, 
79c0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
79d0: 41 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a  ADWRITE, &res);.
79e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
79f0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73  SQLITE_OK || res
7a00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7a10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7a20: 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20  (pParse, "not a 
7a30: 77 72 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f  writable directo
7a40: 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ry");.          
7a50: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
7a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7a70: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7a80: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61  _free(sqlite3_da
7a90: 74 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  ta_directory);. 
7aa0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
7ab0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
7ac0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
7ad0: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
7ae0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
7af0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
7b00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7b10: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7b20: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7b30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7b40: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7b50: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7b60: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
7b70: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
7b80: 4e 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20  NG_STYLE.  /*.  
7b90: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
7ba0: 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ema.]lock_proxy_
7bb0: 66 69 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47  file.  **   PRAG
7bc0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
7bd0: 5f 70 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a  _proxy_file = ":
7be0: 61 75 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c  auto:"|"lock_fil
7bf0: 65 5f 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a  e_path".  **.  *
7c00: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
7c10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
7c20: 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
7c30: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
7c40: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
7c50: 73 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20  sets a specific 
7c60: 66 69 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20  file to be used 
7c70: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 63 63  for database acc
7c80: 65 73 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a  ess locks..  **.
7c90: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7ca0: 54 79 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46  Typ_LOCK_PROXY_F
7cb0: 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ILE: {.    if( !
7cc0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7cd0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7ce0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7cf0: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7d00: 20 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66     char *proxy_f
7d10: 69 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b  ile_path = NULL;
7d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7d30: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c  ile *pFile = sql
7d40: 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
7d50: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
7d60: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7d70: 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c  lHint(pFile, SQL
7d80: 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
7d90: 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  YFILE, .        
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7db0: 20 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70     &proxy_file_p
7dc0: 61 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ath);.      retu
7dd0: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
7de0: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29  proxy_file_path)
7df0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e00: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
7e10: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7e20: 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  ager(pDb->pBt);.
7e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7e40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7e50: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7e60: 67 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ger);.      int 
7e70: 72 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  res;.      if( z
7e80: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7e90: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7ea0: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7eb0: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7ec0: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20      zRight);.   
7f00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
7f10: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7f20: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7f30: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7f40: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20      NULL);.     
7f80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73   }.      if( res
7f90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7fa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7fb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7fc0: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f  failed to set lo
7fd0: 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b  ck proxy file");
7fe0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72  .        goto pr
7ff0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
8000: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
8010: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
8020: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
8030: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20  OCKING_STYLE */ 
8040: 20 20 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a       .    .  /*.
8050: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
8060: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
8070: 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  us.  **   PRAGMA
8080: 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72   [schema.]synchr
8090: 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52  onous=OFF|ON|NOR
80a0: 4d 41 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20  MAL|FULL|EXTRA. 
80b0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
80c0: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
80d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
80e0: 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20  nchronous flag. 
80f0: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
8100: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64  he local value d
8110: 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61  oes not make cha
8120: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b  nges to the disk
8130: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20   file and the.  
8140: 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
8150: 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65   will be restore
8160: 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
8170: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
8180: 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a    ** opened..  *
8190: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
81a0: 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a  _SYNCHRONOUS: {.
81b0: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
81c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
81d0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
81e0: 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29  >safety_level-1)
81f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8200: 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f     if( !db->auto
8210: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
8220: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8230: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
8240: 20 20 20 20 20 20 20 22 53 61 66 65 74 79 20 6c         "Safety l
8250: 65 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20  evel may not be 
8260: 63 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61  changed inside a
8270: 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a   transaction");.
8280: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8290: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
82a0: 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28    int iLevel = (
82b0: 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a  getSafetyLevel(z
82c0: 52 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20  Right,0,1)+1) & 
82d0: 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
82e0: 53 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20  S_MASK;.        
82f0: 69 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20  if( iLevel==0 ) 
8300: 69 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20  iLevel = 1;.    
8310: 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
8320: 6c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a  level = iLevel;.
8330: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79          pDb->bSy
8340: 6e 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  ncSet = 1;.     
8350: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
8360: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ags(db);.      }
8370: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
8380: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
83a0: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  R_PRAGMAS */..#i
83b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
83c0: 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20  T_FLAG_PRAGMAS. 
83d0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c   case PragTyp_FL
83e0: 41 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  AG: {.    if( zR
83f0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
8400: 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74   setPragmaResult
8410: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70  ColumnNames(v, p
8420: 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72  Pragma);.      r
8430: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
8440: 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70  , (db->flags & p
8450: 50 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30  Pragma->iArg)!=0
8460: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
8470: 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
8480: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20  pPragma->iArg;  
8490: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
84a0: 73 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61  s to set or clea
84b0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
84c0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
84d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
84e0: 46 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  Foreign key supp
84f0: 6f 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65  ort may not be e
8500: 6e 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c  nabled or disabl
8510: 65 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20  ed while not.   
8520: 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d       ** in auto-
8530: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f  commit mode.  */
8540: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d  .        mask &=
8550: 20 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   ~(SQLITE_Foreig
8560: 6e 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeys);.      }.
8570: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
8580: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
8590: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
85a0: 68 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55  h.authLevel==UAU
85b0: 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20  TH_User ){.     
85c0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
85d0: 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65  ow non-admin use
85e0: 72 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  rs to modify the
85f0: 20 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72   schema arbitrar
8600: 69 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ily */.        m
8610: 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ask &= ~(SQLITE_
8620: 57 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20  WriteSchema);.  
8630: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8640: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
8650: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
8660: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
8670: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73  db->flags |= mas
8680: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
8690: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
86a0: 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  s &= ~mask;.    
86b0: 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51      if( mask==SQ
86c0: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20  LITE_DeferFKs ) 
86d0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
86e0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
86f0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79  }..      /* Many
8700: 20 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61   of the flag-pra
8710: 67 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20  gmas modify the 
8720: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
8730: 79 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20  y the SQL .     
8740: 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67   ** compiler (eg
8750: 2e 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29  . count_changes)
8760: 2e 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f  . So add an opco
8770: 64 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c  de to expire all
8780: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
8790: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
87a0: 73 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e  s after modifyin
87b0: 67 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65  g a pragma value
87c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
87d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
87e0: 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29  p0(v, OP_Expire)
87f0: 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61  ;.      setAllPa
8800: 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20  gerFlags(db);.  
8810: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8820: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8830: 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52  ITE_OMIT_FLAG_PR
8840: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
8850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  f SQLITE_OMIT_SC
8860: 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f  HEMA_PRAGMAS.  /
8870: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
8880: 74 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c  table_info(<tabl
8890: 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  e>).  **.  ** Re
88a0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
88b0: 77 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  w for each colum
88c0: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  n of the named t
88d0: 61 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e  able. The column
88e0: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  s of.  ** the re
88f0: 74 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20  turned data set 
8900: 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  are:.  **.  ** c
8910: 69 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  id:        Colum
8920: 6e 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66  n id (numbered f
8930: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
8940: 74 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30  t, starting at 0
8950: 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20  ).  ** name:    
8960: 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20     Column name. 
8970: 20 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20   ** type:       
8980: 43 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  Column declarati
8990: 6f 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f  on type..  ** no
89a0: 74 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69  tnull:    True i
89b0: 66 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20  f 'NOT NULL' is 
89c0: 70 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64  part of column d
89d0: 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  eclaration.  ** 
89e0: 64 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20  dflt_value: The 
89f0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8a00: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66  r the column, if
8a10: 20 61 6e 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   any..  */.  cas
8a20: 65 20 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f  e PragTyp_TABLE_
8a30: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
8a40: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
8a50: 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  Tab;.    pTab = 
8a60: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
8a70: 6c 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54  le(pParse, LOCAT
8a80: 45 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c  E_NOERR, zRight,
8a90: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
8aa0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Tab ){.      int
8ab0: 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e 74   i, k;.      int
8ac0: 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20   nHidden = 0;.  
8ad0: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
8ae0: 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
8af0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
8b00: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
8b10: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
8b20: 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20  >nMem = 6;.     
8b30: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
8b40: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
8b50: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
8b60: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
8b70: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
8b80: 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Tab);.      for(
8b90: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
8ba0: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
8bb0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
8bc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
8bd0: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
8be0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
8bf0: 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20  nHidden++;.     
8c00: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8c10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8c20: 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46   if( (pCol->colF
8c30: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
8c40: 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20  RIMKEY)==0 ){.  
8c50: 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20          k = 0;. 
8c60: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8c70: 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPk==0 ){.     
8c80: 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20       k = 1;.    
8c90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ca0: 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
8cb0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70  =pTab->nCol && p
8cc0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31  Pk->aiColumn[k-1
8cd0: 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20  ]!=i; k++){}.   
8ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
8cf0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44 66  ssert( pCol->pDf
8d00: 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70  lt==0 || pCol->p
8d10: 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41  Dflt->op==TK_SPA
8d20: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
8d30: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
8d40: 64 28 76 2c 20 31 2c 20 22 69 73 73 69 73 69 22  d(v, 1, "issisi"
8d50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8d60: 20 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20   i-nHidden,.    
8d70: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
8d80: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
8d90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
8da0: 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22  lumnType(pCol,""
8db0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
8dc0: 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20    pCol->notNull 
8dd0: 3f 20 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  ? 1 : 0,.       
8de0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44          pCol->pD
8df0: 66 6c 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c  flt ? pCol->pDfl
8e00: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c  t->u.zToken : 0,
8e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e20: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
8e30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8e40: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
8e50: 2c 20 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 6);.      }.  
8e60: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
8e70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8e80: 44 45 42 55 47 0a 20 20 63 61 73 65 20 50 72 61  DEBUG.  case Pra
8e90: 67 54 79 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20  gTyp_STATS: {.  
8ea0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
8eb0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a     HashElem *i;.
8ec0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8ed0: 20 3d 20 35 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 5;.    sqlite
8ee0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
8ef0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
8f00: 20 20 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65      for(i=sqlite
8f10: 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
8f20: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
8f30: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
8f40: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
8f50: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8f60: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
8f70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8f80: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
8f90: 20 31 2c 20 22 73 73 69 69 69 22 2c 0a 20 20 20   1, "ssiii",.   
8fa0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
8fb0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
8fc0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  0,.           pT
8fd0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20  ab->szTabRow,.  
8fe0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
8ff0: 52 6f 77 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20  RowLogEst,.     
9000: 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
9010: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  lags);.      sql
9020: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9030: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
9040: 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 66 6f 72  1, 5);.      for
9050: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
9060: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9070: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9090: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20  MultiLoad(v, 2, 
90a0: 22 73 69 69 69 22 2c 0a 20 20 20 20 20 20 20 20  "siii",.        
90b0: 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a     pIdx->zName,.
90c0: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
90d0: 3e 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20  >szIdxRow,.     
90e0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f        pIdx->aiRo
90f0: 77 4c 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20  wLogEst[0],.    
9100: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73         pIdx->has
9110: 53 74 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20  Stat1);.        
9120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9130: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9140: 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20  w, 1, 5);.      
9150: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
9160: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63  eak;.#endif..  c
9170: 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45  ase PragTyp_INDE
9180: 58 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67  X_INFO: if( zRig
9190: 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  ht ){.    Index 
91a0: 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
91b0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78   *pTab;.    pIdx
91c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
91d0: 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  dex(db, zRight, 
91e0: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49  zDb);.    if( pI
91f0: 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  dx ){.      int 
9200: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 3b  i;.      int mx;
9210: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 61 67  .      if( pPrag
9220: 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20 20  ma->iArg ){.    
9230: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
9240: 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65 72  dex_xinfo (newer
9250: 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20 6d 6f   version with mo
9260: 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75  re rows and colu
9270: 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  mns) */.        
9280: 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  mx = pIdx->nColu
9290: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  mn;.        pPar
92a0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20  se->nMem = 6;.  
92b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
92c0: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64     /* PRAGMA ind
92d0: 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79 20  ex_info (legacy 
92e0: 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  version) */.    
92f0: 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e      mx = pIdx->n
9300: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
9310: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33  pParse->nMem = 3
9320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9330: 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  pTab = pIdx->pTa
9340: 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ble;.      sqlit
9350: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
9360: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
9370: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9380: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72  Parse->nMem<=pPr
9390: 61 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65  agma->nPragCName
93a0: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
93b0: 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20  0; i<mx; i++){. 
93c0: 20 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20         i16 cnum 
93d0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
93e0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  [i];.        sql
93f0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9400: 64 28 76 2c 20 31 2c 20 22 69 69 73 22 2c 20 69  d(v, 1, "iis", i
9410: 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , cnum,.        
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20       cnum<0 ? 0 
9440: 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  : pTab->aCol[cnu
9450: 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m].zName);.     
9460: 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e     if( pPragma->
9470: 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iArg ){.        
9480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9490: 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73  tiLoad(v, 4, "is
94a0: 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i",.            
94b0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
94c0: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
94d0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
94e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 3c  ,.            i<
94f0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a  pIdx->nKeyCol);.
9500: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9520: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9530: 52 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  Row, 1, pParse->
9540: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nMem);.      }. 
9550: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
9560: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
9570: 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66  p_INDEX_LIST: if
9580: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
9590: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
95a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
95b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 61    int i;.    pTa
95c0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
95d0: 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c  able(db, zRight,
95e0: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
95f0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Tab ){.      pPa
9600: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20  rse->nMem = 5;. 
9610: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
9620: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
9630: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
9640: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
9650: 70 49 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49 64  pIndex, i=0; pId
9660: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9670: 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ext, i++){.     
9680: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
9690: 7a 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22 63  zOrigin[] = { "c
96a0: 22 2c 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b 0a  ", "u", "pk" };.
96b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
96c0: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20  dbeMultiLoad(v, 
96d0: 31 2c 20 22 69 73 69 73 69 22 2c 0a 20 20 20 20  1, "isisi",.    
96e0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
96f0: 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65       pIdx->zName
9700: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 49 73 55  ,.           IsU
9710: 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
9720: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 4f  ,.           azO
9730: 72 69 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78 54  rigin[pIdx->idxT
9740: 79 70 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  ype],.          
9750: 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
9760: 68 65 72 65 21 3d 30 29 3b 0a 20 20 20 20 20 20  here!=0);.      
9770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9780: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9790: 52 6f 77 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20  Row, 1, 5);.    
97a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
97b0: 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50  break;..  case P
97c0: 72 61 67 54 79 70 5f 44 41 54 41 42 41 53 45 5f  ragTyp_DATABASE_
97d0: 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  LIST: {.    int 
97e0: 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  i;.    pParse->n
97f0: 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72  Mem = 3;.    for
9800: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
9810: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
9820: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
9830: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
9840: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
9850: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
9860: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
9870: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9880: 64 28 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20  d(v, 1, "iss",. 
9890: 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20          i,.     
98a0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a      db->aDb[i].z
98b0: 44 62 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  DbSName,.       
98c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
98d0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
98e0: 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20  b[i].pBt));.    
98f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9900: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9910: 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 20 20  Row, 1, 3);.    
9920: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
9930: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
9940: 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b  OLLATION_LIST: {
9950: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
9960: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
9970: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
9980: 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 70  m = 2;.    for(p
9990: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
99a0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
99b0: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
99c0: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
99d0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
99e0: 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69   (CollSeq *)sqli
99f0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
9a00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9a10: 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20  MultiLoad(v, 1, 
9a20: 22 69 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c  "is", i++, pColl
9a30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
9a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9a50: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9a60: 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a  w, 1, 2);.    }.
9a70: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
9a80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9a90: 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41  IT_SCHEMA_PRAGMA
9aa0: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
9ab0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
9ac0: 4e 5f 4b 45 59 0a 20 20 63 61 73 65 20 50 72 61  N_KEY.  case Pra
9ad0: 67 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  gTyp_FOREIGN_KEY
9ae0: 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69 67 68  _LIST: if( zRigh
9af0: 74 20 29 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70  t ){.    FKey *p
9b00: 46 4b 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  FK;.    Table *p
9b10: 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  Tab;.    pTab = 
9b20: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
9b30: 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  (db, zRight, zDb
9b40: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
9b50: 29 7b 0a 20 20 20 20 20 20 70 46 4b 20 3d 20 70  ){.      pFK = p
9b60: 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20 20 20 20  Tab->pFKey;.    
9b70: 20 20 69 66 28 20 70 46 4b 20 29 7b 0a 20 20 20    if( pFK ){.   
9b80: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20       int i = 0; 
9b90: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
9ba0: 3e 6e 4d 65 6d 20 3d 20 38 3b 0a 20 20 20 20 20  >nMem = 8;.     
9bb0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
9bc0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
9bd0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
9be0: 20 77 68 69 6c 65 28 70 46 4b 29 7b 0a 20 20 20   while(pFK){.   
9bf0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
9c00: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
9c10: 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b   j<pFK->nCol; j+
9c20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
9c30: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9c40: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69 73 73  Load(v, 1, "iiss
9c50: 73 73 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20  ssss",.         
9c60: 20 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20            i,.   
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
9c90: 20 20 20 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a        pFK->zTo,.
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 46     pTab->aCol[pF
9cc0: 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d  K->aCol[j].iFrom
9cd0: 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ].zName,.       
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d              pFK-
9cf0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20  >aCol[j].zCol,. 
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b    actionName(pFK
9d20: 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 29 2c 20 20  ->aAction[1]),  
9d30: 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 2a 2f 0a  /* ON UPDATE */.
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46     actionName(pF
9d60: 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 2c 20  K->aAction[0]), 
9d70: 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 2a 2f   /* ON DELETE */
9d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9d90: 20 20 20 20 22 4e 4f 4e 45 22 29 3b 0a 20 20 20      "NONE");.   
9da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9db0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9dc0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 38  _ResultRow, 1, 8
9dd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
9de0: 20 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20           ++i;.  
9df0: 20 20 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46          pFK = pF
9e00: 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  K->pNextFrom;.  
9e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9e20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9e30: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  k;.#endif /* !de
9e40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9e50: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
9e60: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
9e70: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
9e80: 45 59 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  EY.#ifndef SQLIT
9e90: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
9ea0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f   case PragTyp_FO
9eb0: 52 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a  REIGN_KEY_CHECK:
9ec0: 20 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b   {.    FKey *pFK
9ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9ee0: 20 41 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63   A foreign key c
9ef0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
9f00: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
9f10: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64          /* Child
9f20: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22   table contain "
9f30: 52 45 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77  REFERENCES" keyw
9f40: 6f 72 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ord */.    Table
9f50: 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
9f60: 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c    /* Parent tabl
9f70: 65 20 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69  e that child poi
9f80: 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e  nts to */.    In
9f90: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
9fa0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
9fb0: 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
9fc0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20  e */.    int i; 
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a  /* Loop counter:
9ff0: 20 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75    Foreign key nu
a000: 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f  mber for pTab */
a010: 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  .    int j;     
a020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a030: 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69  oop counter:  Fi
a040: 65 6c 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69  eld of the forei
a050: 67 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61  gn key */.    Ha
a060: 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
a070: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a080: 6e 74 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c  nter:  Next tabl
a090: 65 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20  e in schema */. 
a0a0: 20 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20     int x;       
a0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73            /* res
a0c0: 75 6c 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ult variable */.
a0d0: 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c      int regResul
a0e0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20  t;         /* 3 
a0f0: 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
a100: 64 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  d a result row *
a110: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79  /.    int regKey
a120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a130: 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64  Register to hold
a140: 20 6b 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e   key for checkin
a150: 67 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20  g the FK */.    
a160: 69 6e 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20  int regRow;     
a170: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
a180: 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f  ers to hold a ro
a190: 77 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20  w from pTab */. 
a1a0: 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20     int addrTop; 
a1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
a1c0: 20 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b   of a loop check
a1d0: 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  ing foreign keys
a1e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
a1f0: 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Ok;            /
a200: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
a210: 68 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a  he key is OK */.
a220: 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b      int *aiCols;
a230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68             /* ch
a240: 69 6c 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f  ild to parent co
a250: 6c 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a  lumn mapping */.
a260: 0a 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d  .    regResult =
a270: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
a280: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
a290: 6d 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b  m += 4;.    regK
a2a0: 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ey = ++pParse->n
a2b0: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  Mem;.    regRow 
a2c0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
a2d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
a2e0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
a2f0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
a300: 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69  k = sqliteHashFi
a310: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62  rst(&db->aDb[iDb
a320: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
a330: 73 68 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  sh);.    while( 
a340: 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  k ){.      if( z
a350: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
a360: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
a370: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
a380: 65 2c 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e, 0, zRight, zD
a390: 62 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  b);.        k = 
a3a0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
a3b0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 28          pTab = (
a3c0: 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
a3d0: 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
a3e0: 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68    k = sqliteHash
a3f0: 4e 65 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d  Next(k);.      }
a400: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
a410: 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65  =0 || pTab->pFKe
a420: 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  y==0 ) continue;
a430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
a440: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
a450: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
a460: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
a470: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
a480: 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50  ->nCol+regRow>pP
a490: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61  arse->nMem ) pPa
a4a0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62  rse->nMem = pTab
a4b0: 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b  ->nCol + regRow;
a4c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
a4d0: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
a4e0: 30 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  0, iDb, pTab, OP
a4f0: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
a500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
a510: 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67 52 65  dString(v, regRe
a520: 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  sult, pTab->zNam
a530: 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  e);.      for(i=
a540: 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b  1, pFK=pTab->pFK
a550: 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46  ey; pFK; i++, pF
a560: 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d  K=pFK->pNextFrom
a570: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65  ){.        pPare
a580: 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nt = sqlite3Find
a590: 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a  Table(db, pFK->z
a5a0: 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  To, zDb);.      
a5b0: 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30    if( pParent==0
a5c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a5d0: 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20       pIdx = 0;. 
a5e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
a5f0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
a600: 69 44 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e  iDb, pParent->tn
a610: 75 6d 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e  um, 0, pParent->
a620: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
a630: 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63  x = sqlite3FkLoc
a640: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
a650: 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26   pParent, pFK, &
a660: 70 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  pIdx, 0);.      
a670: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
a680: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
a690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a6a0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
a6b0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  ble(pParse, i, i
a6c0: 44 62 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f  Db, pParent, OP_
a6d0: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
a6e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a6f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a700: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a710: 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20 70 49 64  OpenRead, i, pId
a720: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
a730: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a740: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
a750: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
a760: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a770: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a780: 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20         k = 0;.  
a790: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a7a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a7b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a7c0: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c  Parse->nErr>0 ||
a7d0: 20 70 46 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20   pFK==0 );.     
a7e0: 20 69 66 28 20 70 46 4b 20 29 20 62 72 65 61 6b   if( pFK ) break
a7f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
a800: 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50 61  se->nTab<i ) pPa
a810: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20  rse->nTab = i;. 
a820: 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73       addrTop = s
a830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
a840: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30  (v, OP_Rewind, 0
a850: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
a860: 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  v);.      for(i=
a870: 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b  1, pFK=pTab->pFK
a880: 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46  ey; pFK; i++, pF
a890: 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d  K=pFK->pNextFrom
a8a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65  ){.        pPare
a8b0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nt = sqlite3Find
a8c0: 54 61 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a  Table(db, pFK->z
a8d0: 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  To, zDb);.      
a8e0: 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20    pIdx = 0;.    
a8f0: 20 20 20 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a      aiCols = 0;.
a900: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
a910: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
a920: 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f   x = sqlite3FkLo
a930: 63 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  cateIndex(pParse
a940: 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20  , pParent, pFK, 
a950: 26 70 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b  &pIdx, &aiCols);
a960: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
a970: 74 28 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( x==0 );.     
a980: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
a990: 72 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rOk = sqlite3Vdb
a9a0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
a9b0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65         if( pPare
a9c0: 6e 74 20 26 26 20 70 49 64 78 3d 3d 30 20 29 7b  nt && pIdx==0 ){
a9d0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
a9e0: 4b 65 79 20 3d 20 70 46 4b 2d 3e 61 43 6f 6c 5b  Key = pFK->aCol[
a9f0: 30 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20  0].iFrom;.      
aa00: 20 20 20 20 61 73 73 65 72 74 28 20 69 4b 65 79      assert( iKey
aa10: 3e 3d 30 20 26 26 20 69 4b 65 79 3c 70 54 61 62  >=0 && iKey<pTab
aa20: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
aa30: 20 20 20 20 69 66 28 20 69 4b 65 79 21 3d 70 54      if( iKey!=pT
aa40: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
aa50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
aa60: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
aa70: 6e 4f 66 54 61 62 6c 65 28 0a 20 20 20 20 20 20  nOfTable(.      
aa80: 20 20 20 20 20 20 20 20 20 20 76 2c 20 70 54 61            v, pTa
aa90: 62 2c 20 30 2c 20 70 46 4b 2d 3e 61 43 6f 6c 5b  b, 0, pFK->aCol[
aaa0: 30 5d 2e 69 46 72 6f 6d 2c 20 72 65 67 52 6f 77  0].iFrom, regRow
aab0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
aac0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
aad0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
aae0: 65 67 52 6f 77 2c 20 61 64 64 72 4f 6b 29 3b 20  egRow, addrOk); 
aaf0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
ab00: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ab10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
ab20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ab30: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20  v, OP_Rowid, 0, 
ab40: 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  regRow);.       
ab50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
ab60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ab70: 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
ab80: 2c 20 69 2c 20 30 2c 20 72 65 67 52 6f 77 29 3b  , i, 0, regRow);
ab90: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
aba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
abb0: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
abc0: 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20  ddrOk);.        
abd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
abe0: 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33  pHere(v, sqlite3
abf0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
ac00: 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  v)-2);.        }
ac10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ac20: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e  for(j=0; j<pFK->
ac30: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
ac40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ac50: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
ac60: 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
ac70: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 61 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b  aiCols ? aiCols[
aca0: 6a 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a  j] : pFK->aCol[j
acb0: 5d 2e 69 46 72 6f 6d 2c 20 72 65 67 52 6f 77 2b  ].iFrom, regRow+
acc0: 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j);.            
acd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ace0: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
acf0: 72 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f 6b  regRow+j, addrOk
ad00: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
ad10: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  v);.          }.
ad20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
ad30: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  arent ){.       
ad40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ad50: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
ad60: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
ad70: 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b   pFK->nCol, regK
ad80: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66    sqlite3IndexAf
adb0: 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49 64  finityStr(db,pId
adc0: 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b 0a  x), pFK->nCol);.
add0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ade0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
adf0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c  (v, OP_Found, i,
ae00: 20 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c   addrOk, regKey,
ae10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
ae20: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ae30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ae40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ae50: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
ae60: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
ae70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ae80: 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30  2(v, OP_Rowid, 0
ae90: 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a  , regResult+1);.
aea0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
aeb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
aec0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
aed0: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 65 73  _Null, 0, regRes
aee0: 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ult+1);.        
aef0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
af00: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
af10: 2c 20 72 65 67 52 65 73 75 6c 74 2b 32 2c 20 22  , regResult+2, "
af20: 73 69 22 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69  si", pFK->zTo, i
af30: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  -1);.        sql
af40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
af50: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
af60: 72 65 67 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20  regResult, 4);. 
af70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
af80: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
af90: 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20  , addrOk);.     
afa0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
afb0: 28 64 62 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20  (db, aiCols);.  
afc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
afd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
afe0: 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64   OP_Next, 0, add
aff0: 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76  rTop+1); VdbeCov
b000: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
b010: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b020: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
b030: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
b040: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ak;.#endif /* !d
b050: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b060: 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 23  IT_TRIGGER) */.#
b070: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
b080: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
b090: 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23  REIGN_KEY) */..#
b0a0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
b0b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 52  case PragTyp_PAR
b0c0: 53 45 52 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20  SER_TRACE: {.   
b0d0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
b0e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b0f0: 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  GetBoolean(zRigh
b100: 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t, 0) ){.       
b110: 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 54 72   sqlite3ParserTr
b120: 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72  ace(stdout, "par
b130: 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d  ser: ");.      }
b140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b150: 6c 69 74 65 33 50 61 72 73 65 72 54 72 61 63 65  lite3ParserTrace
b160: 28 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  (0, 0);.      }.
b170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
b180: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  k;.#endif..  /* 
b190: 52 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49  Reinstall the LI
b1a0: 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63  KE and GLOB func
b1b0: 74 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69  tions.  The vari
b1c0: 61 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a  ant of LIKE.  **
b1d0: 20 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61   used will be ca
b1e0: 73 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20  se sensitive or 
b1f0: 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  not depending on
b200: 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
b210: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41   case PragTyp_CA
b220: 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b  SE_SENSITIVE_LIK
b230: 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  E: {.    if( zRi
b240: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
b250: 69 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65  ite3RegisterLike
b260: 46 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71  Functions(db, sq
b270: 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
b280: 7a 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20  zRight, 0));.   
b290: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
b2a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b2b0: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f  INTEGRITY_CHECK_
b2c0: 45 52 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69  ERROR_MAX.# defi
b2d0: 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52  ne SQLITE_INTEGR
b2e0: 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f  ITY_CHECK_ERROR_
b2f0: 4d 41 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a  MAX 100.#endif..
b300: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b310: 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
b320: 45 43 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41 47  ECK.  /*    PRAG
b330: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
b340: 63 6b 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d  ck.  **    PRAGM
b350: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
b360: 6b 28 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52 41  k(N).  **    PRA
b370: 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a  GMA quick_check.
b380: 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71    **    PRAGMA q
b390: 75 69 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20  uick_check(N).  
b3a0: 2a 2a 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  **.  ** Verify t
b3b0: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
b3c0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
b3d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 71 75 69  **.  ** The "qui
b3e0: 63 6b 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64  ck_check" is red
b3f0: 75 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  uced version of 
b400: 0a 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f  .  ** integrity_
b410: 63 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74  check designed t
b420: 6f 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61  o detect most da
b430: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
b440: 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74  n.  ** without t
b450: 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 63  he overhead of c
b460: 72 6f 73 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e  ross-checking in
b470: 64 65 78 65 73 2e 20 20 51 75 69 63 6b 5f 63 68  dexes.  Quick_ch
b480: 65 63 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65  eck.  ** is line
b490: 61 72 20 74 69 6d 65 20 77 68 65 72 65 61 73 65  ar time wherease
b4a0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b4b0: 20 69 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20   is O(NlogN)..  
b4c0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
b4d0: 70 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  p_INTEGRITY_CHEC
b4e0: 4b 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  K: {.    int i, 
b4f0: 6a 2c 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a  j, addr, mxErr;.
b500: 0a 20 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b  .    int isQuick
b510: 20 3d 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77   = (sqlite3Tolow
b520: 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71  er(zLeft[0])=='q
b530: 27 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ');..    /* If t
b540: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
b550: 64 20 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72  d was of the for
b560: 6d 20 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69  m "PRAGMA <db>.i
b570: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c  ntegrity_check",
b580: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62  .    ** then iDb
b590: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
b5a0: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
b5b0: 62 61 73 65 20 69 64 65 6e 74 69 66 69 65 64 20  base identified 
b5c0: 62 79 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20  by <db>..    ** 
b5d0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
b5e0: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64  e integrity of d
b5f0: 61 74 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79  atabase iDb only
b600: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 0a   is verified by.
b610: 20 20 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20      ** the VDBE 
b620: 63 72 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20  created below.. 
b630: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68     **.    ** Oth
b640: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63  erwise, if the c
b650: 6f 6d 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c  ommand was simpl
b660: 79 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72  y "PRAGMA integr
b670: 69 74 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20  ity_check" (or. 
b680: 20 20 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75     ** "PRAGMA qu
b690: 69 63 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65  ick_check"), the
b6a0: 6e 20 69 44 62 20 69 73 20 73 65 74 20 74 6f 20  n iDb is set to 
b6b0: 30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  0. In this case,
b6c0: 20 73 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20   set iDb.    ** 
b6d0: 74 6f 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69  to -1 here, to i
b6e0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
b6f0: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72   VDBE should ver
b700: 69 66 79 20 74 68 65 20 69 6e 74 65 67 72 69 74  ify the integrit
b710: 79 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  y.    ** of all 
b720: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
b730: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  es.  */.    asse
b740: 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20  rt( iDb>=0 );.  
b750: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
b760: 20 7c 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20   || pId2->z );. 
b770: 20 20 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d     if( pId2->z==
b780: 30 20 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20  0 ) iDb = -1;.. 
b790: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
b7a0: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
b7b0: 6d 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d  m */.    pParse-
b7c0: 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20  >nMem = 6;..    
b7d0: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d  /* Set the maxim
b7e0: 75 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a  um error count *
b7f0: 2f 0a 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51  /.    mxErr = SQ
b800: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
b810: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a  HECK_ERROR_MAX;.
b820: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
b830: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
b840: 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20  etInt32(zRight, 
b850: 26 6d 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69  &mxErr);.      i
b860: 66 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20  f( mxErr<=0 ){. 
b870: 20 20 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53         mxErr = S
b880: 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f  QLITE_INTEGRITY_
b890: 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b  CHECK_ERROR_MAX;
b8a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b8b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b8c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
b8d0: 65 72 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b  er, mxErr-1, 1);
b8e0: 20 2f 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73   /* reg[1] holds
b8f0: 20 65 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a   errors left */.
b900: 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e  .    /* Do an in
b910: 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e  tegrity check on
b920: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
b930: 69 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ile */.    for(i
b940: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
b950: 2b 2b 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45  ++){.      HashE
b960: 6c 65 6d 20 2a 78 3b 0a 20 20 20 20 20 20 48 61  lem *x;.      Ha
b970: 73 68 20 2a 70 54 62 6c 73 3b 0a 20 20 20 20 20  sh *pTbls;.     
b980: 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 0a 20 20 20   int *aRoot;.   
b990: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
b9a0: 20 20 20 20 20 20 69 6e 74 20 6d 78 49 64 78 20        int mxIdx 
b9b0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
b9c0: 49 64 78 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  Idx;..      if( 
b9d0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
b9e0: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==1 ) continue;.
b9f0: 20 20 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30        if( iDb>=0
ba00: 20 26 26 20 69 21 3d 69 44 62 20 29 20 63 6f 6e   && i!=iDb ) con
ba10: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73 71  tinue;..      sq
ba20: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
ba30: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29  chema(pParse, i)
ba40: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61  ;..      /* Do a
ba50: 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  n integrity chec
ba60: 6b 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a  k of the B-Tree.
ba70: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
ba80: 2a 20 42 65 67 69 6e 20 62 79 20 66 69 6e 64 69  * Begin by findi
ba90: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
baa0: 73 20 6e 75 6d 62 65 72 73 0a 20 20 20 20 20 20  s numbers.      
bab0: 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ** for all table
bac0: 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 69 6e  s and indices in
bad0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
bae0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
baf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
bb00: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
bb10: 20 69 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20   i, 0) );.      
bb20: 70 54 62 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62  pTbls = &db->aDb
bb30: 5b 69 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [i].pSchema->tbl
bb40: 48 61 73 68 3b 0a 20 20 20 20 20 20 66 6f 72 28  Hash;.      for(
bb50: 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48  cnt=0, x=sqliteH
bb60: 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b  ashFirst(pTbls);
bb70: 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68   x; x=sqliteHash
bb80: 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20  Next(x)){.      
bb90: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
bba0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78  sqliteHashData(x
bbb0: 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  );.        Index
bbc0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20   *pIdx;.        
bbd0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
bbe0: 62 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20  b) ) cnt++;.    
bbf0: 20 20 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20      for(nIdx=0, 
bc00: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
bc10: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
bc20: 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b  dx->pNext, nIdx+
bc30: 2b 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20  +){ cnt++; }.   
bc40: 20 20 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78       if( nIdx>mx
bc50: 49 64 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49  Idx ) mxIdx = nI
bc60: 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
bc70: 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65    aRoot = sqlite
bc80: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
bc90: 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
bca0: 63 6e 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69  cnt+1));.      i
bcb0: 66 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72  f( aRoot==0 ) br
bcc0: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63  eak;.      for(c
bcd0: 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61  nt=0, x=sqliteHa
bce0: 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20  shFirst(pTbls); 
bcf0: 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e  x; x=sqliteHashN
bd00: 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20  ext(x)){.       
bd10: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
bd20: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29  qliteHashData(x)
bd30: 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  ;.        Index 
bd40: 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69  *pIdx;.        i
bd50: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
bd60: 29 20 29 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d  ) ) aRoot[cnt++]
bd70: 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
bd80: 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
bd90: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
bda0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
bdb0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
bdc0: 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20   aRoot[cnt++] = 
bdd0: 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  pIdx->tnum;.    
bde0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bdf0: 20 20 20 20 61 52 6f 6f 74 5b 63 6e 74 5d 20 3d      aRoot[cnt] =
be00: 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61   0;..      /* Ma
be10: 6b 65 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ke sure sufficie
be20: 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67  nt number of reg
be30: 69 73 74 65 72 73 20 68 61 76 65 20 62 65 65 6e  isters have been
be40: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
be50: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
be60: 20 3d 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e   = MAX( pParse->
be70: 6e 4d 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b  nMem, 8+mxIdx );
be80: 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 74 68  ..      /* Do th
be90: 65 20 62 2d 74 72 65 65 20 69 6e 74 65 67 72 69  e b-tree integri
bea0: 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20 20  ty checks */.   
beb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bec0: 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp4(v, OP_Integ
bed0: 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c 20  rityCk, 2, cnt, 
bee0: 31 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f 74 2c  1, (char*)aRoot,
bef0: 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
bf00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
bf10: 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 69  hangeP5(v, (u8)i
bf20: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
bf30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bf40: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
bf50: 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
bf60: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
bf70: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
bf80: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33  OP_String8, 0, 3
bf90: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71  , 0,.         sq
bfa0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
bfb0: 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73   "*** in databas
bfc0: 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d  e %s ***\n", db-
bfd0: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
bfe0: 29 2c 0a 20 20 20 20 20 20 20 20 20 50 34 5f 44  ),.         P4_D
bff0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73  YNAMIC);.      s
c000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c010: 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 32 2c 20  (v, OP_Move, 2, 
c020: 34 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  4, 1);.      sql
c030: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c040: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20  , OP_Concat, 4, 
c050: 33 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 6e 74  3, 2);.      int
c060: 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c  egrityCheckResul
c070: 74 52 6f 77 28 76 2c 20 32 29 3b 0a 20 20 20 20  tRow(v, 2);.    
c080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c090: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
c0a0: 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  .      /* Make s
c0b0: 75 72 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69  ure all the indi
c0c0: 63 65 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63  ces are construc
c0d0: 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ted correctly.. 
c0e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f       */.      fo
c0f0: 72 28 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(x=sqliteHashFi
c100: 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78  rst(pTbls); x; x
c110: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
c120: 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  x)){.        Tab
c130: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
c140: 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20  eHashData(x);.  
c150: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
c160: 78 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20  x, *pPk;.       
c170: 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72 20 3d   Index *pPrior =
c180: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
c190: 6c 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20 20  loopTop;.       
c1a0: 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20 69   int iDataCur, i
c1b0: 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
c1c0: 69 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20  int r1 = -1;..  
c1d0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
c1e0: 74 6e 75 6d 3c 31 20 29 20 63 6f 6e 74 69 6e 75  tnum<1 ) continu
c1f0: 65 3b 20 20 2f 2a 20 53 6b 69 70 20 56 49 45 57  e;  /* Skip VIEW
c200: 73 20 6f 72 20 56 49 52 54 55 41 4c 20 54 41 42  s or VIRTUAL TAB
c210: 4c 45 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  LEs */.        i
c220: 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 3d  f( pTab->pCheck=
c230: 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
c240: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
c250: 20 54 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 29 3d   TF_HasNotNull)=
c260: 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
c270: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  pTab->pIndex==0 
c280: 7c 7c 20 69 73 51 75 69 63 6b 29 0a 20 20 20 20  || isQuick).    
c290: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
c2a0: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 4e   continue;  /* N
c2b0: 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65  o additional che
c2c0: 63 6b 73 20 6e 65 65 64 65 64 20 66 6f 72 20 74  cks needed for t
c2d0: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  his table */.   
c2e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
c2f0: 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54  Pk = HasRowid(pT
c300: 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  ab) ? 0 : sqlite
c310: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
c320: 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
c330: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
c340: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
c350: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
c360: 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65  enTableAndIndice
c370: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
c380: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c 0a  OP_OpenRead, 0,.
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3b0: 20 20 20 31 2c 20 30 2c 20 26 69 44 61 74 61 43     1, 0, &iDataC
c3c0: 75 72 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20  ur, &iIdxCur);. 
c3d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c3e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c3f0: 6e 74 65 67 65 72 2c 20 30 2c 20 37 29 3b 0a 20  nteger, 0, 7);. 
c400: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
c410: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
c420: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
c430: 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b  dx->pNext, j++){
c440: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c450: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c460: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 38  OP_Integer, 0, 8
c470: 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65 78 20 65 6e  +j); /* index en
c480: 74 72 69 65 73 20 63 6f 75 6e 74 65 72 20 2a 2f  tries counter */
c490: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c4a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
c4b0: 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a  e->nMem>=8+j );.
c4c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c4d0: 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e  sqlite3NoTempsIn
c4e0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 31 2c 37  Range(pParse,1,7
c4f0: 2b 6a 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73  +j) );.        s
c500: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c510: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
c520: 44 61 74 61 43 75 72 2c 20 30 29 3b 20 56 64 62  DataCur, 0); Vdb
c530: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c540: 20 20 20 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20        loopTop = 
c550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c560: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
c570: 37 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f  7, 1);.        /
c580: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c  * Verify that al
c590: 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  l NOT NULL colum
c5a0: 6e 73 20 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f  ns really are NO
c5b0: 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  T NULL */.      
c5c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
c5d0: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
c5e0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
c5f0: 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Err;.          i
c600: 6e 74 20 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20  nt jmp2;.       
c610: 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e     if( j==pTab->
c620: 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65  iPKey ) continue
c630: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
c640: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f  pTab->aCol[j].no
c650: 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69  tNull==0 ) conti
c660: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nue;.          s
c670: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
c680: 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
c690: 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72  , pTab, iDataCur
c6a0: 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , j, 3);.       
c6b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
c6c0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
c6d0: 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20  _TYPEOFARG);.   
c6e0: 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71         jmp2 = sq
c6f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c700: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33  v, OP_NotNull, 3
c710: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
c720: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 45  v);.          zE
c730: 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  rr = sqlite3MPri
c740: 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61  ntf(db, "NULL va
c750: 6c 75 65 20 69 6e 20 25 73 2e 25 73 22 2c 20 70  lue in %s.%s", p
c760: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c780: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
c790: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[j].zName);.
c7a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c7b0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
c7c0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
c7d0: 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e   0, zErr, P4_DYN
c7e0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  AMIC);.         
c7f0: 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52   integrityCheckR
c800: 65 73 75 6c 74 52 6f 77 28 76 2c 20 33 29 3b 0a  esultRow(v, 3);.
c810: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c820: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c830: 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20   jmp2);.        
c840: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72  }.        /* Ver
c850: 69 66 79 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  ify CHECK constr
c860: 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
c870: 20 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63   if( pTab->pChec
c880: 6b 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  k && (db->flags 
c890: 26 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43  & SQLITE_IgnoreC
c8a0: 68 65 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20  hecks)==0 ){.   
c8b0: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
c8c0: 2a 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  *pCheck = sqlite
c8d0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c8e0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 30   pTab->pCheck, 0
c8f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
c900: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c910: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
c920: 20 20 20 20 69 6e 74 20 61 64 64 72 43 6b 46 61      int addrCkFa
c930: 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ult = sqlite3Vdb
c940: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
c950: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61             int a
c960: 64 64 72 43 6b 4f 6b 20 3d 20 73 71 6c 69 74 65  ddrCkOk = sqlite
c970: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
c980: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
c990: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
c9a0: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
c9b0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
c9c0: 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 44 61  ->iSelfTab = iDa
c9d0: 74 61 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  taCur;.         
c9e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
c9f0: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
ca00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
ca10: 28 6b 3d 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72  (k=pCheck->nExpr
ca20: 2d 31 3b 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20  -1; k>0; k--){. 
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ca40: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
ca50: 70 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e  pParse, pCheck->
ca60: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 61 64 64 72  a[k].pExpr, addr
ca70: 43 6b 46 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20  CkFault, 0);.   
ca80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ca90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
caa0: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
cab0: 20 70 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45   pCheck->a[0].pE
cac0: 78 70 72 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a  xpr, addrCkOk, .
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
caf0: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  L);.            
cb00: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
cb10: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
cb20: 6b 46 61 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  kFault);.       
cb30: 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69       zErr = sqli
cb40: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
cb50: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
cb60: 20 66 61 69 6c 65 64 20 69 6e 20 25 73 22 2c 0a   failed in %s",.
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb80: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
cb90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cba0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
cbb0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c  P_String8, 0, 3,
cbc0: 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e   0, zErr, P4_DYN
cbd0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  AMIC);.         
cbe0: 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63     integrityChec
cbf0: 6b 52 65 73 75 6c 74 52 6f 77 28 76 2c 20 33 29  kResultRow(v, 3)
cc00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
cc10: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
cc20: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 4f  Label(v, addrCkO
cc30: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
cc40: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
cc50: 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
cc60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cc70: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
cc80: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 68  stDelete(db, pCh
cc90: 65 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eck);.        }.
cca0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64          /* Valid
ccb0: 61 74 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65  ate index entrie
ccc0: 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
ccd0: 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  t row */.       
cce0: 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70   for(j=0, pIdx=p
ccf0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
cd00: 78 20 26 26 20 21 69 73 51 75 69 63 6b 3b 20 70  x && !isQuick; p
cd10: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
cd20: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
cd30: 20 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c   int jmp2, jmp3,
cd40: 20 6a 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20 20   jmp4, jmp5;.   
cd50: 20 20 20 20 20 20 20 69 6e 74 20 63 6b 55 6e 69         int ckUni
cd60: 71 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  q = sqlite3VdbeM
cd70: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
cd80: 20 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d         if( pPk==
cd90: 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b  pIdx ) continue;
cda0: 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
cdb0: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
cdc0: 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
cdd0: 70 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20  pIdx, iDataCur, 
cde0: 30 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20  0, 0, &jmp3,.   
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 20 70 50 72 69 6f 72 2c 20 72 31 29 3b      pPrior, r1);
ce20: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f  .          pPrio
ce30: 72 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  r = pIdx;.      
ce40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ce50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
ce60: 6d 6d 2c 20 38 2b 6a 2c 20 31 29 3b 20 20 2f 2a  mm, 8+j, 1);  /*
ce70: 20 69 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72 79   increment entry
ce80: 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   count */.      
ce90: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
cea0: 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
ceb0: 79 20 65 78 69 73 74 73 20 66 6f 72 20 74 68 65  y exists for the
cec0: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 72   current table r
ced0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ow */.          
cee0: 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp2 = sqlite3Vd
cef0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
cf00: 50 5f 46 6f 75 6e 64 2c 20 69 49 64 78 43 75 72  P_Found, iIdxCur
cf10: 2b 6a 2c 20 63 6b 55 6e 69 71 2c 20 72 31 2c 0a  +j, ckUniq, r1,.
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c        pIdx->nCol
cf50: 75 6d 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  umn); VdbeCovera
cf60: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
cf70: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
cf80: 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f  String(v, 3, "ro
cf90: 77 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  w ");.          
cfa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cfb0: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
cfc0: 37 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20  7, 3, 3);.      
cfd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
cfe0: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20  oadString(v, 4, 
cff0: 22 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 69  " missing from i
d000: 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20  ndex ");.       
d010: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d020: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  dOp3(v, OP_Conca
d030: 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20  t, 4, 3, 3);.   
d040: 20 20 20 20 20 20 20 6a 6d 70 35 20 3d 20 73 71         jmp5 = sq
d050: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
d060: 69 6e 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e  ing(v, 4, pIdx->
d070: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
d080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d090: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
d0a0: 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 4, 3, 3);.    
d0b0: 20 20 20 20 20 20 6a 6d 70 34 20 3d 20 69 6e 74        jmp4 = int
d0c0: 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c  egrityCheckResul
d0d0: 74 52 6f 77 28 76 2c 20 33 29 3b 0a 20 20 20 20  tRow(v, 3);.    
d0e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d0f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70  eJumpHere(v, jmp
d100: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  2);.          /*
d110: 20 46 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65   For UNIQUE inde
d120: 78 65 73 2c 20 76 65 72 69 66 79 20 74 68 61 74  xes, verify that
d130: 20 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20   only one entry 
d140: 65 78 69 73 74 73 20 77 69 74 68 20 74 68 65 0a  exists with the.
d150: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
d160: 72 65 6e 74 20 6b 65 79 2e 20 20 54 68 65 20 65  rent key.  The e
d170: 6e 74 72 79 20 69 73 20 75 6e 69 71 75 65 20 69  ntry is unique i
d180: 66 20 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e  f (1) any column
d190: 20 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20   is NULL.       
d1a0: 20 20 20 2a 2a 20 6f 72 20 28 32 29 20 74 68 65     ** or (2) the
d1b0: 20 6e 65 78 74 20 65 6e 74 72 79 20 68 61 73 20   next entry has 
d1c0: 61 20 64 69 66 66 65 72 65 6e 74 20 6b 65 79 20  a different key 
d1d0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
d1e0: 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
d1f0: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
d200: 20 20 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d      int uniqOk =
d210: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d220: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d230: 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a        int jmp6;.
d240: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d250: 6b 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  kk;.            
d260: 66 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64  for(kk=0; kk<pId
d270: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b  x->nKeyCol; kk++
d280: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d290: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78   int iCol = pIdx
d2a0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a  ->aiColumn[kk];.
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
d2c0: 73 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52  sert( iCol!=XN_R
d2d0: 4f 57 49 44 20 26 26 20 69 43 6f 6c 3c 70 54 61  OWID && iCol<pTa
d2e0: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
d2f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
d300: 6c 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e 61 43  l>=0 && pTab->aC
d310: 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c  ol[iCol].notNull
d320: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d330: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d340: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d350: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b  OP_IsNull, r1+kk
d360: 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20  , uniqOk);.     
d370: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
d380: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
d390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d3a0: 20 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74      jmp6 = sqlit
d3b0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d3c0: 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72  OP_Next, iIdxCur
d3d0: 2b 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +j); VdbeCoverag
d3e0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
d3f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
d400: 6f 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20  o(v, uniqOk);.  
d410: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d420: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
d430: 20 6a 6d 70 36 29 3b 0a 20 20 20 20 20 20 20 20   jmp6);.        
d440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d450: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
d460: 64 78 47 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c  dxGT, iIdxCur+j,
d470: 20 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20   uniqOk, r1,.   
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
d4a0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64  dx->nKeyCol); Vd
d4b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d4c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d4d0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
d4e0: 28 76 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71  (v, 3, "non-uniq
d4f0: 75 65 20 65 6e 74 72 79 20 69 6e 20 69 6e 64 65  ue entry in inde
d500: 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  x ");.          
d510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
d520: 6f 28 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20  o(v, jmp5);.    
d530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d540: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d550: 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20  v, uniqOk);.    
d560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d570: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d580: 70 48 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b 0a  pHere(v, jmp4);.
d590: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d5a0: 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c  3ResolvePartIdxL
d5b0: 61 62 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70  abel(pParse, jmp
d5c0: 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  3);.        }.  
d5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d5e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
d5f0: 78 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f  xt, iDataCur, lo
d600: 6f 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65  opTop); VdbeCove
d610: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
d620: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d630: 48 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d  Here(v, loopTop-
d640: 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1);.#ifndef SQLI
d650: 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
d660: 4e 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  NT.        if( !
d670: 69 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20  isQuick ){.     
d680: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d690: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 32 2c  LoadString(v, 2,
d6a0: 20 22 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74   "wrong # of ent
d6b0: 72 69 65 73 20 69 6e 20 69 6e 64 65 78 20 22 29  ries in index ")
d6c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
d6d0: 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  j=0, pIdx=pTab->
d6e0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
d6f0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
d700: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
d710: 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20    if( pPk==pIdx 
d720: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d740: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d750: 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a  Count, iIdxCur+j
d760: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
d770: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
d780: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d790: 5f 45 71 2c 20 38 2b 6a 2c 20 30 2c 20 33 29 3b  _Eq, 8+j, 0, 3);
d7a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d7b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
d7c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d7d0: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e  5(v, SQLITE_NOTN
d7e0: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULL);.          
d7f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
d800: 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 70 49  dString(v, 3, pI
d810: 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
d820: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d830: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d840: 43 6f 6e 63 61 74 2c 20 33 2c 20 32 2c 20 37 29  Concat, 3, 2, 7)
d850: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
d860: 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75  tegrityCheckResu
d870: 6c 74 52 6f 77 28 76 2c 20 37 29 3b 0a 20 20 20  ltRow(v, 7);.   
d880: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d890: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d8a0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  addr);.         
d8b0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
d8c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d8d0: 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
d8e0: 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a  .      } .    }.
d8f0: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 74 61 74      {.      stat
d900: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e  ic const int iLn
d910: 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c   = VDBE_OFFSET_L
d920: 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20  INENO(2);.      
d930: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62  static const Vdb
d940: 65 4f 70 4c 69 73 74 20 65 6e 64 43 6f 64 65 5b  eOpList endCode[
d950: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
d960: 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20  OP_AddImm,      
d970: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
d980: 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20      /* 0 */.    
d990: 20 20 20 20 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65      { OP_IfNotZe
d9a0: 72 6f 2c 20 20 20 31 2c 20 34 2c 20 20 20 20 20  ro,   1, 4,     
d9b0: 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a     0},    /* 1 *
d9c0: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53  /.        { OP_S
d9d0: 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33  tring8,     0, 3
d9e0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
d9f0: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 2 */.        
da00: 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  { OP_ResultRow, 
da10: 20 20 33 2c 20 31 2c 20 20 20 20 20 20 20 20 30    3, 1,        0
da20: 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20  },    /* 3 */.  
da30: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62      };.      Vdb
da40: 65 4f 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20  eOp *aOp;..     
da50: 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   aOp = sqlite3Vd
da60: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
da70: 72 72 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65  rraySize(endCode
da80: 29 2c 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29  ), endCode, iLn)
da90: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f 70 20  ;.      if( aOp 
daa0: 29 7b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30  ){.        aOp[0
dab0: 5d 2e 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b 0a  ].p2 = 1-mxErr;.
dac0: 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70          aOp[2].p
dad0: 34 74 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49  4type = P4_STATI
dae0: 43 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32  C;.        aOp[2
daf0: 5d 2e 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20  ].p4.z = "ok";. 
db00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
db10: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
db20: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
db30: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
db40: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
db50: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
db60: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
db70: 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20   encoding.  **  
db80: 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67   PRAGMA encoding
db90: 20 3d 20 22 75 74 66 2d 38 22 7c 22 75 74 66 2d   = "utf-8"|"utf-
dba0: 31 36 22 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22  16"|"utf-16le"|"
dbb0: 75 74 66 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20  utf-16be".  **. 
dbc0: 20 2a 2a 20 49 6e 20 69 74 73 20 66 69 72 73 74   ** In its first
dbd0: 20 66 6f 72 6d 2c 20 74 68 69 73 20 70 72 61 67   form, this prag
dbe0: 6d 61 20 72 65 74 75 72 6e 73 20 74 68 65 20 65  ma returns the e
dbf0: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 6d  ncoding of the m
dc00: 61 69 6e 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  ain.  ** databas
dc10: 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e. If the databa
dc20: 73 65 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  se is not initia
dc30: 6c 69 7a 65 64 2c 20 69 74 20 69 73 20 69 6e 69  lized, it is ini
dc40: 74 69 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20  tialized now..  
dc50: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
dc60: 6e 64 20 66 6f 72 6d 20 6f 66 20 74 68 69 73 20  nd form of this 
dc70: 70 72 61 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f  pragma is a no-o
dc80: 70 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61  p if the main da
dc90: 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
dca0: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
dcb0: 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
dcc0: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
dcd0: 69 74 20 73 65 74 73 20 74 68 65 20 64 65 66 61  it sets the defa
dce0: 75 6c 74 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e  ult.  ** encodin
dcf0: 67 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  g that will be u
dd00: 73 65 64 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  sed for the main
dd10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
dd20: 66 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  f a new file.  *
dd30: 2a 20 69 73 20 63 72 65 61 74 65 64 2e 20 49 66  * is created. If
dd40: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 61 69   an existing mai
dd50: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
dd60: 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20  is opened, then 
dd70: 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74  the.  ** default
dd80: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 66   text encoding f
dd90: 6f 72 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  or the existing 
dda0: 64 61 74 61 62 61 73 65 20 69 73 20 75 73 65 64  database is used
ddb0: 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20  ..  ** .  ** In 
ddc0: 61 6c 6c 20 63 61 73 65 73 20 6e 65 77 20 64 61  all cases new da
ddd0: 74 61 62 61 73 65 73 20 63 72 65 61 74 65 64 20  tabases created 
dde0: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
ddf0: 20 63 6f 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a   command are.  *
de00: 2a 20 63 72 65 61 74 65 64 20 74 6f 20 75 73 65  * created to use
de10: 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c   the same defaul
de20: 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  t text encoding 
de30: 61 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  as the main data
de40: 62 61 73 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68  base. If.  ** th
de50: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
de60: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69  has not been ini
de70: 74 69 61 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20  tialized and/or 
de80: 63 72 65 61 74 65 64 20 77 68 65 6e 20 41 54 54  created when ATT
de90: 41 43 48 0a 20 20 2a 2a 20 69 73 20 65 78 65 63  ACH.  ** is exec
dea0: 75 74 65 64 2c 20 74 68 69 73 20 69 73 20 64 6f  uted, this is do
deb0: 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 41 54  ne before the AT
dec0: 54 41 43 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  TACH operation..
ded0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65    **.  ** In the
dee0: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69   second form thi
def0: 73 20 70 72 61 67 6d 61 20 73 65 74 73 20 74 68  s pragma sets th
df00: 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
df10: 74 6f 20 62 65 20 75 73 65 64 20 69 6e 0a 20 20  to be used in.  
df20: 2a 2a 20 6e 65 77 20 64 61 74 61 62 61 73 65 20  ** new database 
df30: 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 75 73  files created us
df40: 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73  ing this databas
df50: 65 20 68 61 6e 64 6c 65 2e 20 49 74 20 69 73 20  e handle. It is 
df60: 6f 6e 6c 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c  only.  ** useful
df70: 20 69 66 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65   if invoked imme
df80: 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68  diately after th
df90: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
dfa0: 69 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  i.  */.  case Pr
dfb0: 61 67 54 79 70 5f 45 4e 43 4f 44 49 4e 47 3a 20  agTyp_ENCODING: 
dfc0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
dfd0: 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d  st struct EncNam
dfe0: 65 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e {.      char *
dff0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75 38 20  zName;.      u8 
e000: 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61  enc;.    } encna
e010: 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  mes[] = {.      
e020: 7b 20 22 55 54 46 38 22 2c 20 20 20 20 20 53 51  { "UTF8",     SQ
e030: 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20 20 20  LITE_UTF8       
e040: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46   },.      { "UTF
e050: 2d 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55  -8",    SQLITE_U
e060: 54 46 38 20 20 20 20 20 20 20 20 7d 2c 20 20 2f  TF8        },  /
e070: 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e  * Must be elemen
e080: 74 20 5b 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b  t [1] */.      {
e090: 20 22 55 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c   "UTF-16le", SQL
e0a0: 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20  ITE_UTF16LE     
e0b0: 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65  },  /* Must be e
e0c0: 6c 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20  lement [2] */.  
e0d0: 20 20 20 20 7b 20 22 55 54 46 2d 31 36 62 65 22      { "UTF-16be"
e0e0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
e0f0: 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74       },  /* Must
e100: 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20   be element [3] 
e110: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  */.      { "UTF1
e120: 36 6c 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54  6le",  SQLITE_UT
e130: 46 31 36 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20  F16LE     },.   
e140: 20 20 20 7b 20 22 55 54 46 31 36 62 65 22 2c 20     { "UTF16be", 
e150: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
e160: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
e170: 55 54 46 2d 31 36 22 2c 20 20 20 30 20 20 20 20  UTF-16",   0    
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
e190: 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   /* SQLITE_UTF16
e1a0: 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20  NATIVE */.      
e1b0: 7b 20 22 55 54 46 31 36 22 2c 20 20 20 20 30 20  { "UTF16",    0 
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54   }, /* SQLITE_UT
e1e0: 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20  F16NATIVE */.   
e1f0: 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
e200: 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72  };.    const str
e210: 75 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e  uct EncName *pEn
e220: 63 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67  c;.    if( !zRig
e230: 68 74 20 29 7b 20 20 20 20 2f 2a 20 22 50 52 41  ht ){    /* "PRA
e240: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f  GMA encoding" */
e250: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
e260: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
e270: 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67  rse) ) goto prag
e280: 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 61 73  ma_out;.      as
e290: 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53  sert( encnames[S
e2a0: 51 4c 49 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d  QLITE_UTF8].enc=
e2b0: 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a  =SQLITE_UTF8 );.
e2c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
e2d0: 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54  cnames[SQLITE_UT
e2e0: 46 31 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49  F16LE].enc==SQLI
e2f0: 54 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20  TE_UTF16LE );.  
e300: 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e      assert( encn
e310: 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31  ames[SQLITE_UTF1
e320: 36 42 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45  6BE].enc==SQLITE
e330: 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 20 20  _UTF16BE );.    
e340: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65    returnSingleTe
e350: 78 74 28 76 2c 20 65 6e 63 6e 61 6d 65 73 5b 45  xt(v, encnames[E
e360: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 5d 2e  NC(pParse->db)].
e370: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
e380: 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
e390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 50 52            /* "PR
e3a0: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20  AGMA encoding = 
e3b0: 58 58 58 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  XXX" */.      /*
e3c0: 20 4f 6e 6c 79 20 63 68 61 6e 67 65 20 74 68 65   Only change the
e3d0: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
e3e0: 2e 65 6e 63 20 69 66 20 74 68 65 20 64 61 74 61  .enc if the data
e3f0: 62 61 73 65 20 68 61 6e 64 6c 65 20 69 73 20 6e  base handle is n
e400: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  ot.      ** init
e410: 69 61 6c 69 7a 65 64 2e 20 49 66 20 74 68 65 20  ialized. If the 
e420: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 78  main database ex
e430: 69 73 74 73 2c 20 74 68 65 20 6e 65 77 20 73 71  ists, the new sq
e440: 6c 69 74 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20  lite.enc value. 
e450: 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
e460: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
e470: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 6e   the schema is n
e480: 65 78 74 20 6c 6f 61 64 65 64 2e 20 49 66 20 69  ext loaded. If i
e490: 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20  t does not.     
e4a0: 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78 69 73   ** already exis
e4b0: 74 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63  ts, it will be c
e4c0: 72 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68  reated to use th
e4d0: 65 20 6e 65 77 20 65 6e 63 6f 64 69 6e 67 20 76  e new encoding v
e4e0: 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  alue..      */. 
e4f0: 20 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20       if( .      
e500: 20 20 21 28 44 62 48 61 73 50 72 6f 70 65 72 74    !(DbHasPropert
e510: 79 28 64 62 2c 20 30 2c 20 44 42 5f 53 63 68 65  y(db, 0, DB_Sche
e520: 6d 61 4c 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20  maLoaded)) || . 
e530: 20 20 20 20 20 20 20 44 62 48 61 73 50 72 6f 70         DbHasProp
e540: 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 45  erty(db, 0, DB_E
e550: 6d 70 74 79 29 20 0a 20 20 20 20 20 20 29 7b 0a  mpty) .      ){.
e560: 20 20 20 20 20 20 20 20 66 6f 72 28 70 45 6e 63          for(pEnc
e570: 3d 26 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70  =&encnames[0]; p
e580: 45 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63  Enc->zName; pEnc
e590: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
e5a0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
e5b0: 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 70 45 6e  ICmp(zRight, pEn
e5c0: 63 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  c->zName) ){.   
e5d0: 20 20 20 20 20 20 20 20 20 53 43 48 45 4d 41 5f           SCHEMA_
e5e0: 45 4e 43 28 64 62 29 20 3d 20 45 4e 43 28 64 62  ENC(db) = ENC(db
e5f0: 29 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) =.            
e600: 20 20 20 20 70 45 6e 63 2d 3e 65 6e 63 20 3f 20      pEnc->enc ? 
e610: 70 45 6e 63 2d 3e 65 6e 63 20 3a 20 53 51 4c 49  pEnc->enc : SQLI
e620: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
e630: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
e640: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
e650: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e660: 20 69 66 28 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d   if( !pEnc->zNam
e670: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
e680: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e690: 50 61 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72  Parse, "unsuppor
e6a0: 74 65 64 20 65 6e 63 6f 64 69 6e 67 3a 20 25 73  ted encoding: %s
e6b0: 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  ", zRight);.    
e6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e6d0: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
e6e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e6f0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
e700: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e710: 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53  OMIT_SCHEMA_VERS
e720: 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a  ION_PRAGMAS.  /*
e730: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
e740: 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76  schema.]schema_v
e750: 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52  ersion.  **   PR
e760: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63  AGMA [schema.]sc
e770: 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 3c  hema_version = <
e780: 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20  integer>.  **.  
e790: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
e7a0: 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f  ema.]user_versio
e7b0: 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  n.  **   PRAGMA 
e7c0: 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65  [schema.]user_ve
e7d0: 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72  rsion = <integer
e7e0: 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52  >.  **.  **   PR
e7f0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 66 72  AGMA [schema.]fr
e800: 65 65 6c 69 73 74 5f 63 6f 75 6e 74 0a 20 20 2a  eelist_count.  *
e810: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
e820: 5b 73 63 68 65 6d 61 2e 5d 64 61 74 61 5f 76 65  [schema.]data_ve
e830: 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rsion.  **.  ** 
e840: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
e850: 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64  .]application_id
e860: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
e870: 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74  schema.]applicat
e880: 69 6f 6e 5f 69 64 20 3d 20 3c 69 6e 74 65 67 65  ion_id = <intege
e890: 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r>.  **.  ** The
e8a0: 20 70 72 61 67 6d 61 27 73 20 73 63 68 65 6d 61   pragma's schema
e8b0: 5f 76 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65  _version and use
e8c0: 72 5f 76 65 72 73 69 6f 6e 20 61 72 65 20 75 73  r_version are us
e8d0: 65 64 20 74 6f 20 73 65 74 20 6f 72 20 67 65 74  ed to set or get
e8e0: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
e8f0: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  of the schema-ve
e900: 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 2d 76  rsion and user-v
e910: 65 72 73 69 6f 6e 2c 20 72 65 73 70 65 63 74 69  ersion, respecti
e920: 76 65 6c 79 2e 20 42 6f 74 68 0a 20 20 2a 2a 20  vely. Both.  ** 
e930: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
e940: 6f 6e 20 61 6e 64 20 74 68 65 20 75 73 65 72 2d  on and the user-
e950: 76 65 72 73 69 6f 6e 20 61 72 65 20 33 32 2d 62  version are 32-b
e960: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
e970: 72 73 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  rs.  ** stored i
e980: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
e990: 65 61 64 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eader..  **.  **
e9a0: 20 54 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b   The schema-cook
e9b0: 69 65 20 69 73 20 75 73 75 61 6c 6c 79 20 6f 6e  ie is usually on
e9c0: 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 69  ly manipulated i
e9d0: 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c  nternally by SQL
e9e0: 69 74 65 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  ite. It.  ** is 
e9f0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 53  incremented by S
ea00: 51 4c 69 74 65 20 77 68 65 6e 65 76 65 72 20 74  QLite whenever t
ea10: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
ea20: 6d 61 20 69 73 20 6d 6f 64 69 66 69 65 64 20 28  ma is modified (
ea30: 62 79 0a 20 20 2a 2a 20 63 72 65 61 74 69 6e 67  by.  ** creating
ea40: 20 6f 72 20 64 72 6f 70 70 69 6e 67 20 61 20 74   or dropping a t
ea50: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 29 2e 20  able or index). 
ea60: 54 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69  The schema versi
ea70: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 0a 20 20  on is used by.  
ea80: 2a 2a 20 53 51 4c 69 74 65 20 65 61 63 68 20 74  ** SQLite each t
ea90: 69 6d 65 20 61 20 71 75 65 72 79 20 69 73 20 65  ime a query is e
eaa0: 78 65 63 75 74 65 64 20 74 6f 20 65 6e 73 75 72  xecuted to ensur
eab0: 65 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72  e that the inter
eac0: 6e 61 6c 20 63 61 63 68 65 0a 20 20 2a 2a 20 6f  nal cache.  ** o
ead0: 66 20 74 68 65 20 73 63 68 65 6d 61 20 75 73 65  f the schema use
eae0: 64 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  d when compiling
eaf0: 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 6d   the SQL query m
eb00: 61 74 63 68 65 73 20 74 68 65 20 73 63 68 65 6d  atches the schem
eb10: 61 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61  a of.  ** the da
eb20: 74 61 62 61 73 65 20 61 67 61 69 6e 73 74 20 77  tabase against w
eb30: 68 69 63 68 20 74 68 65 20 63 6f 6d 70 69 6c 65  hich the compile
eb40: 64 20 71 75 65 72 79 20 69 73 20 61 63 74 75 61  d query is actua
eb50: 6c 6c 79 20 65 78 65 63 75 74 65 64 2e 0a 20 20  lly executed..  
eb60: 2a 2a 20 53 75 62 76 65 72 74 69 6e 67 20 74 68  ** Subverting th
eb70: 69 73 20 6d 65 63 68 61 6e 69 73 6d 20 62 79 20  is mechanism by 
eb80: 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 63  using "PRAGMA sc
eb90: 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 20 74 6f  hema_version" to
eba0: 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65   modify.  ** the
ebb0: 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20   schema-version 
ebc0: 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64  is potentially d
ebd0: 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 6d 61 79  angerous and may
ebe0: 20 6c 65 61 64 20 74 6f 20 70 72 6f 67 72 61 6d   lead to program
ebf0: 0a 20 20 2a 2a 20 63 72 61 73 68 65 73 20 6f 72  .  ** crashes or
ec00: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
ec10: 74 69 6f 6e 2e 20 55 73 65 20 77 69 74 68 20 63  tion. Use with c
ec20: 61 75 74 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a  aution!.  **.  *
ec30: 2a 20 54 68 65 20 75 73 65 72 2d 76 65 72 73 69  * The user-versi
ec40: 6f 6e 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  on is not used i
ec50: 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c  nternally by SQL
ec60: 69 74 65 2e 20 49 74 20 6d 61 79 20 62 65 20 75  ite. It may be u
ec70: 73 65 64 20 62 79 0a 20 20 2a 2a 20 61 70 70 6c  sed by.  ** appl
ec80: 69 63 61 74 69 6f 6e 73 20 66 6f 72 20 61 6e 79  ications for any
ec90: 20 70 75 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20   purpose..  */. 
eca0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 48 45   case PragTyp_HE
ecb0: 41 44 45 52 5f 56 41 4c 55 45 3a 20 7b 0a 20 20  ADER_VALUE: {.  
ecc0: 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20    int iCookie = 
ecd0: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20  pPragma->iArg;  
ece0: 2f 2a 20 57 68 69 63 68 20 63 6f 6f 6b 69 65 20  /* Which cookie 
ecf0: 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
ed00: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
ed10: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
ed20: 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  iDb);.    if( zR
ed30: 69 67 68 74 20 26 26 20 28 70 50 72 61 67 6d 61  ight && (pPragma
ed40: 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61  ->mPragFlg & Pra
ed50: 67 46 6c 67 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d  gFlg_ReadOnly)==
ed60: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72  0 ){.      /* Wr
ed70: 69 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ite the specifie
ed80: 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  d cookie value *
ed90: 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
eda0: 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20  onst VdbeOpList 
edb0: 73 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a  setCookie[] = {.
edc0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61          { OP_Tra
edd0: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20  nsaction,    0, 
ede0: 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30   1,  0},    /* 0
edf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
ee00: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20  _SetCookie,     
ee10: 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20   0,  0,  0},    
ee20: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b  /* 1 */.      };
ee30: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61  .      VdbeOp *a
ee40: 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Op;.      sqlite
ee50: 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c  3VdbeVerifyNoMal
ee60: 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41  locRequired(v, A
ee70: 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b  rraySize(setCook
ee80: 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20  ie));.      aOp 
ee90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
eea0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
eeb0: 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20  ize(setCookie), 
eec0: 73 65 74 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  setCookie, 0);. 
eed0: 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46       if( ONLY_IF
eee0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28  _REALLOC_STRESS(
eef0: 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  aOp==0) ) break;
ef00: 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31  .      aOp[0].p1
ef10: 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f   = iDb;.      aO
ef20: 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[1].p1 = iDb;. 
ef30: 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d       aOp[1].p2 =
ef40: 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20   iCookie;.      
ef50: 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69  aOp[1].p3 = sqli
ef60: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b  te3Atoi(zRight);
ef70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ef80: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 70    /* Read the sp
ef90: 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76  ecified cookie v
efa0: 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74  alue */.      st
efb0: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
efc0: 70 4c 69 73 74 20 72 65 61 64 43 6f 6f 6b 69 65  pList readCookie
efd0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
efe0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
eff0: 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c       0,  0,  0},
f000: 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20      /* 0 */.    
f010: 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
f020: 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 31 2c  kie,      0,  1,
f030: 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f    0},    /* 1 */
f040: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  .        { OP_Re
f050: 73 75 6c 74 52 6f 77 2c 20 20 20 20 20 20 20 31  sultRow,       1
f060: 2c 20 20 31 2c 20 20 30 7d 0a 20 20 20 20 20 20  ,  1,  0}.      
f070: 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  };.      VdbeOp 
f080: 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  *aOp;.      sqli
f090: 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d  te3VdbeVerifyNoM
f0a0: 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c  allocRequired(v,
f0b0: 20 41 72 72 61 79 53 69 7a 65 28 72 65 61 64 43   ArraySize(readC
f0c0: 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61  ookie));.      a
f0d0: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
f0e0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
f0f0: 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69  aySize(readCooki
f100: 65 29 2c 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29  e),readCookie,0)
f110: 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59  ;.      if( ONLY
f120: 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  _IF_REALLOC_STRE
f130: 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65  SS(aOp==0) ) bre
f140: 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d  ak;.      aOp[0]
f150: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
f160: 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62   aOp[1].p1 = iDb
f170: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70  ;.      aOp[1].p
f180: 33 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20  3 = iCookie;.   
f190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
f1a0: 75 73 61 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d  usable(v);.    }
f1b0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
f1c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f1d0: 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  MIT_SCHEMA_VERSI
f1e0: 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  ON_PRAGMAS */..#
f1f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f200: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
f210: 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a  _DIAGS.  /*.  **
f220: 20 20 20 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c     PRAGMA compil
f230: 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20  e_options.  **. 
f240: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
f250: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70  ames of all comp
f260: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
f270: 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 62 75   used in this bu
f280: 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70  ild,.  ** one op
f290: 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20  tion per row..  
f2a0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
f2b0: 70 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e  p_COMPILE_OPTION
f2c0: 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  S: {.    int i =
f2d0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
f2e0: 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50  ar *zOpt;.    pP
f2f0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a  arse->nMem = 1;.
f300: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4f 70 74      while( (zOpt
f310: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69   = sqlite3_compi
f320: 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b  leoption_get(i++
f330: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
f340: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
f350: 72 69 6e 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29  ring(v, 1, zOpt)
f360: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f370: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f380: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29  ResultRow, 1, 1)
f390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
f3a0: 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28  te3VdbeReusable(
f3b0: 76 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  v);.  }.  break;
f3c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f3d0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
f3e0: 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23  TION_DIAGS */..#
f3f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f400: 49 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a  IT_WAL.  /*.  **
f410: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
f420: 61 2e 5d 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  a.]wal_checkpoin
f430: 74 20 3d 20 70 61 73 73 69 76 65 7c 66 75 6c 6c  t = passive|full
f440: 7c 72 65 73 74 61 72 74 7c 74 72 75 6e 63 61 74  |restart|truncat
f450: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63  e.  **.  ** Chec
f460: 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62  kpoint the datab
f470: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
f480: 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 43 48 45   PragTyp_WAL_CHE
f490: 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69  CKPOINT: {.    i
f4a0: 6e 74 20 69 42 74 20 3d 20 28 70 49 64 32 2d 3e  nt iBt = (pId2->
f4b0: 7a 3f 69 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58  z?iDb:SQLITE_MAX
f4c0: 5f 41 54 54 41 43 48 45 44 29 3b 0a 20 20 20 20  _ATTACHED);.    
f4d0: 69 6e 74 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49  int eMode = SQLI
f4e0: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
f4f0: 53 53 49 56 45 3b 0a 20 20 20 20 69 66 28 20 7a  SSIVE;.    if( z
f500: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69  Right ){.      i
f510: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
f520: 70 28 7a 52 69 67 68 74 2c 20 22 66 75 6c 6c 22  p(zRight, "full"
f530: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f540: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
f550: 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a  HECKPOINT_FULL;.
f560: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f570: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f580: 52 69 67 68 74 2c 20 22 72 65 73 74 61 72 74 22  Right, "restart"
f590: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f5a0: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
f5b0: 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
f5c0: 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  T;.      }else i
f5d0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
f5e0: 70 28 7a 52 69 67 68 74 2c 20 22 74 72 75 6e 63  p(zRight, "trunc
f5f0: 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ate")==0 ){.    
f600: 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49      eMode = SQLI
f610: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
f620: 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a  UNCATE;.      }.
f630: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
f640: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
f650: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f660: 33 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69  3(v, OP_Checkpoi
f670: 6e 74 2c 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20  nt, iBt, eMode, 
f680: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
f690: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f6a0: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29  ResultRow, 1, 3)
f6b0: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  ;.  }.  break;..
f6c0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
f6d0: 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  MA wal_autocheck
f6e0: 70 6f 69 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41  point.  **   PRA
f6f0: 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  GMA wal_autochec
f700: 6b 70 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a  kpoint = N.  **.
f710: 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61    ** Configure a
f720: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f730: 74 69 6f 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69  tion to automati
f740: 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
f750: 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a   a database.  **
f760: 20 61 66 74 65 72 20 61 63 63 75 6d 75 6c 61 74   after accumulat
f770: 69 6e 67 20 4e 20 66 72 61 6d 65 73 20 69 6e 20  ing N frames in 
f780: 74 68 65 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72  the log. Or quer
f790: 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
f7a0: 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20  t value.  ** of 
f7b0: 4e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  N..  */.  case P
f7c0: 72 61 67 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43  ragTyp_WAL_AUTOC
f7d0: 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20  HECKPOINT: {.   
f7e0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
f7f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c       sqlite3_wal
f800: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
f810: 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28  db, sqlite3Atoi(
f820: 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a  zRight));.    }.
f830: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
f840: 49 6e 74 28 76 2c 20 0a 20 20 20 20 20 20 20 64  Int(v, .       d
f850: 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d  b->xWalCallback=
f860: 3d 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75  =sqlite3WalDefau
f870: 6c 74 48 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20  ltHook ? .      
f880: 20 20 20 20 20 53 51 4c 49 54 45 5f 50 54 52 5f       SQLITE_PTR_
f890: 54 4f 5f 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41  TO_INT(db->pWalA
f8a0: 72 67 29 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  rg) : 0);.  }.  
f8b0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20  break;.#endif.. 
f8c0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
f8d0: 20 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20   shrink_memory. 
f8e0: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
f8f0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33  NTATION-OF: R-23
f900: 34 34 35 2d 34 36 31 30 39 20 54 68 69 73 20 70  445-46109 This p
f910: 72 61 67 6d 61 20 63 61 75 73 65 73 20 74 68 65  ragma causes the
f920: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 63   database.  ** c
f930: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69  onnection on whi
f940: 63 68 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  ch it is invoked
f950: 20 74 6f 20 66 72 65 65 20 75 70 20 61 73 20 6d   to free up as m
f960: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 69 74  uch memory as it
f970: 0a 20 20 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61  .  ** can, by ca
f980: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 62  lling sqlite3_db
f990: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
f9a0: 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  )..  */.  case P
f9b0: 72 61 67 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45  ragTyp_SHRINK_ME
f9c0: 4d 4f 52 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69  MORY: {.    sqli
f9d0: 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
f9e0: 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 20 20 62  emory(db);.    b
f9f0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
fa00: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70 74    **  PRAGMA opt
fa10: 69 6d 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  imize.  **  PRAG
fa20: 4d 41 20 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b  MA optimize(MASK
fa30: 29 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73  ).  **  PRAGMA s
fa40: 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a 20  chema.optimize. 
fa50: 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65   **  PRAGMA sche
fa60: 6d 61 2e 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b  ma.optimize(MASK
fa70: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 74 65  ).  **.  ** Atte
fa80: 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  mpt to optimize 
fa90: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
faa0: 6c 6c 20 73 63 68 65 6d 61 73 20 61 72 65 20 6f  ll schemas are o
fab0: 70 74 69 6d 69 7a 65 64 20 69 6e 20 74 68 65 20  ptimized in the 
fac0: 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 66  first.  ** two f
fad0: 6f 72 6d 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  orms, and only t
fae0: 68 65 20 73 70 65 63 69 66 69 65 64 20 73 63 68  he specified sch
faf0: 65 6d 61 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ema is optimized
fb00: 20 69 6e 20 74 68 65 20 6c 61 74 74 65 72 20 74   in the latter t
fb10: 77 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  wo..  **.  ** Th
fb20: 65 20 64 65 74 61 69 6c 73 20 6f 66 20 6f 70 74  e details of opt
fb30: 69 6d 69 7a 61 74 69 6f 6e 73 20 70 65 72 66 6f  imizations perfo
fb40: 72 6d 65 64 20 62 79 20 74 68 69 73 20 70 72 61  rmed by this pra
fb50: 67 6d 61 20 61 72 65 20 65 78 70 65 63 74 65 64  gma are expected
fb60: 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  .  ** to change 
fb70: 61 6e 64 20 69 6d 70 72 6f 76 65 20 6f 76 65 72  and improve over
fb80: 20 74 69 6d 65 2e 20 20 41 70 70 6c 69 63 61 74   time.  Applicat
fb90: 69 6f 6e 73 20 73 68 6f 75 6c 64 20 61 6e 74 69  ions should anti
fba0: 63 69 70 61 74 65 20 74 68 61 74 0a 20 20 2a 2a  cipate that.  **
fbb0: 20 74 68 69 73 20 70 72 61 67 6d 61 20 77 69 6c   this pragma wil
fbc0: 6c 20 70 65 72 66 6f 72 6d 20 6e 65 77 20 6f 70  l perform new op
fbd0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 66  timizations in f
fbe0: 75 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a  uture releases..
fbf0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 70    **.  ** The op
fc00: 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20  tional argument 
fc10: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
fc20: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
fc30: 20 70 65 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20   perform:.  **. 
fc40: 20 2a 2a 20 20 20 20 30 78 30 30 30 31 20 20 20   **    0x0001   
fc50: 20 44 65 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e   Debugging mode.
fc60: 20 20 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c    Do not actuall
fc70: 79 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 6f 70  y perform any op
fc80: 74 69 6d 69 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a  timizations.  **
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
fca0: 74 20 69 6e 73 74 65 61 64 20 72 65 74 75 72 6e  t instead return
fcb0: 20 6f 6e 65 20 6c 69 6e 65 20 6f 66 20 74 65 78   one line of tex
fcc0: 74 20 66 6f 72 20 65 61 63 68 20 6f 70 74 69 6d  t for each optim
fcd0: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20  ization.  **    
fce0: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 77            that w
fcf0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 64  ould have been d
fd00: 6f 6e 65 2e 20 20 4f 66 66 20 62 79 20 64 65 66  one.  Off by def
fd10: 61 75 6c 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ault..  **.  ** 
fd20: 20 20 20 30 78 30 30 30 32 20 20 20 20 52 75 6e     0x0002    Run
fd30: 20 41 4e 41 4c 59 5a 45 20 6f 6e 20 74 61 62 6c   ANALYZE on tabl
fd40: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  es that might be
fd50: 6e 65 66 69 74 2e 20 20 4f 6e 20 62 79 20 64 65  nefit.  On by de
fd60: 66 61 75 6c 74 2e 0a 20 20 2a 2a 20 20 20 20 20  fault..  **     
fd70: 20 20 20 20 20 20 20 20 20 53 65 65 20 62 65 6c           See bel
fd80: 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ow for additiona
fd90: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
fda0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30   **.  **    0x00
fdb0: 30 34 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69  04    (Not yet i
fdc0: 6d 70 6c 65 6d 65 6e 74 65 64 29 20 52 65 63 6f  mplemented) Reco
fdd0: 72 64 20 75 73 61 67 65 20 61 6e 64 20 70 65 72  rd usage and per
fde0: 66 6f 72 6d 61 6e 63 65 20 0a 20 20 2a 2a 20 20  formance .  **  
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 66 6f              info
fe00: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
fe10: 20 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f 6e   current session
fe20: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 20 20 20   in the.  **    
fe30: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
fe40: 73 65 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  se file so that 
fe50: 69 74 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c  it will be avail
fe60: 61 62 6c 65 20 74 6f 20 22 6f 70 74 69 6d 69 7a  able to "optimiz
fe70: 65 22 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  e".  **         
fe80: 20 20 20 20 20 70 72 61 67 6d 61 73 20 72 75 6e       pragmas run
fe90: 20 62 79 20 66 75 74 75 72 65 20 64 61 74 61 62   by future datab
fea0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
feb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78  .  **.  **    0x
fec0: 30 30 30 38 20 20 20 20 28 4e 6f 74 20 79 65 74  0008    (Not yet
fed0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 20 43 72   implemented) Cr
fee0: 65 61 74 65 20 69 6e 64 65 78 65 73 20 74 68 61  eate indexes tha
fef0: 74 20 6d 69 67 68 74 20 68 61 76 65 0a 20 20 2a  t might have.  *
ff00: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  *              b
ff10: 65 65 6e 20 68 65 6c 70 66 75 6c 20 74 6f 20 72  een helpful to r
ff20: 65 63 65 6e 74 20 71 75 65 72 69 65 73 0a 20 20  ecent queries.  
ff30: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 66 61  **.  ** The defa
ff40: 75 6c 74 20 4d 41 53 4b 20 69 73 20 61 6e 64 20  ult MASK is and 
ff50: 61 6c 77 61 79 73 20 73 68 61 6c 6c 20 62 65 20  always shall be 
ff60: 30 78 66 66 66 65 2e 20 20 30 78 66 66 66 65 20  0xfffe.  0xfffe 
ff70: 6d 65 61 6e 73 20 70 65 72 66 6f 72 6d 20 61 6c  means perform al
ff80: 6c 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f  l    ** of the o
ff90: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 73  ptimizations lis
ffa0: 74 65 64 20 61 62 6f 76 65 20 65 78 63 65 70 74  ted above except
ffb0: 20 44 65 62 75 67 20 4d 6f 64 65 2c 20 69 6e 63   Debug Mode, inc
ffc0: 6c 75 64 69 6e 67 20 6e 65 77 0a 20 20 2a 2a 20  luding new.  ** 
ffd0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 68  optimizations th
ffe0: 61 74 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  at have not yet 
fff0: 62 65 65 6e 20 69 6e 76 65 6e 74 65 64 2e 20 20  been invented.  
10000 49 66 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74  If new optimizat
10010 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 65 76  ions are.  ** ev
10020 65 72 20 61 64 64 65 64 20 74 68 61 74 20 73 68  er added that sh
10030 6f 75 6c 64 20 62 65 20 6f 66 66 20 62 79 20 64  ould be off by d
10040 65 66 61 75 6c 74 2c 20 74 68 6f 73 65 20 6f 66  efault, those of
10050 66 2d 62 79 2d 64 65 66 61 75 6c 74 20 0a 20 20  f-by-default .  
10060 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ** optimizations
10070 20 77 69 6c 6c 20 68 61 76 65 20 62 69 74 6d 61   will have bitma
10080 73 6b 73 20 6f 66 20 30 78 31 30 30 30 30 20 6f  sks of 0x10000 o
10090 72 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 0a 20  r larger..  **. 
100a0 20 2a 2a 20 44 45 54 45 52 4d 49 4e 41 54 49 4f   ** DETERMINATIO
100b0 4e 20 4f 46 20 57 48 45 4e 20 54 4f 20 52 55 4e  N OF WHEN TO RUN
100c0 20 41 4e 41 4c 59 5a 45 0a 20 20 2a 2a 0a 20 20   ANALYZE.  **.  
100d0 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  ** In the curren
100e0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
100f0 2c 20 61 20 74 61 62 6c 65 20 69 73 20 61 6e 61  , a table is ana
10100 6c 79 7a 65 64 20 69 66 20 6f 6e 6c 79 20 69 66  lyzed if only if
10110 20 61 6c 6c 20 6f 66 0a 20 20 2a 2a 20 74 68 65   all of.  ** the
10120 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
10130 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28  rue:.  **.  ** (
10140 31 29 20 4d 41 53 4b 20 62 69 74 20 30 78 30 32  1) MASK bit 0x02
10150 20 69 73 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   is set..  **.  
10160 2a 2a 20 28 32 29 20 54 68 65 20 71 75 65 72 79  ** (2) The query
10170 20 70 6c 61 6e 6e 65 72 20 75 73 65 64 20 73 71   planner used sq
10180 6c 69 74 65 5f 73 74 61 74 31 2d 73 74 79 6c 65  lite_stat1-style
10190 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20   statistics for 
101a0 6f 6e 65 20 6f 72 0a 20 20 2a 2a 20 20 20 20 20  one or.  **     
101b0 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20  more indexes of 
101c0 74 68 65 20 74 61 62 6c 65 20 61 74 20 73 6f 6d  the table at som
101d0 65 20 70 6f 69 6e 74 20 64 75 72 69 6e 67 20 74  e point during t
101e0 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 20  he lifetime of. 
101f0 20 2a 2a 20 20 20 20 20 74 68 65 20 63 75 72 72   **     the curr
10200 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ent connection..
10210 20 20 2a 2a 0a 20 20 2a 2a 20 28 33 29 20 4f 6e    **.  ** (3) On
10220 65 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  e or more indexe
10230 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
10240 72 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 61  re currently una
10250 6e 61 6c 79 7a 65 64 20 4f 52 0a 20 20 2a 2a 20  nalyzed OR.  ** 
10260 20 20 20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f      the number o
10270 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
10280 62 6c 65 20 68 61 73 20 69 6e 63 72 65 61 73 65  ble has increase
10290 64 20 62 79 20 32 35 20 74 69 6d 65 73 20 6f 72  d by 25 times or
102a0 20 6d 6f 72 65 0a 20 20 2a 2a 20 20 20 20 20 73   more.  **     s
102b0 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20 74 69  ince the last ti
102c0 6d 65 20 41 4e 41 4c 59 5a 45 20 77 61 73 20 72  me ANALYZE was r
102d0 75 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  un..  **.  ** Th
102e0 65 20 72 75 6c 65 73 20 66 6f 72 20 77 68 65 6e  e rules for when
102f0 20 74 61 62 6c 65 73 20 61 72 65 20 61 6e 61 6c   tables are anal
10300 79 7a 65 64 20 61 72 65 20 6c 69 6b 65 6c 79 20  yzed are likely 
10310 74 6f 20 63 68 61 6e 67 65 20 69 6e 0a 20 20 2a  to change in.  *
10320 2a 20 66 75 74 75 72 65 20 72 65 6c 65 61 73 65  * future release
10330 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  s..  */.  case P
10340 72 61 67 54 79 70 5f 4f 50 54 49 4d 49 5a 45 3a  ragTyp_OPTIMIZE:
10350 20 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 4c 61   {.    int iDbLa
10360 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
10370 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   Loop terminatio
10380 6e 20 70 6f 69 6e 74 20 66 6f 72 20 74 68 65 20  n point for the 
10390 73 63 68 65 6d 61 20 6c 6f 6f 70 20 2a 2f 0a 20  schema loop */. 
103a0 20 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20     int iTabCur; 
103b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
103c0 73 6f 72 20 66 6f 72 20 61 20 74 61 62 6c 65 20  sor for a table 
103d0 77 68 6f 73 65 20 73 69 7a 65 20 6e 65 65 64 73  whose size needs
103e0 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 20   checking */.   
103f0 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
10400 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10410 6f 76 65 72 20 74 61 62 6c 65 73 20 6f 66 20 61  over tables of a
10420 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 53   schema */.    S
10430 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 3b 20  chema *pSchema; 
10440 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
10450 72 65 6e 74 20 73 63 68 65 6d 61 20 2a 2f 0a 20  rent schema */. 
10460 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
10470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
10480 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68 65  able in the sche
10490 6d 61 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ma */.    Index 
104a0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
104b0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 66 20   /* An index of 
104c0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
104d0 20 4c 6f 67 45 73 74 20 73 7a 54 68 72 65 73 68   LogEst szThresh
104e0 6f 6c 64 3b 20 20 20 20 2f 2a 20 53 69 7a 65 20  old;    /* Size 
104f0 74 68 72 65 73 68 6f 6c 64 20 61 62 6f 76 65 20  threshold above 
10500 77 68 69 63 68 20 72 65 61 6e 61 6c 79 73 69 73  which reanalysis
10510 20 69 73 20 6e 65 65 64 64 20 2a 2f 0a 20 20 20   is needd */.   
10520 20 63 68 61 72 20 2a 7a 53 75 62 53 71 6c 3b 20   char *zSubSql; 
10530 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
10540 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 65  tatement for the
10550 20 4f 50 5f 53 71 6c 45 78 65 63 20 6f 70 63 6f   OP_SqlExec opco
10560 64 65 20 2a 2f 0a 20 20 20 20 75 33 32 20 6f 70  de */.    u32 op
10570 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
10580 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6f 70 65 72   /* Mask of oper
10590 61 74 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72  ations to perfor
105a0 6d 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52  m */..    if( zR
105b0 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 6f 70  ight ){.      op
105c0 4d 61 73 6b 20 3d 20 28 75 33 32 29 73 71 6c 69  Mask = (u32)sqli
105d0 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b  te3Atoi(zRight);
105e0 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70 4d 61  .      if( (opMa
105f0 73 6b 20 26 20 30 78 30 32 29 3d 3d 30 20 29 20  sk & 0x02)==0 ) 
10600 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
10610 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d  {.      opMask =
10620 20 30 78 66 66 66 65 3b 0a 20 20 20 20 7d 0a 20   0xfffe;.    }. 
10630 20 20 20 69 54 61 62 43 75 72 20 3d 20 70 50 61     iTabCur = pPa
10640 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
10650 20 66 6f 72 28 69 44 62 4c 61 73 74 20 3d 20 7a   for(iDbLast = z
10660 44 62 3f 69 44 62 3a 64 62 2d 3e 6e 44 62 2d 31  Db?iDb:db->nDb-1
10670 3b 20 69 44 62 3c 3d 69 44 62 4c 61 73 74 3b 20  ; iDb<=iDbLast; 
10680 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  iDb++){.      if
10690 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 6e 74 69  ( iDb==1 ) conti
106a0 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nue;.      sqlit
106b0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
106c0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
106d0 0a 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d  .      pSchema =
106e0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
106f0 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 66 6f 72  chema;.      for
10700 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
10710 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  st(&pSchema->tbl
10720 48 61 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69  Hash); k; k=sqli
10730 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
10740 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 28          pTab = (
10750 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
10760 68 44 61 74 61 28 6b 29 3b 0a 0a 20 20 20 20 20  hData(k);..     
10770 20 20 20 2f 2a 20 49 66 20 74 61 62 6c 65 20 70     /* If table p
10780 54 61 62 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  Tab has not been
10790 20 75 73 65 64 20 69 6e 20 61 20 77 61 79 20 74   used in a way t
107a0 68 61 74 20 77 6f 75 6c 64 20 62 65 6e 65 66 69  hat would benefi
107b0 74 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a  t from.        *
107c0 2a 20 68 61 76 69 6e 67 20 61 6e 61 6c 79 73 69  * having analysi
107d0 73 20 73 74 61 74 69 73 74 69 63 73 20 64 75 72  s statistics dur
107e0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
107f0 73 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 6b  session, then sk
10800 69 70 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a  ip it..        *
10810 2a 20 54 68 69 73 20 61 6c 73 6f 20 68 61 73 20  * This also has 
10820 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 73 6b  the effect of sk
10830 69 70 70 69 6e 67 20 76 69 72 74 75 61 6c 20 74  ipping virtual t
10840 61 62 6c 65 73 20 61 6e 64 20 76 69 65 77 73 20  ables and views 
10850 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
10860 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
10870 20 54 46 5f 53 74 61 74 73 55 73 65 64 29 3d 3d   TF_StatsUsed)==
10880 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
10890 20 20 20 20 20 20 20 2f 2a 20 52 65 61 6e 61 6c         /* Reanal
108a0 79 7a 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  yze if the table
108b0 20 69 73 20 32 35 20 74 69 6d 65 73 20 6c 61 72   is 25 times lar
108c0 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 73  ger than the las
108d0 74 20 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20  t analysis */.  
108e0 20 20 20 20 20 20 73 7a 54 68 72 65 73 68 6f 6c        szThreshol
108f0 64 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  d = pTab->nRowLo
10900 67 45 73 74 20 2b 20 34 36 3b 20 61 73 73 65 72  gEst + 46; asser
10910 74 28 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  t( sqlite3LogEst
10920 28 32 35 29 3d 3d 34 36 20 29 3b 0a 20 20 20 20  (25)==46 );.    
10930 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
10940 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
10950 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
10960 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
10970 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74  ( !pIdx->hasStat
10980 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
10990 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 30   szThreshold = 0
109a0 3b 20 2f 2a 20 41 6c 77 61 79 73 20 61 6e 61 6c  ; /* Always anal
109b0 79 7a 65 20 69 66 20 61 6e 79 20 69 6e 64 65 78  yze if any index
109c0 20 6c 61 63 6b 73 20 73 74 61 74 69 73 74 69 63   lacks statistic
109d0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
109e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
109f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
10a00 20 20 20 20 20 20 69 66 28 20 73 7a 54 68 72 65        if( szThre
10a10 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  shold ){.       
10a20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
10a30 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
10a40 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Cur, iDb, pTab, 
10a50 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
10a60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10a70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10a80 49 66 53 6d 61 6c 6c 65 72 2c 20 69 54 61 62 43  IfSmaller, iTabC
10a90 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10ab0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10ac0 41 64 64 72 28 76 29 2b 32 2b 28 6f 70 4d 61 73  Addr(v)+2+(opMas
10ad0 6b 26 31 29 2c 20 73 7a 54 68 72 65 73 68 6f 6c  k&1), szThreshol
10ae0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  d);.          Vd
10af0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
10b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10b10 20 7a 53 75 62 53 71 6c 20 3d 20 73 71 6c 69 74   zSubSql = sqlit
10b20 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 41  e3MPrintf(db, "A
10b30 4e 41 4c 59 5a 45 20 5c 22 25 77 5c 22 2e 5c 22  NALYZE \"%w\".\"
10b40 25 77 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %w\"",.         
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
10b70 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 70  iDb].zDbSName, p
10b80 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
10b90 20 20 20 20 20 69 66 28 20 6f 70 4d 61 73 6b 20       if( opMask 
10ba0 26 20 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  & 0x01 ){.      
10bb0 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
10bc0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
10bd0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
10be0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10bf0 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
10c00 38 2c 20 30 2c 20 72 31 2c 20 30 2c 20 7a 53 75  8, 0, r1, 0, zSu
10c10 62 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43  bSql, P4_DYNAMIC
10c20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
10c30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10c40 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
10c50 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r1, 1);.        
10c60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10c70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10c80 70 34 28 76 2c 20 4f 50 5f 53 71 6c 45 78 65 63  p4(v, OP_SqlExec
10c90 2c 20 30 2c 20 30 2c 20 30 2c 20 7a 53 75 62 53  , 0, 0, 0, zSubS
10ca0 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ql, P4_DYNAMIC);
10cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10cc0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
10cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
10ce0 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20  , OP_Expire);.  
10cf0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
10d00 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
10d10 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20 20   busy_timeout.  
10d20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73 79  **   PRAGMA busy
10d30 5f 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20 2a  _timeout = N.  *
10d40 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  *.  ** Call sqli
10d50 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
10d60 28 64 62 2c 20 4e 29 2e 20 20 52 65 74 75 72 6e  (db, N).  Return
10d70 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
10d80 65 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20  eout value.  ** 
10d90 69 66 20 6f 6e 65 20 69 73 20 73 65 74 2e 20 20  if one is set.  
10da0 49 66 20 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c  If no busy handl
10db0 65 72 20 6f 72 20 61 20 64 69 66 66 65 72 65 6e  er or a differen
10dc0 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 69  t busy handler i
10dd0 73 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e 20  s set.  ** then 
10de0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  0 is returned.  
10df0 53 65 74 74 69 6e 67 20 74 68 65 20 62 75 73 79  Setting the busy
10e00 5f 74 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f 72  _timeout to 0 or
10e10 20 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a 20 64   negative.  ** d
10e20 69 73 61 62 6c 65 73 20 74 68 65 20 74 69 6d 65  isables the time
10e30 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61  out..  */.  /*ca
10e40 73 65 20 50 72 61 67 54 79 70 5f 42 55 53 59 5f  se PragTyp_BUSY_
10e50 54 49 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75 6c  TIMEOUT*/ defaul
10e60 74 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t: {.    assert(
10e70 20 70 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54   pPragma->ePragT
10e80 79 70 3d 3d 50 72 61 67 54 79 70 5f 42 55 53 59  yp==PragTyp_BUSY
10e90 5f 54 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20 20  _TIMEOUT );.    
10ea0 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
10eb0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
10ec0 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 73 71 6c  _timeout(db, sql
10ed0 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29  ite3Atoi(zRight)
10ee0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
10ef0 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
10f00 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 29  db->busyTimeout)
10f10 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
10f20 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  ..  /*.  **   PR
10f30 41 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c  AGMA soft_heap_l
10f40 69 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52 41 47  imit.  **   PRAG
10f50 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  MA soft_heap_lim
10f60 69 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  it = N.  **.  **
10f70 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
10f80 4f 46 3a 20 52 2d 32 36 33 34 33 2d 34 35 39 33  OF: R-26343-4593
10f90 30 20 54 68 69 73 20 70 72 61 67 6d 61 20 69 6e  0 This pragma in
10fa0 76 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 73  vokes the.  ** s
10fb0 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
10fc0 5f 6c 69 6d 69 74 36 34 28 29 20 69 6e 74 65 72  _limit64() inter
10fd0 66 61 63 65 20 77 69 74 68 20 74 68 65 20 61 72  face with the ar
10fe0 67 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69  gument N, if N i
10ff0 73 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  s.  ** specified
11000 20 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65   and is a non-ne
11010 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a  gative integer..
11020 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
11030 49 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d  ION-OF: R-64451-
11040 30 37 31 36 33 20 54 68 65 20 73 6f 66 74 5f 68  07163 The soft_h
11050 65 61 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61  eap_limit pragma
11060 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65 74   always.  ** ret
11070 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 69 6e  urns the same in
11080 74 65 67 65 72 20 74 68 61 74 20 77 6f 75 6c 64  teger that would
11090 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
110a0 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
110b0 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
110c0 36 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67  64(-1) C-languag
110d0 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  e function..  */
110e0 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
110f0 53 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a  SOFT_HEAP_LIMIT:
11100 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69   {.    sqlite3_i
11110 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20  nt64 N;.    if( 
11120 7a 52 69 67 68 74 20 26 26 20 73 71 6c 69 74 65  zRight && sqlite
11130 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
11140 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49  Right, &N)==SQLI
11150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11160 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
11170 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20  _limit64(N);.   
11180 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
11190 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65  gleInt(v, sqlite
111a0 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
111b0 74 36 34 28 2d 31 29 29 3b 0a 20 20 20 20 62 72  t64(-1));.    br
111c0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
111d0 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72   **   PRAGMA thr
111e0 65 61 64 73 0a 20 20 2a 2a 20 20 20 50 52 41 47  eads.  **   PRAG
111f0 4d 41 20 74 68 72 65 61 64 73 20 3d 20 4e 0a 20  MA threads = N. 
11200 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75   **.  ** Configu
11210 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  re the maximum n
11220 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20  umber of worker 
11230 74 68 72 65 61 64 73 2e 20 20 52 65 74 75 72 6e  threads.  Return
11240 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d 61   the new.  ** ma
11250 78 69 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69 67  ximum, which mig
11260 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
11270 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
11280 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54    case PragTyp_T
11290 48 52 45 41 44 53 3a 20 7b 0a 20 20 20 20 73 71  HREADS: {.    sq
112a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20  lite3_int64 N;. 
112b0 20 20 20 69 66 28 20 7a 52 69 67 68 74 0a 20 20     if( zRight.  
112c0 20 20 20 26 26 20 73 71 6c 69 74 65 33 44 65 63     && sqlite3Dec
112d0 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68  OrHexToI64(zRigh
112e0 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f  t, &N)==SQLITE_O
112f0 4b 0a 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a 20  K.     && N>=0. 
11300 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
11310 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51  te3_limit(db, SQ
11320 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
11330 52 5f 54 48 52 45 41 44 53 2c 20 28 69 6e 74 29  R_THREADS, (int)
11340 28 4e 26 30 78 37 66 66 66 66 66 66 66 29 29 3b  (N&0x7fffffff));
11350 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
11360 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71  nSingleInt(v, sq
11370 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20  lite3_limit(db, 
11380 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
11390 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 2d 31 29  KER_THREADS, -1)
113a0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
113b0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
113c0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
113d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
113e0 45 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52  EST).  /*.  ** R
113f0 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e  eport the curren
11400 74 20 73 74 61 74 65 20 6f 66 20 66 69 6c 65 20  t state of file 
11410 6c 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64 61 74  logs for all dat
11420 61 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63 61  abases.  */.  ca
11430 73 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f  se PragTyp_LOCK_
11440 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 73 74  STATUS: {.    st
11450 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
11460 2a 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d  *const azLockNam
11470 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75  e[] = {.      "u
11480 6e 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65  nlocked", "share
11490 64 22 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20  d", "reserved", 
114a0 22 70 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c  "pending", "excl
114b0 75 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20  usive".    };.  
114c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61    int i;.    pPa
114d0 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20  rse->nMem = 2;. 
114e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
114f0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
11500 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20     Btree *pBt;. 
11510 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
11520 2a 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f  *zState = "unkno
11530 77 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  wn";.      int j
11540 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
11550 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d  aDb[i].zDbSName=
11560 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
11570 20 20 20 20 20 70 42 74 20 3d 20 64 62 2d 3e 61       pBt = db->a
11580 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
11590 20 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73   if( pBt==0 || s
115a0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
115b0 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
115c0 20 20 20 20 7a 53 74 61 74 65 20 3d 20 22 63 6c      zState = "cl
115d0 6f 73 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  osed";.      }el
115e0 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66  se if( sqlite3_f
115f0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
11600 69 20 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  i ? db->aDb[i].z
11610 44 62 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20 20  DbSName : 0, .  
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 20 20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f     SQLITE_FCNTL_
11650 4c 4f 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d 3d  LOCKSTATE, &j)==
11660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11670 20 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20 61        zState = a
11680 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20  zLockName[j];.  
11690 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
116a0 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
116b0 28 76 2c 20 31 2c 20 22 73 73 22 2c 20 64 62 2d  (v, 1, "ss", db-
116c0 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
116d0 2c 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 20  , zState);.     
116e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
116f0 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
11700 6f 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d  ow, 1, 2);.    }
11710 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11720 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
11730 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
11740 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4b    case PragTyp_K
11750 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  EY: {.    if( zR
11760 69 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f 6b  ight ) sqlite3_k
11770 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
11780 52 69 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74  Right, sqlite3St
11790 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b  rlen30(zRight));
117a0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
117b0 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 52    case PragTyp_R
117c0 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20  EKEY: {.    if( 
117d0 7a 52 69 67 68 74 20 29 20 73 71 6c 69 74 65 33  zRight ) sqlite3
117e0 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  _rekey_v2(db, zD
117f0 62 2c 20 7a 52 69 67 68 74 2c 20 73 71 6c 69 74  b, zRight, sqlit
11800 65 33 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68  e3Strlen30(zRigh
11810 74 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  t));.    break;.
11820 20 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54    }.  case PragT
11830 79 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20  yp_HEXKEY: {.   
11840 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
11850 20 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20       u8 iByte;. 
11860 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
11870 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b    char zKey[40];
11880 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
11890 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f  iByte=0; i<sizeo
118a0 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c  f(zKey)*2 && sql
118b0 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 52 69  ite3Isxdigit(zRi
118c0 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ght[i]); i++){. 
118d0 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28         iByte = (
118e0 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69  iByte<<4) + sqli
118f0 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67  te3HexToInt(zRig
11900 68 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ht[i]);.        
11910 69 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a  if( (i&1)!=0 ) z
11920 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65  Key[i/2] = iByte
11930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11940 69 66 28 20 28 7a 4c 65 66 74 5b 33 5d 20 26 20  if( (zLeft[3] & 
11950 30 78 66 29 3d 3d 30 78 62 20 29 7b 0a 20 20 20  0xf)==0xb ){.   
11960 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79       sqlite3_key
11970 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65  _v2(db, zDb, zKe
11980 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d  y, i/2);.      }
11990 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
119a0 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64  lite3_rekey_v2(d
119b0 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f  b, zDb, zKey, i/
119c0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
119d0 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
119e0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
119f0 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
11a00 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64  ODEC) || defined
11a10 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
11a20 45 52 4f 44 29 0a 20 20 63 61 73 65 20 50 72 61  EROD).  case Pra
11a30 67 54 79 70 5f 41 43 54 49 56 41 54 45 5f 45 58  gTyp_ACTIVATE_EX
11a40 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a 52  TENSIONS: if( zR
11a50 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53  ight ){.#ifdef S
11a60 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
11a70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
11a80 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  trNICmp(zRight, 
11a90 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b  "see-", 4)==0 ){
11aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61  .      sqlite3_a
11ab0 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69  ctivate_see(&zRi
11ac0 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23  ght[4]);.    }.#
11ad0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
11ae0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44  ITE_ENABLE_CEROD
11af0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11b00 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c  StrNICmp(zRight,
11b10 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30   "cerod-", 6)==0
11b20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11b30 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64  3_activate_cerod
11b40 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20  (&zRight[6]);.  
11b50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
11b60 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a   break;.#endif..
11b70 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68    } /* End of th
11b80 65 20 50 52 41 47 4d 41 20 73 77 69 74 63 68 20  e PRAGMA switch 
11b90 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
11ba0 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 69 73 20  lowing block is 
11bb0 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53  a no-op unless S
11bc0 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
11bd0 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c 79  efined. Its only
11be0 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 69 73  .  ** purpose is
11bf0 20 74 6f 20 65 78 65 63 75 74 65 20 61 73 73 65   to execute asse
11c00 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
11c10 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 69  to verify that i
11c20 66 20 74 68 65 0a 20 20 2a 2a 20 50 72 61 67 46  f the.  ** PragF
11c30 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20 66 6c  lg_NoColumns1 fl
11c40 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
11c50 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  e caller specifi
11c60 65 64 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a 20  ed an argument. 
11c70 20 2a 2a 20 74 6f 20 74 68 65 20 50 52 41 47 4d   ** to the PRAGM
11c80 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  A, the implement
11c90 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 61 64  ation has not ad
11ca0 64 65 64 20 61 6e 79 20 4f 50 5f 52 65 73 75 6c  ded any OP_Resul
11cb0 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e 73 74 72  tRow .  ** instr
11cc0 75 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 56  uctions to the V
11cd0 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  M.  */.  if( (pP
11ce0 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
11cf0 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75  & PragFlg_NoColu
11d00 6d 6e 73 31 29 20 26 26 20 7a 52 69 67 68 74 20  mns1) && zRight 
11d10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
11d20 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74  beVerifyNoResult
11d30 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a 70 72 61  Row(v);.  }..pra
11d40 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  gma_out:.  sqlit
11d50 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4c 65  e3DbFree(db, zLe
11d60 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ft);.  sqlite3Db
11d70 46 72 65 65 28 64 62 2c 20 7a 52 69 67 68 74 29  Free(db, zRight)
11d80 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
11d90 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
11da0 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ABLE./**********
11db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11df0 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ***.** Implement
11e00 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 70 6f 6e  ation of an epon
11e10 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
11e20 62 6c 65 20 74 68 61 74 20 72 75 6e 73 20 61 20  ble that runs a 
11e30 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a 74 79  pragma..**.*/.ty
11e40 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72 61  pedef struct Pra
11e50 67 6d 61 56 74 61 62 20 50 72 61 67 6d 61 56 74  gmaVtab PragmaVt
11e60 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ab;.typedef stru
11e70 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  ct PragmaVtabCur
11e80 73 6f 72 20 50 72 61 67 6d 61 56 74 61 62 43 75  sor PragmaVtabCu
11e90 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 50 72 61  rsor;.struct Pra
11ea0 67 6d 61 56 74 61 62 20 7b 0a 20 20 73 71 6c 69  gmaVtab {.  sqli
11eb0 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20  te3_vtab base;  
11ec0 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c        /* Base cl
11ed0 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69  ass.  Must be fi
11ee0 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rst */.  sqlite3
11ef0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
11f00 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
11f10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
11f20 20 77 68 69 63 68 20 69 74 20 62 65 6c 6f 6e 67   which it belong
11f30 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50 72 61  s */.  const Pra
11f40 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 20  gmaName *pName; 
11f50 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
11f60 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75 38 20 6e  pragma */.  u8 n
11f70 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20  Hidden;         
11f80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11f90 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  of hidden column
11fa0 73 20 2a 2f 0a 20 20 75 38 20 69 48 69 64 64 65  s */.  u8 iHidde
11fb0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
11fc0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
11fd0 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 63 6f   first hidden co
11fe0 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  lumn */.};.struc
11ff0 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73  t PragmaVtabCurs
12000 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  or {.  sqlite3_v
12010 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b  tab_cursor base;
12020 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20   /* Base class. 
12030 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   Must be first *
12040 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
12050 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 20 2f 2a   *pPragma;    /*
12060 20 54 68 65 20 70 72 61 67 6d 61 20 73 74 61 74   The pragma stat
12070 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a  ement to run */.
12080 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
12090 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 43  Rowid;      /* C
120a0 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
120b0 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 32 5d    char *azArg[2]
120c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
120d0 61 6c 75 65 20 6f 66 20 74 68 65 20 61 72 67 75  alue of the argu
120e0 6d 65 6e 74 20 61 6e 64 20 73 63 68 65 6d 61 20  ment and schema 
120f0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 50 72  */.};../* .** Pr
12100 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62  agma virtual tab
12110 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e 65  le module xConne
12120 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  ct method..*/.st
12130 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
12140 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71  tabConnect(.  sq
12150 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
12160 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
12170 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
12180 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
12190 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
121a0 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
121b0 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  zErr.){.  const 
121c0 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72 61  PragmaName *pPra
121d0 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20 50 72 61  gma = (const Pra
121e0 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78 3b 0a 20  gmaName*)pAux;. 
121f0 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
12200 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  b = 0;.  int rc;
12210 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
12220 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a  har cSep = '(';.
12230 20 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b 0a    StrAccum acc;.
12240 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
12250 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
12260 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55  METER(argc);.  U
12270 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12280 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  argv);.  sqlite3
12290 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63  StrAccumInit(&ac
122a0 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a 65  c, 0, zBuf, size
122b0 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20 20  of(zBuf), 0);.  
122c0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
122d0 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22  ppendAll(&acc, "
122e0 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 22 29  CREATE TABLE x")
122f0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70  ;.  for(i=0, j=p
12300 50 72 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61  Pragma->iPragCNa
12310 6d 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e  me; i<pPragma->n
12320 50 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20  PragCName; i++, 
12330 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  j++){.    sqlite
12340 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22  3XPrintf(&acc, "
12350 25 63 5c 22 25 73 5c 22 22 2c 20 63 53 65 70 2c  %c\"%s\"", cSep,
12360 20 70 72 61 67 43 4e 61 6d 65 5b 6a 5d 29 3b 0a   pragCName[j]);.
12370 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a      cSep = ',';.
12380 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d 30 20 29    }.  if( i==0 )
12390 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
123a0 69 6e 74 66 28 26 61 63 63 2c 20 22 28 5c 22 25  intf(&acc, "(\"%
123b0 73 5c 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e 7a  s\"", pPragma->z
123c0 4e 61 6d 65 29 3b 0a 20 20 20 20 63 53 65 70 20  Name);.    cSep 
123d0 3d 20 27 2c 27 3b 0a 20 20 20 20 69 2b 2b 3b 0a  = ',';.    i++;.
123e0 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 69    }.  j = 0;.  i
123f0 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61  f( pPragma->mPra
12400 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52  gFlg & PragFlg_R
12410 65 73 75 6c 74 31 20 29 7b 0a 20 20 20 20 73 71  esult1 ){.    sq
12420 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
12430 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 2c 61  endAll(&acc, ",a
12440 72 67 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20  rg HIDDEN");.   
12450 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   j++;.  }.  if( 
12460 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
12470 67 20 26 20 28 50 72 61 67 46 6c 67 5f 53 63 68  g & (PragFlg_Sch
12480 65 6d 61 4f 70 74 7c 50 72 61 67 46 6c 67 5f 53  emaOpt|PragFlg_S
12490 63 68 65 6d 61 52 65 71 29 20 29 7b 0a 20 20 20  chemaReq) ){.   
124a0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
124b0 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20  AppendAll(&acc, 
124c0 22 2c 73 63 68 65 6d 61 20 48 49 44 44 45 4e 22  ",schema HIDDEN"
124d0 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
124e0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
124f0 6d 41 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29  mAppend(&acc, ")
12500 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 1);.  sqlite3
12510 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
12520 61 63 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20  acc);.  assert( 
12530 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73  strlen(zBuf) < s
12540 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b  izeof(zBuf)-1 );
12550 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
12560 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c  declare_vtab(db,
12570 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63   zBuf);.  if( rc
12580 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12590 20 20 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d     pTab = (Pragm
125a0 61 56 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d  aVtab*)sqlite3_m
125b0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61  alloc(sizeof(Pra
125c0 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69  gmaVtab));.    i
125d0 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
125e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
125f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
12600 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
12610 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Tab, 0, sizeof(P
12620 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20  ragmaVtab));.   
12630 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d     pTab->pName =
12640 20 70 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20   pPragma;.      
12650 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  pTab->db = db;. 
12660 20 20 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64       pTab->iHidd
12670 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54  en = i;.      pT
12680 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b  ab->nHidden = j;
12690 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
126a0 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
126b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
126c0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
126d0 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a  g(db));.  }..  *
126e0 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVtab = (sqlite
126f0 33 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20  3_vtab*)pTab;.  
12700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12710 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74   .** Pragma virt
12720 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
12730 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74   xDisconnect met
12740 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
12750 6e 74 20 70 72 61 67 6d 61 56 74 61 62 44 69 73  nt pragmaVtabDis
12760 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f  connect(sqlite3_
12770 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
12780 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62  PragmaVtab *pTab
12790 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29   = (PragmaVtab*)
127a0 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  pVtab;.  sqlite3
127b0 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72  _free(pTab);.  r
127c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
127d0 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75  .}../* Figure ou
127e0 74 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  t the best index
127f0 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63   to use to searc
12800 68 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75  h a pragma virtu
12810 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
12820 54 68 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65  There are not re
12830 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63  ally any index c
12840 68 6f 69 63 65 73 2e 20 20 42 75 74 20 77 65 20  hoices.  But we 
12850 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67  want to encourag
12860 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70  e the.** query p
12870 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d  lanner to give =
12880 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  = constraints on
12890 20 61 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20   as many hidden 
128a0 70 61 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a  parameters as.**
128b0 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65   possible, and e
128c0 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65  specially on the
128d0 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 70 61   first hidden pa
128e0 72 61 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74  rameter.  So ret
128f0 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f  urn a.** high co
12900 73 74 20 69 66 20 68 69 64 64 65 6e 20 70 61 72  st if hidden par
12910 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f  ameters are unco
12920 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74  nstrained..*/.st
12930 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56  atic int pragmaV
12940 74 61 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c  tabBestIndex(sql
12950 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20  ite3_vtab *tab, 
12960 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12970 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20  fo *pIdxInfo){. 
12980 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
12990 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a  b = (PragmaVtab*
129a0 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74  )tab;.  const st
129b0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
129c0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
129d0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
129e0 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65  t i, j;.  int se
129f0 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e  en[2];..  pIdxIn
12a00 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
12a10 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  t = (double)1;. 
12a20 20 69 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64   if( pTab->nHidd
12a30 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20  en==0 ){ return 
12a40 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70  SQLITE_OK; }.  p
12a50 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
12a60 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
12a70 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20  nt;.  seen[0] = 
12a80 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30  0;.  seen[1] = 0
12a90 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
12aa0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
12ab0 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73  aint; i++, pCons
12ac0 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69  traint++){.    i
12ad0 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  f( pConstraint->
12ae0 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74  usable==0 ) cont
12af0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
12b00 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53  onstraint->op!=S
12b10 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
12b20 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74  TRAINT_EQ ) cont
12b30 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
12b40 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
12b50 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64  mn < pTab->iHidd
12b60 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  en ) continue;. 
12b70 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69     j = pConstrai
12b80 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54  nt->iColumn - pT
12b90 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20  ab->iHidden;.   
12ba0 20 61 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29   assert( j < 2 )
12bb0 3b 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20  ;.    seen[j] = 
12bc0 69 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  i+1;.  }.  if( s
12bd0 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  een[0]==0 ){.   
12be0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
12bf0 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62  atedCost = (doub
12c00 6c 65 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20  le)2147483647;. 
12c10 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
12c20 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34  imatedRows = 214
12c30 37 34 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74  7483647;.    ret
12c40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12c50 20 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d   }.  j = seen[0]
12c60 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  -1;.  pIdxInfo->
12c70 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
12c80 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  [j].argvIndex = 
12c90 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  1;.  pIdxInfo->a
12ca0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
12cb0 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69  j].omit = 1;.  i
12cc0 66 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20  f( seen[1]==0 ) 
12cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12ce0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
12cf0 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64  timatedCost = (d
12d00 6f 75 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78  ouble)20;.  pIdx
12d10 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
12d20 6f 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20  ows = 20;.  j = 
12d30 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64  seen[1]-1;.  pId
12d40 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
12d50 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49  ntUsage[j].argvI
12d60 6e 64 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78  ndex = 2;.  pIdx
12d70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
12d80 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d  tUsage[j].omit =
12d90 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
12da0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72  ITE_OK;.}../* Cr
12db0 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
12dc0 72 20 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61  r for the pragma
12dd0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
12de0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
12df0 67 6d 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69  gmaVtabOpen(sqli
12e00 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
12e10 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
12e20 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
12e30 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
12e40 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43  rsor *pCsr;.  pC
12e50 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
12e60 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f  Cursor*)sqlite3_
12e70 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
12e80 43 73 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73  Csr));.  if( pCs
12e90 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
12ea0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
12eb0 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69  mset(pCsr, 0, si
12ec0 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43  zeof(PragmaVtabC
12ed0 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d  ursor));.  pCsr-
12ee0 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56  >base.pVtab = pV
12ef0 74 61 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72  tab;.  *ppCursor
12f00 20 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a   = &pCsr->base;.
12f10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12f20 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20  OK;.}../* Clear 
12f30 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  all content from
12f40 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
12f50 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f  table cursor. */
12f60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 61  .static void pra
12f70 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
12f80 61 72 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  ar(PragmaVtabCur
12f90 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
12fa0 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  t i;.  sqlite3_f
12fb0 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50  inalize(pCsr->pP
12fc0 72 61 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e  ragma);.  pCsr->
12fd0 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66  pPragma = 0;.  f
12fe0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
12ff0 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29  ize(pCsr->azArg)
13000 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
13010 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61  te3_free(pCsr->a
13020 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43  zArg[i]);.    pC
13030 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30  sr->azArg[i] = 0
13040 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73  ;.  }.}../* Clos
13050 65 20 61 20 70 72 61 67 6d 61 20 76 69 72 74 75  e a pragma virtu
13060 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  al table cursor 
13070 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
13080 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71  agmaVtabClose(sq
13090 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
130a0 72 20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d  r *cur){.  Pragm
130b0 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73  aVtabCursor *pCs
130c0 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43  r = (PragmaVtabC
130d0 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72  ursor*)cur;.  pr
130e0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c  agmaVtabCursorCl
130f0 65 61 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c  ear(pCsr);.  sql
13100 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b  ite3_free(pCsr);
13110 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13120 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e  _OK;.}../* Advan
13130 63 65 20 74 68 65 20 70 72 61 67 6d 61 20 76 69  ce the pragma vi
13140 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
13150 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  or to the next r
13160 6f 77 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ow */.static int
13170 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28   pragmaVtabNext(
13180 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13190 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
131a0 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
131b0 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
131c0 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
131d0 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
131e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
131f0 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  OK;..  /* Increm
13200 65 6e 74 20 74 68 65 20 78 52 6f 77 69 64 20 76  ent the xRowid v
13210 61 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e  alue */.  pCsr->
13220 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65  iRowid++;.  asse
13230 72 74 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d  rt( pCsr->pPragm
13240 61 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  a );.  if( SQLIT
13250 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73  E_ROW!=sqlite3_s
13260 74 65 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d  tep(pCsr->pPragm
13270 61 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  a) ){.    rc = s
13280 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
13290 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a  pCsr->pPragma);.
132a0 20 20 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d      pCsr->pPragm
132b0 61 20 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d  a = 0;.    pragm
132c0 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
132d0 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCsr);.  }.  re
132e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
132f0 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
13300 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
13310 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a  Filter method..*
13320 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13330 67 6d 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20  gmaVtabFilter(. 
13340 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
13350 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
13360 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  r, .  int idxNum
13370 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
13380 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
13390 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
133a0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67  **argv.){.  Prag
133b0 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
133c0 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
133d0 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
133e0 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  sor;.  PragmaVta
133f0 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
13400 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72  aVtab*)(pVtabCur
13410 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69  sor->pVtab);.  i
13420 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
13430 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63  j;.  StrAccum ac
13440 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  c;.  char *zSql;
13450 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
13460 45 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20  ETER(idxNum);.  
13470 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13480 28 69 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67  (idxStr);.  prag
13490 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
134a0 72 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28  r(pCsr);.  j = (
134b0 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72  pTab->pName->mPr
134c0 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
134d0 52 65 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20  Result1)!=0 ? 0 
134e0 3a 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  : 1;.  for(i=0; 
134f0 69 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b  i<argc; i++, j++
13500 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ){.    assert( j
13510 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d  <ArraySize(pCsr-
13520 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20 20 20 70  >azArg) );.    p
13530 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20  Csr->azArg[j] = 
13540 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
13550 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61  "%s", sqlite3_va
13560 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
13570 29 29 3b 0a 20 20 20 20 69 66 28 20 70 43 73 72  ));.    if( pCsr
13580 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 7b  ->azArg[j]==0 ){
13590 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
135a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
135b0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  }.  }.  sqlite3S
135c0 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63  trAccumInit(&acc
135d0 2c 20 30 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  , 0, 0, 0, pTab-
135e0 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
135f0 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e  TE_LIMIT_SQL_LEN
13600 47 54 48 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  GTH]);.  sqlite3
13610 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
13620 6c 28 26 61 63 63 2c 20 22 50 52 41 47 4d 41 20  l(&acc, "PRAGMA 
13630 22 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  ");.  if( pCsr->
13640 61 7a 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20 20  azArg[1] ){.    
13650 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
13660 61 63 63 2c 20 22 25 51 2e 22 2c 20 70 43 73 72  acc, "%Q.", pCsr
13670 2d 3e 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  ->azArg[1]);.  }
13680 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
13690 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63  umAppendAll(&acc
136a0 2c 20 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 7a  , pTab->pName->z
136b0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 43 73  Name);.  if( pCs
136c0 72 2d 3e 61 7a 41 72 67 5b 30 5d 20 29 7b 0a 20  r->azArg[0] ){. 
136d0 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
136e0 66 28 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70  f(&acc, "=%Q", p
136f0 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a  Csr->azArg[0]);.
13700 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c    }.  zSql = sql
13710 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
13720 73 68 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20  sh(&acc);.  if( 
13730 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
13740 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
13750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
13760 65 70 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64  epare_v2(pTab->d
13770 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
13780 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b  sr->pPragma, 0);
13790 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
137a0 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  zSql);.  if( rc!
137b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
137c0 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72    pTab->base.zEr
137d0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
137e0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
137f0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62  ite3_errmsg(pTab
13800 2d 3e 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75  ->db));.    retu
13810 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74  rn rc;.  }.  ret
13820 75 72 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65  urn pragmaVtabNe
13830 78 74 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  xt(pVtabCursor);
13840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61  .}../*.** Pragma
13850 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
13860 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f  odule xEof metho
13870 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
13880 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73   pragmaVtabEof(s
13890 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
138a0 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29  or *pVtabCursor)
138b0 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75  {.  PragmaVtabCu
138c0 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72  rsor *pCsr = (Pr
138d0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29  agmaVtabCursor*)
138e0 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72  pVtabCursor;.  r
138f0 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72  eturn (pCsr->pPr
13900 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20  agma==0);.}../* 
13910 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68  The xColumn meth
13920 6f 64 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  od simply return
13930 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
13940 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  ing column from.
13950 2a 2a 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20  ** the PRAGMA.  
13960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13970 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28  ragmaVtabColumn(
13980 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
13990 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
139a0 73 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  sor, .  sqlite3_
139b0 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20  context *ctx, . 
139c0 20 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67   int i.){.  Prag
139d0 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
139e0 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
139f0 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72  Cursor*)pVtabCur
13a00 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61  sor;.  PragmaVta
13a10 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d  b *pTab = (Pragm
13a20 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75 72  aVtab*)(pVtabCur
13a30 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69  sor->pVtab);.  i
13a40 66 28 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64  f( i<pTab->iHidd
13a50 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
13a60 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
13a70 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  tx, sqlite3_colu
13a80 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70  mn_value(pCsr->p
13a90 50 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d  Pragma, i));.  }
13aa0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
13ab0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
13ac0 78 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69  x, pCsr->azArg[i
13ad0 2d 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c  -pTab->iHidden],
13ae0 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  -1,SQLITE_TRANSI
13af0 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ENT);.  }.  retu
13b00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13b10 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ./* .** Pragma v
13b20 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
13b30 75 6c 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f  ule xRowid metho
13b40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
13b50 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64   pragmaVtabRowid
13b60 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
13b70 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
13b80 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
13b90 2a 70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61  *p){.  PragmaVta
13ba0 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  bCursor *pCsr = 
13bb0 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
13bc0 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r*)pVtabCursor;.
13bd0 20 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f    *p = pCsr->iRo
13be0 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  wid;.  return SQ
13bf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
13c00 68 65 20 70 72 61 67 6d 61 20 76 69 72 74 75 61  he pragma virtua
13c10 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a  l table object *
13c20 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
13c30 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72  qlite3_module pr
13c40 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d  agmaVtabModule =
13c50 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20   {.  0,         
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c70 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
13c80 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72 65  /* xCreate - cre
13cb0 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20  ate a table */. 
13cc0 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65   pragmaVtabConne
13cd0 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
13ce0 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e   xConnect - conn
13cf0 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69  ect to an existi
13d00 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72  ng table */.  pr
13d10 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65  agmaVtabBestInde
13d20 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42  x,         /* xB
13d30 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72  estIndex - Deter
13d40 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74 72 61  mine search stra
13d50 74 65 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61  tegy */.  pragma
13d60 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20  VtabDisconnect, 
13d70 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f         /* xDisco
13d80 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65  nnect - Disconne
13d90 63 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  ct from a table 
13da0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20    /* xDestroy - 
13dd0 44 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a  Drop a table */.
13de0 20 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e    pragmaVtabOpen
13df0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
13e00 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61  * xOpen - open a
13e10 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61   cursor */.  pra
13e20 67 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20  gmaVtabClose,   
13e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
13e40 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75  ose - close a cu
13e50 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61  rsor */.  pragma
13e60 56 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20  VtabFilter,     
13e70 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
13e80 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
13e90 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
13ea0 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65  /.  pragmaVtabNe
13eb0 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
13ec0 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
13ed0 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
13ee0 20 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c    pragmaVtabEof,
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f00 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67  * xEof */.  prag
13f10 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20  maVtabColumn,   
13f20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
13f30 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
13f40 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52  */.  pragmaVtabR
13f50 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
13f60 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
13f70 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20  ad data */.  0, 
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70            /* xUp
13fa0 64 61 74 65 20 2d 20 77 72 69 74 65 20 64 61 74  date - write dat
13fb0 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  a */.  0,       
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20      /* xBegin - 
13fe0 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
13ff0 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73      /* xSync - s
14020 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ync transaction 
14030 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14050 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63    /* xCommit - c
14060 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f  ommit transactio
14070 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
140a0 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e   - rollback tran
140b0 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  saction */.  0, 
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
140e0 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e  ndFunction - fun
140f0 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
14100 67 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  g */.  0,       
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d      /* xRename -
14130 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c   rename the tabl
14140 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e      /* xSavepoin
14170 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20      /* xRelease 
141a0 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141c0 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f    /* xRollbackTo
141d0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68   */.};../*.** Ch
141e0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a 54  eck to see if zT
141f0 61 62 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c 79  abName is really
14200 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 70   the name of a p
14210 72 61 67 6d 61 2e 20 20 49 66 20 69 74 20 69 73  ragma.  If it is
14220 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69 73 74  ,.** then regist
14230 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  er an eponymous 
14240 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f  virtual table fo
14250 72 20 74 68 61 74 20 70 72 61 67 6d 61 20 61 6e  r that pragma an
14260 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  d return.** a po
14270 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 6f 64  inter to the Mod
14280 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ule object for t
14290 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  he new virtual t
142a0 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65 20  able..*/.Module 
142b0 2a 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74  *sqlite3PragmaVt
142c0 61 62 52 65 67 69 73 74 65 72 28 73 71 6c 69 74  abRegister(sqlit
142d0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
142e0 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f  ar *zName){.  co
142f0 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a  nst PragmaName *
14300 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  pName;.  assert(
14310 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
14320 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61  p(zName, "pragma
14330 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  _", 7)==0 );.  p
14340 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f 63  Name = pragmaLoc
14350 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20 20  ate(zName+7);.  
14360 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20 72  if( pName==0 ) r
14370 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
14380 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20  pName->mPragFlg 
14390 26 20 28 50 72 61 67 46 6c 67 5f 52 65 73 75 6c  & (PragFlg_Resul
143a0 74 30 7c 50 72 61 67 46 6c 67 5f 52 65 73 75 6c  t0|PragFlg_Resul
143b0 74 31 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  t1))==0 ) return
143c0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
143d0 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
143e0 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d  b->aModule, zNam
143f0 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  e)==0 );.  retur
14400 6e 20 73 71 6c 69 74 65 33 56 74 61 62 43 72 65  n sqlite3VtabCre
14410 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e  ateModule(db, zN
14420 61 6d 65 2c 20 26 70 72 61 67 6d 61 56 74 61 62  ame, &pragmaVtab
14430 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29 70  Module, (void*)p
14440 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6e  Name, 0);.}..#en
14450 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14460 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
14470 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  */..#endif /* SQ
14480 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41  LITE_OMIT_PRAGMA
14490 20 2a 2f 0a                                       */.