/ Hex Artifact Content
Login

Artifact 09fe2d45a92a16d3dfcab3f18a4992b3bedaacdeed93704cc9dee4b8525717c8:


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 23     break;.  }..#
53f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52  ifdef SQLITE_SER
5400: 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 2f 2a  VER_EDITION.  /*
5410: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5420: 63 68 65 6d 61 2e 5d 66 72 65 65 6c 69 73 74 5f  chema.]freelist_
5430: 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 20 50 52 41  format.  **  PRA
5440: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 66 72 65  GMA [schema.]fre
5450: 65 6c 69 73 74 5f 66 6f 72 6d 61 74 20 3d 20 28  elist_format = (
5460: 31 7c 32 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65  1|2).  */.  case
5470: 20 50 72 61 67 54 79 70 5f 46 52 45 45 4c 49 53   PragTyp_FREELIS
5480: 54 5f 46 4f 52 4d 41 54 3a 20 7b 0a 20 20 20 20  T_FORMAT: {.    
5490: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
54a0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
54b0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56    static const V
54c0: 64 62 65 4f 70 4c 69 73 74 20 66 72 65 65 6c 69  dbeOpList freeli
54d0: 73 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  st[] = {.      {
54e0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
54f0: 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20      0,  0,  0}, 
5500: 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20     /* 0 */.     
5510: 20 7b 20 4f 50 5f 46 72 65 65 6c 69 73 74 46 6d   { OP_FreelistFm
5520: 74 2c 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d  t,    0,  1,  0}
5530: 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20  ,    /* 1 */.   
5540: 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f     { OP_ResultRo
5550: 77 2c 20 20 20 20 20 20 31 2c 20 20 31 2c 20 20  w,      1,  1,  
5560: 30 7d 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20  0}     /* 2 */. 
5570: 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 4f 70     };.    VdbeOp
5580: 20 2a 61 4f 70 3b 0a 20 20 20 20 73 71 6c 69 74   *aOp;.    sqlit
5590: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61  e3VdbeVerifyNoMa
55a0: 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20  llocRequired(v, 
55b0: 41 72 72 61 79 53 69 7a 65 28 66 72 65 65 6c 69  ArraySize(freeli
55c0: 73 74 29 29 3b 0a 20 20 20 20 61 4f 70 20 3d 20  st));.    aOp = 
55d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
55e0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
55f0: 65 28 66 72 65 65 6c 69 73 74 29 2c 20 66 72 65  e(freelist), fre
5600: 65 6c 69 73 74 2c 30 29 3b 0a 20 20 20 20 61 4f  elist,0);.    aO
5610: 70 5b 30 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20  p[0].p1 = iDb;. 
5620: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
5630: 44 62 3b 0a 0a 20 20 20 20 69 66 28 20 7a 52 69  Db;..    if( zRi
5640: 67 68 74 20 26 26 20 28 7a 52 69 67 68 74 5b 30  ght && (zRight[0
5650: 5d 3d 3d 27 31 27 20 7c 7c 20 7a 52 69 67 68 74  ]=='1' || zRight
5660: 5b 30 5d 3d 3d 27 32 27 29 20 26 26 20 7a 52 69  [0]=='2') && zRi
5670: 67 68 74 5b 31 5d 3d 3d 27 5c 30 27 20 29 7b 0a  ght[1]=='\0' ){.
5680: 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 32 20        aOp[0].p2 
5690: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
56a0: 20 20 2f 2a 20 4f 70 65 6e 20 61 20 77 72 69 74    /* Open a writ
56b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e transaction */
56c0: 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33  .      aOp[1].p3
56d0: 20 3d 20 28 69 6e 74 29 28 7a 52 69 67 68 74 5b   = (int)(zRight[
56e0: 30 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 7d  0] - '0');.    }
56f0: 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ..    break;.  }
5700: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
5710: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
5720: 6d 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  ma.]journal_size
5730: 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 50 52 41  _limit.  **  PRA
5740: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75  GMA [schema.]jou
5750: 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 3d  rnal_size_limit=
5760: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 74 20  N.  **.  ** Get 
5770: 6f 72 20 73 65 74 20 74 68 65 20 73 69 7a 65 20  or set the size 
5780: 6c 69 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62 61 63  limit on rollbac
5790: 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  k journal files.
57a0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
57b0: 67 54 79 70 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  gTyp_JOURNAL_SIZ
57c0: 45 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 50  E_LIMIT: {.    P
57d0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
57e0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
57f0: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
5800: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 2d 32 3b  i64 iLimit = -2;
5810: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
5820: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5830: 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
5840: 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 3b 0a  ight, &iLimit);.
5850: 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74        if( iLimit
5860: 3c 2d 31 20 29 20 69 4c 69 6d 69 74 20 3d 20 2d  <-1 ) iLimit = -
5870: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 69  1;.    }.    iLi
5880: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  mit = sqlite3Pag
5890: 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  erJournalSizeLim
58a0: 69 74 28 70 50 61 67 65 72 2c 20 69 4c 69 6d 69  it(pPager, iLimi
58b0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69  t);.    returnSi
58c0: 6e 67 6c 65 49 6e 74 28 76 2c 20 69 4c 69 6d 69  ngleInt(v, iLimi
58d0: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
58e0: 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   }..#endif /* SQ
58f0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
5900: 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a  PRAGMAS */..  /*
5910: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73  .  **  PRAGMA [s
5920: 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61 63 75  chema.]auto_vacu
5930: 75 6d 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  um.  **  PRAGMA 
5940: 5b 73 63 68 65 6d 61 2e 5d 61 75 74 6f 5f 76 61  [schema.]auto_va
5950: 63 75 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  cuum=N.  **.  **
5960: 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20   Get or set the 
5970: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
5980: 61 62 61 73 65 20 27 61 75 74 6f 2d 76 61 63 75  abase 'auto-vacu
5990: 75 6d 27 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  um' parameter.. 
59a0: 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73   ** The value is
59b0: 20 6f 6e 65 20 6f 66 3a 20 20 30 20 4e 4f 4e 45   one of:  0 NONE
59c0: 20 31 20 46 55 4c 4c 20 32 20 49 4e 43 52 45 4d   1 FULL 2 INCREM
59d0: 45 4e 54 41 4c 0a 20 20 2a 2f 0a 23 69 66 6e 64  ENTAL.  */.#ifnd
59e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
59f0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 63 61 73 65  UTOVACUUM.  case
5a00: 20 50 72 61 67 54 79 70 5f 41 55 54 4f 5f 56 41   PragTyp_AUTO_VA
5a10: 43 55 55 4d 3a 20 7b 0a 20 20 20 20 42 74 72 65  CUUM: {.    Btre
5a20: 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42  e *pBt = pDb->pB
5a30: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
5a40: 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  Bt!=0 );.    if(
5a50: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
5a60: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
5a70: 74 28 76 2c 20 73 71 6c 69 74 65 33 42 74 72 65  t(v, sqlite3Btre
5a80: 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70  eGetAutoVacuum(p
5a90: 42 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Bt));.    }else{
5aa0: 0a 20 20 20 20 20 20 69 6e 74 20 65 41 75 74 6f  .      int eAuto
5ab0: 20 3d 20 67 65 74 41 75 74 6f 56 61 63 75 75 6d   = getAutoVacuum
5ac0: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
5ad0: 61 73 73 65 72 74 28 20 65 41 75 74 6f 3e 3d 30  assert( eAuto>=0
5ae0: 20 26 26 20 65 41 75 74 6f 3c 3d 32 20 29 3b 0a   && eAuto<=2 );.
5af0: 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 41 75        db->nextAu
5b00: 74 6f 76 61 63 20 3d 20 28 75 38 29 65 41 75 74  tovac = (u8)eAut
5b10: 6f 3b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c  o;.      /* Call
5b20: 20 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 29   SetAutoVacuum()
5b30: 20 74 6f 20 73 65 74 20 69 6e 69 74 69 61 6c 69   to set initiali
5b40: 7a 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ze the internal 
5b50: 61 75 74 6f 20 61 6e 64 0a 20 20 20 20 20 20 2a  auto and.      *
5b60: 2a 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 66 6c  * incr-vacuum fl
5b70: 61 67 73 2e 20 54 68 69 73 20 69 73 20 72 65 71  ags. This is req
5b80: 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68  uired in case th
5b90: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  is connection.  
5ba0: 20 20 20 20 2a 2a 20 63 72 65 61 74 65 73 20 74      ** creates t
5bb0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5bc0: 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  . It is importan
5bd0: 74 20 74 68 61 74 20 69 74 20 69 73 20 63 72 65  t that it is cre
5be0: 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73  ated.      ** as
5bf0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
5c00: 63 61 70 61 62 6c 65 20 64 62 2e 0a 20 20 20 20  capable db..    
5c10: 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
5c20: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
5c30: 75 74 6f 56 61 63 75 75 6d 28 70 42 74 2c 20 65  utoVacuum(pBt, e
5c40: 41 75 74 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Auto);.      if(
5c50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5c60: 26 20 28 65 41 75 74 6f 3d 3d 31 20 7c 7c 20 65  & (eAuto==1 || e
5c70: 41 75 74 6f 3d 3d 32 29 20 29 7b 0a 20 20 20 20  Auto==2) ){.    
5c80: 20 20 20 20 2f 2a 20 57 68 65 6e 20 73 65 74 74      /* When sett
5c90: 69 6e 67 20 74 68 65 20 61 75 74 6f 5f 76 61 63  ing the auto_vac
5ca0: 75 75 6d 20 6d 6f 64 65 20 74 6f 20 65 69 74 68  uum mode to eith
5cb0: 65 72 20 22 66 75 6c 6c 22 20 6f 72 20 0a 20 20  er "full" or .  
5cc0: 20 20 20 20 20 20 2a 2a 20 22 69 6e 63 72 65 6d        ** "increm
5cd0: 65 6e 74 61 6c 22 2c 20 77 72 69 74 65 20 74 68  ental", write th
5ce0: 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b  e value of meta[
5cf0: 36 5d 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  6] in the databa
5d00: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  se.        ** fi
5d10: 6c 65 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  le. Before writi
5d20: 6e 67 20 74 6f 20 6d 65 74 61 5b 36 5d 2c 20 63  ng to meta[6], c
5d30: 68 65 63 6b 20 74 68 61 74 20 6d 65 74 61 5b 33  heck that meta[3
5d40: 5d 20 69 6e 64 69 63 61 74 65 73 0a 20 20 20 20  ] indicates.    
5d50: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
5d60: 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 75   really is an au
5d70: 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
5d80: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
5d90: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
5da0: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
5db0: 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45  iLn = VDBE_OFFSE
5dc0: 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20  T_LINENO(2);.   
5dd0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5de0: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74  t VdbeOpList set
5df0: 4d 65 74 61 36 5b 5d 20 3d 20 7b 0a 20 20 20 20  Meta6[] = {.    
5e00: 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73        { OP_Trans
5e10: 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 20  action,    0,   
5e20: 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20 20        1,        
5e30: 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20           0},    
5e40: 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 0 */.        
5e50: 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69    { OP_ReadCooki
5e60: 65 2c 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  e,     0,       
5e70: 20 20 31 2c 20 20 20 20 20 20 20 20 20 42 54 52    1,         BTR
5e80: 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f  EE_LARGEST_ROOT_
5e90: 50 41 47 45 7d 2c 0a 20 20 20 20 20 20 20 20 20  PAGE},.         
5ea0: 20 7b 20 4f 50 5f 49 66 2c 20 20 20 20 20 20 20   { OP_If,       
5eb0: 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20 20        1,        
5ec0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
5ed0: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20      0},    /* 2 
5ee0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f  */.          { O
5ef0: 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 20 20  P_Halt,         
5f00: 20 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f    SQLITE_OK, OE_
5f10: 41 62 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20  Abort,          
5f20: 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20  0},    /* 3 */. 
5f30: 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65           { OP_Se
5f40: 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c  tCookie,      0,
5f50: 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 49           BTREE_I
5f60: 4e 43 52 5f 56 41 43 55 55 4d 2c 20 30 7d 2c 20  NCR_VACUUM, 0}, 
5f70: 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20     /* 4 */.     
5f80: 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 56 64     };.        Vd
5f90: 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 20  beOp *aOp;.     
5fa0: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
5fb0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5fc0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
5fd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72    sqlite3VdbeVer
5fe0: 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69  ifyNoMallocRequi
5ff0: 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a 65  red(v, ArraySize
6000: 28 73 65 74 4d 65 74 61 36 29 29 3b 0a 20 20 20  (setMeta6));.   
6010: 20 20 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74       aOp = sqlit
6020: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
6030: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65 74  v, ArraySize(set
6040: 4d 65 74 61 36 29 2c 20 73 65 74 4d 65 74 61 36  Meta6), setMeta6
6050: 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 20 20 20 20  , iLn);.        
6060: 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52 45 41 4c  if( ONLY_IF_REAL
6070: 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f 70 3d 3d  LOC_STRESS(aOp==
6080: 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  0) ) break;.    
6090: 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20      aOp[0].p1 = 
60a0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70  iDb;.        aOp
60b0: 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20  [1].p1 = iDb;.  
60c0: 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 32 20        aOp[2].p2 
60d0: 3d 20 69 41 64 64 72 2b 34 3b 0a 20 20 20 20 20  = iAddr+4;.     
60e0: 20 20 20 61 4f 70 5b 34 5d 2e 70 31 20 3d 20 69     aOp[4].p1 = i
60f0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
6100: 34 5d 2e 70 33 20 3d 20 65 41 75 74 6f 20 2d 20  4].p3 = eAuto - 
6110: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
6120: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
6130: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  v, iDb);.      }
6140: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6150: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
6160: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
6170: 5b 73 63 68 65 6d 61 2e 5d 69 6e 63 72 65 6d 65  [schema.]increme
6180: 6e 74 61 6c 5f 76 61 63 75 75 6d 28 4e 29 0a 20  ntal_vacuum(N). 
6190: 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20 73 74   **.  ** Do N st
61a0: 65 70 73 20 6f 66 20 69 6e 63 72 65 6d 65 6e 74  eps of increment
61b0: 61 6c 20 76 61 63 75 75 6d 69 6e 67 20 6f 6e 20  al vacuuming on 
61c0: 61 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  a database..  */
61d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
61e0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
61f0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 49    case PragTyp_I
6200: 4e 43 52 45 4d 45 4e 54 41 4c 5f 56 41 43 55 55  NCREMENTAL_VACUU
6210: 4d 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 4c 69  M: {.    int iLi
6220: 6d 69 74 2c 20 61 64 64 72 3b 0a 20 20 20 20 69  mit, addr;.    i
6230: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  f( zRight==0 || 
6240: 21 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32  !sqlite3GetInt32
6250: 28 7a 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74  (zRight, &iLimit
6260: 29 20 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30 20 29  ) || iLimit<=0 )
6270: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
6280: 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
6290: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65   }.    sqlite3Be
62a0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
62b0: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
62c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
62d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
62e0: 6e 74 65 67 65 72 2c 20 69 4c 69 6d 69 74 2c 20  nteger, iLimit, 
62f0: 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  1);.    addr = s
6300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
6310: 28 76 2c 20 4f 50 5f 49 6e 63 72 56 61 63 75 75  (v, OP_IncrVacuu
6320: 6d 2c 20 69 44 62 29 3b 20 56 64 62 65 43 6f 76  m, iDb); VdbeCov
6330: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
6340: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
6350: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
6360: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
6370: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6380: 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b  _AddImm, 1, -1);
6390: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
63a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
63b0: 6f 73 2c 20 31 2c 20 61 64 64 72 29 3b 20 56 64  os, 1, addr); Vd
63c0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
63d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
63e0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
63f0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6400: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6410: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
6420: 52 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20  R_PRAGMAS.  /*. 
6430: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68   **  PRAGMA [sch
6440: 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65 0a  ema.]cache_size.
6450: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
6460: 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 69 7a 65  hema.]cache_size
6470: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  =N.  **.  ** The
6480: 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f   first form repo
6490: 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rts the current 
64a0: 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f  local setting fo
64b0: 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  r the.  ** page 
64c0: 63 61 63 68 65 20 73 69 7a 65 2e 20 54 68 65 20  cache size. The 
64d0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73  second form sets
64e0: 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20   the local.  ** 
64f0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
6500: 76 61 6c 75 65 2e 20 20 49 66 20 4e 20 69 73 20  value.  If N is 
6510: 70 6f 73 69 74 69 76 65 20 74 68 65 6e 20 74 68  positive then th
6520: 61 74 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e  at is the.  ** n
6530: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
6540: 6e 20 74 68 65 20 63 61 63 68 65 2e 20 20 49 66  n the cache.  If
6550: 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20   N is negative, 
6560: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6e 75  then the.  ** nu
6570: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 73  mber of pages is
6580: 20 61 64 6a 75 73 74 65 64 20 73 6f 20 74 68 61   adjusted so tha
6590: 74 20 74 68 65 20 63 61 63 68 65 20 75 73 65 73  t the cache uses
65a0: 20 2d 4e 20 6b 69 62 69 62 79 74 65 73 0a 20 20   -N kibibytes.  
65b0: 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20 20  ** of memory..  
65c0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
65d0: 70 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a  p_CACHE_SIZE: {.
65e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
65f0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
6600: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
6610: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
6620: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
6630: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44  nSingleInt(v, pD
6640: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68  b->pSchema->cach
6650: 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  e_size);.    }el
6660: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  se{.      int si
6670: 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69  ze = sqlite3Atoi
6680: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
6690: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
66a0: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
66b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
66c0: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
66d0: 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70  pDb->pBt, pDb->p
66e0: 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69  Schema->cache_si
66f0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ze);.    }.    b
6700: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
6710: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
6720: 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73 70 69 6c  hema.]cache_spil
6730: 6c 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63  l.  **  PRAGMA c
6740: 61 63 68 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45  ache_spill=BOOLE
6750: 41 4e 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  AN.  **  PRAGMA 
6760: 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65 5f 73  [schema.]cache_s
6770: 70 69 6c 6c 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  pill=N.  **.  **
6780: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
6790: 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72  reports the curr
67a0: 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e  ent local settin
67b0: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  g for the.  ** p
67c0: 61 67 65 20 63 61 63 68 65 20 73 70 69 6c 6c 20  age cache spill 
67d0: 73 69 7a 65 2e 20 54 68 65 20 73 65 63 6f 6e 64  size. The second
67e0: 20 66 6f 72 6d 20 74 75 72 6e 73 20 63 61 63 68   form turns cach
67f0: 65 20 73 70 69 6c 6c 20 6f 6e 0a 20 20 2a 2a 20  e spill on.  ** 
6800: 6f 72 20 6f 66 66 2e 20 20 57 68 65 6e 20 74 75  or off.  When tu
6810: 72 6e 6e 69 6e 67 20 63 61 63 68 65 20 73 70 69  rnning cache spi
6820: 6c 6c 20 6f 6e 2c 20 74 68 65 20 73 69 7a 65 20  ll on, the size 
6830: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
6840: 2a 2a 20 63 75 72 72 65 6e 74 20 63 61 63 68 65  ** current cache
6850: 5f 73 69 7a 65 2e 20 20 54 68 65 20 74 68 69 72  _size.  The thir
6860: 64 20 66 6f 72 6d 20 73 65 74 73 20 61 20 73 70  d form sets a sp
6870: 69 6c 6c 20 73 69 7a 65 20 74 68 61 74 0a 20 20  ill size that.  
6880: 2a 2a 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ** may be differ
6890: 65 6e 74 20 66 6f 72 6d 20 74 68 65 20 63 61 63  ent form the cac
68a0: 68 65 20 73 69 7a 65 2e 0a 20 20 2a 2a 20 49 66  he size..  ** If
68b0: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
68c0: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
68d0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
68e0: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
68f0: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
6900: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
6910: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
6920: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
6930: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
6940: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
6950: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
6960: 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ry..  **.  ** If
6970: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
6980: 61 63 68 65 5f 73 70 69 6c 6c 20 70 61 67 65 73  ache_spill pages
6990: 20 69 73 20 6c 65 73 73 20 74 68 65 6e 20 74 68   is less then th
69a0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
69b0: 20 63 61 63 68 65 5f 73 69 7a 65 20 70 61 67 65   cache_size page
69c0: 73 2c 20 6e 6f 20 73 70 69 6c 6c 69 6e 67 20 6f  s, no spilling o
69d0: 63 63 75 72 73 20 75 6e 74 69 6c 20 74 68 65 20  ccurs until the 
69e0: 70 61 67 65 20 63 6f 75 6e 74 20 65 78 63 65 65  page count excee
69f0: 64 73 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  ds.  ** the numb
6a00: 65 72 20 6f 66 20 63 61 63 68 65 5f 73 69 7a 65  er of cache_size
6a10: 20 70 61 67 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a   pages..  **.  *
6a20: 2a 20 54 68 65 20 63 61 63 68 65 5f 73 70 69 6c  * The cache_spil
6a30: 6c 3d 42 4f 4f 4c 45 41 4e 20 73 65 74 74 69 6e  l=BOOLEAN settin
6a40: 67 20 61 70 70 6c 69 65 73 20 74 6f 20 61 6c 6c  g applies to all
6a50: 20 61 74 74 61 63 68 65 64 20 73 63 68 65 6d 61   attached schema
6a60: 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 6a 75 73 74  s,.  ** not just
6a70: 20 74 68 65 20 73 63 68 65 6d 61 20 73 70 65 63   the schema spec
6a80: 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ified..  */.  ca
6a90: 73 65 20 50 72 61 67 54 79 70 5f 43 41 43 48 45  se PragTyp_CACHE
6aa0: 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 61 73  _SPILL: {.    as
6ab0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
6ac0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
6ad0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
6ae0: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
6af0: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
6b00: 65 49 6e 74 28 76 2c 0a 20 20 20 20 20 20 20 20  eInt(v,.        
6b10: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
6b20: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 29  LITE_CacheSpill)
6b30: 3d 3d 30 20 3f 20 30 20 3a 20 0a 20 20 20 20 20  ==0 ? 0 : .     
6b40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6b50: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
6b60: 70 44 62 2d 3e 70 42 74 2c 30 29 29 3b 0a 20 20  pDb->pBt,0));.  
6b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
6b80: 6e 74 20 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20  nt size = 1;.   
6b90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
6ba0: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
6bb0: 73 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20  size) ){.       
6bc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
6bd0: 53 70 69 6c 6c 53 69 7a 65 28 70 44 62 2d 3e 70  SpillSize(pDb->p
6be0: 42 74 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20  Bt, size);.     
6bf0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
6c00: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
6c10: 52 69 67 68 74 2c 20 73 69 7a 65 21 3d 30 29 20  Right, size!=0) 
6c20: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66  ){.        db->f
6c30: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43  lags |= SQLITE_C
6c40: 61 63 68 65 53 70 69 6c 6c 3b 0a 20 20 20 20 20  acheSpill;.     
6c50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6c60: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
6c70: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6c80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
6c90: 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28  etAllPagerFlags(
6ca0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  db);.    }.    b
6cb0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
6cc0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63    **  PRAGMA [sc
6cd0: 68 65 6d 61 2e 5d 6d 6d 61 70 5f 73 69 7a 65 28  hema.]mmap_size(
6ce0: 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  N).  **.  ** Use
6cf0: 64 20 74 6f 20 73 65 74 20 6d 61 70 70 69 6e 67  d to set mapping
6d00: 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20 54 68 65   size limit. The
6d10: 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69   mapping size li
6d20: 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75 73 65 64  mit is.  ** used
6d30: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 61 67   to limit the ag
6d40: 67 72 65 67 61 74 65 20 73 69 7a 65 20 6f 66 20  gregate size of 
6d50: 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  all memory mappe
6d60: 64 20 72 65 67 69 6f 6e 73 20 6f 66 20 74 68 65  d regions of the
6d70: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
6d80: 69 6c 65 2e 20 49 66 20 74 68 69 73 20 70 61 72  ile. If this par
6d90: 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
6da0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d 65 6d 6f   zero, then memo
6db0: 72 79 20 6d 61 70 70 69 6e 67 0a 20 20 2a 2a 20  ry mapping.  ** 
6dc0: 69 73 20 6e 6f 74 20 75 73 65 64 20 61 74 20 61  is not used at a
6dd0: 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67  ll.  If N is neg
6de0: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
6df0: 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 6d  default memory m
6e00: 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 64 65  ap.  ** limit de
6e10: 74 65 72 6d 69 6e 65 64 20 62 79 20 73 71 6c 69  termined by sqli
6e20: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
6e30: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
6e40: 5a 45 29 20 69 73 20 73 65 74 2e 0a 20 20 2a 2a  ZE) is set..  **
6e50: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 4e   The parameter N
6e60: 20 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20   is measured in 
6e70: 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  bytes..  **.  **
6e80: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 61   This value is a
6e90: 64 76 69 73 6f 72 79 2e 20 20 54 68 65 20 75 6e  dvisory.  The un
6ea0: 64 65 72 6c 79 69 6e 67 20 56 46 53 20 69 73 20  derlying VFS is 
6eb0: 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72 79 20 6d  free to memory m
6ec0: 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69 74 74 6c  ap.  ** as littl
6ed0: 65 20 6f 72 20 61 73 20 6d 75 63 68 20 61 73 20  e or as much as 
6ee0: 69 74 20 77 61 6e 74 73 2e 20 20 45 78 63 65 70  it wants.  Excep
6ef0: 74 2c 20 69 66 20 4e 20 69 73 20 73 65 74 20 74  t, if N is set t
6f00: 6f 20 30 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  o 0 then the.  *
6f10: 2a 20 75 70 70 65 72 20 6c 61 79 65 72 73 20 77  * upper layers w
6f20: 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65  ill never invoke
6f30: 20 74 68 65 20 78 46 65 74 63 68 20 69 6e 74 65   the xFetch inte
6f40: 72 66 61 63 65 73 20 74 6f 20 74 68 65 20 56 46  rfaces to the VF
6f50: 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  S..  */.  case P
6f60: 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53 49 5a 45  ragTyp_MMAP_SIZE
6f70: 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
6f80: 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66 20 53 51  int64 sz;.#if SQ
6f90: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
6fa0: 5a 45 3e 30 0a 20 20 20 20 61 73 73 65 72 74 28  ZE>0.    assert(
6fb0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
6fc0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
6fd0: 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a   0) );.    if( z
6fe0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69  Right ){.      i
6ff0: 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 73 71 6c  nt ii;.      sql
7000: 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
7010: 34 28 7a 52 69 67 68 74 2c 20 26 73 7a 29 3b 0a  4(zRight, &sz);.
7020: 20 20 20 20 20 20 69 66 28 20 73 7a 3c 30 20 29        if( sz<0 )
7030: 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f   sz = sqlite3Glo
7040: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
7050: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32  ;.      if( pId2
7060: 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e 73 7a 4d  ->n==0 ) db->szM
7070: 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  map = sz;.      
7080: 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62 2d 31  for(ii=db->nDb-1
7090: 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a  ; ii>=0; ii--){.
70a0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
70b0: 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28  aDb[ii].pBt && (
70c0: 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d  ii==iDb || pId2-
70d0: 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  >n==0) ){.      
70e0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
70f0: 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 64 62 2d  SetMmapLimit(db-
7100: 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 73 7a  >aDb[ii].pBt, sz
7110: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7120: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
7130: 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72 63 20 3d  z = -1;.    rc =
7140: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
7150: 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53  ntrol(db, zDb, S
7160: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
7170: 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 23 65 6c  _SIZE, &sz);.#el
7180: 73 65 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20  se.    sz = 0;. 
7190: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
71a0: 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  K;.#endif.    if
71b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
71c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
71d0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 7a 29 3b  ingleInt(v, sz);
71e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
71f0: 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c!=SQLITE_NOTFOU
7200: 4e 44 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  ND ){.      pPar
7210: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
7220: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
7230: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  c;.    }.    bre
7240: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
7250: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
7260: 5f 73 74 6f 72 65 0a 20 20 2a 2a 20 20 20 50 52  _store.  **   PR
7270: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20  AGMA temp_store 
7280: 3d 20 22 64 65 66 61 75 6c 74 22 7c 22 6d 65 6d  = "default"|"mem
7290: 6f 72 79 22 7c 22 66 69 6c 65 22 0a 20 20 2a 2a  ory"|"file".  **
72a0: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20  .  ** Return or 
72b0: 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61  set the local va
72c0: 6c 75 65 20 6f 66 20 74 68 65 20 74 65 6d 70 5f  lue of the temp_
72d0: 73 74 6f 72 65 20 66 6c 61 67 2e 20 20 43 68 61  store flag.  Cha
72e0: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c  nging.  ** the l
72f0: 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20  ocal value does 
7300: 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73  not make changes
7310: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c   to the disk fil
7320: 65 20 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c  e and the defaul
7330: 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20 77 69 6c  t.  ** value wil
7340: 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 68  l be restored th
7350: 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
7360: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
7370: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ed..  **.  ** No
7380: 74 65 20 74 68 61 74 20 69 74 20 69 73 20 70 6f  te that it is po
7390: 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 6c  ssible for the l
73a0: 69 62 72 61 72 79 20 63 6f 6d 70 69 6c 65 2d 74  ibrary compile-t
73b0: 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 6f 0a 20  ime options to. 
73c0: 20 2a 2a 20 6f 76 65 72 72 69 64 65 20 74 68 69   ** override thi
73d0: 73 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  s setting.  */. 
73e0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 45   case PragTyp_TE
73f0: 4d 50 5f 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20  MP_STORE: {.    
7400: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
7410: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
7420: 65 49 6e 74 28 76 2c 20 64 62 2d 3e 74 65 6d 70  eInt(v, db->temp
7430: 5f 73 74 6f 72 65 29 3b 0a 20 20 20 20 7d 65 6c  _store);.    }el
7440: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  se{.      change
7450: 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50 61 72  TempStorage(pPar
7460: 73 65 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20  se, zRight);.   
7470: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
7480: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  }..  /*.  **   P
7490: 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
74a0: 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20  _directory.  ** 
74b0: 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74    PRAGMA temp_st
74c0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
74d0: 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61  ""|"directory_na
74e0: 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  me".  **.  ** Re
74f0: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
7500: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
7510: 68 65 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  he temp_store_di
7520: 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43  rectory flag.  C
7530: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7540: 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70   value sets a sp
7550: 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72 79  ecific directory
7560: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
7570: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
7580: 0a 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 74 6f  .  ** Setting to
7590: 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72   a null string r
75a0: 65 76 65 72 74 73 20 74 6f 20 74 68 65 20 64 65  everts to the de
75b0: 66 61 75 6c 74 20 74 65 6d 70 6f 72 61 72 79 20  fault temporary 
75c0: 64 69 72 65 63 74 6f 72 79 20 73 65 61 72 63 68  directory search
75d0: 2e 0a 20 20 2a 2a 20 49 66 20 74 65 6d 70 6f 72  ..  ** If tempor
75e0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 69 73  ary directory is
75f0: 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 69   changed, then i
7600: 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f  nvalidateTempSto
7610: 72 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a  rage..  **.  */.
7620: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 54    case PragTyp_T
7630: 45 4d 50 5f 53 54 4f 52 45 5f 44 49 52 45 43 54  EMP_STORE_DIRECT
7640: 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ORY: {.    if( !
7650: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7660: 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74  returnSingleText
7670: 28 76 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  (v, sqlite3_temp
7680: 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
7690: 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20   }else{.#ifndef 
76a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
76b0: 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74        if( zRight
76c0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  [0] ){.        i
76d0: 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20  nt res;.        
76e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
76f0: 63 65 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a  cess(db->pVfs, z
7700: 52 69 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43  Right, SQLITE_AC
7710: 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20  CESS_READWRITE, 
7720: 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
7730: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7740: 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20   || res==0 ){.  
7750: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7760: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7770: 22 6e 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20  "not a writable 
7780: 64 69 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20  directory");.   
7790: 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67         goto prag
77a0: 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ma_out;.        
77b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
77c0: 69 66 28 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  if( SQLITE_TEMP_
77d0: 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20 20 20 20  STORE==0.       
77e0: 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  || (SQLITE_TEMP_
77f0: 53 54 4f 52 45 3d 3d 31 20 26 26 20 64 62 2d 3e  STORE==1 && db->
7800: 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31 29 0a 20  temp_store<=1). 
7810: 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45        || (SQLITE
7820: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 20 26  _TEMP_STORE==2 &
7830: 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  & db->temp_store
7840: 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ==1).      ){.  
7850: 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
7860: 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50 61 72  TempStorage(pPar
7870: 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
7880: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7890: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
78a0: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 69  ectory);.      i
78b0: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
78c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
78d0: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
78e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
78f0: 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a  ("%s", zRight);.
7900: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7910: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d       sqlite3_tem
7920: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
7930: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
7940: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
7950: 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  SD */.    }.    
7960: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66 20  break;.  }..#if 
7970: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
7980: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
7990: 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
79a0: 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52 41  ctory.  **   PRA
79b0: 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  GMA data_store_d
79c0: 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22 64  irectory = ""|"d
79d0: 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a 20  irectory_name". 
79e0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
79f0: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
7a00: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
7a10: 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  ta_store_directo
7a20: 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69  ry flag.  Changi
7a30: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  ng.  ** the valu
7a40: 65 20 73 65 74 73 20 61 20 73 70 65 63 69 66 69  e sets a specifi
7a50: 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 62  c directory to b
7a60: 65 20 75 73 65 64 20 66 6f 72 20 64 61 74 61 62  e used for datab
7a70: 61 73 65 20 66 69 6c 65 73 20 74 68 61 74 0a 20  ase files that. 
7a80: 20 2a 2a 20 77 65 72 65 20 73 70 65 63 69 66 69   ** were specifi
7a90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
7aa0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 53 65  ve pathname.  Se
7ab0: 74 74 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20  tting to a null 
7ac0: 73 74 72 69 6e 67 20 72 65 76 65 72 74 73 0a 20  string reverts. 
7ad0: 20 2a 2a 20 74 6f 20 74 68 65 20 64 65 66 61 75   ** to the defau
7ae0: 6c 74 20 64 61 74 61 62 61 73 65 20 64 69 72 65  lt database dire
7af0: 63 74 6f 72 79 2c 20 77 68 69 63 68 20 66 6f 72  ctory, which for
7b00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
7b10: 73 70 65 63 69 66 69 65 64 20 77 69 74 68 0a 20  specified with. 
7b20: 20 2a 2a 20 61 20 72 65 6c 61 74 69 76 65 20 70   ** a relative p
7b30: 61 74 68 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ath will probabl
7b40: 79 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  y be based on th
7b50: 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74  e current direct
7b60: 6f 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ory for the.  **
7b70: 20 70 72 6f 63 65 73 73 2e 20 20 44 61 74 61 62   process.  Datab
7b80: 61 73 65 20 66 69 6c 65 20 73 70 65 63 69 66 69  ase file specifi
7b90: 65 64 20 77 69 74 68 20 61 6e 20 61 62 73 6f 6c  ed with an absol
7ba0: 75 74 65 20 70 61 74 68 20 61 72 65 20 6e 6f 74  ute path are not
7bb0: 20 69 6d 70 61 63 74 65 64 0a 20 20 2a 2a 20 62   impacted.  ** b
7bc0: 79 20 74 68 69 73 20 73 65 74 74 69 6e 67 2c 20  y this setting, 
7bd0: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 69 74  regardless of it
7be0: 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20  s value..  **.  
7bf0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
7c00: 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f 44 49 52  p_DATA_STORE_DIR
7c10: 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69 66  ECTORY: {.    if
7c20: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
7c30: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54     returnSingleT
7c40: 65 78 74 28 76 2c 20 73 71 6c 69 74 65 33 5f 64  ext(v, sqlite3_d
7c50: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  ata_directory);.
7c60: 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64      }else{.#ifnd
7c70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
7c80: 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  SD.      if( zRi
7c90: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
7ca0: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
7cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7cc0: 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73  sAccess(db->pVfs
7cd0: 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45  , zRight, SQLITE
7ce0: 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
7cf0: 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  E, &res);.      
7d00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7d10: 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b  _OK || res==0 ){
7d20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7d30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7d40: 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62  e, "not a writab
7d50: 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a  le directory");.
7d60: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
7d70: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20  ragma_out;.     
7d80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7d90: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7da0: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
7db0: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 69  ectory);.      i
7dc0: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
7dd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7de0: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
7df0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
7e00: 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a  ("%s", zRight);.
7e10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7e20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
7e30: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
7e40: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
7e50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
7e60: 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  SD */.    }.    
7e70: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
7e80: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  f..#if SQLITE_EN
7e90: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
7ea0: 4c 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  LE.  /*.  **   P
7eb0: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c  RAGMA [schema.]l
7ec0: 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 20  ock_proxy_file. 
7ed0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
7ee0: 68 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  hema.]lock_proxy
7ef0: 5f 66 69 6c 65 20 3d 20 22 3a 61 75 74 6f 3a 22  _file = ":auto:"
7f00: 7c 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70 61 74 68  |"lock_file_path
7f10: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
7f20: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 76 61  rn or set the va
7f30: 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 5f  lue of the lock_
7f40: 70 72 6f 78 79 5f 66 69 6c 65 20 66 6c 61 67 2e  proxy_file flag.
7f50: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
7f60: 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61  the value sets a
7f70: 20 73 70 65 63 69 66 69 63 20 66 69 6c 65 20 74   specific file t
7f80: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61  o be used for da
7f90: 74 61 62 61 73 65 20 61 63 63 65 73 73 20 6c 6f  tabase access lo
7fa0: 63 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20  cks..  **.  */. 
7fb0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4c 4f   case PragTyp_LO
7fc0: 43 4b 5f 50 52 4f 58 59 5f 46 49 4c 45 3a 20 7b  CK_PROXY_FILE: {
7fd0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
7fe0: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
7ff0: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
8000: 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62 2d  3BtreePager(pDb-
8010: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 63 68 61  >pBt);.      cha
8020: 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61  r *proxy_file_pa
8030: 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  th = NULL;.     
8040: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
8050: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  File = sqlite3Pa
8060: 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b  gerFile(pPager);
8070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
8080: 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
8090: 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 47 45  pFile, SQLITE_GE
80a0: 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
80b0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 72               &pr
80d0: 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a  oxy_file_path);.
80e0: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
80f0: 6c 65 54 65 78 74 28 76 2c 20 70 72 6f 78 79 5f  leText(v, proxy_
8100: 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20  file_path);.    
8110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 61 67  }else{.      Pag
8120: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
8130: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
8140: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
8150: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
8160: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
8170: 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
8180: 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20        int res;. 
8190: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
81a0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  0] ){.        re
81b0: 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  s=sqlite3OsFileC
81c0: 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51  ontrol(pFile, SQ
81d0: 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
81e0: 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20  XYFILE, .       
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 52                zR
8210: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 20 65  ight);.      } e
8220: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 72 65  lse {.        re
8230: 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  s=sqlite3OsFileC
8240: 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51  ontrol(pFile, SQ
8250: 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
8260: 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20  XYFILE, .       
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
8290: 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
82a0: 20 20 20 69 66 28 20 72 65 73 21 3d 53 51 4c 49     if( res!=SQLI
82b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
82c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
82d0: 28 70 50 61 72 73 65 2c 20 22 66 61 69 6c 65 64  (pParse, "failed
82e0: 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20 70 72 6f   to set lock pro
82f0: 78 79 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  xy file");.     
8300: 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f     goto pragma_o
8310: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
8320: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
8330: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8340: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
8350: 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20 20 20 0a  _STYLE */      .
8360: 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20      .  /*.  **  
8370: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
8380: 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a  ]synchronous.  *
8390: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
83a0: 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ma.]synchronous=
83b0: 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c 7c 46 55  OFF|ON|NORMAL|FU
83c0: 4c 4c 7c 45 58 54 52 41 0a 20 20 2a 2a 0a 20 20  LL|EXTRA.  **.  
83d0: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
83e0: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
83f0: 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72 6f 6e   of the synchron
8400: 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61 6e 67  ous flag.  Chang
8410: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63  ing.  ** the loc
8420: 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f  al value does no
8430: 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74  t make changes t
8440: 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  o the disk file 
8450: 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64 65 66  and the.  ** def
8460: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
8470: 62 65 20 72 65 73 74 6f 72 65 64 20 74 68 65 20  be restored the 
8480: 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 64 61  next time the da
8490: 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f  tabase is.  ** o
84a0: 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  pened..  */.  ca
84b0: 73 65 20 50 72 61 67 54 79 70 5f 53 59 4e 43 48  se PragTyp_SYNCH
84c0: 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20 20 69 66  RONOUS: {.    if
84d0: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
84e0: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
84f0: 6e 74 28 76 2c 20 70 44 62 2d 3e 73 61 66 65 74  nt(v, pDb->safet
8500: 79 5f 6c 65 76 65 6c 2d 31 29 3b 0a 20 20 20 20  y_level-1);.    
8510: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
8520: 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
8530: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8540: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8550: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
8560: 20 22 53 61 66 65 74 79 20 6c 65 76 65 6c 20 6d   "Safety level m
8570: 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65  ay not be change
8580: 64 20 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73  d inside a trans
8590: 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  action");.      
85a0: 7d 65 6c 73 65 20 69 66 28 20 69 44 62 21 3d 31  }else if( iDb!=1
85b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
85c0: 69 4c 65 76 65 6c 20 3d 20 28 67 65 74 53 61 66  iLevel = (getSaf
85d0: 65 74 79 4c 65 76 65 6c 28 7a 52 69 67 68 74 2c  etyLevel(zRight,
85e0: 30 2c 31 29 2b 31 29 20 26 20 50 41 47 45 52 5f  0,1)+1) & PAGER_
85f0: 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
8600: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4c  ;.        if( iL
8610: 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65 76 65 6c  evel==0 ) iLevel
8620: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44   = 1;.        pD
8630: 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
8640: 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  = iLevel;.      
8650: 20 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74 20    pDb->bSyncSet 
8660: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65 74  = 1;.        set
8670: 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62  AllPagerFlags(db
8680: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8690: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
86a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
86b0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
86c0: 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  MAS */..#ifndef 
86d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47  SQLITE_OMIT_FLAG
86e0: 5f 50 52 41 47 4d 41 53 0a 20 20 63 61 73 65 20  _PRAGMAS.  case 
86f0: 50 72 61 67 54 79 70 5f 46 4c 41 47 3a 20 7b 0a  PragTyp_FLAG: {.
8700: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d 3d      if( zRight==
8710: 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 50 72  0 ){.      setPr
8720: 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75 6d 6e  agmaResultColumn
8730: 4e 61 6d 65 73 28 76 2c 20 70 50 72 61 67 6d 61  Names(v, pPragma
8740: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  );.      returnS
8750: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 28 64 62 2d  ingleInt(v, (db-
8760: 3e 66 6c 61 67 73 20 26 20 70 50 72 61 67 6d 61  >flags & pPragma
8770: 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b 0a 20 20  ->iArg)!=0 );.  
8780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
8790: 6e 74 20 6d 61 73 6b 20 3d 20 70 50 72 61 67 6d  nt mask = pPragm
87a0: 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f 2a 20 4d  a->iArg;    /* M
87b0: 61 73 6b 20 6f 66 20 62 69 74 73 20 74 6f 20 73  ask of bits to s
87c0: 65 74 20 6f 72 20 63 6c 65 61 72 2e 20 2a 2f 0a  et or clear. */.
87d0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75        if( db->au
87e0: 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20  toCommit==0 ){. 
87f0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65 69 67         /* Foreig
8800: 6e 20 6b 65 79 20 73 75 70 70 6f 72 74 20 6d 61  n key support ma
8810: 79 20 6e 6f 74 20 62 65 20 65 6e 61 62 6c 65 64  y not be enabled
8820: 20 6f 72 20 64 69 73 61 62 6c 65 64 20 77 68 69   or disabled whi
8830: 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  le not.        *
8840: 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74  * in auto-commit
8850: 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 20 20 20   mode.  */.     
8860: 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 53 51 4c     mask &= ~(SQL
8870: 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 29  ITE_ForeignKeys)
8880: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  ;.      }.#if SQ
8890: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
88a0: 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 69  TICATION.      i
88b0: 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74 68  f( db->auth.auth
88c0: 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f 55 73 65  Level==UAUTH_Use
88d0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
88e0: 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6e 6f 6e  Do not allow non
88f0: 2d 61 64 6d 69 6e 20 75 73 65 72 73 20 74 6f 20  -admin users to 
8900: 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68 65 6d  modify the schem
8910: 61 20 61 72 62 69 74 72 61 72 69 6c 79 20 2a 2f  a arbitrarily */
8920: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d  .        mask &=
8930: 20 7e 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53   ~(SQLITE_WriteS
8940: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 0a  chema);.      }.
8950: 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66  #endif..      if
8960: 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ( sqlite3GetBool
8970: 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 20 29  ean(zRight, 0) )
8980: 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c  {.        db->fl
8990: 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ags |= mask;.   
89a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
89b0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
89c0: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  mask;.        if
89d0: 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54 45 5f 44  ( mask==SQLITE_D
89e0: 65 66 65 72 46 4b 73 20 29 20 64 62 2d 3e 6e 44  eferFKs ) db->nD
89f0: 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
8a00: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
8a10: 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66 20 74 68     /* Many of th
8a20: 65 20 66 6c 61 67 2d 70 72 61 67 6d 61 73 20 6d  e flag-pragmas m
8a30: 6f 64 69 66 79 20 74 68 65 20 63 6f 64 65 20 67  odify the code g
8a40: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
8a50: 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  SQL .      ** co
8a60: 6d 70 69 6c 65 72 20 28 65 67 2e 20 63 6f 75 6e  mpiler (eg. coun
8a70: 74 5f 63 68 61 6e 67 65 73 29 2e 20 53 6f 20 61  t_changes). So a
8a80: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 6f 20  dd an opcode to 
8a90: 65 78 70 69 72 65 20 61 6c 6c 0a 20 20 20 20 20  expire all.     
8aa0: 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c   ** compiled SQL
8ab0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 66 74 65   statements afte
8ac0: 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 70 72  r modifying a pr
8ad0: 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20 20 20 20  agma value..    
8ae0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
8af0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
8b00: 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20  OP_Expire);.    
8b10: 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61    setAllPagerFla
8b20: 67 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  gs(db);.    }.  
8b30: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e    break;.  }.#en
8b40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
8b50: 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 20  IT_FLAG_PRAGMAS 
8b60: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
8b70: 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50  TE_OMIT_SCHEMA_P
8b80: 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a  RAGMAS.  /*.  **
8b90: 20 20 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f     PRAGMA table_
8ba0: 69 6e 66 6f 28 3c 74 61 62 6c 65 3e 29 0a 20 20  info(<table>).  
8bb0: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  **.  ** Return a
8bc0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 66 6f 72 20   single row for 
8bd0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  each column of t
8be0: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 20  he named table. 
8bf0: 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  The columns of. 
8c00: 20 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64   ** the returned
8c10: 20 64 61 74 61 20 73 65 74 20 61 72 65 3a 0a 20   data set are:. 
8c20: 20 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a 20 20 20   **.  ** cid:   
8c30: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 69 64 20 28       Column id (
8c40: 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65  numbered from le
8c50: 66 74 20 74 6f 20 72 69 67 68 74 2c 20 73 74 61  ft to right, sta
8c60: 72 74 69 6e 67 20 61 74 20 30 29 0a 20 20 2a 2a  rting at 0).  **
8c70: 20 6e 61 6d 65 3a 20 20 20 20 20 20 20 43 6f 6c   name:       Col
8c80: 75 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a 20 74 79  umn name.  ** ty
8c90: 70 65 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  pe:       Column
8ca0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
8cb0: 65 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75 6c 6c 3a  e..  ** notnull:
8cc0: 20 20 20 20 54 72 75 65 20 69 66 20 27 4e 4f 54      True if 'NOT
8cd0: 20 4e 55 4c 4c 27 20 69 73 20 70 61 72 74 20 6f   NULL' is part o
8ce0: 66 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  f column declara
8cf0: 74 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c 74 5f 76  tion.  ** dflt_v
8d00: 61 6c 75 65 3a 20 54 68 65 20 64 65 66 61 75 6c  alue: The defaul
8d10: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
8d20: 63 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79 2e 0a  column, if any..
8d30: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
8d40: 54 79 70 5f 54 41 42 4c 45 5f 49 4e 46 4f 3a 20  Typ_TABLE_INFO: 
8d50: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
8d60: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
8d70: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
8d80: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
8d90: 72 73 65 2c 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  rse, LOCATE_NOER
8da0: 52 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  R, zRight, zDb);
8db0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
8dc0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b  .      int i, k;
8dd0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64 64  .      int nHidd
8de0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 6f  en = 0;.      Co
8df0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  lumn *pCol;.    
8e00: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73    Index *pPk = s
8e10: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
8e20: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
8e30: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
8e40: 3d 20 36 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 6;.      sqlit
8e50: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
8e60: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
8e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 69  .      sqlite3Vi
8e80: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
8e90: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
8ea0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
8eb0: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
8ec0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
8ed0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
8ee0: 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
8ef0: 43 6f 6c 75 6d 6e 28 70 43 6f 6c 29 20 29 7b 0a  Column(pCol) ){.
8f00: 20 20 20 20 20 20 20 20 20 20 6e 48 69 64 64 65            nHidde
8f10: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  n++;.          c
8f20: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8f30: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
8f40: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
8f50: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
8f60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8f70: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    k = 0;.       
8f80: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 3d 3d   }else if( pPk==
8f90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b  0 ){.          k
8fa0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
8fb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
8fc0: 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 70 54 61 62 2d  or(k=1; k<=pTab-
8fd0: 3e 6e 43 6f 6c 20 26 26 20 70 50 6b 2d 3e 61 69  >nCol && pPk->ai
8fe0: 43 6f 6c 75 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b 20  Column[k-1]!=i; 
8ff0: 6b 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 7d  k++){}.        }
9000: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9010: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20   pCol->pDflt==0 
9020: 7c 7c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e  || pCol->pDflt->
9030: 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a 20  op==TK_SPAN );. 
9040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9050: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
9060: 2c 20 22 69 73 73 69 73 69 22 2c 0a 20 20 20 20  , "issisi",.    
9070: 20 20 20 20 20 20 20 20 20 20 20 69 2d 6e 48 69             i-nHi
9080: 64 64 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  dden,.          
9090: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
90a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
90b0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
90c0: 70 65 28 70 43 6f 6c 2c 22 22 29 2c 0a 20 20 20  pe(pCol,""),.   
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
90e0: 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a 20  ->notNull ? 1 : 
90f0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
9100: 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3f 20    pCol->pDflt ? 
9110: 70 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a  pCol->pDflt->u.z
9120: 54 6f 6b 65 6e 20 3a 20 30 2c 0a 20 20 20 20 20  Token : 0,.     
9130: 20 20 20 20 20 20 20 20 20 20 6b 29 3b 0a 20 20            k);.  
9140: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9150: 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66 64 65 66    break;..#ifdef
9160: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
9170: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 54 41  case PragTyp_STA
9180: 54 53 3a 20 7b 0a 20 20 20 20 49 6e 64 65 78 20  TS: {.    Index 
9190: 2a 70 49 64 78 3b 0a 20 20 20 20 48 61 73 68 45  *pIdx;.    HashE
91a0: 6c 65 6d 20 2a 69 3b 0a 20 20 20 20 70 50 61 72  lem *i;.    pPar
91b0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20  se->nMem = 5;.  
91c0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
91d0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
91e0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 66 6f 72 28  , iDb);.    for(
91f0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9200: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
9210: 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d  >tblHash); i; i=
9220: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
9230: 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  )){.      Table 
9240: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
9250: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 20  shData(i);.     
9260: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
9270: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 73 69  iLoad(v, 1, "ssi
9280: 69 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ii",.           
9290: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
92a0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
92b0: 20 20 20 20 20 20 70 54 61 62 2d 3e 73 7a 54 61        pTab->szTa
92c0: 62 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  bRow,.          
92d0: 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
92e0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  t,.           pT
92f0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 29 3b 0a 20  ab->tabFlags);. 
9300: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
9310: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
9320: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
9330: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  xt){.        sql
9340: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
9350: 64 28 76 2c 20 32 2c 20 22 73 69 69 69 58 22 2c  d(v, 2, "siiiX",
9360: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
9370: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
9380: 20 20 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52      pIdx->szIdxR
9390: 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
93a0: 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
93b0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [0],.           
93c0: 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 29 3b  pIdx->hasStat1);
93d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
93e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
93f0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 35  _ResultRow, 1, 5
9400: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9410: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
9420: 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 50 72 61  ndif..  case Pra
9430: 67 54 79 70 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a  gTyp_INDEX_INFO:
9440: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
9450: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
9460: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
9470: 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69  .    pIdx = sqli
9480: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
9490: 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20   zRight, zDb);. 
94a0: 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20     if( pIdx ){. 
94b0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
94c0: 20 20 69 6e 74 20 6d 78 3b 0a 20 20 20 20 20 20    int mx;.      
94d0: 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41 72  if( pPragma->iAr
94e0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g ){.        /* 
94f0: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
9500: 66 6f 20 28 6e 65 77 65 72 20 76 65 72 73 69 6f  fo (newer versio
9510: 6e 20 77 69 74 68 20 6d 6f 72 65 20 72 6f 77 73  n with more rows
9520: 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f   and columns) */
9530: 0a 20 20 20 20 20 20 20 20 6d 78 20 3d 20 70 49  .        mx = pI
9540: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
9550: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
9560: 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20 7d 65 6c  m = 6;.      }el
9570: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 50  se{.        /* P
9580: 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e 66 6f  RAGMA index_info
9590: 20 28 6c 65 67 61 63 79 20 76 65 72 73 69 6f 6e   (legacy version
95a0: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78 20  ) */.        mx 
95b0: 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
95c0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
95d0: 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 20  >nMem = 3;.     
95e0: 20 7d 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20   }.      pTab = 
95f0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  pIdx->pTable;.  
9600: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
9610: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
9620: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
9630: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
9640: 6e 4d 65 6d 3c 3d 70 50 72 61 67 6d 61 2d 3e 6e  nMem<=pPragma->n
9650: 50 72 61 67 43 4e 61 6d 65 20 29 3b 0a 20 20 20  PragCName );.   
9660: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78     for(i=0; i<mx
9670: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9680: 69 31 36 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d  i16 cnum = pIdx-
9690: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
96a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
96b0: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
96c0: 20 22 69 69 73 58 22 2c 20 69 2c 20 63 6e 75 6d   "iisX", i, cnum
96d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
96f0: 6e 75 6d 3c 30 20 3f 20 30 20 3a 20 70 54 61 62  num<0 ? 0 : pTab
9700: 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61  ->aCol[cnum].zNa
9710: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
9720: 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 20 29   pPragma->iArg )
9730: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
9740: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9750: 28 76 2c 20 34 2c 20 22 69 73 69 58 22 2c 0a 20  (v, 4, "isiX",. 
9760: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
9770: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 2c 0a  >aSortOrder[i],.
9780: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
9790: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a 20 20 20  ->azColl[i],.   
97a0: 20 20 20 20 20 20 20 20 20 69 3c 70 49 64 78 2d           i<pIdx-
97b0: 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 20  >nKeyCol);.     
97c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
97d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
97e0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
97f0: 31 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29  1, pParse->nMem)
9800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9810: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20    }.  break;..  
9820: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44  case PragTyp_IND
9830: 45 58 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52 69  EX_LIST: if( zRi
9840: 67 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ght ){.    Index
9850: 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c   *pIdx;.    Tabl
9860: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  e *pTab;.    int
9870: 20 69 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73   i;.    pTab = s
9880: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
9890: 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29  db, zRight, zDb)
98a0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
98b0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
98c0: 6e 4d 65 6d 20 3d 20 35 3b 0a 20 20 20 20 20 20  nMem = 5;.      
98d0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
98e0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
98f0: 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  iDb);.      for(
9900: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
9910: 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b 20 70 49  x, i=0; pIdx; pI
9920: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
9930: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
9940: 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f 72 69 67  nst char *azOrig
9950: 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c 20 22 75  in[] = { "c", "u
9960: 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20 20 20 20  ", "pk" };.     
9970: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9980: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69  ltiLoad(v, 1, "i
9990: 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20 20 20  sisi",.         
99a0: 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20    i,.           
99b0: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pIdx->zName,.   
99c0: 20 20 20 20 20 20 20 20 49 73 55 6e 69 71 75 65          IsUnique
99d0: 49 6e 64 65 78 28 70 49 64 78 29 2c 0a 20 20 20  Index(pIdx),.   
99e0: 20 20 20 20 20 20 20 20 61 7a 4f 72 69 67 69 6e          azOrigin
99f0: 5b 70 49 64 78 2d 3e 69 64 78 54 79 70 65 5d 2c  [pIdx->idxType],
9a00: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
9a10: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
9a20: 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  =0);.      }.   
9a30: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9a40: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9a50: 44 41 54 41 42 41 53 45 5f 4c 49 53 54 3a 20 7b  DATABASE_LIST: {
9a60: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
9a70: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33  pParse->nMem = 3
9a80: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
9a90: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
9aa0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
9ab0: 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 20 63 6f  b[i].pBt==0 ) co
9ac0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
9ad0: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d  sert( db->aDb[i]
9ae0: 2e 7a 44 62 53 4e 61 6d 65 21 3d 30 20 29 3b 0a  .zDbSName!=0 );.
9af0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9b00: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
9b10: 20 22 69 73 73 22 2c 0a 20 20 20 20 20 20 20 20   "iss",.        
9b20: 20 69 2c 0a 20 20 20 20 20 20 20 20 20 64 62 2d   i,.         db-
9b30: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
9b40: 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
9b50: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
9b60: 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  me(db->aDb[i].pB
9b70: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
9b80: 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20   break;..  case 
9b90: 50 72 61 67 54 79 70 5f 43 4f 4c 4c 41 54 49 4f  PragTyp_COLLATIO
9ba0: 4e 5f 4c 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e  N_LIST: {.    in
9bb0: 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 48 61 73  t i = 0;.    Has
9bc0: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 70 50  hElem *p;.    pP
9bd0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a  arse->nMem = 2;.
9be0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
9bf0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9c00: 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20 70 3d 73  CollSeq); p; p=s
9c10: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
9c20: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
9c30: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
9c40: 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  eq *)sqliteHashD
9c50: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 73 71  ata(p);.      sq
9c60: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9c70: 61 64 28 76 2c 20 31 2c 20 22 69 73 22 2c 20 69  ad(v, 1, "is", i
9c80: 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  ++, pColl->zName
9c90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  );.    }.  }.  b
9ca0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  reak;.#endif /* 
9cb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45  SQLITE_OMIT_SCHE
9cc0: 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  MA_PRAGMAS */..#
9cd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9ce0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
9cf0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f   case PragTyp_FO
9d00: 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a 20  REIGN_KEY_LIST: 
9d10: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
9d20: 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20 20 20    FKey *pFK;.   
9d30: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
9d40: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
9d50: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52  FindTable(db, zR
9d60: 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20  ight, zDb);.    
9d70: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
9d80: 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e 70 46    pFK = pTab->pF
9d90: 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Key;.      if( p
9da0: 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  FK ){.        in
9db0: 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  t i = 0; .      
9dc0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
9dd0: 20 38 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   8;.        sqli
9de0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
9df0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
9e00: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
9e10: 70 46 4b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pFK){.          
9e20: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  int j;.         
9e30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d   for(j=0; j<pFK-
9e40: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
9e50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9e60: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9e70: 20 31 2c 20 22 69 69 73 73 73 73 73 73 22 2c 0a   1, "iissssss",.
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20     i,.          
9ea0: 20 20 20 20 20 20 20 20 20 6a 2c 0a 20 20 20 20           j,.    
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
9ec0: 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20 20 20 20  FK->zTo,.       
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
9ee0: 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61 43 6f 6c  ->aCol[pFK->aCol
9ef0: 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65  [j].iFrom].zName
9f00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9f10: 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a       pFK->aCol[j
9f20: 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ].zCol,.        
9f30: 20 20 20 20 20 20 20 20 20 20 20 61 63 74 69 6f             actio
9f40: 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74 69  nName(pFK->aActi
9f50: 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f 4e 20 55  on[1]),  /* ON U
9f60: 50 44 41 54 45 20 2a 2f 0a 20 20 20 20 20 20 20  PDATE */.       
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74 69              acti
9f80: 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41 63 74  onName(pFK->aAct
9f90: 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20 4f 4e 20  ion[0]),  /* ON 
9fa0: 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20 20 20 20  DELETE */.      
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 4f               "NO
9fc0: 4e 45 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  NE");.          
9fd0: 7d 0a 20 20 20 20 20 20 20 20 20 20 2b 2b 69 3b  }.          ++i;
9fe0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 20 3d  .          pFK =
9ff0: 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b   pFK->pNextFrom;
a000: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a010: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
a020: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  reak;.#endif /* 
a030: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a040: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
a050: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
a060: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
a070: 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66 20 53 51  N_KEY.#ifndef SQ
a080: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
a090: 52 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  R.  case PragTyp
a0a0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 43 48 45  _FOREIGN_KEY_CHE
a0b0: 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65 79 20 2a  CK: {.    FKey *
a0c0: 70 46 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  pFK;            
a0d0: 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e 20 6b 65   /* A foreign ke
a0e0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  y constraint */.
a0f0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
a100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
a110: 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ild table contai
a120: 6e 20 22 52 45 46 45 52 45 4e 43 45 53 22 20 6b  n "REFERENCES" k
a130: 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20 20 54 61  eyword */.    Ta
a140: 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  ble *pParent;   
a150: 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 74       /* Parent t
a160: 61 62 6c 65 20 74 68 61 74 20 63 68 69 6c 64 20  able that child 
a170: 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20  points to */.   
a180: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
a190: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
a1a0: 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74   in the parent t
a1b0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
a1c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
a1d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
a1e0: 65 72 3a 20 20 46 6f 72 65 69 67 6e 20 6b 65 79  er:  Foreign key
a1f0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 54 61 62   number for pTab
a200: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20   */.    int j;  
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a220: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20  * Loop counter: 
a230: 20 46 69 65 6c 64 20 6f 66 20 74 68 65 20 66 6f   Field of the fo
a240: 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a 20 20 20  reign key */.   
a250: 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
a260: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a270: 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78 74 20 74  counter:  Next t
a280: 61 62 6c 65 20 69 6e 20 73 63 68 65 6d 61 20 2a  able in schema *
a290: 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20 20 20 20  /.    int x;    
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2b0: 72 65 73 75 6c 74 20 76 61 72 69 61 62 6c 65 20  result variable 
a2c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65  */.    int regRe
a2d0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  sult;         /*
a2e0: 20 33 20 72 65 67 69 73 74 65 72 73 20 74 6f 20   3 registers to 
a2f0: 68 6f 6c 64 20 61 20 72 65 73 75 6c 74 20 72 6f  hold a result ro
a300: 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  w */.    int reg
a310: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
a320: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 68  /* Register to h
a330: 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63 68 65 63  old key for chec
a340: 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a 2f 0a 20  king the FK */. 
a350: 20 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 20 20     int regRow;  
a360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
a370: 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61  isters to hold a
a380: 20 72 6f 77 20 66 72 6f 6d 20 70 54 61 62 20 2a   row from pTab *
a390: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f  /.    int addrTo
a3a0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
a3b0: 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70 20 63 68  Top of a loop ch
a3c0: 65 63 6b 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b  ecking foreign k
a3d0: 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  eys */.    int a
a3e0: 64 64 72 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  ddrOk;          
a3f0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
a400: 66 20 74 68 65 20 6b 65 79 20 69 73 20 4f 4b 20  f the key is OK 
a410: 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f  */.    int *aiCo
a420: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ls;           /*
a430: 20 63 68 69 6c 64 20 74 6f 20 70 61 72 65 6e 74   child to parent
a440: 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69 6e 67 20   column mapping 
a450: 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65 73 75 6c  */..    regResul
a460: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
a470: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
a480: 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20 20 20 72  nMem += 4;.    r
a490: 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61 72 73 65  egKey = ++pParse
a4a0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52  ->nMem;.    regR
a4b0: 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ow = ++pParse->n
a4c0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
a4d0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
a4e0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
a4f0: 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 48 61 73     k = sqliteHas
a500: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
a510: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  iDb].pSchema->tb
a520: 6c 48 61 73 68 29 3b 0a 20 20 20 20 77 68 69 6c  lHash);.    whil
a530: 65 28 20 6b 20 29 7b 0a 20 20 20 20 20 20 69 66  e( k ){.      if
a540: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
a550: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
a560: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
a570: 61 72 73 65 2c 20 30 2c 20 7a 52 69 67 68 74 2c  arse, 0, zRight,
a580: 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 6b   zDb);.        k
a590: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
a5a0: 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  e{.        pTab 
a5b0: 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
a5c0: 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
a5d0: 20 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 48       k = sqliteH
a5e0: 61 73 68 4e 65 78 74 28 6b 29 3b 0a 20 20 20 20  ashNext(k);.    
a5f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
a600: 61 62 3d 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  ab==0 || pTab->p
a610: 46 4b 65 79 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  FKey==0 ) contin
a620: 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ue;.      sqlite
a630: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
a640: 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
a650: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
a660: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
a670: 54 61 62 2d 3e 6e 43 6f 6c 2b 72 65 67 52 6f 77  Tab->nCol+regRow
a680: 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20  >pParse->nMem ) 
a690: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 70  pParse->nMem = p
a6a0: 54 61 62 2d 3e 6e 43 6f 6c 20 2b 20 72 65 67 52  Tab->nCol + regR
a6b0: 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
a6c0: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
a6d0: 65 2c 20 30 2c 20 69 44 62 2c 20 70 54 61 62 2c  e, 0, iDb, pTab,
a6e0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
a6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a700: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65  LoadString(v, re
a710: 67 52 65 73 75 6c 74 2c 20 70 54 61 62 2d 3e 7a  gResult, pTab->z
a720: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  Name);.      for
a730: 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e  (i=1, pFK=pTab->
a740: 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c  pFKey; pFK; i++,
a750: 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46   pFK=pFK->pNextF
a760: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50  rom){.        pP
a770: 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46  arent = sqlite3F
a780: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b  indTable(db, pFK
a790: 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20  ->zTo, zDb);.   
a7a0: 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74       if( pParent
a7b0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
a7c0: 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30          pIdx = 0
a7d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a7e0: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
a7f0: 65 2c 20 69 44 62 2c 20 70 50 61 72 65 6e 74 2d  e, iDb, pParent-
a800: 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61 72 65 6e  >tnum, 0, pParen
a810: 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  t->zName);.     
a820: 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b     x = sqlite3Fk
a830: 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61 72  LocateIndex(pPar
a840: 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b  se, pParent, pFK
a850: 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a 20 20 20  , &pIdx, 0);.   
a860: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b       if( x==0 ){
a870: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
a880: 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx==0 ){.      
a890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
a8a0: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
a8b0: 2c 20 69 44 62 2c 20 70 50 61 72 65 6e 74 2c 20  , iDb, pParent, 
a8c0: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
a8d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a8e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a8f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a900: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 2c 20  OP_OpenRead, i, 
a910: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
a920: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
a930: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
a940: 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
a950: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dx);.          }
a960: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a970: 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b            k = 0;
a980: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
a990: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a9a0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
a9b0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
a9c0: 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b 0a 20 20   || pFK==0 );.  
a9d0: 20 20 20 20 69 66 28 20 70 46 4b 20 29 20 62 72      if( pFK ) br
a9e0: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
a9f0: 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20  Parse->nTab<i ) 
aa00: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69  pParse->nTab = i
aa10: 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20  ;.      addrTop 
aa20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
aa30: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
aa40: 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
aa50: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  ge(v);.      for
aa60: 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e  (i=1, pFK=pTab->
aa70: 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c  pFKey; pFK; i++,
aa80: 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46   pFK=pFK->pNextF
aa90: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50  rom){.        pP
aaa0: 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 46  arent = sqlite3F
aab0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70 46 4b  indTable(db, pFK
aac0: 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a 20 20 20  ->zTo, zDb);.   
aad0: 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20       pIdx = 0;. 
aae0: 20 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3d 20         aiCols = 
aaf0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
ab00: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
ab10: 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 46      x = sqlite3F
ab20: 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70 50 61  kLocateIndex(pPa
ab30: 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 46  rse, pParent, pF
ab40: 4b 2c 20 26 70 49 64 78 2c 20 26 61 69 43 6f 6c  K, &pIdx, &aiCol
ab50: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  s);.          as
ab60: 73 65 72 74 28 20 78 3d 3d 30 20 29 3b 0a 20 20  sert( x==0 );.  
ab70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ab80: 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65 33  addrOk = sqlite3
ab90: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
aba0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ;..        /* Ge
abb0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
abc0: 65 61 64 20 74 68 65 20 63 68 69 6c 64 20 6b 65  ead the child ke
abd0: 79 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 72 65  y values into re
abe0: 67 69 73 74 65 72 73 0a 20 20 20 20 20 20 20 20  gisters.        
abf0: 2a 2a 20 72 65 67 52 6f 77 2e 2e 72 65 67 52 6f  ** regRow..regRo
ac00: 77 2b 6e 2e 20 49 66 20 61 6e 79 20 6f 66 20 74  w+n. If any of t
ac10: 68 65 20 63 68 69 6c 64 20 6b 65 79 20 76 61 6c  he child key val
ac20: 75 65 73 20 61 72 65 20 4e 55 4c 4c 2c 20 74 68  ues are NULL, th
ac30: 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  is .        ** r
ac40: 6f 77 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20  ow cannot cause 
ac50: 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 2e  an FK violation.
ac60: 20 4a 75 6d 70 20 64 69 72 65 63 74 6c 79 20 74   Jump directly t
ac70: 6f 20 61 64 64 72 4f 6b 20 69 6e 20 0a 20 20 20  o addrOk in .   
ac80: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
ac90: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  e. */.        fo
aca0: 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43  r(j=0; j<pFK->nC
acb0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
acc0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61      int iCol = a
acd0: 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73 5b 6a  iCols ? aiCols[j
ace0: 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d  ] : pFK->aCol[j]
acf0: 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20  .iFrom;.        
ad00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ad10: 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
ad20: 65 28 76 2c 20 70 54 61 62 2c 20 30 2c 20 69 43  e(v, pTab, 0, iC
ad30: 6f 6c 2c 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20  ol, regRow+j);. 
ad40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ad50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ad60: 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b  _IsNull, regRow+
ad70: 6a 2c 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65  j, addrOk); Vdbe
ad80: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
ad90: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
ada0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
adb0: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 70 61   to query the pa
adc0: 72 65 6e 74 20 69 6e 64 65 78 20 66 6f 72 20 61  rent index for a
add0: 20 6d 61 74 63 68 69 6e 67 20 70 61 72 65 6e 74   matching parent
ade0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 2e  .        ** key.
adf0: 20 49 66 20 61 20 6d 61 74 63 68 20 69 73 20 66   If a match is f
ae00: 6f 75 6e 64 2c 20 6a 75 6d 70 20 74 6f 20 61 64  ound, jump to ad
ae10: 64 72 4f 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  drOk. */.       
ae20: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
ae30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ae40: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
ae50: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
ae60: 77 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65  w, pFK->nCol, re
ae70: 67 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  gKey,.          
ae80: 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78      sqlite3Index
ae90: 41 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70  AffinityStr(db,p
aea0: 49 64 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29  Idx), pFK->nCol)
aeb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
aec0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
aed0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 2c  (v, OP_Found, i,
aee0: 20 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79 2c   addrOk, regKey,
aef0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56   0);.          V
af00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
af10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
af20: 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
af30: 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 20 3d         int jmp =
af40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
af50: 65 6e 74 41 64 64 72 28 76 29 2b 32 3b 0a 20 20  entAddr(v)+2;.  
af60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
af70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
af80: 53 65 65 6b 52 6f 77 69 64 2c 20 69 2c 20 6a 6d  SeekRowid, i, jm
af90: 70 2c 20 72 65 67 52 6f 77 29 3b 20 56 64 62 65  p, regRow); Vdbe
afa0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
afb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
afc0: 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 4f 6b  beGoto(v, addrOk
afd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
afe0: 65 72 74 28 20 70 46 4b 2d 3e 6e 43 6f 6c 3d 3d  ert( pFK->nCol==
aff0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  1 );.        }..
b000: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
b010: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 70 6f  ate code to repo
b020: 72 74 20 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69  rt an FK violati
b030: 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  on to the caller
b040: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
b050: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
b060: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b080: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72  , OP_Rowid, 0, r
b090: 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20 20  egResult+1);.   
b0a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b0c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
b0d0: 6c 6c 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74  ll, 0, regResult
b0e0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +1);.        }. 
b0f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b100: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 72  beMultiLoad(v, r
b110: 65 67 52 65 73 75 6c 74 2b 32 2c 20 22 73 69 58  egResult+2, "siX
b120: 22 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d 31  ", pFK->zTo, i-1
b130: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b140: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b150: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
b160: 67 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20 20  gResult, 4);.   
b170: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b180: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b190: 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20  addrOk);.       
b1a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b1b0: 62 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20  b, aiCols);.    
b1c0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b1d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b1e0: 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 54  P_Next, 0, addrT
b1f0: 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  op+1); VdbeCover
b200: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
b210: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b220: 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
b230: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
b240: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
b250: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b260: 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 23 65 6e  _TRIGGER) */.#en
b270: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
b280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
b290: 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66  IGN_KEY) */..#if
b2a0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 63 61  ndef NDEBUG.  ca
b2b0: 73 65 20 50 72 61 67 54 79 70 5f 50 41 52 53 45  se PragTyp_PARSE
b2c0: 52 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  R_TRACE: {.    i
b2d0: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
b2e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
b2f0: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c  tBoolean(zRight,
b300: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73   0) ){.        s
b310: 71 6c 69 74 65 33 50 61 72 73 65 72 54 72 61 63  qlite3ParserTrac
b320: 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65  e(stdout, "parse
b330: 72 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r: ");.      }el
b340: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b350: 74 65 33 50 61 72 73 65 72 54 72 61 63 65 28 30  te3ParserTrace(0
b360: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
b370: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
b380: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
b390: 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b 45  install the LIKE
b3a0: 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69   and GLOB functi
b3b0: 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61 6e  ons.  The varian
b3c0: 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20 75  t of LIKE.  ** u
b3d0: 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73 65  sed will be case
b3e0: 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e 6f   sensitive or no
b3f0: 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  t depending on t
b400: 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 63  he RHS..  */.  c
b410: 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 53 45  ase PragTyp_CASE
b420: 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45 3a  _SENSITIVE_LIKE:
b430: 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68   {.    if( zRigh
b440: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
b450: 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46 75  e3RegisterLikeFu
b460: 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c 69  nctions(db, sqli
b470: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
b480: 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d  ight, 0));.    }
b490: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23  .  }.  break;..#
b4a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e  ifndef SQLITE_IN
b4b0: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52  TEGRITY_CHECK_ER
b4c0: 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65  ROR_MAX.# define
b4d0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54   SQLITE_INTEGRIT
b4e0: 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41  Y_CHECK_ERROR_MA
b4f0: 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69  X 100.#endif..#i
b500: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b510: 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
b520: 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41 47 4d 41  K.  /*    PRAGMA
b530: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
b540: 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20  .  **    PRAGMA 
b550: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28  integrity_check(
b560: 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d  N).  **    PRAGM
b570: 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 0a 20 20  A quick_check.  
b580: 2a 2a 20 20 20 20 50 52 41 47 4d 41 20 71 75 69  **    PRAGMA qui
b590: 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20 20 2a 2a  ck_check(N).  **
b5a0: 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 65  .  ** Verify the
b5b0: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
b5c0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
b5d0: 0a 20 20 2a 2a 20 54 68 65 20 22 71 75 69 63 6b  .  ** The "quick
b5e0: 5f 63 68 65 63 6b 22 20 69 73 20 72 65 64 75 63  _check" is reduc
b5f0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  ed version of . 
b600: 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63 68   ** integrity_ch
b610: 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f 20  eck designed to 
b620: 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74 61  detect most data
b630: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 0a  base corruption.
b640: 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 74 68 65    ** without the
b650: 20 6f 76 65 72 68 65 61 64 20 6f 66 20 63 72 6f   overhead of cro
b660: 73 73 2d 63 68 65 63 6b 69 6e 67 20 69 6e 64 65  ss-checking inde
b670: 78 65 73 2e 20 20 51 75 69 63 6b 5f 63 68 65 63  xes.  Quick_chec
b680: 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e 65 61 72  k.  ** is linear
b690: 20 74 69 6d 65 20 77 68 65 72 65 61 73 65 20 69   time wherease i
b6a0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 69  ntegrity_check i
b6b0: 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20 20 2a 2f  s O(NlogN)..  */
b6c0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
b6d0: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 3a  INTEGRITY_CHECK:
b6e0: 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c   {.    int i, j,
b6f0: 20 61 64 64 72 2c 20 6d 78 45 72 72 3b 0a 0a 20   addr, mxErr;.. 
b700: 20 20 20 69 6e 74 20 69 73 51 75 69 63 6b 20 3d     int isQuick =
b710: 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72   (sqlite3Tolower
b720: 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29  (zLeft[0])=='q')
b730: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
b740: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20   PRAGMA command 
b750: 77 61 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  was of the form 
b760: 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74  "PRAGMA <db>.int
b770: 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20  egrity_check",. 
b780: 20 20 20 2a 2a 20 74 68 65 6e 20 69 44 62 20 69     ** then iDb i
b790: 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
b7a0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
b7b0: 73 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  se identified by
b7c0: 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e   <db>..    ** In
b7d0: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
b7e0: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 64 61 74  integrity of dat
b7f0: 61 62 61 73 65 20 69 44 62 20 6f 6e 6c 79 20 69  abase iDb only i
b800: 73 20 76 65 72 69 66 69 65 64 20 62 79 0a 20 20  s verified by.  
b810: 20 20 2a 2a 20 74 68 65 20 56 44 42 45 20 63 72    ** the VDBE cr
b820: 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20  eated below..   
b830: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72   **.    ** Other
b840: 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6d  wise, if the com
b850: 6d 61 6e 64 20 77 61 73 20 73 69 6d 70 6c 79 20  mand was simply 
b860: 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  "PRAGMA integrit
b870: 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a 20 20 20  y_check" (or.   
b880: 20 2a 2a 20 22 50 52 41 47 4d 41 20 71 75 69 63   ** "PRAGMA quic
b890: 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68 65 6e 20  k_check"), then 
b8a0: 69 44 62 20 69 73 20 73 65 74 20 74 6f 20 30 2e  iDb is set to 0.
b8b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
b8c0: 65 74 20 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f  et iDb.    ** to
b8d0: 20 2d 31 20 68 65 72 65 2c 20 74 6f 20 69 6e 64   -1 here, to ind
b8e0: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 56  icate that the V
b8f0: 44 42 45 20 73 68 6f 75 6c 64 20 76 65 72 69 66  DBE should verif
b900: 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 0a  y the integrity.
b910: 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74      ** of all at
b920: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
b930: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
b940: 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20  ( iDb>=0 );.    
b950: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 7c  assert( iDb==0 |
b960: 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20  | pId2->z );.   
b970: 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20   if( pId2->z==0 
b980: 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20  ) iDb = -1;..   
b990: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
b9a0: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
b9b0: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
b9c0: 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20 20 2f 2a  Mem = 6;..    /*
b9d0: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
b9e0: 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a   error count */.
b9f0: 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49      mxErr = SQLI
ba00: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
ba10: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20  CK_ERROR_MAX;.  
ba20: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
ba30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
ba40: 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 6d  Int32(zRight, &m
ba50: 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28  xErr);.      if(
ba60: 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20   mxErr<=0 ){.   
ba70: 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c       mxErr = SQL
ba80: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
ba90: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20  ECK_ERROR_MAX;. 
baa0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bac0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
bad0: 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29 3b 20 2f  , mxErr-1, 1); /
bae0: 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65  * reg[1] holds e
baf0: 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20  rrors left */.. 
bb00: 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65     /* Do an inte
bb10: 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 65  grity check on e
bb20: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
bb30: 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
bb40: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
bb50: 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c 65  ){.      HashEle
bb60: 6d 20 2a 78 3b 0a 20 20 20 20 20 20 48 61 73 68  m *x;.      Hash
bb70: 20 2a 70 54 62 6c 73 3b 0a 20 20 20 20 20 20 69   *pTbls;.      i
bb80: 6e 74 20 2a 61 52 6f 6f 74 3b 0a 20 20 20 20 20  nt *aRoot;.     
bb90: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
bba0: 20 20 20 20 69 6e 74 20 6d 78 49 64 78 20 3d 20      int mxIdx = 
bbb0: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  0;.      int nId
bbc0: 78 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4f 4d  x;..      if( OM
bbd0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 3d 3d  IT_TEMPDB && i==
bbe0: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  1 ) continue;.  
bbf0: 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 26      if( iDb>=0 &
bc00: 26 20 69 21 3d 69 44 62 20 29 20 63 6f 6e 74 69  & i!=iDb ) conti
bc10: 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  nue;..      sqli
bc20: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
bc30: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
bc40: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20  .      /* Do an 
bc50: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  integrity check 
bc60: 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20 20  of the B-Tree.  
bc70: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
bc80: 42 65 67 69 6e 20 62 79 20 66 69 6e 64 69 6e 67  Begin by finding
bc90: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 73 20   the root pages 
bca0: 6e 75 6d 62 65 72 73 0a 20 20 20 20 20 20 2a 2a  numbers.      **
bcb0: 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
bcc0: 61 6e 64 20 69 6e 64 69 63 65 73 20 69 6e 20 74  and indices in t
bcd0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
bce0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
bcf0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
bd00: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
bd10: 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 54  , 0) );.      pT
bd20: 62 6c 73 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  bls = &db->aDb[i
bd30: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
bd40: 73 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e  sh;.      for(cn
bd50: 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73  t=0, x=sqliteHas
bd60: 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78  hFirst(pTbls); x
bd70: 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; x=sqliteHashNe
bd80: 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(x)){.        
bd90: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
bda0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b  liteHashData(x);
bdb0: 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
bdc0: 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66  pIdx;.        if
bdd0: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
bde0: 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20   ) cnt++;.      
bdf0: 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49    for(nIdx=0, pI
be00: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
be10: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
be20: 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29  ->pNext, nIdx++)
be30: 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 20 20 20  { cnt++; }.     
be40: 20 20 20 69 66 28 20 6e 49 64 78 3e 6d 78 49 64     if( nIdx>mxId
be50: 78 20 29 20 6d 78 49 64 78 20 3d 20 6e 49 64 78  x ) mxIdx = nIdx
be60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
be70: 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 44  aRoot = sqlite3D
be80: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
be90: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 63 6e   sizeof(int)*(cn
bea0: 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  t+1));.      if(
beb0: 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62 72 65 61   aRoot==0 ) brea
bec0: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 63 6e 74  k;.      for(cnt
bed0: 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48 61 73 68  =0, x=sqliteHash
bee0: 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b  First(pTbls); x;
bef0: 20 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   x=sqliteHashNex
bf00: 74 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(x)){.        T
bf10: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
bf20: 69 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a  iteHashData(x);.
bf30: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
bf40: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Idx;.        if(
bf50: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
bf60: 29 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d  ) aRoot[cnt++] =
bf70: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pTab->tnum;.   
bf80: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
bf90: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
bfa0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
bfb0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  xt){.          a
bfc0: 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d 20 70 49  Root[cnt++] = pI
bfd0: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
bfe0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bff0: 20 20 61 52 6f 6f 74 5b 63 6e 74 5d 20 3d 20 30    aRoot[cnt] = 0
c000: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ;..      /* Make
c010: 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
c020: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   number of regis
c030: 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  ters have been a
c040: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
c050: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
c060: 20 4d 41 58 28 20 70 50 61 72 73 65 2d 3e 6e 4d   MAX( pParse->nM
c070: 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29 3b 0a 0a  em, 8+mxIdx );..
c080: 20 20 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20        /* Do the 
c090: 62 2d 74 72 65 65 20 69 6e 74 65 67 72 69 74 79  b-tree integrity
c0a0: 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20 20 20 20   checks */.     
c0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c0c0: 70 34 28 76 2c 20 4f 50 5f 49 6e 74 65 67 72 69  p4(v, OP_Integri
c0d0: 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c 20 31 2c  tyCk, 2, cnt, 1,
c0e0: 20 28 63 68 61 72 2a 29 61 52 6f 6f 74 2c 50 34   (char*)aRoot,P4
c0f0: 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 20 20  _INTARRAY);.    
c100: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
c110: 6e 67 65 50 35 28 76 2c 20 28 75 38 29 69 29 3b  ngeP5(v, (u8)i);
c120: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
c130: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c140: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32 29  v, OP_IsNull, 2)
c150: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
c160: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c170: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
c180: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20  _String8, 0, 3, 
c190: 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  0,.         sqli
c1a0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
c1b0: 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20  *** in database 
c1c0: 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e 61  %s ***\n", db->a
c1d0: 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 29 2c  Db[i].zDbSName),
c1e0: 0a 20 20 20 20 20 20 20 20 20 50 34 5f 44 59 4e  .         P4_DYN
c1f0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  AMIC);.      sql
c200: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c210: 2c 20 4f 50 5f 4d 6f 76 65 2c 20 32 2c 20 34 2c  , OP_Move, 2, 4,
c220: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
c230: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c240: 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c  OP_Concat, 4, 3,
c250: 20 32 29 3b 0a 20 20 20 20 20 20 69 6e 74 65 67   2);.      integ
c260: 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52  rityCheckResultR
c270: 6f 77 28 76 2c 20 32 29 3b 0a 20 20 20 20 20 20  ow(v, 2);.      
c280: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c290: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20  ere(v, addr);.. 
c2a0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
c2b0: 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63 65  e all the indice
c2c0: 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74 65  s are constructe
c2d0: 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20  d correctly..   
c2e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
c2f0: 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  x=sqliteHashFirs
c300: 74 28 70 54 62 6c 73 29 3b 20 78 3b 20 78 3d 73  t(pTbls); x; x=s
c310: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29  qliteHashNext(x)
c320: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
c330: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
c340: 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20  ashData(x);.    
c350: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c      Index *pIdx,
c360: 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20 20 49   *pPk;.        I
c370: 6e 64 65 78 20 2a 70 50 72 69 6f 72 20 3d 20 30  ndex *pPrior = 0
c380: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 6f  ;.        int lo
c390: 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  opTop;.        i
c3a0: 6e 74 20 69 44 61 74 61 43 75 72 2c 20 69 49 64  nt iDataCur, iId
c3b0: 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  xCur;.        in
c3c0: 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20 20 20  t r1 = -1;..    
c3d0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
c3e0: 75 6d 3c 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  um<1 ) continue;
c3f0: 20 20 2f 2a 20 53 6b 69 70 20 56 49 45 57 73 20    /* Skip VIEWs 
c400: 6f 72 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  or VIRTUAL TABLE
c410: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
c420: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 3d 3d 30   pTab->pCheck==0
c430: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54  .         && (pT
c440: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
c450: 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 29 3d 3d 30  F_HasNotNull)==0
c460: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54  .         && (pT
c470: 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 7c 7c  ab->pIndex==0 ||
c480: 20 69 73 51 75 69 63 6b 29 0a 20 20 20 20 20 20   isQuick).      
c490: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63    ){.          c
c4a0: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 4e 6f 20  ontinue;  /* No 
c4b0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b  additional check
c4c0: 73 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68 69  s needed for thi
c4d0: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  s table */.     
c4e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 6b     }.        pPk
c4f0: 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61 62   = HasRowid(pTab
c500: 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 50  ) ? 0 : sqlite3P
c510: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
c520: 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Tab);.        sq
c530: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
c540: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
c550: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
c560: 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28  TableAndIndices(
c570: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4f 50  pParse, pTab, OP
c580: 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c 0a 20 20  _OpenRead, 0,.  
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5b0: 20 31 2c 20 30 2c 20 26 69 44 61 74 61 43 75 72   1, 0, &iDataCur
c5c0: 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20  , &iIdxCur);.   
c5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c5e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c5f0: 65 67 65 72 2c 20 30 2c 20 37 29 3b 0a 20 20 20  eger, 0, 7);.   
c600: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
c610: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
c620: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
c630: 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20  ->pNext, j++){. 
c640: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c650: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c660: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 38 2b 6a  _Integer, 0, 8+j
c670: 29 3b 20 2f 2a 20 69 6e 64 65 78 20 65 6e 74 72  ); /* index entr
c680: 69 65 73 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ies counter */. 
c690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c6a0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
c6b0: 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20 29 3b 0a 20 20  >nMem>=8+j );.  
c6c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
c6d0: 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61  lite3NoTempsInRa
c6e0: 6e 67 65 28 70 50 61 72 73 65 2c 31 2c 37 2b 6a  nge(pParse,1,7+j
c6f0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
c700: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c710: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44 61  , OP_Rewind, iDa
c720: 74 61 43 75 72 2c 20 30 29 3b 20 56 64 62 65 43  taCur, 0); VdbeC
c730: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
c740: 20 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73 71      loopTop = sq
c750: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c760: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 37 2c  v, OP_AddImm, 7,
c770: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20   1);.        /* 
c780: 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  Verify that all 
c790: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
c7a0: 20 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54 20   really are NOT 
c7b0: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  NULL */.        
c7c0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
c7d0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
c7e0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72         char *zEr
c7f0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  r;.          int
c800: 20 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20 20 20   jmp2;.         
c810: 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50   if( j==pTab->iP
c820: 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Key ) continue;.
c830: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
c840: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  ab->aCol[j].notN
c850: 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ull==0 ) continu
c860: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e;.          sql
c870: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
c880: 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
c890: 70 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20  pTab, iDataCur, 
c8a0: 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  j, 3);.         
c8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
c8c0: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54  geP5(v, OPFLAG_T
c8d0: 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
c8e0: 20 20 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69       jmp2 = sqli
c8f0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c900: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b   OP_NotNull, 3);
c910: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c920: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 72 72  ;.          zErr
c930: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
c940: 66 28 64 62 2c 20 22 4e 55 4c 4c 20 76 61 6c 75  f(db, "NULL valu
c950: 65 20 69 6e 20 25 73 2e 25 73 22 2c 20 70 54 61  e in %s.%s", pTa
c960: 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
c990: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
c9a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c9b0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
c9c0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30  String8, 0, 3, 0
c9d0: 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d  , zErr, P4_DYNAM
c9e0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  IC);.          i
c9f0: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73  ntegrityCheckRes
ca00: 75 6c 74 52 6f 77 28 76 2c 20 33 29 3b 0a 20 20  ultRow(v, 3);.  
ca10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ca20: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
ca30: 6d 70 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mp2);.        }.
ca40: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
ca50: 79 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  y CHECK constrai
ca60: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
ca70: 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20  f( pTab->pCheck 
ca80: 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
ca90: 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43 68 65  SQLITE_IgnoreChe
caa0: 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  cks)==0 ){.     
cab0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
cac0: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
cad0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
cae0: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 30 29 3b  Tab->pCheck, 0);
caf0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
cb00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
cb10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
cb20: 20 20 69 6e 74 20 61 64 64 72 43 6b 46 61 75 6c    int addrCkFaul
cb30: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
cb40: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
cb50: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64           int add
cb60: 72 43 6b 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  rCkOk = sqlite3V
cb70: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
cb80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
cb90: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20  r *zErr;.       
cba0: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
cbb0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
cbc0: 69 53 65 6c 66 54 61 62 20 3d 20 69 44 61 74 61  iSelfTab = iData
cbd0: 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Cur;.           
cbe0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
cbf0: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
cc00: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
cc10: 3d 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 2d 31  =pCheck->nExpr-1
cc20: 3b 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20  ; k>0; k--){.   
cc30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
cc40: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
cc50: 61 72 73 65 2c 20 70 43 68 65 63 6b 2d 3e 61 5b  arse, pCheck->a[
cc60: 6b 5d 2e 70 45 78 70 72 2c 20 61 64 64 72 43 6b  k].pExpr, addrCk
cc70: 46 61 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  Fault, 0);.     
cc80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cc90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cca0: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
ccb0: 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70 45 78 70  Check->a[0].pExp
ccc0: 72 2c 20 61 64 64 72 43 6b 4f 6b 2c 20 0a 20 20  r, addrCkOk, .  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
cce0: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
ccf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
cd00: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
cd10: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 46  Label(v, addrCkF
cd20: 61 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ault);.         
cd30: 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65     zErr = sqlite
cd40: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 48  3MPrintf(db, "CH
cd50: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  ECK constraint f
cd60: 61 69 6c 65 64 20 69 6e 20 25 73 22 2c 0a 20 20  ailed in %s",.  
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
cd80: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
cd90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cda0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
cdb0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30  String8, 0, 3, 0
cdc0: 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d  , zErr, P4_DYNAM
cdd0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
cde0: 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52   integrityCheckR
cdf0: 65 73 75 6c 74 52 6f 77 28 76 2c 20 33 29 3b 0a  esultRow(v, 3);.
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ce10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ce20: 62 65 6c 28 76 2c 20 61 64 64 72 43 6b 4f 6b 29  bel(v, addrCkOk)
ce30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
ce40: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
ce50: 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
ce60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ce70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ce80: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 68 65 63  Delete(db, pChec
ce90: 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  k);.        }.  
cea0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74        /* Validat
ceb0: 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  e index entries 
cec0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
ced0: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  row */.        f
cee0: 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61  or(j=0, pIdx=pTa
cef0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
cf00: 26 26 20 21 69 73 51 75 69 63 6b 3b 20 70 49 64  && !isQuick; pId
cf10: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
cf20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
cf30: 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33 2c 20 6a  nt jmp2, jmp3, j
cf40: 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20 20 20 20  mp4, jmp5;.     
cf50: 20 20 20 20 20 69 6e 74 20 63 6b 55 6e 69 71 20       int ckUniq 
cf60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
cf70: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
cf80: 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49       if( pPk==pI
cf90: 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  dx ) continue;. 
cfa0: 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
cfb0: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
cfc0: 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
cfd0: 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c  dx, iDataCur, 0,
cfe0: 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20 20 20 20   0, &jmp3,.     
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 20 20 70 50 72 69 6f 72 2c 20 72 31 29 3b 0a 20    pPrior, r1);. 
d020: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
d030: 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
d040: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d050: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
d060: 2c 20 38 2b 6a 2c 20 31 29 3b 20 20 2f 2a 20 69  , 8+j, 1);  /* i
d070: 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72 79 20 63  ncrement entry c
d080: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ount */.        
d090: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
d0a0: 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
d0b0: 65 78 69 73 74 73 20 66 6f 72 20 74 68 65 20 63  exists for the c
d0c0: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 72 6f 77  urrent table row
d0d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6a 6d   */.          jm
d0e0: 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
d0f0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
d100: 46 6f 75 6e 64 2c 20 69 49 64 78 43 75 72 2b 6a  Found, iIdxCur+j
d110: 2c 20 63 6b 55 6e 69 71 2c 20 72 31 2c 0a 20 20  , ckUniq, r1,.  
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d      pIdx->nColum
d150: 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  n); VdbeCoverage
d160: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
d170: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
d180: 72 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77 20  ring(v, 3, "row 
d190: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ");.          sq
d1a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d1b0: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37 2c  v, OP_Concat, 7,
d1c0: 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   3, 3);.        
d1d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
d1e0: 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 22 20  dString(v, 4, " 
d1f0: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64  missing from ind
d200: 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ex ");.         
d210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d220: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
d230: 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20   4, 3, 3);.     
d240: 20 20 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c 69       jmp5 = sqli
d250: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
d260: 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a 4e  g(v, 4, pIdx->zN
d270: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
d280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d290: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
d2a0: 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20  4, 3, 3);.      
d2b0: 20 20 20 20 6a 6d 70 34 20 3d 20 69 6e 74 65 67      jmp4 = integ
d2c0: 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74 52  rityCheckResultR
d2d0: 6f 77 28 76 2c 20 33 29 3b 0a 20 20 20 20 20 20  ow(v, 3);.      
d2e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d2f0: 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29  umpHere(v, jmp2)
d300: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;.          /* F
d310: 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 65  or UNIQUE indexe
d320: 73 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 6f  s, verify that o
d330: 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79 20 65 78  nly one entry ex
d340: 69 73 74 73 20 77 69 74 68 20 74 68 65 0a 20 20  ists with the.  
d350: 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65          ** curre
d360: 6e 74 20 6b 65 79 2e 20 20 54 68 65 20 65 6e 74  nt key.  The ent
d370: 72 79 20 69 73 20 75 6e 69 71 75 65 20 69 66 20  ry is unique if 
d380: 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69  (1) any column i
d390: 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20  s NULL.         
d3a0: 20 2a 2a 20 6f 72 20 28 32 29 20 74 68 65 20 6e   ** or (2) the n
d3b0: 65 78 74 20 65 6e 74 72 79 20 68 61 73 20 61 20  ext entry has a 
d3c0: 64 69 66 66 65 72 65 6e 74 20 6b 65 79 20 2a 2f  different key */
d3d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
d3e0: 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
d3f0: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x) ){.          
d400: 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20 3d 20 73    int uniqOk = s
d410: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d420: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
d430: 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b 0a 20 20      int jmp6;.  
d440: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 6b            int kk
d450: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
d460: 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49 64 78 2d  r(kk=0; kk<pIdx-
d470: 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b 2b 29 7b  >nKeyCol; kk++){
d480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
d490: 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt iCol = pIdx->
d4a0: 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b 0a 20 20  aiColumn[kk];.  
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
d4c0: 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f 52 4f 57  rt( iCol!=XN_ROW
d4d0: 49 44 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  ID && iCol<pTab-
d4e0: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20  >nCol );.       
d4f0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
d500: 3d 30 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c  =0 && pTab->aCol
d510: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
d520: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d530: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d540: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d550: 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b 6b 2c 20  _IsNull, r1+kk, 
d560: 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20  uniqOk);.       
d570: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
d580: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
d590: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d5a0: 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69 74 65 33    jmp6 = sqlite3
d5b0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d5c0: 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2b 6a  _Next, iIdxCur+j
d5d0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
d5e0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
d5f0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
d600: 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20  v, uniqOk);.    
d610: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d620: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
d630: 6d 70 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mp6);.          
d640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d650: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
d660: 47 54 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20 75  GT, iIdxCur+j, u
d670: 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20 20 20 20  niqOk, r1,.     
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
d6a0: 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
d6b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
d6c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d6d0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
d6e0: 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69 71 75 65  , 3, "non-unique
d6f0: 20 65 6e 74 72 79 20 69 6e 20 69 6e 64 65 78 20   entry in index 
d700: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
d710: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
d720: 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20 20 20 20  v, jmp5);.      
d730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d740: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d750: 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20 20 20   uniqOk);.      
d760: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d770: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d780: 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b 0a 20 20  ere(v, jmp4);.  
d790: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
d7a0: 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
d7b0: 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d 70 33 29  el(pParse, jmp3)
d7c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d7d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d7e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
d7f0: 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 6f 6f 70  , iDataCur, loop
d800: 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Top); VdbeCovera
d810: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
d820: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
d830: 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 2d 31 29  re(v, loopTop-1)
d840: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
d850: 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
d860: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
d870: 51 75 69 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Quick ){.       
d880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
d890: 61 64 53 74 72 69 6e 67 28 76 2c 20 32 2c 20 22  adString(v, 2, "
d8a0: 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72 69  wrong # of entri
d8b0: 65 73 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a  es in index ");.
d8c0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
d8d0: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
d8e0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
d8f0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
d900: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
d910: 69 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20  if( pPk==pIdx ) 
d920: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d940: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
d950: 75 6e 74 2c 20 69 49 64 78 43 75 72 2b 6a 2c 20  unt, iIdxCur+j, 
d960: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
d970: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d980: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
d990: 71 2c 20 38 2b 6a 2c 20 30 2c 20 33 29 3b 20 56  q, 8+j, 0, 3); V
d9a0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d9c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
d9d0: 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c  v, SQLITE_NOTNUL
d9e0: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  L);.            
d9f0: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
da00: 74 72 69 6e 67 28 76 2c 20 33 2c 20 70 49 64 78  tring(v, 3, pIdx
da10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
da20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
da30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
da40: 6e 63 61 74 2c 20 33 2c 20 32 2c 20 37 29 3b 0a  ncat, 3, 2, 7);.
da50: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
da60: 67 72 69 74 79 43 68 65 63 6b 52 65 73 75 6c 74  grityCheckResult
da70: 52 6f 77 28 76 2c 20 37 29 3b 0a 20 20 20 20 20  Row(v, 7);.     
da80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
da90: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
daa0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dr);.          }
dab0: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
dac0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
dad0: 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20  _BTREECOUNT */. 
dae0: 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20       } .    }.  
daf0: 20 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63    {.      static
db00: 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d   const int iLn =
db10: 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e   VDBE_OFFSET_LIN
db20: 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20 20 73 74  ENO(2);.      st
db30: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
db40: 70 4c 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20  pList endCode[] 
db50: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
db60: 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c  _AddImm,      1,
db70: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
db80: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
db90: 20 20 7b 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f    { OP_IfNotZero
dba0: 2c 20 20 20 31 2c 20 34 2c 20 20 20 20 20 20 20  ,   1, 4,       
dbb0: 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a   0},    /* 1 */.
dbc0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72          { OP_Str
dbd0: 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20  ing8,     0, 3, 
dbe0: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
dbf0: 20 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20   2 */.        { 
dc00: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20  OP_ResultRow,   
dc10: 33 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  3, 1,        0},
dc20: 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20      /* 3 */.    
dc30: 20 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f    };.      VdbeO
dc40: 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20 20 20 61  p *aOp;..      a
dc50: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
dc60: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
dc70: 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c  aySize(endCode),
dc80: 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e 29 3b 0a   endCode, iLn);.
dc90: 20 20 20 20 20 20 69 66 28 20 61 4f 70 20 29 7b        if( aOp ){
dca0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e  .        aOp[0].
dcb0: 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b 0a 20 20  p2 = 1-mxErr;.  
dcc0: 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e 70 34 74        aOp[2].p4t
dcd0: 79 70 65 20 3d 20 50 34 5f 53 54 41 54 49 43 3b  ype = P4_STATIC;
dce0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e  .        aOp[2].
dcf0: 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a 20 20 20  p4.z = "ok";.   
dd00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
dd10: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
dd20: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
dd30: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
dd40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
dd50: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a  _OMIT_UTF16.  /*
dd60: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65  .  **   PRAGMA e
dd70: 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50  ncoding.  **   P
dd80: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
dd90: 20 22 75 74 66 2d 38 22 7c 22 75 74 66 2d 31 36   "utf-8"|"utf-16
dda0: 22 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22 75 74  "|"utf-16le"|"ut
ddb0: 66 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a  f-16be".  **.  *
ddc0: 2a 20 49 6e 20 69 74 73 20 66 69 72 73 74 20 66  * In its first f
ddd0: 6f 72 6d 2c 20 74 68 69 73 20 70 72 61 67 6d 61  orm, this pragma
dde0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 65 6e 63   returns the enc
ddf0: 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69  oding of the mai
de00: 6e 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  n.  ** database.
de10: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
de20: 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   is not initiali
de30: 7a 65 64 2c 20 69 74 20 69 73 20 69 6e 69 74 69  zed, it is initi
de40: 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a  alized now..  **
de50: 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
de60: 20 66 6f 72 6d 20 6f 66 20 74 68 69 73 20 70 72   form of this pr
de70: 61 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20  agma is a no-op 
de80: 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  if the main data
de90: 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68  base file.  ** h
dea0: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
deb0: 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  een initialized.
dec0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
ded0: 20 73 65 74 73 20 74 68 65 20 64 65 66 61 75 6c   sets the defaul
dee0: 74 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  t.  ** encoding 
def0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
df00: 64 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  d for the main d
df10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
df20: 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
df30: 69 73 20 63 72 65 61 74 65 64 2e 20 49 66 20 61  is created. If a
df40: 6e 20 65 78 69 73 74 69 6e 67 20 6d 61 69 6e 20  n existing main 
df50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
df60: 20 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20 74 68   opened, then th
df70: 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 74  e.  ** default t
df80: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ext encoding for
df90: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61   the existing da
dfa0: 74 61 62 61 73 65 20 69 73 20 75 73 65 64 2e 0a  tabase is used..
dfb0: 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c    ** .  ** In al
dfc0: 6c 20 63 61 73 65 73 20 6e 65 77 20 64 61 74 61  l cases new data
dfd0: 62 61 73 65 73 20 63 72 65 61 74 65 64 20 75 73  bases created us
dfe0: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
dff0: 6f 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20  ommand are.  ** 
e000: 63 72 65 61 74 65 64 20 74 6f 20 75 73 65 20 74  created to use t
e010: 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20  he same default 
e020: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 73  text encoding as
e030: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e040: 73 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65 20  se. If.  ** the 
e050: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 68 61  main database ha
e060: 73 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74 69  s not been initi
e070: 61 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72  alized and/or cr
e080: 65 61 74 65 64 20 77 68 65 6e 20 41 54 54 41 43  eated when ATTAC
e090: 48 0a 20 20 2a 2a 20 69 73 20 65 78 65 63 75 74  H.  ** is execut
e0a0: 65 64 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65  ed, this is done
e0b0: 20 62 65 66 6f 72 65 20 74 68 65 20 41 54 54 41   before the ATTA
e0c0: 43 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  CH operation..  
e0d0: 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 73  **.  ** In the s
e0e0: 65 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73 20  econd form this 
e0f0: 70 72 61 67 6d 61 20 73 65 74 73 20 74 68 65 20  pragma sets the 
e100: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f  text encoding to
e110: 20 62 65 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a   be used in.  **
e120: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69   new database fi
e130: 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  les created usin
e140: 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  g this database 
e150: 68 61 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e  handle. It is on
e160: 6c 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20 69  ly.  ** useful i
e170: 66 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69  f invoked immedi
e180: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
e190: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 0a  main database i.
e1a0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
e1b0: 54 79 70 5f 45 4e 43 4f 44 49 4e 47 3a 20 7b 0a  Typ_ENCODING: {.
e1c0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
e1d0: 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20   struct EncName 
e1e0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
e1f0: 61 6d 65 3b 0a 20 20 20 20 20 20 75 38 20 65 6e  ame;.      u8 en
e200: 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65  c;.    } encname
e210: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  s[] = {.      { 
e220: 22 55 54 46 38 22 2c 20 20 20 20 20 53 51 4c 49  "UTF8",     SQLI
e230: 54 45 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d  TE_UTF8        }
e240: 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 38  ,.      { "UTF-8
e250: 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46  ",    SQLITE_UTF
e260: 38 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20  8        },  /* 
e270: 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20  Must be element 
e280: 5b 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22  [1] */.      { "
e290: 55 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54  UTF-16le", SQLIT
e2a0: 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c  E_UTF16LE     },
e2b0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65    /* Must be ele
e2c0: 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20  ment [2] */.    
e2d0: 20 20 7b 20 22 55 54 46 2d 31 36 62 65 22 2c 20    { "UTF-16be", 
e2e0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20  SQLITE_UTF16BE  
e2f0: 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62     },  /* Must b
e300: 65 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f  e element [3] */
e310: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 6c  .      { "UTF16l
e320: 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31  e",  SQLITE_UTF1
e330: 36 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  6LE     },.     
e340: 20 7b 20 22 55 54 46 31 36 62 65 22 2c 20 20 53   { "UTF16be",  S
e350: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20  QLITE_UTF16BE   
e360: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54    },.      { "UT
e370: 46 2d 31 36 22 2c 20 20 20 30 20 20 20 20 20 20  F-16",   0      
e380: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f              }, /
e390: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
e3a0: 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20  TIVE */.      { 
e3b0: 22 55 54 46 31 36 22 2c 20 20 20 20 30 20 20 20  "UTF16",    0   
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
e3d0: 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31  , /* SQLITE_UTF1
e3e0: 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20  6NATIVE */.     
e3f0: 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b   { 0, 0 }.    };
e400: 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .    const struc
e410: 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b  t EncName *pEnc;
e420: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
e430: 20 29 7b 20 20 20 20 2f 2a 20 22 50 52 41 47 4d   ){    /* "PRAGM
e440: 41 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20  A encoding" */. 
e450: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e460: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
e470: 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61  e) ) goto pragma
e480: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 61 73 73 65  _out;.      asse
e490: 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c  rt( encnames[SQL
e4a0: 49 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53  ITE_UTF8].enc==S
e4b0: 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20  QLITE_UTF8 );.  
e4c0: 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e      assert( encn
e4d0: 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31  ames[SQLITE_UTF1
e4e0: 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45  6LE].enc==SQLITE
e4f0: 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 20 20  _UTF16LE );.    
e500: 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d    assert( encnam
e510: 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 42  es[SQLITE_UTF16B
e520: 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  E].enc==SQLITE_U
e530: 54 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20 20  TF16BE );.      
e540: 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74  returnSingleText
e550: 28 76 2c 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43  (v, encnames[ENC
e560: 28 70 50 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e  (pParse->db)].zN
e570: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 20 20 20 20 20 20 20 20 2f 2a 20 22 50 52 41 47          /* "PRAG
e5a0: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58  MA encoding = XX
e5b0: 58 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f  X" */.      /* O
e5c0: 6e 6c 79 20 63 68 61 6e 67 65 20 74 68 65 20 76  nly change the v
e5d0: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 2e 65  alue of sqlite.e
e5e0: 6e 63 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nc if the databa
e5f0: 73 65 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74  se handle is not
e600: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  .      ** initia
e610: 6c 69 7a 65 64 2e 20 49 66 20 74 68 65 20 6d 61  lized. If the ma
e620: 69 6e 20 64 61 74 61 62 61 73 65 20 65 78 69 73  in database exis
e630: 74 73 2c 20 74 68 65 20 6e 65 77 20 73 71 6c 69  ts, the new sqli
e640: 74 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20 20  te.enc value.   
e650: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76     ** will be ov
e660: 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 20 74  erwritten when t
e670: 68 65 20 73 63 68 65 6d 61 20 69 73 20 6e 65 78  he schema is nex
e680: 74 20 6c 6f 61 64 65 64 2e 20 49 66 20 69 74 20  t loaded. If it 
e690: 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  does not.      *
e6a0: 2a 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  * already exists
e6b0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 72 65  , it will be cre
e6c0: 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  ated to use the 
e6d0: 6e 65 77 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c  new encoding val
e6e0: 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ue..      */.   
e6f0: 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 20 20     if( .        
e700: 21 28 44 62 48 61 73 50 72 6f 70 65 72 74 79 28  !(DbHasProperty(
e710: 64 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  db, 0, DB_Schema
e720: 4c 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20 20 20  Loaded)) || .   
e730: 20 20 20 20 20 44 62 48 61 73 50 72 6f 70 65 72       DbHasProper
e740: 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70  ty(db, 0, DB_Emp
e750: 74 79 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  ty) .      ){.  
e760: 20 20 20 20 20 20 66 6f 72 28 70 45 6e 63 3d 26        for(pEnc=&
e770: 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e  encnames[0]; pEn
e780: 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b  c->zName; pEnc++
e790: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
e7a0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
e7b0: 6d 70 28 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d  mp(zRight, pEnc-
e7c0: 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  >zName) ){.     
e7d0: 20 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e         SCHEMA_EN
e7e0: 43 28 64 62 29 20 3d 20 45 4e 43 28 64 62 29 20  C(db) = ENC(db) 
e7f0: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
e800: 20 20 70 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45    pEnc->enc ? pE
e810: 6e 63 2d 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45  nc->enc : SQLITE
e820: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
e830: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
e840: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
e860: 66 28 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20  f( !pEnc->zName 
e870: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
e880: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e890: 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65  rse, "unsupporte
e8a0: 64 20 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c  d encoding: %s",
e8b0: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   zRight);.      
e8c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e8d0: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
e8e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e8f0: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
e900: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e910: 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  IT_SCHEMA_VERSIO
e920: 4e 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20  N_PRAGMAS.  /*. 
e930: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
e940: 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f 76 65 72  hema.]schema_ver
e950: 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47  sion.  **   PRAG
e960: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65  MA [schema.]sche
e970: 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e  ma_version = <in
e980: 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a  teger>.  **.  **
e990: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
e9a0: 61 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a  a.]user_version.
e9b0: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
e9c0: 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73  chema.]user_vers
e9d0: 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a  ion = <integer>.
e9e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    **.  **   PRAG
e9f0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 66 72 65 65  MA [schema.]free
ea00: 6c 69 73 74 5f 63 6f 75 6e 74 0a 20 20 2a 2a 0a  list_count.  **.
ea10: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
ea20: 63 68 65 6d 61 2e 5d 64 61 74 61 5f 76 65 72 73  chema.]data_vers
ea30: 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ion.  **.  **   
ea40: 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d  PRAGMA [schema.]
ea50: 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20  application_id. 
ea60: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
ea70: 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f  hema.]applicatio
ea80: 6e 5f 69 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e  n_id = <integer>
ea90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  **.  ** The p
eaa0: 72 61 67 6d 61 27 73 20 73 63 68 65 6d 61 5f 76  ragma's schema_v
eab0: 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f  ersion and user_
eac0: 76 65 72 73 69 6f 6e 20 61 72 65 20 75 73 65 64  version are used
ead0: 20 74 6f 20 73 65 74 20 6f 72 20 67 65 74 0a 20   to set or get. 
eae0: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
eaf0: 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73   the schema-vers
eb00: 69 6f 6e 20 61 6e 64 20 75 73 65 72 2d 76 65 72  ion and user-ver
eb10: 73 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65  sion, respective
eb20: 6c 79 2e 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68  ly. Both.  ** th
eb30: 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e  e schema-version
eb40: 20 61 6e 64 20 74 68 65 20 75 73 65 72 2d 76 65   and the user-ve
eb50: 72 73 69 6f 6e 20 61 72 65 20 33 32 2d 62 69 74  rsion are 32-bit
eb60: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73   signed integers
eb70: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
eb80: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
eb90: 64 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  der..  **.  ** T
eba0: 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  he schema-cookie
ebb0: 20 69 73 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79   is usually only
ebc0: 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 69 6e 74   manipulated int
ebd0: 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74  ernally by SQLit
ebe0: 65 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e  e. It.  ** is in
ebf0: 63 72 65 6d 65 6e 74 65 64 20 62 79 20 53 51 4c  cremented by SQL
ec00: 69 74 65 20 77 68 65 6e 65 76 65 72 20 74 68 65  ite whenever the
ec10: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
ec20: 20 69 73 20 6d 6f 64 69 66 69 65 64 20 28 62 79   is modified (by
ec30: 0a 20 20 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f  .  ** creating o
ec40: 72 20 64 72 6f 70 70 69 6e 67 20 61 20 74 61 62  r dropping a tab
ec50: 6c 65 20 6f 72 20 69 6e 64 65 78 29 2e 20 54 68  le or index). Th
ec60: 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
ec70: 20 69 73 20 75 73 65 64 20 62 79 0a 20 20 2a 2a   is used by.  **
ec80: 20 53 51 4c 69 74 65 20 65 61 63 68 20 74 69 6d   SQLite each tim
ec90: 65 20 61 20 71 75 65 72 79 20 69 73 20 65 78 65  e a query is exe
eca0: 63 75 74 65 64 20 74 6f 20 65 6e 73 75 72 65 20  cuted to ensure 
ecb0: 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61  that the interna
ecc0: 6c 20 63 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20  l cache.  ** of 
ecd0: 74 68 65 20 73 63 68 65 6d 61 20 75 73 65 64 20  the schema used 
ece0: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74  when compiling t
ecf0: 68 65 20 53 51 4c 20 71 75 65 72 79 20 6d 61 74  he SQL query mat
ed00: 63 68 65 73 20 74 68 65 20 73 63 68 65 6d 61 20  ches the schema 
ed10: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  of.  ** the data
ed20: 62 61 73 65 20 61 67 61 69 6e 73 74 20 77 68 69  base against whi
ed30: 63 68 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20  ch the compiled 
ed40: 71 75 65 72 79 20 69 73 20 61 63 74 75 61 6c 6c  query is actuall
ed50: 79 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a  y executed..  **
ed60: 20 53 75 62 76 65 72 74 69 6e 67 20 74 68 69 73   Subverting this
ed70: 20 6d 65 63 68 61 6e 69 73 6d 20 62 79 20 75 73   mechanism by us
ed80: 69 6e 67 20 22 50 52 41 47 4d 41 20 73 63 68 65  ing "PRAGMA sche
ed90: 6d 61 5f 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d  ma_version" to m
eda0: 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73  odify.  ** the s
edb0: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73  chema-version is
edc0: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e   potentially dan
edd0: 67 65 72 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c  gerous and may l
ede0: 65 61 64 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20  ead to program. 
edf0: 20 2a 2a 20 63 72 61 73 68 65 73 20 6f 72 20 64   ** crashes or d
ee00: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
ee10: 6f 6e 2e 20 55 73 65 20 77 69 74 68 20 63 61 75  on. Use with cau
ee20: 74 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion!.  **.  ** 
ee30: 54 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e  The user-version
ee40: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
ee50: 65 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74  ernally by SQLit
ee60: 65 2e 20 49 74 20 6d 61 79 20 62 65 20 75 73 65  e. It may be use
ee70: 64 20 62 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63  d by.  ** applic
ee80: 61 74 69 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70  ations for any p
ee90: 75 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  urpose..  */.  c
eea0: 61 73 65 20 50 72 61 67 54 79 70 5f 48 45 41 44  ase PragTyp_HEAD
eeb0: 45 52 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  ER_VALUE: {.    
eec0: 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50  int iCookie = pP
eed0: 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a  ragma->iArg;  /*
eee0: 20 57 68 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f   Which cookie to
eef0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 2a   read or write *
ef00: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
ef10: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
ef20: 62 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  b);.    if( zRig
ef30: 68 74 20 26 26 20 28 70 50 72 61 67 6d 61 2d 3e  ht && (pPragma->
ef40: 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67 46  mPragFlg & PragF
ef50: 6c 67 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d 30 20  lg_ReadOnly)==0 
ef60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ){.      /* Writ
ef70: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
ef80: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a  cookie value */.
ef90: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
efa0: 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65  st VdbeOpList se
efb0: 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20  tCookie[] = {.  
efc0: 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73        { OP_Trans
efd0: 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 31  action,    0,  1
efe0: 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a  ,  0},    /* 0 *
eff0: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53  /.        { OP_S
f000: 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30  etCookie,      0
f010: 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a  ,  0,  0},    /*
f020: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20   1 */.      };. 
f030: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70       VdbeOp *aOp
f040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f050: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
f060: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
f070: 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65  aySize(setCookie
f080: 29 29 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  ));.      aOp = 
f090: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f0a0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
f0b0: 65 28 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65  e(setCookie), se
f0c0: 74 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  tCookie, 0);.   
f0d0: 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49 46 5f 52     if( ONLY_IF_R
f0e0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 28 61 4f  EALLOC_STRESS(aO
f0f0: 70 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  p==0) ) break;. 
f100: 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70 31 20 3d       aOp[0].p1 =
f110: 20 69 44 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b   iDb;.      aOp[
f120: 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20  1].p1 = iDb;.   
f130: 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20 69     aOp[1].p2 = i
f140: 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 61 4f  Cookie;.      aO
f150: 70 5b 31 5d 2e 70 33 20 3d 20 73 71 6c 69 74 65  p[1].p3 = sqlite
f160: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
f170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f180: 2f 2a 20 52 65 61 64 20 74 68 65 20 73 70 65 63  /* Read the spec
f190: 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c  ified cookie val
f1a0: 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  ue */.      stat
f1b0: 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
f1c0: 69 73 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b 5d  ist readCookie[]
f1d0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f   = {.        { O
f1e0: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20  P_Transaction,  
f1f0: 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20     0,  0,  0},  
f200: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
f210: 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69    { OP_ReadCooki
f220: 65 2c 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20  e,      0,  1,  
f230: 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20  0},    /* 1 */. 
f240: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75         { OP_Resu
f250: 6c 74 52 6f 77 2c 20 20 20 20 20 20 20 31 2c 20  ltRow,       1, 
f260: 20 31 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d 3b   1,  0}.      };
f270: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61  .      VdbeOp *a
f280: 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Op;.      sqlite
f290: 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c  3VdbeVerifyNoMal
f2a0: 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20 41  locRequired(v, A
f2b0: 72 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f  rraySize(readCoo
f2c0: 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70  kie));.      aOp
f2d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f2e0: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
f2f0: 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29  Size(readCookie)
f300: 2c 72 65 61 64 43 6f 6f 6b 69 65 2c 30 29 3b 0a  ,readCookie,0);.
f310: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
f320: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
f330: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
f340: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70  ;.      aOp[0].p
f350: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61  1 = iDb;.      a
f360: 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[1].p1 = iDb;.
f370: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 33 20        aOp[1].p3 
f380: 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  = iCookie;.     
f390: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73   sqlite3VdbeReus
f3a0: 61 62 6c 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  able(v);.    }. 
f3b0: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64   }.  break;.#end
f3c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f3d0: 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  T_SCHEMA_VERSION
f3e0: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
f3f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f400: 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
f410: 49 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  IAGS.  /*.  **  
f420: 20 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c 65 5f   PRAGMA compile_
f430: 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20 20 2a  options.  **.  *
f440: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
f450: 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 69 6c  es of all compil
f460: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 75  e-time options u
f470: 73 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  sed in this buil
f480: 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70 74 69  d,.  ** one opti
f490: 6f 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20 2a 2f  on per row..  */
f4a0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
f4b0: 43 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e 53 3a  COMPILE_OPTIONS:
f4c0: 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30   {.    int i = 0
f4d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f4e0: 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50 61 72   *zOpt;.    pPar
f4f0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20  se->nMem = 1;.  
f500: 20 20 77 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d    while( (zOpt =
f510: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
f520: 6f 70 74 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29  option_get(i++))
f530: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
f540: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
f550: 6e 67 28 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a  ng(v, 1, zOpt);.
f560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f570: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f580: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a  sultRow, 1, 1);.
f590: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f5a0: 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 76 29  3VdbeReusable(v)
f5b0: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  ;.  }.  break;.#
f5c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f5d0: 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
f5e0: 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69 66  ON_DIAGS */..#if
f5f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f600: 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  _WAL.  /*.  **  
f610: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
f620: 5d 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  ]wal_checkpoint 
f630: 3d 20 70 61 73 73 69 76 65 7c 66 75 6c 6c 7c 72  = passive|full|r
f640: 65 73 74 61 72 74 7c 74 72 75 6e 63 61 74 65 0a  estart|truncate.
f650: 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70    **.  ** Checkp
f660: 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  oint the databas
f670: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e..  */.  case P
f680: 72 61 67 54 79 70 5f 57 41 4c 5f 43 48 45 43 4b  ragTyp_WAL_CHECK
f690: 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69 6e 74  POINT: {.    int
f6a0: 20 69 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f   iBt = (pId2->z?
f6b0: 69 44 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41  iDb:SQLITE_MAX_A
f6c0: 54 54 41 43 48 45 44 29 3b 0a 20 20 20 20 69 6e  TTACHED);.    in
f6d0: 74 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  t eMode = SQLITE
f6e0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
f6f0: 49 56 45 3b 0a 20 20 20 20 69 66 28 20 7a 52 69  IVE;.    if( zRi
f700: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ght ){.      if(
f710: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f720: 7a 52 69 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d  zRight, "full")=
f730: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
f740: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45  ode = SQLITE_CHE
f750: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20  CKPOINT_FULL;.  
f760: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
f770: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69  lite3StrICmp(zRi
f780: 67 68 74 2c 20 22 72 65 73 74 61 72 74 22 29 3d  ght, "restart")=
f790: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
f7a0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45  ode = SQLITE_CHE
f7b0: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b  CKPOINT_RESTART;
f7c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f7d0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f7e0: 7a 52 69 67 68 74 2c 20 22 74 72 75 6e 63 61 74  zRight, "truncat
f7f0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
f800: 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45    eMode = SQLITE
f810: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e  _CHECKPOINT_TRUN
f820: 43 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CATE;.      }.  
f830: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
f840: 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 73 71  nMem = 3;.    sq
f850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f860: 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  v, OP_Checkpoint
f870: 2c 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29  , iBt, eMode, 1)
f880: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f890: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f8a0: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a  sultRow, 1, 3);.
f8b0: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20    }.  break;..  
f8c0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
f8d0: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
f8e0: 69 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  int.  **   PRAGM
f8f0: 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  A wal_autocheckp
f900: 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  oint = N.  **.  
f910: 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 20 64  ** Configure a d
f920: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
f930: 6f 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  on to automatica
f940: 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 61  lly checkpoint a
f950: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
f960: 66 74 65 72 20 61 63 63 75 6d 75 6c 61 74 69 6e  fter accumulatin
f970: 67 20 4e 20 66 72 61 6d 65 73 20 69 6e 20 74 68  g N frames in th
f980: 65 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72 79 20  e log. Or query 
f990: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
f9a0: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 4e 2e  value.  ** of N.
f9b0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
f9c0: 67 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43 48 45  gTyp_WAL_AUTOCHE
f9d0: 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 69  CKPOINT: {.    i
f9e0: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
f9f0: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61     sqlite3_wal_a
fa00: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
fa10: 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  , sqlite3Atoi(zR
fa20: 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ight));.    }.  
fa30: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
fa40: 74 28 76 2c 20 0a 20 20 20 20 20 20 20 64 62 2d  t(v, .       db-
fa50: 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d 73  >xWalCallback==s
fa60: 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
fa70: 48 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20 20  Hook ? .        
fa80: 20 20 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f     SQLITE_PTR_TO
fa90: 5f 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72 67  _INT(db->pWalArg
faa0: 29 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72  ) : 0);.  }.  br
fab0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  eak;.#endif..  /
fac0: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73  *.  **  PRAGMA s
fad0: 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20 2a  hrink_memory.  *
fae0: 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
faf0: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34 34  ATION-OF: R-2344
fb00: 35 2d 34 36 31 30 39 20 54 68 69 73 20 70 72 61  5-46109 This pra
fb10: 67 6d 61 20 63 61 75 73 65 73 20 74 68 65 20 64  gma causes the d
fb20: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e  atabase.  ** con
fb30: 6e 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63 68  nection on which
fb40: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 74   it is invoked t
fb50: 6f 20 66 72 65 65 20 75 70 20 61 73 20 6d 75 63  o free up as muc
fb60: 68 20 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a 20  h memory as it. 
fb70: 20 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c 6c   ** can, by call
fb80: 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  ing sqlite3_db_r
fb90: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e  elease_memory().
fba0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
fbb0: 67 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d 4f  gTyp_SHRINK_MEMO
fbc0: 52 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  RY: {.    sqlite
fbd0: 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
fbe0: 6f 72 79 28 64 62 29 3b 0a 20 20 20 20 62 72 65  ory(db);.    bre
fbf0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
fc00: 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70 74 69 6d  **  PRAGMA optim
fc10: 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
fc20: 20 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a   optimize(MASK).
fc30: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68    **  PRAGMA sch
fc40: 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a 20 20 2a  ema.optimize.  *
fc50: 2a 20 20 50 52 41 47 4d 41 20 73 63 68 65 6d 61  *  PRAGMA schema
fc60: 2e 6f 70 74 69 6d 69 7a 65 28 4d 41 53 4b 29 0a  .optimize(MASK).
fc70: 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 74 65 6d 70    **.  ** Attemp
fc80: 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68  t to optimize th
fc90: 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 6c 6c  e database.  All
fca0: 20 73 63 68 65 6d 61 73 20 61 72 65 20 6f 70 74   schemas are opt
fcb0: 69 6d 69 7a 65 64 20 69 6e 20 74 68 65 20 66 69  imized in the fi
fcc0: 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 66 6f 72  rst.  ** two for
fcd0: 6d 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  ms, and only the
fce0: 20 73 70 65 63 69 66 69 65 64 20 73 63 68 65 6d   specified schem
fcf0: 61 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 69  a is optimized i
fd00: 6e 20 74 68 65 20 6c 61 74 74 65 72 20 74 77 6f  n the latter two
fd10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
fd20: 64 65 74 61 69 6c 73 20 6f 66 20 6f 70 74 69 6d  details of optim
fd30: 69 7a 61 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  izations perform
fd40: 65 64 20 62 79 20 74 68 69 73 20 70 72 61 67 6d  ed by this pragm
fd50: 61 20 61 72 65 20 65 78 70 65 63 74 65 64 0a 20  a are expected. 
fd60: 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 61 6e   ** to change an
fd70: 64 20 69 6d 70 72 6f 76 65 20 6f 76 65 72 20 74  d improve over t
fd80: 69 6d 65 2e 20 20 41 70 70 6c 69 63 61 74 69 6f  ime.  Applicatio
fd90: 6e 73 20 73 68 6f 75 6c 64 20 61 6e 74 69 63 69  ns should antici
fda0: 70 61 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74  pate that.  ** t
fdb0: 68 69 73 20 70 72 61 67 6d 61 20 77 69 6c 6c 20  his pragma will 
fdc0: 70 65 72 66 6f 72 6d 20 6e 65 77 20 6f 70 74 69  perform new opti
fdd0: 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 66 75 74  mizations in fut
fde0: 75 72 65 20 72 65 6c 65 61 73 65 73 2e 0a 20 20  ure releases..  
fdf0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 70 74 69  **.  ** The opti
fe00: 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73  onal argument is
fe10: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70   a bitmask of op
fe20: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 70  timizations to p
fe30: 65 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  erform:.  **.  *
fe40: 2a 20 20 20 20 30 78 30 30 30 31 20 20 20 20 44  *    0x0001    D
fe50: 65 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20  ebugging mode.  
fe60: 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  Do not actually 
fe70: 70 65 72 66 6f 72 6d 20 61 6e 79 20 6f 70 74 69  perform any opti
fe80: 6d 69 7a 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 20  mizations.  **  
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20              but 
fea0: 69 6e 73 74 65 61 64 20 72 65 74 75 72 6e 20 6f  instead return o
feb0: 6e 65 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20  ne line of text 
fec0: 66 6f 72 20 65 61 63 68 20 6f 70 74 69 6d 69 7a  for each optimiz
fed0: 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 20  ation.  **      
fee0: 20 20 20 20 20 20 20 20 74 68 61 74 20 77 6f 75          that wou
fef0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 64 6f 6e  ld have been don
ff00: 65 2e 20 20 4f 66 66 20 62 79 20 64 65 66 61 75  e.  Off by defau
ff10: 6c 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  lt..  **.  **   
ff20: 20 30 78 30 30 30 32 20 20 20 20 52 75 6e 20 41   0x0002    Run A
ff30: 4e 41 4c 59 5a 45 20 6f 6e 20 74 61 62 6c 65 73  NALYZE on tables
ff40: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 6e 65   that might bene
ff50: 66 69 74 2e 20 20 4f 6e 20 62 79 20 64 65 66 61  fit.  On by defa
ff60: 75 6c 74 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  ult..  **       
ff70: 20 20 20 20 20 20 20 53 65 65 20 62 65 6c 6f 77         See below
ff80: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
ff90: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
ffa0: 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30 30 34  *.  **    0x0004
ffb0: 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69 6d 70      (Not yet imp
ffc0: 6c 65 6d 65 6e 74 65 64 29 20 52 65 63 6f 72 64  lemented) Record
ffd0: 20 75 73 61 67 65 20 61 6e 64 20 70 65 72 66 6f   usage and perfo
ffe0: 72 6d 61 6e 63 65 20 0a 20 20 2a 2a 20 20 20 20  rmance .  **    
fff0: 20 20 20 20 20 20 20 20 20 20 69 6e 66 6f 72 6d            inform
10000 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63  ation from the c
10010 75 72 72 65 6e 74 20 73 65 73 73 69 6f 6e 20 69  urrent session i
10020 6e 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  n the.  **      
10030 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
10040 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
10050 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62   will be availab
10060 6c 65 20 74 6f 20 22 6f 70 74 69 6d 69 7a 65 22  le to "optimize"
10070 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
10080 20 20 20 70 72 61 67 6d 61 73 20 72 75 6e 20 62     pragmas run b
10090 79 20 66 75 74 75 72 65 20 64 61 74 61 62 61 73  y future databas
100a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  e connections.. 
100b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30 30   **.  **    0x00
100c0 30 38 20 20 20 20 28 4e 6f 74 20 79 65 74 20 69  08    (Not yet i
100d0 6d 70 6c 65 6d 65 6e 74 65 64 29 20 43 72 65 61  mplemented) Crea
100e0 74 65 20 69 6e 64 65 78 65 73 20 74 68 61 74 20  te indexes that 
100f0 6d 69 67 68 74 20 68 61 76 65 0a 20 20 2a 2a 20  might have.  ** 
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65               bee
10110 6e 20 68 65 6c 70 66 75 6c 20 74 6f 20 72 65 63  n helpful to rec
10120 65 6e 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a  ent queries.  **
10130 0a 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  .  ** The defaul
10140 74 20 4d 41 53 4b 20 69 73 20 61 6e 64 20 61 6c  t MASK is and al
10150 77 61 79 73 20 73 68 61 6c 6c 20 62 65 20 30 78  ways shall be 0x
10160 66 66 66 65 2e 20 20 30 78 66 66 66 65 20 6d 65  fffe.  0xfffe me
10170 61 6e 73 20 70 65 72 66 6f 72 6d 20 61 6c 6c 20  ans perform all 
10180 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74     ** of the opt
10190 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 73 74 65  imizations liste
101a0 64 20 61 62 6f 76 65 20 65 78 63 65 70 74 20 44  d above except D
101b0 65 62 75 67 20 4d 6f 64 65 2c 20 69 6e 63 6c 75  ebug Mode, inclu
101c0 64 69 6e 67 20 6e 65 77 0a 20 20 2a 2a 20 6f 70  ding new.  ** op
101d0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61 74  timizations that
101e0 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
101f0 65 6e 20 69 6e 76 65 6e 74 65 64 2e 20 20 49 66  en invented.  If
10200 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f   new optimizatio
10210 6e 73 20 61 72 65 0a 20 20 2a 2a 20 65 76 65 72  ns are.  ** ever
10220 20 61 64 64 65 64 20 74 68 61 74 20 73 68 6f 75   added that shou
10230 6c 64 20 62 65 20 6f 66 66 20 62 79 20 64 65 66  ld be off by def
10240 61 75 6c 74 2c 20 74 68 6f 73 65 20 6f 66 66 2d  ault, those off-
10250 62 79 2d 64 65 66 61 75 6c 74 20 0a 20 20 2a 2a  by-default .  **
10260 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
10270 69 6c 6c 20 68 61 76 65 20 62 69 74 6d 61 73 6b  ill have bitmask
10280 73 20 6f 66 20 30 78 31 30 30 30 30 20 6f 72 20  s of 0x10000 or 
10290 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  larger..  **.  *
102a0 2a 20 44 45 54 45 52 4d 49 4e 41 54 49 4f 4e 20  * DETERMINATION 
102b0 4f 46 20 57 48 45 4e 20 54 4f 20 52 55 4e 20 41  OF WHEN TO RUN A
102c0 4e 41 4c 59 5a 45 0a 20 20 2a 2a 0a 20 20 2a 2a  NALYZE.  **.  **
102d0 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
102e0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
102f0 61 20 74 61 62 6c 65 20 69 73 20 61 6e 61 6c 79  a table is analy
10300 7a 65 64 20 69 66 20 6f 6e 6c 79 20 69 66 20 61  zed if only if a
10310 6c 6c 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66  ll of.  ** the f
10320 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
10330 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 29  e:.  **.  ** (1)
10340 20 4d 41 53 4b 20 62 69 74 20 30 78 30 32 20 69   MASK bit 0x02 i
10350 73 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  s set..  **.  **
10360 20 28 32 29 20 54 68 65 20 71 75 65 72 79 20 70   (2) The query p
10370 6c 61 6e 6e 65 72 20 75 73 65 64 20 73 71 6c 69  lanner used sqli
10380 74 65 5f 73 74 61 74 31 2d 73 74 79 6c 65 20 73  te_stat1-style s
10390 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 6f 6e  tatistics for on
103a0 65 20 6f 72 0a 20 20 2a 2a 20 20 20 20 20 6d 6f  e or.  **     mo
103b0 72 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 68  re indexes of th
103c0 65 20 74 61 62 6c 65 20 61 74 20 73 6f 6d 65 20  e table at some 
103d0 70 6f 69 6e 74 20 64 75 72 69 6e 67 20 74 68 65  point during the
103e0 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 20 20 2a   lifetime of.  *
103f0 2a 20 20 20 20 20 74 68 65 20 63 75 72 72 65 6e  *     the curren
10400 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  t connection..  
10410 2a 2a 0a 20 20 2a 2a 20 28 33 29 20 4f 6e 65 20  **.  ** (3) One 
10420 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
10430 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  of the table are
10440 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 61 6e 61   currently unana
10450 6c 79 7a 65 64 20 4f 52 0a 20 20 2a 2a 20 20 20  lyzed OR.  **   
10460 20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    the number of 
10470 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
10480 65 20 68 61 73 20 69 6e 63 72 65 61 73 65 64 20  e has increased 
10490 62 79 20 32 35 20 74 69 6d 65 73 20 6f 72 20 6d  by 25 times or m
104a0 6f 72 65 0a 20 20 2a 2a 20 20 20 20 20 73 69 6e  ore.  **     sin
104b0 63 65 20 74 68 65 20 6c 61 73 74 20 74 69 6d 65  ce the last time
104c0 20 41 4e 41 4c 59 5a 45 20 77 61 73 20 72 75 6e   ANALYZE was run
104d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
104e0 72 75 6c 65 73 20 66 6f 72 20 77 68 65 6e 20 74  rules for when t
104f0 61 62 6c 65 73 20 61 72 65 20 61 6e 61 6c 79 7a  ables are analyz
10500 65 64 20 61 72 65 20 6c 69 6b 65 6c 79 20 74 6f  ed are likely to
10510 20 63 68 61 6e 67 65 20 69 6e 0a 20 20 2a 2a 20   change in.  ** 
10520 66 75 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e  future releases.
10530 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
10540 67 54 79 70 5f 4f 50 54 49 4d 49 5a 45 3a 20 7b  gTyp_OPTIMIZE: {
10550 0a 20 20 20 20 69 6e 74 20 69 44 62 4c 61 73 74  .    int iDbLast
10560 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
10570 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
10580 70 6f 69 6e 74 20 66 6f 72 20 74 68 65 20 73 63  point for the sc
10590 68 65 6d 61 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  hema loop */.   
105a0 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20   int iTabCur;   
105b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
105c0 72 20 66 6f 72 20 61 20 74 61 62 6c 65 20 77 68  r for a table wh
105d0 6f 73 65 20 73 69 7a 65 20 6e 65 65 64 73 20 63  ose size needs c
105e0 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 48  hecking */.    H
105f0 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
10600 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76        /* Loop ov
10610 65 72 20 74 61 62 6c 65 73 20 6f 66 20 61 20 73  er tables of a s
10620 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 53 63 68  chema */.    Sch
10630 65 6d 61 20 2a 70 53 63 68 65 6d 61 3b 20 20 20  ema *pSchema;   
10640 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
10650 6e 74 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  nt schema */.   
10660 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
10670 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
10680 6c 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  le in the schema
10690 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
106a0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
106b0 2a 20 41 6e 20 69 6e 64 65 78 20 6f 66 20 74 68  * An index of th
106c0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4c  e table */.    L
106d0 6f 67 45 73 74 20 73 7a 54 68 72 65 73 68 6f 6c  ogEst szThreshol
106e0 64 3b 20 20 20 20 2f 2a 20 53 69 7a 65 20 74 68  d;    /* Size th
106f0 72 65 73 68 6f 6c 64 20 61 62 6f 76 65 20 77 68  reshold above wh
10700 69 63 68 20 72 65 61 6e 61 6c 79 73 69 73 20 69  ich reanalysis i
10710 73 20 6e 65 65 64 64 20 2a 2f 0a 20 20 20 20 63  s needd */.    c
10720 68 61 72 20 2a 7a 53 75 62 53 71 6c 3b 20 20 20  har *zSubSql;   
10730 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
10740 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 4f  tement for the O
10750 50 5f 53 71 6c 45 78 65 63 20 6f 70 63 6f 64 65  P_SqlExec opcode
10760 20 2a 2f 0a 20 20 20 20 75 33 32 20 6f 70 4d 61   */.    u32 opMa
10770 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
10780 2a 20 4d 61 73 6b 20 6f 66 20 6f 70 65 72 61 74  * Mask of operat
10790 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f 72 6d 20  ions to perform 
107a0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a 52 69 67  */..    if( zRig
107b0 68 74 20 29 7b 0a 20 20 20 20 20 20 6f 70 4d 61  ht ){.      opMa
107c0 73 6b 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65  sk = (u32)sqlite
107d0 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
107e0 20 20 20 20 20 69 66 28 20 28 6f 70 4d 61 73 6b       if( (opMask
107f0 20 26 20 30 78 30 32 29 3d 3d 30 20 29 20 62 72   & 0x02)==0 ) br
10800 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
10810 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 30        opMask = 0
10820 78 66 66 66 65 3b 0a 20 20 20 20 7d 0a 20 20 20  xfffe;.    }.   
10830 20 69 54 61 62 43 75 72 20 3d 20 70 50 61 72 73   iTabCur = pPars
10840 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 66  e->nTab++;.    f
10850 6f 72 28 69 44 62 4c 61 73 74 20 3d 20 7a 44 62  or(iDbLast = zDb
10860 3f 69 44 62 3a 64 62 2d 3e 6e 44 62 2d 31 3b 20  ?iDb:db->nDb-1; 
10870 69 44 62 3c 3d 69 44 62 4c 61 73 74 3b 20 69 44  iDb<=iDbLast; iD
10880 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b++){.      if( 
10890 69 44 62 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  iDb==1 ) continu
108a0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
108b0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
108c0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
108d0 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 64       pSchema = d
108e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
108f0 65 6d 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ema;.      for(k
10900 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
10910 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  (&pSchema->tblHa
10920 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  sh); k; k=sqlite
10930 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
10940 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
10950 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
10960 61 74 61 28 6b 29 3b 0a 0a 20 20 20 20 20 20 20  ata(k);..       
10970 20 2f 2a 20 49 66 20 74 61 62 6c 65 20 70 54 61   /* If table pTa
10980 62 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 75  b has not been u
10990 73 65 64 20 69 6e 20 61 20 77 61 79 20 74 68 61  sed in a way tha
109a0 74 20 77 6f 75 6c 64 20 62 65 6e 65 66 69 74 20  t would benefit 
109b0 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20  from.        ** 
109c0 68 61 76 69 6e 67 20 61 6e 61 6c 79 73 69 73 20  having analysis 
109d0 73 74 61 74 69 73 74 69 63 73 20 64 75 72 69 6e  statistics durin
109e0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
109f0 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 6b 69 70  ssion, then skip
10a00 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20   it..        ** 
10a10 54 68 69 73 20 61 6c 73 6f 20 68 61 73 20 74 68  This also has th
10a20 65 20 65 66 66 65 63 74 20 6f 66 20 73 6b 69 70  e effect of skip
10a30 70 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62  ping virtual tab
10a40 6c 65 73 20 61 6e 64 20 76 69 65 77 73 20 2a 2f  les and views */
10a50 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
10a60 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
10a70 46 5f 53 74 61 74 73 55 73 65 64 29 3d 3d 30 20  F_StatsUsed)==0 
10a80 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
10a90 20 20 20 20 20 2f 2a 20 52 65 61 6e 61 6c 79 7a       /* Reanalyz
10aa0 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  e if the table i
10ab0 73 20 32 35 20 74 69 6d 65 73 20 6c 61 72 67 65  s 25 times large
10ac0 72 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20  r than the last 
10ad0 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20  analysis */.    
10ae0 20 20 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20      szThreshold 
10af0 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
10b00 73 74 20 2b 20 34 36 3b 20 61 73 73 65 72 74 28  st + 46; assert(
10b10 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32   sqlite3LogEst(2
10b20 35 29 3d 3d 34 36 20 29 3b 0a 20 20 20 20 20 20  5)==46 );.      
10b30 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
10b40 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
10b50 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
10b60 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
10b70 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20  !pIdx->hasStat1 
10b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
10b90 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20 30 3b 20  zThreshold = 0; 
10ba0 2f 2a 20 41 6c 77 61 79 73 20 61 6e 61 6c 79 7a  /* Always analyz
10bb0 65 20 69 66 20 61 6e 79 20 69 6e 64 65 78 20 6c  e if any index l
10bc0 61 63 6b 73 20 73 74 61 74 69 73 74 69 63 73 20  acks statistics 
10bd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
10be0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
10bf0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
10c00 20 20 20 20 69 66 28 20 73 7a 54 68 72 65 73 68      if( szThresh
10c10 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  old ){.         
10c20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
10c30 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 43 75  e(pParse, iTabCu
10c40 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  r, iDb, pTab, OP
10c50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
10c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10c70 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
10c80 53 6d 61 6c 6c 65 72 2c 20 69 54 61 62 43 75 72  Smaller, iTabCur
10c90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10cb0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10cc0 64 72 28 76 29 2b 32 2b 28 6f 70 4d 61 73 6b 26  dr(v)+2+(opMask&
10cd0 31 29 2c 20 73 7a 54 68 72 65 73 68 6f 6c 64 29  1), szThreshold)
10ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
10cf0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
10d10 53 75 62 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  SubSql = sqlite3
10d20 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 41 4e 41  MPrintf(db, "ANA
10d30 4c 59 5a 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77  LYZE \"%w\".\"%w
10d40 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
10d70 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61  b].zDbSName, pTa
10d80 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
10d90 20 20 20 69 66 28 20 6f 70 4d 61 73 6b 20 26 20     if( opMask & 
10da0 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20  0x01 ){.        
10db0 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
10dc0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
10dd0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
10de0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10df0 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
10e00 20 30 2c 20 72 31 2c 20 30 2c 20 7a 53 75 62 53   0, r1, 0, zSubS
10e10 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ql, P4_DYNAMIC);
10e20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10e30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10e40 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 31  OP_ResultRow, r1
10e50 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
10e60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
10e70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10e80 28 76 2c 20 4f 50 5f 53 71 6c 45 78 65 63 2c 20  (v, OP_SqlExec, 
10e90 30 2c 20 30 2c 20 30 2c 20 7a 53 75 62 53 71 6c  0, 0, 0, zSubSql
10ea0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
10eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10ec0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10ed0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
10ee0 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20  OP_Expire);.    
10ef0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10f00 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62  .  **   PRAGMA b
10f10 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a 2a  usy_timeout.  **
10f20 20 20 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74     PRAGMA busy_t
10f30 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a  imeout = N.  **.
10f40 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65    ** Call sqlite
10f50 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64  3_busy_timeout(d
10f60 62 2c 20 4e 29 2e 20 20 52 65 74 75 72 6e 20 74  b, N).  Return t
10f70 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 6f  he current timeo
10f80 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 66  ut value.  ** if
10f90 20 6f 6e 65 20 69 73 20 73 65 74 2e 20 20 49 66   one is set.  If
10fa0 20 6e 6f 20 62 75 73 79 20 68 61 6e 64 6c 65 72   no busy handler
10fb0 20 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20   or a different 
10fc0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 69 73 20  busy handler is 
10fd0 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30 20  set.  ** then 0 
10fe0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 53 65  is returned.  Se
10ff0 74 74 69 6e 67 20 74 68 65 20 62 75 73 79 5f 74  tting the busy_t
11000 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f 72 20 6e  imeout to 0 or n
11010 65 67 61 74 69 76 65 0a 20 20 2a 2a 20 64 69 73  egative.  ** dis
11020 61 62 6c 65 73 20 74 68 65 20 74 69 6d 65 6f 75  ables the timeou
11030 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73 65  t..  */.  /*case
11040 20 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49   PragTyp_BUSY_TI
11050 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74 3a  MEOUT*/ default:
11060 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   {.    assert( p
11070 50 72 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70  Pragma->ePragTyp
11080 3d 3d 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54  ==PragTyp_BUSY_T
11090 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20 20 69 66  IMEOUT );.    if
110a0 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
110b0 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
110c0 69 6d 65 6f 75 74 28 64 62 2c 20 73 71 6c 69 74  imeout(db, sqlit
110d0 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b  e3Atoi(zRight));
110e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
110f0 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62  nSingleInt(v, db
11100 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 29 3b 0a  ->busyTimeout);.
11110 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
11120 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
11130 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  MA soft_heap_lim
11140 69 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  it.  **   PRAGMA
11150 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74   soft_heap_limit
11160 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   = N.  **.  ** I
11170 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
11180 3a 20 52 2d 32 36 33 34 33 2d 34 35 39 33 30 20  : R-26343-45930 
11190 54 68 69 73 20 70 72 61 67 6d 61 20 69 6e 76 6f  This pragma invo
111a0 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  kes the.  ** sql
111b0 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
111c0 69 6d 69 74 36 34 28 29 20 69 6e 74 65 72 66 61  imit64() interfa
111d0 63 65 20 77 69 74 68 20 74 68 65 20 61 72 67 75  ce with the argu
111e0 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73 0a  ment N, if N is.
111f0 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61    ** specified a
11200 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61  nd is a non-nega
11210 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20  tive integer..  
11220 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
11230 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30 37  N-OF: R-64451-07
11240 31 36 33 20 54 68 65 20 73 6f 66 74 5f 68 65 61  163 The soft_hea
11250 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61 20 61  p_limit pragma a
11260 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65 74 75 72  lways.  ** retur
11270 6e 73 20 74 68 65 20 73 61 6d 65 20 69 6e 74 65  ns the same inte
11280 67 65 72 20 74 68 61 74 20 77 6f 75 6c 64 20 62  ger that would b
11290 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
112a0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73  e.  ** sqlite3_s
112b0 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34  oft_heap_limit64
112c0 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67 65 20  (-1) C-language 
112d0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
112e0 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 4f   case PragTyp_SO
112f0 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20 7b  FT_HEAP_LIMIT: {
11300 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
11310 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a 52  64 N;.    if( zR
11320 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 33 44  ight && sqlite3D
11330 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69  ecOrHexToI64(zRi
11340 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45  ght, &N)==SQLITE
11350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11360 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
11370 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20 20 7d  imit64(N);.    }
11380 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
11390 65 49 6e 74 28 76 2c 20 73 71 6c 69 74 65 33 5f  eInt(v, sqlite3_
113a0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
113b0 34 28 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61  4(-1));.    brea
113c0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
113d0 2a 20 20 20 50 52 41 47 4d 41 20 74 68 72 65 61  *   PRAGMA threa
113e0 64 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  ds.  **   PRAGMA
113f0 20 74 68 72 65 61 64 73 20 3d 20 4e 0a 20 20 2a   threads = N.  *
11400 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65  *.  ** Configure
11410 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
11420 62 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68  ber of worker th
11430 72 65 61 64 73 2e 20 20 52 65 74 75 72 6e 20 74  reads.  Return t
11440 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78 69  he new.  ** maxi
11450 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69 67 68 74  mum, which might
11460 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 72 65   be less than re
11470 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
11480 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 48 52  case PragTyp_THR
11490 45 41 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c 69  EADS: {.    sqli
114a0 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20  te3_int64 N;.   
114b0 20 69 66 28 20 7a 52 69 67 68 74 0a 20 20 20 20   if( zRight.    
114c0 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72   && sqlite3DecOr
114d0 48 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c  HexToI64(zRight,
114e0 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a   &N)==SQLITE_OK.
114f0 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20 20       && N>=0.   
11500 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11510 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49  3_limit(db, SQLI
11520 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
11530 54 48 52 45 41 44 53 2c 20 28 69 6e 74 29 28 4e  THREADS, (int)(N
11540 26 30 78 37 66 66 66 66 66 66 66 29 29 3b 0a 20  &0x7fffffff));. 
11550 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
11560 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69  ingleInt(v, sqli
11570 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51  te3_limit(db, SQ
11580 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
11590 52 5f 54 48 52 45 41 44 53 2c 20 2d 31 29 29 3b  R_THREADS, -1));
115a0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
115b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
115c0 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
115d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
115e0 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70  T).  /*.  ** Rep
115f0 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  ort the current 
11600 73 74 61 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f  state of file lo
11610 67 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  gs for all datab
11620 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ases.  */.  case
11630 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f 53 54   PragTyp_LOCK_ST
11640 41 54 55 53 3a 20 7b 0a 20 20 20 20 73 74 61 74  ATUS: {.    stat
11650 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
11660 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b  onst azLockName[
11670 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c  ] = {.      "unl
11680 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65 64 22  ocked", "shared"
11690 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20 22 70  , "reserved", "p
116a0 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c 75 73  ending", "exclus
116b0 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ive".    };.    
116c0 69 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73  int i;.    pPars
116d0 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20  e->nMem = 2;.   
116e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
116f0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11700 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20   Btree *pBt;.   
11710 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11720 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e  State = "unknown
11730 22 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  ";.      int j;.
11740 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
11750 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3d 3d 30  b[i].zDbSName==0
11760 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11770 20 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62     pBt = db->aDb
11780 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11790 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c  f( pBt==0 || sql
117a0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
117b0 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Bt)==0 ){.      
117c0 20 20 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f 73    zState = "clos
117d0 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ed";.      }else
117e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6c   if( sqlite3_fil
117f0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20  e_control(db, i 
11800 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62  ? db->aDb[i].zDb
11810 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20 20 20 20  SName : 0, .    
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
11850 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d 3d 53 51  CKSTATE, &j)==SQ
11860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11870 20 20 20 20 7a 53 74 61 74 65 20 3d 20 61 7a 4c      zState = azL
11880 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20  ockName[j];.    
11890 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
118a0 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
118b0 2c 20 31 2c 20 22 73 73 22 2c 20 64 62 2d 3e 61  , 1, "ss", db->a
118c0 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  Db[i].zDbSName, 
118d0 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20  zState);.    }. 
118e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
118f0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
11900 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
11910 63 61 73 65 20 50 72 61 67 54 79 70 5f 4b 45 59  case PragTyp_KEY
11920 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
11930 68 74 20 29 20 73 71 6c 69 74 65 33 5f 6b 65 79  ht ) sqlite3_key
11940 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69  _v2(db, zDb, zRi
11950 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ght, sqlite3Strl
11960 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b 0a 20  en30(zRight));. 
11970 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
11980 63 61 73 65 20 50 72 61 67 54 79 70 5f 52 45 4b  case PragTyp_REK
11990 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  EY: {.    if( zR
119a0 69 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f 72  ight ) sqlite3_r
119b0 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  ekey_v2(db, zDb,
119c0 20 7a 52 69 67 68 74 2c 20 73 71 6c 69 74 65 33   zRight, sqlite3
119d0 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
119e0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
119f0 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  }.  case PragTyp
11a00 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20 20 69  _HEXKEY: {.    i
11a10 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
11a20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20 20     u8 iByte;.   
11a30 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
11a40 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20  char zKey[40];. 
11a50 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42       for(i=0, iB
11a60 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  yte=0; i<sizeof(
11a70 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c 69 74  zKey)*2 && sqlit
11a80 65 33 49 73 78 64 69 67 69 74 28 7a 52 69 67 68  e3Isxdigit(zRigh
11a90 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[i]); i++){.   
11aa0 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69 42       iByte = (iB
11ab0 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65  yte<<4) + sqlite
11ac0 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67 68 74  3HexToInt(zRight
11ad0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [i]);.        if
11ae0 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b 65  ( (i&1)!=0 ) zKe
11af0 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a  y[i/2] = iByte;.
11b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11b10 28 20 28 7a 4c 65 66 74 5b 33 5d 20 26 20 30 78  ( (zLeft[3] & 0x
11b20 66 29 3d 3d 30 78 62 20 29 7b 0a 20 20 20 20 20  f)==0xb ){.     
11b30 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76     sqlite3_key_v
11b40 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c  2(db, zDb, zKey,
11b50 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c   i/2);.      }el
11b60 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
11b70 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c  te3_rekey_v2(db,
11b80 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29   zDb, zKey, i/2)
11b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11ba0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23      break;.  }.#
11bb0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
11bc0 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
11bd0 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  EC) || defined(S
11be0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52  QLITE_ENABLE_CER
11bf0 4f 44 29 0a 20 20 63 61 73 65 20 50 72 61 67 54  OD).  case PragT
11c00 79 70 5f 41 43 54 49 56 41 54 45 5f 45 58 54 45  yp_ACTIVATE_EXTE
11c10 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a 52 69 67  NSIONS: if( zRig
11c20 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ht ){.#ifdef SQL
11c30 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
11c40 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
11c50 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 73  NICmp(zRight, "s
11c60 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  ee-", 4)==0 ){. 
11c70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63 74       sqlite3_act
11c80 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69 67 68  ivate_see(&zRigh
11c90 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  t[4]);.    }.#en
11ca0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
11cb0 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 0a 20  E_ENABLE_CEROD. 
11cc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
11cd0 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  rNICmp(zRight, "
11ce0 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30 20 29  cerod-", 6)==0 )
11cf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11d00 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64 28 26  activate_cerod(&
11d10 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20 20 20  zRight[6]);.    
11d20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62  }.#endif.  }.  b
11d30 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  reak;.#endif..  
11d40 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  } /* End of the 
11d50 50 52 41 47 4d 41 20 73 77 69 74 63 68 20 2a 2f  PRAGMA switch */
11d60 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
11d70 77 69 6e 67 20 62 6c 6f 63 6b 20 69 73 20 61 20  wing block is a 
11d80 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c  no-op unless SQL
11d90 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
11da0 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c 79 0a 20  ined. Its only. 
11db0 20 2a 2a 20 70 75 72 70 6f 73 65 20 69 73 20 74   ** purpose is t
11dc0 6f 20 65 78 65 63 75 74 65 20 61 73 73 65 72 74  o execute assert
11dd0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
11de0 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20   verify that if 
11df0 74 68 65 0a 20 20 2a 2a 20 50 72 61 67 46 6c 67  the.  ** PragFlg
11e00 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20 66 6c 61 67  _NoColumns1 flag
11e10 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
11e20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
11e30 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a   an argument.  *
11e40 2a 20 74 6f 20 74 68 65 20 50 52 41 47 4d 41 2c  * to the PRAGMA,
11e50 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
11e60 69 6f 6e 20 68 61 73 20 6e 6f 74 20 61 64 64 65  ion has not adde
11e70 64 20 61 6e 79 20 4f 50 5f 52 65 73 75 6c 74 52  d any OP_ResultR
11e80 6f 77 20 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  ow .  ** instruc
11e90 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 56 4d 2e  tions to the VM.
11ea0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 72 61    */.  if( (pPra
11eb0 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  gma->mPragFlg & 
11ec0 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e  PragFlg_NoColumn
11ed0 73 31 29 20 26 26 20 7a 52 69 67 68 74 20 29 7b  s1) && zRight ){
11ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11ef0 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f  VerifyNoResultRo
11f00 77 28 76 29 3b 0a 20 20 7d 0a 0a 70 72 61 67 6d  w(v);.  }..pragm
11f10 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  a_out:.  sqlite3
11f20 44 62 46 72 65 65 28 64 62 2c 20 7a 4c 65 66 74  DbFree(db, zLeft
11f30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
11f40 65 65 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a  ee(db, zRight);.
11f50 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
11f60 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11f70 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  LE./************
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fc0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
11fd0 69 6f 6e 20 6f 66 20 61 6e 20 65 70 6f 6e 79 6d  ion of an eponym
11fe0 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ous virtual tabl
11ff0 65 20 74 68 61 74 20 72 75 6e 73 20 61 20 70 72  e that runs a pr
12000 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a 74 79 70 65  agma..**.*/.type
12010 64 65 66 20 73 74 72 75 63 74 20 50 72 61 67 6d  def struct Pragm
12020 61 56 74 61 62 20 50 72 61 67 6d 61 56 74 61 62  aVtab PragmaVtab
12030 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
12040 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f   PragmaVtabCurso
12050 72 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73  r PragmaVtabCurs
12060 6f 72 3b 0a 73 74 72 75 63 74 20 50 72 61 67 6d  or;.struct Pragm
12070 61 56 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65  aVtab {.  sqlite
12080 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20 20 20  3_vtab base;    
12090 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73      /* Base clas
120a0 73 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72 73  s.  Must be firs
120b0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
120c0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
120d0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
120e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 77   connection to w
120f0 68 69 63 68 20 69 74 20 62 65 6c 6f 6e 67 73 20  hich it belongs 
12100 2a 2f 0a 20 20 63 6f 6e 73 74 20 50 72 61 67 6d  */.  const Pragm
12110 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b 20 20 2f  aName *pName;  /
12120 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
12130 61 67 6d 61 20 2a 2f 0a 20 20 75 38 20 6e 48 69  agma */.  u8 nHi
12140 64 64 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  dden;           
12150 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12160 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20   hidden columns 
12170 2a 2f 0a 20 20 75 38 20 69 48 69 64 64 65 6e 3b  */.  u8 iHidden;
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12190 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 66  * Index of the f
121a0 69 72 73 74 20 68 69 64 64 65 6e 20 63 6f 6c 75  irst hidden colu
121b0 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  mn */.};.struct 
121c0 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
121d0 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
121e0 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 20 2f  b_cursor base; /
121f0 2a 20 42 61 73 65 20 63 6c 61 73 73 2e 20 20 4d  * Base class.  M
12200 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a  ust be first */.
12210 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12220 70 50 72 61 67 6d 61 3b 20 20 20 20 2f 2a 20 54  pPragma;    /* T
12230 68 65 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d  he pragma statem
12240 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20  ent to run */.  
12250 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f  sqlite_int64 iRo
12260 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 43 75 72  wid;      /* Cur
12270 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20  rent rowid */.  
12280 63 68 61 72 20 2a 61 7a 41 72 67 5b 32 5d 3b 20  char *azArg[2]; 
12290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
122a0 75 65 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ue of the argume
122b0 6e 74 20 61 6e 64 20 73 63 68 65 6d 61 20 2a 2f  nt and schema */
122c0 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67  .};../* .** Prag
122d0 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ma virtual table
122e0 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e 65 63 74   module xConnect
122f0 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
12300 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
12310 62 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69  bConnect(.  sqli
12320 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
12330 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67  *pAux,.  int arg
12340 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  c, const char *c
12350 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c  onst*argv,.  sql
12360 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74  ite3_vtab **ppVt
12370 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  ab,.  char **pzE
12380 72 72 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 50 72  rr.){.  const Pr
12390 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72 61 67 6d  agmaName *pPragm
123a0 61 20 3d 20 28 63 6f 6e 73 74 20 50 72 61 67 6d  a = (const Pragm
123b0 61 4e 61 6d 65 2a 29 70 41 75 78 3b 0a 20 20 50  aName*)pAux;.  P
123c0 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
123d0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
123e0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
123f0 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a 20 20  r cSep = '(';.  
12400 53 74 72 41 63 63 75 6d 20 61 63 63 3b 0a 20 20  StrAccum acc;.  
12410 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a  char zBuf[200];.
12420 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12430 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55 4e 55  TER(argc);.  UNU
12440 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
12450 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  gv);.  sqlite3St
12460 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c  rAccumInit(&acc,
12470 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a 65 6f 66   0, zBuf, sizeof
12480 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20 20 73 71  (zBuf), 0);.  sq
12490 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
124a0 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 43 52  endAll(&acc, "CR
124b0 45 41 54 45 20 54 41 42 4c 45 20 78 22 29 3b 0a  EATE TABLE x");.
124c0 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 50 72    for(i=0, j=pPr
124d0 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e 61 6d 65  agma->iPragCName
124e0 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e 6e 50 72  ; i<pPragma->nPr
124f0 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c 20 6a 2b  agCName; i++, j+
12500 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58  +){.    sqlite3X
12510 50 72 69 6e 74 66 28 26 61 63 63 2c 20 22 25 63  Printf(&acc, "%c
12520 5c 22 25 73 5c 22 22 2c 20 63 53 65 70 2c 20 70  \"%s\"", cSep, p
12530 72 61 67 43 4e 61 6d 65 5b 6a 5d 29 3b 0a 20 20  ragCName[j]);.  
12540 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20    cSep = ',';.  
12550 7d 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a  }.  if( i==0 ){.
12560 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
12570 74 66 28 26 61 63 63 2c 20 22 28 5c 22 25 73 5c  tf(&acc, "(\"%s\
12580 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61  "", pPragma->zNa
12590 6d 65 29 3b 0a 20 20 20 20 63 53 65 70 20 3d 20  me);.    cSep = 
125a0 27 2c 27 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  ',';.    i++;.  
125b0 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 69 66 28  }.  j = 0;.  if(
125c0 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46   pPragma->mPragF
125d0 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65 73  lg & PragFlg_Res
125e0 75 6c 74 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  ult1 ){.    sqli
125f0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
12600 64 41 6c 6c 28 26 61 63 63 2c 20 22 2c 61 72 67  dAll(&acc, ",arg
12610 20 48 49 44 44 45 4e 22 29 3b 0a 20 20 20 20 6a   HIDDEN");.    j
12620 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ++;.  }.  if( pP
12630 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67 20  ragma->mPragFlg 
12640 26 20 28 50 72 61 67 46 6c 67 5f 53 63 68 65 6d  & (PragFlg_Schem
12650 61 4f 70 74 7c 50 72 61 67 46 6c 67 5f 53 63 68  aOpt|PragFlg_Sch
12660 65 6d 61 52 65 71 29 20 29 7b 0a 20 20 20 20 73  emaReq) ){.    s
12670 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
12680 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 2c  pendAll(&acc, ",
12690 73 63 68 65 6d 61 20 48 49 44 44 45 4e 22 29 3b  schema HIDDEN");
126a0 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
126b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
126c0 70 70 65 6e 64 28 26 61 63 63 2c 20 22 29 22 2c  ppend(&acc, ")",
126d0 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   1);.  sqlite3St
126e0 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63  rAccumFinish(&ac
126f0 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74  c);.  assert( st
12700 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20 73 69 7a  rlen(zBuf) < siz
12710 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b 0a 20  eof(zBuf)-1 );. 
12720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
12730 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 7a  clare_vtab(db, z
12740 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Buf);.  if( rc==
12750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12760 20 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56   pTab = (PragmaV
12770 74 61 62 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  tab*)sqlite3_mal
12780 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72 61 67 6d  loc(sizeof(Pragm
12790 61 56 74 61 62 29 29 3b 0a 20 20 20 20 69 66 28  aVtab));.    if(
127a0 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
127b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
127c0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
127d0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 61        memset(pTa
127e0 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 61  b, 0, sizeof(Pra
127f0 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20 20  gmaVtab));.     
12800 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20 3d 20 70   pTab->pName = p
12810 50 72 61 67 6d 61 3b 0a 20 20 20 20 20 20 70 54  Pragma;.      pT
12820 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  ab->db = db;.   
12830 20 20 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e     pTab->iHidden
12840 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62   = i;.      pTab
12850 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a 3b 0a 20  ->nHidden = j;. 
12860 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
12870 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
12880 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
12890 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
128a0 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  db));.  }..  *pp
128b0 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f  Vtab = (sqlite3_
128c0 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20 72 65  vtab*)pTab;.  re
128d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
128e0 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75 61  ** Pragma virtua
128f0 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
12900 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f  Disconnect metho
12910 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12920 20 70 72 61 67 6d 61 56 74 61 62 44 69 73 63 6f   pragmaVtabDisco
12930 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74  nnect(sqlite3_vt
12940 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 50 72  ab *pVtab){.  Pr
12950 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20 3d  agmaVtab *pTab =
12960 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 70 56   (PragmaVtab*)pV
12970 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  tab;.  sqlite3_f
12980 72 65 65 28 70 54 61 62 29 3b 0a 20 20 72 65 74  ree(pTab);.  ret
12990 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
129a0 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20  ../* Figure out 
129b0 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74  the best index t
129c0 6f 20 75 73 65 20 74 6f 20 73 65 61 72 63 68 20  o use to search 
129d0 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  a pragma virtual
129e0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
129f0 65 72 65 20 61 72 65 20 6e 6f 74 20 72 65 61 6c  ere are not real
12a00 6c 79 20 61 6e 79 20 69 6e 64 65 78 20 63 68 6f  ly any index cho
12a10 69 63 65 73 2e 20 20 42 75 74 20 77 65 20 77 61  ices.  But we wa
12a20 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  nt to encourage 
12a30 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 6c 61  the.** query pla
12a40 6e 6e 65 72 20 74 6f 20 67 69 76 65 20 3d 3d 20  nner to give == 
12a50 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61  constraints on a
12a60 73 20 6d 61 6e 79 20 68 69 64 64 65 6e 20 70 61  s many hidden pa
12a70 72 61 6d 65 74 65 72 73 20 61 73 0a 2a 2a 20 70  rameters as.** p
12a80 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 65 73 70  ossible, and esp
12a90 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68 65 20 66  ecially on the f
12aa0 69 72 73 74 20 68 69 64 64 65 6e 20 70 61 72 61  irst hidden para
12ab0 6d 65 74 65 72 2e 20 20 53 6f 20 72 65 74 75 72  meter.  So retur
12ac0 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63 6f 73 74  n a.** high cost
12ad0 20 69 66 20 68 69 64 64 65 6e 20 70 61 72 61 6d   if hidden param
12ae0 65 74 65 72 73 20 61 72 65 20 75 6e 63 6f 6e 73  eters are uncons
12af0 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  trained..*/.stat
12b00 69 63 20 69 6e 74 20 70 72 61 67 6d 61 56 74 61  ic int pragmaVta
12b10 62 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74  bBestIndex(sqlit
12b20 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71  e3_vtab *tab, sq
12b30 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
12b40 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 50   *pIdxInfo){.  P
12b50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61 62 20  ragmaVtab *pTab 
12b60 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a 29 74  = (PragmaVtab*)t
12b70 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  ab;.  const stru
12b80 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
12b90 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f  _constraint *pCo
12ba0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20  nstraint;.  int 
12bb0 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 65 65 6e  i, j;.  int seen
12bc0 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49 6e 66 6f  [2];..  pIdxInfo
12bd0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
12be0 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69  = (double)1;.  i
12bf0 66 28 20 70 54 61 62 2d 3e 6e 48 69 64 64 65 6e  f( pTab->nHidden
12c00 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 53 51  ==0 ){ return SQ
12c10 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 70 43 6f  LITE_OK; }.  pCo
12c20 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
12c30 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
12c40 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d 20 30 3b  ;.  seen[0] = 0;
12c50 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20 30 3b 0a  .  seen[1] = 0;.
12c60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
12c70 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
12c80 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74 72  nt; i++, pConstr
12c90 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28  aint++){.    if(
12ca0 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73   pConstraint->us
12cb0 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  able==0 ) contin
12cc0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ue;.    if( pCon
12cd0 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51 4c  straint->op!=SQL
12ce0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12cf0 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69 6e  AINT_EQ ) contin
12d00 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ue;.    if( pCon
12d10 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e  straint->iColumn
12d20 20 3c 20 70 54 61 62 2d 3e 69 48 69 64 64 65 6e   < pTab->iHidden
12d30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12d40 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74   j = pConstraint
12d50 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 54 61 62  ->iColumn - pTab
12d60 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20 20 20 61  ->iHidden;.    a
12d70 73 73 65 72 74 28 20 6a 20 3c 20 32 20 29 3b 0a  ssert( j < 2 );.
12d80 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d 20 69 2b      seen[j] = i+
12d90 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 65 65  1;.  }.  if( see
12da0 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70  n[0]==0 ){.    p
12db0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
12dc0 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65  edCost = (double
12dd0 29 32 31 34 37 34 38 33 36 34 37 3b 0a 20 20 20  )2147483647;.   
12de0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
12df0 61 74 65 64 52 6f 77 73 20 3d 20 32 31 34 37 34  atedRows = 21474
12e00 38 33 36 34 37 3b 0a 20 20 20 20 72 65 74 75 72  83647;.    retur
12e10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12e20 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30 5d 2d 31  .  j = seen[0]-1
12e30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  ;.  pIdxInfo->aC
12e40 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
12e50 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b  ].argvIndex = 1;
12e60 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  .  pIdxInfo->aCo
12e70 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d  nstraintUsage[j]
12e80 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  .omit = 1;.  if(
12e90 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29 20 72 65   seen[1]==0 ) re
12ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12eb0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
12ec0 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
12ed0 62 6c 65 29 32 30 3b 0a 20 20 70 49 64 78 49 6e  ble)20;.  pIdxIn
12ee0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
12ef0 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d 20 73 65  s = 20;.  j = se
12f00 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49 64 78 49  en[1]-1;.  pIdxI
12f10 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
12f20 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64  Usage[j].argvInd
12f30 65 78 20 3d 20 32 3b 0a 20 20 70 49 64 78 49 6e  ex = 2;.  pIdxIn
12f40 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
12f50 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31  sage[j].omit = 1
12f60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12f70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61  E_OK;.}../* Crea
12f80 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
12f90 66 6f 72 20 74 68 65 20 70 72 61 67 6d 61 20 76  for the pragma v
12fa0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
12fb0 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
12fc0 61 56 74 61 62 4f 70 65 6e 28 73 71 6c 69 74 65  aVtabOpen(sqlite
12fd0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 73  3_vtab *pVtab, s
12fe0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
12ff0 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a  or **ppCursor){.
13000 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
13010 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70 43 73 72  or *pCsr;.  pCsr
13020 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
13030 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61  rsor*)sqlite3_ma
13040 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 43 73  lloc(sizeof(*pCs
13050 72 29 29 3b 0a 20 20 69 66 28 20 70 43 73 72 3d  r));.  if( pCsr=
13060 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
13070 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
13080 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65  et(pCsr, 0, size
13090 6f 66 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  of(PragmaVtabCur
130a0 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e 62  sor));.  pCsr->b
130b0 61 73 65 2e 70 56 74 61 62 20 3d 20 70 56 74 61  ase.pVtab = pVta
130c0 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d  b;.  *ppCursor =
130d0 20 26 70 43 73 72 2d 3e 62 61 73 65 3b 0a 20 20   &pCsr->base;.  
130e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
130f0 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72 20 61 6c  ;.}../* Clear al
13100 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70  l content from p
13110 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
13120 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 73  ble cursor. */.s
13130 74 61 74 69 63 20 76 6f 69 64 20 70 72 61 67 6d  tatic void pragm
13140 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72  aVtabCursorClear
13150 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f  (PragmaVtabCurso
13160 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20  r *pCsr){.  int 
13170 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  i;.  sqlite3_fin
13180 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 50 72 61  alize(pCsr->pPra
13190 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d 3e 70 50  gma);.  pCsr->pP
131a0 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 66 6f 72  ragma = 0;.  for
131b0 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
131c0 65 28 70 43 73 72 2d 3e 61 7a 41 72 67 29 3b 20  e(pCsr->azArg); 
131d0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
131e0 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 7a 41  3_free(pCsr->azA
131f0 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70 43 73 72  rg[i]);.    pCsr
13200 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20 30 3b 0a  ->azArg[i] = 0;.
13210 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f 73 65 20    }.}../* Close 
13220 61 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  a pragma virtual
13230 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f   table cursor */
13240 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67  .static int prag
13250 6d 61 56 74 61 62 43 6c 6f 73 65 28 73 71 6c 69  maVtabClose(sqli
13260 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
13270 2a 63 75 72 29 7b 0a 20 20 50 72 61 67 6d 61 56  *cur){.  PragmaV
13280 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20  tabCursor *pCsr 
13290 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72  = (PragmaVtabCur
132a0 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 72 61 67  sor*)cur;.  prag
132b0 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
132c0 72 28 70 43 73 72 29 3b 0a 20 20 73 71 6c 69 74  r(pCsr);.  sqlit
132d0 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20  e3_free(pCsr);. 
132e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
132f0 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65  K;.}../* Advance
13300 20 74 68 65 20 70 72 61 67 6d 61 20 76 69 72 74   the pragma virt
13310 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
13320 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
13330 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
13340 72 61 67 6d 61 56 74 61 62 4e 65 78 74 28 73 71  ragmaVtabNext(sq
13350 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
13360 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b  r *pVtabCursor){
13370 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  .  PragmaVtabCur
13380 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61  sor *pCsr = (Pra
13390 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70  gmaVtabCursor*)p
133a0 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e  VtabCursor;.  in
133b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
133c0 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
133d0 74 20 74 68 65 20 78 52 6f 77 69 64 20 76 61 6c  t the xRowid val
133e0 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 69 52  ue */.  pCsr->iR
133f0 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73 65 72 74  owid++;.  assert
13400 28 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20  ( pCsr->pPragma 
13410 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
13420 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW!=sqlite3_ste
13430 70 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29  p(pCsr->pPragma)
13440 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
13450 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
13460 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b 0a 20 20  sr->pPragma);.  
13470 20 20 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 20    pCsr->pPragma 
13480 3d 20 30 3b 0a 20 20 20 20 70 72 61 67 6d 61 56  = 0;.    pragmaV
13490 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28 70  tabCursorClear(p
134a0 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Csr);.  }.  retu
134b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
134c0 20 50 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   Pragma virtual 
134d0 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78 46 69  table module xFi
134e0 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  lter method..*/.
134f0 73 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d  static int pragm
13500 61 56 74 61 62 46 69 6c 74 65 72 28 0a 20 20 73  aVtabFilter(.  s
13510 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13520 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
13530 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20   .  int idxNum, 
13540 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
13550 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  tr,.  int argc, 
13560 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
13570 61 72 67 76 0a 29 7b 0a 20 20 50 72 61 67 6d 61  argv.){.  Pragma
13580 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13590 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
135a0 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
135b0 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  r;.  PragmaVtab 
135c0 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56  *pTab = (PragmaV
135d0 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73 6f  tab*)(pVtabCurso
135e0 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 6e 74  r->pVtab);.  int
135f0 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   rc;.  int i, j;
13600 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b  .  StrAccum acc;
13610 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 0a  .  char *zSql;..
13620 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
13630 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20 20 55 4e  ER(idxNum);.  UN
13640 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
13650 64 78 53 74 72 29 3b 0a 20 20 70 72 61 67 6d 61  dxStr);.  pragma
13660 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61 72 28  VtabCursorClear(
13670 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20 28 70 54  pCsr);.  j = (pT
13680 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50 72 61 67  ab->pName->mPrag
13690 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 52 65  Flg & PragFlg_Re
136a0 73 75 6c 74 31 29 21 3d 30 20 3f 20 30 20 3a 20  sult1)!=0 ? 0 : 
136b0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
136c0 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  argc; i++, j++){
136d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 41  .    assert( j<A
136e0 72 72 61 79 53 69 7a 65 28 70 43 73 72 2d 3e 61  rraySize(pCsr->a
136f0 7a 41 72 67 29 20 29 3b 0a 20 20 20 20 70 43 73  zArg) );.    pCs
13700 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d 20 73 71  r->azArg[j] = sq
13710 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
13720 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s", sqlite3_valu
13730 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 29  e_text(argv[i]))
13740 3b 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e  ;.    if( pCsr->
13750 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29 7b 0a 20  azArg[j]==0 ){. 
13760 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13770 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
13780 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
13790 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20  AccumInit(&acc, 
137a0 30 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 64  0, 0, 0, pTab->d
137b0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
137c0 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
137d0 48 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  H]);.  sqlite3St
137e0 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
137f0 26 61 63 63 2c 20 22 50 52 41 47 4d 41 20 22 29  &acc, "PRAGMA ")
13800 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 7a  ;.  if( pCsr->az
13810 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20 20 73 71  Arg[1] ){.    sq
13820 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 61 63  lite3XPrintf(&ac
13830 63 2c 20 22 25 51 2e 22 2c 20 70 43 73 72 2d 3e  c, "%Q.", pCsr->
13840 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 0a 20  azArg[1]);.  }. 
13850 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
13860 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20  AppendAll(&acc, 
13870 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 7a 4e 61  pTab->pName->zNa
13880 6d 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d  me);.  if( pCsr-
13890 3e 61 7a 41 72 67 5b 30 5d 20 29 7b 0a 20 20 20  >azArg[0] ){.   
138a0 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
138b0 26 61 63 63 2c 20 22 3d 25 51 22 2c 20 70 43 73  &acc, "=%Q", pCs
138c0 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  r->azArg[0]);.  
138d0 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  }.  zSql = sqlit
138e0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
138f0 28 26 61 63 63 29 3b 0a 20 20 69 66 28 20 7a 53  (&acc);.  if( zS
13900 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ql==0 ) return S
13910 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
13920 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
13930 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64 62 2c  are_v2(pTab->db,
13940 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 73 72   zSql, -1, &pCsr
13950 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29 3b 0a 20  ->pPragma, 0);. 
13960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
13970 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ql);.  if( rc!=S
13980 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13990 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d  pTab->base.zErrM
139a0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
139b0 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
139c0 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62 2d 3e  e3_errmsg(pTab->
139d0 64 62 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  db));.    return
139e0 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
139f0 6e 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74  n pragmaVtabNext
13a00 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 7d  (pVtabCursor);.}
13a10 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d 61 20 76  ../*.** Pragma v
13a20 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
13a30 75 6c 65 20 78 45 6f 66 20 6d 65 74 68 6f 64 2e  ule xEof method.
13a40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13a50 72 61 67 6d 61 56 74 61 62 45 6f 66 28 73 71 6c  ragmaVtabEof(sql
13a60 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
13a70 20 2a 70 56 74 61 62 43 75 72 73 6f 72 29 7b 0a   *pVtabCursor){.
13a80 20 20 50 72 61 67 6d 61 56 74 61 62 43 75 72 73    PragmaVtabCurs
13a90 6f 72 20 2a 70 43 73 72 20 3d 20 28 50 72 61 67  or *pCsr = (Prag
13aa0 6d 61 56 74 61 62 43 75 72 73 6f 72 2a 29 70 56  maVtabCursor*)pV
13ab0 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72 65 74  tabCursor;.  ret
13ac0 75 72 6e 20 28 70 43 73 72 2d 3e 70 50 72 61 67  urn (pCsr->pPrag
13ad0 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 20 54 68  ma==0);.}../* Th
13ae0 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64  e xColumn method
13af0 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20   simply returns 
13b00 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
13b10 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  g column from.**
13b20 20 74 68 65 20 50 52 41 47 4d 41 2e 20 20 0a 2a   the PRAGMA.  .*
13b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 61  /.static int pra
13b40 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 28 0a 20  gmaVtabColumn(. 
13b50 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
13b60 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
13b70 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  r, .  sqlite3_co
13b80 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20 20 69  ntext *ctx, .  i
13b90 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61 67 6d 61  nt i.){.  Pragma
13ba0 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72  VtabCursor *pCsr
13bb0 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 43 75   = (PragmaVtabCu
13bc0 72 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f  rsor*)pVtabCurso
13bd0 72 3b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 20  r;.  PragmaVtab 
13be0 2a 70 54 61 62 20 3d 20 28 50 72 61 67 6d 61 56  *pTab = (PragmaV
13bf0 74 61 62 2a 29 28 70 56 74 61 62 43 75 72 73 6f  tab*)(pVtabCurso
13c00 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 66 28  r->pVtab);.  if(
13c10 20 69 3c 70 54 61 62 2d 3e 69 48 69 64 64 65 6e   i<pTab->iHidden
13c20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13c30 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
13c40 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
13c50 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 50 72  _value(pCsr->pPr
13c60 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20 7d 65 6c  agma, i));.  }el
13c70 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
13c80 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
13c90 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b 69 2d 70   pCsr->azArg[i-p
13ca0 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d 2c 2d 31  Tab->iHidden],-1
13cb0 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
13cc0 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T);.  }.  return
13cd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13ce0 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72  * .** Pragma vir
13cf0 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
13d00 65 20 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e  e xRowid method.
13d10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13d20 72 61 67 6d 61 56 74 61 62 52 6f 77 69 64 28 73  ragmaVtabRowid(s
13d30 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13d40 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
13d50 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
13d60 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
13d70 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
13d80 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
13d90 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
13da0 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77 69  *p = pCsr->iRowi
13db0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
13dc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
13dd0 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20   pragma virtual 
13de0 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  table object */.
13df0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
13e00 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70 72 61 67  ite3_module prag
13e10 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20 3d 20 7b  maVtabModule = {
13e20 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
13e50 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
13e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13e70 20 78 43 72 65 61 74 65 20 2d 20 63 72 65 61 74   xCreate - creat
13e80 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  e a table */.  p
13e90 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e 65 63 74  ragmaVtabConnect
13ea0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
13eb0 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e 6e 65 63  Connect - connec
13ec0 74 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67  t to an existing
13ed0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 72 61 67   table */.  prag
13ee0 6d 61 56 74 61 62 42 65 73 74 49 6e 64 65 78 2c  maVtabBestIndex,
13ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73           /* xBes
13f00 74 49 6e 64 65 78 20 2d 20 44 65 74 65 72 6d 69  tIndex - Determi
13f10 6e 65 20 73 65 61 72 63 68 20 73 74 72 61 74 65  ne search strate
13f20 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  gy */.  pragmaVt
13f30 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20  abDisconnect,   
13f40 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e       /* xDisconn
13f50 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63 74  ect - Disconnect
13f60 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a 2f   from a table */
13f70 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20 44 72  /* xDestroy - Dr
13fa0 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  op a table */.  
13fb0 70 72 61 67 6d 61 56 74 61 62 4f 70 65 6e 2c 20  pragmaVtabOpen, 
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13fd0 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
13fe0 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d  ursor */.  pragm
13ff0 61 56 74 61 62 43 6c 6f 73 65 2c 20 20 20 20 20  aVtabClose,     
14000 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
14010 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73  e - close a curs
14020 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74  or */.  pragmaVt
14030 61 62 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20  abFilter,       
14040 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20       /* xFilter 
14050 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e  - configure scan
14060 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
14070 20 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74    pragmaVtabNext
14080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
14090 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63  * xNext - advanc
140a0 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
140b0 70 72 61 67 6d 61 56 74 61 62 45 6f 66 2c 20 20  pragmaVtabEof,  
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
140d0 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61 67 6d 61  xEof */.  pragma
140e0 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  VtabColumn,     
140f0 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d         /* xColum
14100 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  n - read data */
14110 0a 20 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77  .  pragmaVtabRow
14120 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
14130 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64  /* xRowid - read
14140 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20   data */.  0,   
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61          /* xUpda
14170 74 65 20 2d 20 77 72 69 74 65 20 64 61 74 61 20  te - write data 
14180 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62 65    /* xBegin - be
141b0 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
141c0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141e0 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79 6e    /* xSync - syn
141f0 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  c transaction */
14200 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20 63 6f 6d  /* xCommit - com
14230 6d 69 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mit transaction 
14240 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14260 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2d    /* xRollback -
14270 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
14280 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  ction */.  0,   
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
142b0 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75 6e 63 74  Function - funct
142c0 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 20  ion overloading 
142d0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2d 20 72    /* xRename - r
14300 65 6e 61 6d 65 20 74 68 65 20 74 61 62 6c 65 20  ename the table 
14310 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20    /* xSavepoint 
14340 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f    /* xRelease */
14370 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14390 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a  /* xRollbackTo *
143a0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  /.};../*.** Chec
143b0 6b 20 74 6f 20 73 65 65 20 69 66 20 7a 54 61 62  k to see if zTab
143c0 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c 79 20 74  Name is really t
143d0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 70 72 61  he name of a pra
143e0 67 6d 61 2e 20 20 49 66 20 69 74 20 69 73 2c 0a  gma.  If it is,.
143f0 2a 2a 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  ** then register
14400 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69   an eponymous vi
14410 72 74 75 61 6c 20 74 61 62 6c 65 20 66 6f 72 20  rtual table for 
14420 74 68 61 74 20 70 72 61 67 6d 61 20 61 6e 64 20  that pragma and 
14430 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
14440 74 65 72 20 74 6f 20 74 68 65 20 4d 6f 64 75 6c  ter to the Modul
14450 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  e object for the
14460 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61 62   new virtual tab
14470 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65 20 2a 73  le..*/.Module *s
14480 71 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62  qlite3PragmaVtab
14490 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  Register(sqlite3
144a0 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
144b0 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73   *zName){.  cons
144c0 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 4e  t PragmaName *pN
144d0 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ame;.  assert( s
144e0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
144f0 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22  zName, "pragma_"
14500 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 4e 61  , 7)==0 );.  pNa
14510 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f 63 61 74  me = pragmaLocat
14520 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20 20 69 66  e(zName+7);.  if
14530 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( pName==0 ) ret
14540 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4e  urn 0;.  if( (pN
14550 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20  ame->mPragFlg & 
14560 28 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 30  (PragFlg_Result0
14570 7c 50 72 61 67 46 6c 67 5f 52 65 73 75 6c 74 31  |PragFlg_Result1
14580 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
14590 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
145a0 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
145b0 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29  >aModule, zName)
145c0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
145d0 73 71 6c 69 74 65 33 56 74 61 62 43 72 65 61 74  sqlite3VtabCreat
145e0 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e 61 6d  eModule(db, zNam
145f0 65 2c 20 26 70 72 61 67 6d 61 56 74 61 62 4d 6f  e, &pragmaVtabMo
14600 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29 70 4e 61  dule, (void*)pNa
14610 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6e 64 69  me, 0);.}..#endi
14620 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14630 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
14640 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
14650 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20 2a  TE_OMIT_PRAGMA *
14660 2f 0a                                            /.