/ Hex Artifact Content
Login

Artifact 79ec7625d56130dbadf287a29b0ebf22167465049646366ad860a694f4547768:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
01c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
01d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
01e0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
01f0: 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
0200: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0210: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0220: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0230: 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
0240: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
0250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
0260: 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
0270: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
02d0: 65 20 22 70 72 61 67 6d 61 2e 68 22 20 69 6e 63  e "pragma.h" inc
02e0: 6c 75 64 65 20 66 69 6c 65 20 69 73 20 61 6e 20  lude file is an 
02f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0300: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 74 68 61  nerated file tha
0310: 74 0a 2a 2a 20 74 68 61 74 20 69 6e 63 6c 75 64  t.** that includ
0320: 65 73 20 74 68 65 20 50 72 61 67 54 79 70 65 5f  es the PragType_
0330: 58 58 58 58 20 6d 61 63 72 6f 20 64 65 66 69 6e  XXXX macro defin
0340: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 61  itions and the a
0350: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 0a 2a 2a 20  PragmaName[].** 
0360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 65 6e  object.  This en
0370: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 61  sures that the a
0380: 50 72 61 67 6d 61 4e 61 6d 65 5b 5d 20 74 61 62  PragmaName[] tab
0390: 6c 65 20 69 73 20 61 72 72 61 6e 67 65 64 20 69  le is arranged i
03a0: 6e 0a 2a 2a 20 6c 65 78 69 63 6f 67 72 61 70 68  n.** lexicograph
03b0: 69 63 61 6c 20 6f 72 64 65 72 20 74 6f 20 66 61  ical order to fa
03c0: 63 69 6c 69 74 79 20 61 20 62 69 6e 61 72 79 20  cility a binary 
03d0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 70 72  search of the pr
03e0: 61 67 6d 61 20 6e 61 6d 65 2e 0a 2a 2a 20 44 6f  agma name..** Do
03f0: 20 6e 6f 74 20 65 64 69 74 20 70 72 61 67 6d 61   not edit pragma
0400: 2e 68 20 64 69 72 65 63 74 6c 79 2e 20 20 45 64  .h directly.  Ed
0410: 69 74 20 61 6e 64 20 72 65 72 75 6e 20 74 68 65  it and rerun the
0420: 20 73 63 72 69 70 74 20 69 6e 20 61 74 20 0a 2a   script in at .*
0430: 2a 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 70 72 61 67  * ../tool/mkprag
0440: 6d 61 74 61 62 2e 74 63 6c 2e 20 2a 2f 0a 23 69  matab.tcl. */.#i
0450: 6e 63 6c 75 64 65 20 22 70 72 61 67 6d 61 2e 68  nclude "pragma.h
0460: 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  "../*.** Interpr
0470: 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  et the given str
0480: 69 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20  ing as a safety 
0490: 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30  level.  Return 0
04a0: 20 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66   for OFF,.** 1 f
04b0: 6f 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 2c  or ON or NORMAL,
04c0: 20 32 20 66 6f 72 20 46 55 4c 4c 2c 20 61 6e 64   2 for FULL, and
04d0: 20 33 20 66 6f 72 20 45 58 54 52 41 2e 20 20 52   3 for EXTRA.  R
04e0: 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65  eturn 1 for an e
04f0: 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65  mpty or .** unre
0500: 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20  cognized string 
0510: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 46  argument.  The F
0520: 55 4c 4c 20 61 6e 64 20 45 58 54 52 41 20 6f 70  ULL and EXTRA op
0530: 74 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77  tion is disallow
0540: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 6f 6d 69  ed.** if the omi
0550: 74 46 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20  tFull parameter 
0560: 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  it 1..**.** Note
0570: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
0580: 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6f 6e   returned are on
0590: 65 20 6c 65 73 73 20 74 68 61 74 20 74 68 65 20  e less that the 
05a0: 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 73  values that.** s
05b0: 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
05c0: 69 6e 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  into sqlite3Btre
05d0: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
05e0: 29 2e 20 20 54 68 65 20 69 73 20 64 6f 6e 65 0a  ).  The is done.
05f0: 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74 20 6c 65  ** to support le
0600: 67 61 63 79 20 53 51 4c 20 63 6f 64 65 2e 20 20  gacy SQL code.  
0610: 54 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  The safety level
0620: 20 75 73 65 64 20 74 6f 20 62 65 20 62 6f 6f 6c   used to be bool
0630: 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c 64 65 72  ean.** and older
0640: 20 73 63 72 69 70 74 73 20 6d 61 79 20 68 61 76   scripts may hav
0650: 65 20 75 73 65 64 20 6e 75 6d 62 65 72 73 20 30  e used numbers 0
0660: 20 66 6f 72 20 4f 46 46 20 61 6e 64 20 31 20 66   for OFF and 1 f
0670: 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  or ON..*/.static
0680: 20 75 38 20 67 65 74 53 61 66 65 74 79 4c 65 76   u8 getSafetyLev
0690: 65 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  el(const char *z
06a0: 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c 6c 2c 20  , int omitFull, 
06b0: 75 38 20 64 66 6c 74 29 7b 0a 20 20 20 20 20 20  u8 dflt){.      
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 20 20 20 20 2f 2a 20 31 32 33 34 35 36         /* 123456
06e0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
06f0: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
0700: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0710: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0720: 74 72 75 65 78 74 72 61 66 75 6c 6c 22 3b 0a 20  truextrafull";. 
0730: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0740: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0750: 20 31 2c 20 32 2c 20 20 34 2c 20 20 20 20 39 2c   1, 2,  4,    9,
0760: 20 20 31 32 2c 20 20 31 35 2c 20 20 20 32 30 7d    12,  15,   20}
0770: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0780: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
0790: 7b 32 2c 20 32 2c 20 33 2c 20 20 35 2c 20 20 20  {2, 2, 3,  5,   
07a0: 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20 20 20   3,   4,   5,   
07b0: 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   4};.  static co
07c0: 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b 5d 20  nst u8 iValue[] 
07d0: 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 20 30 2c  =  {1, 0, 0,  0,
07e0: 20 20 20 20 31 2c 20 20 20 31 2c 20 20 20 33 2c      1,   1,   3,
07f0: 20 20 20 20 32 7d 3b 0a 20 20 20 20 20 20 20 20      2};.        
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 2f 2a 20 6f 6e 20 6e 6f 20 6f 66 66      /* on no off
0820: 20 66 61 6c 73 65 20 79 65 73 20 74 72 75 65 20   false yes true 
0830: 65 78 74 72 61 20 66 75 6c 6c 20 2a 2f 0a 20 20  extra full */.  
0840: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
0850: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
0860: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
0870: 20 28 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69   (u8)sqlite3Atoi
0880: 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  (z);.  }.  n = s
0890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
08a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
08b0: 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74  ArraySize(iLengt
08c0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  h); i++){.    if
08d0: 28 20 69 4c 65 6e 67 74 68 5b 69 5d 3d 3d 6e 20  ( iLength[i]==n 
08e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
08f0: 6d 70 28 26 7a 54 65 78 74 5b 69 4f 66 66 73 65  mp(&zText[iOffse
0900: 74 5b 69 5d 5d 2c 7a 2c 6e 29 3d 3d 30 0a 20 20  t[i]],z,n)==0.  
0910: 20 20 20 26 26 20 28 21 6f 6d 69 74 46 75 6c 6c     && (!omitFull
0920: 20 7c 7c 20 69 56 61 6c 75 65 5b 69 5d 3c 3d 31   || iValue[i]<=1
0930: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
0940: 65 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b  eturn iValue[i];
0950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0960: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  urn dflt;.}../*.
0970: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0980: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0990: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
09a0: 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47  ..*/.u8 sqlite3G
09b0: 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  etBoolean(const 
09c0: 63 68 61 72 20 2a 7a 2c 20 75 38 20 64 66 6c 74  char *z, u8 dflt
09d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
09e0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
09f0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
0a00: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
0a10: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
0a20: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
0a30: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0a40: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0a50: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0a60: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0a70: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0a80: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0a90: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0aa0: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0ab0: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0ac0: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0ad0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
0ae0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
0af0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
0b00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
0b10: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
0b20: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
0b30: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0b40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0b50: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0b60: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0b70: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0b80: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0b90: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0bb0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0bc0: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0bd0: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
0be0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
0bf0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
0c00: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
0c10: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
0c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0c30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0c40: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0c50: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0c60: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0c70: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0c90: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0ca0: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0cb0: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0cc0: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0cd0: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
0ce0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
0cf0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
0d00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
0d10: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
0d20: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
0d30: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0d40: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0d50: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0d60: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d70: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0d80: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0d90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0da0: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0db0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0dc0: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0dd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0de0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0df0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0e00: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0e10: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0e20: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0e30: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0e40: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0e50: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0e70: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0e80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0e90: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0ea0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0eb0: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0ec0: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0ed0: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ee0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0ef0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0f00: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0f10: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0f20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0f30: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0f40: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0f50: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0f60: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0f90: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0fa0: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0fb0: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0fd0: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0ff0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
1000: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
1010: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
1020: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
1030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1040: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
1060: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
1070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1080: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
1090: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
10a0: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
10b0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
10c0: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
10d0: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
10e0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
10f0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
1100: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
1110: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
1120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
1130: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
1140: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1170: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1180: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
1190: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
11a0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
11b0: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
11c0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
11d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
1200: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
1210: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
1220: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
1230: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
1240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1250: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1260: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1270: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
1280: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
1290: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
12a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
12b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
12c0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
12d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12f0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
1300: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
1310: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
1320: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
1330: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1340: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1350: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1360: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1370: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1380: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1390: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
13a0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
13b0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
13c0: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
13d0: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
13e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13f0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
1400: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
1420: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
1430: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1440: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1450: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1460: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1470: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1480: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14a0: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
14b0: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
14c0: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
14d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
14f0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
1500: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1530: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 72 65 73 75  ../*.** Set resu
1550: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  lt column names 
1560: 66 6f 72 20 61 20 70 72 61 67 6d 61 2e 0a 2a 2f  for a pragma..*/
1570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1580: 50 72 61 67 6d 61 52 65 73 75 6c 74 43 6f 6c 75  PragmaResultColu
1590: 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62 65 20  mnNames(.  Vdbe 
15a0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71          /* The q
15c0: 75 65 72 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  uery under const
15d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
15e0: 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70  st PragmaName *p
15f0: 50 72 61 67 6d 61 20 20 20 20 2f 2a 20 54 68 65  Pragma    /* The
1600: 20 70 72 61 67 6d 61 20 2a 2f 0a 29 7b 0a 20 20   pragma */.){.  
1610: 75 38 20 6e 20 3d 20 70 50 72 61 67 6d 61 2d 3e  u8 n = pPragma->
1620: 6e 50 72 61 67 43 4e 61 6d 65 3b 0a 20 20 73 71  nPragCName;.  sq
1630: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1640: 6f 6c 73 28 76 2c 20 6e 3d 3d 30 20 3f 20 31 20  ols(v, n==0 ? 1 
1650: 3a 20 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30  : n);.  if( n==0
1660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1670: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
1680: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
1690: 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65  , pPragma->zName
16a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16c0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
16d0: 28 69 3d 30 2c 20 6a 3d 70 50 72 61 67 6d 61 2d  (i=0, j=pPragma-
16e0: 3e 69 50 72 61 67 43 4e 61 6d 65 3b 20 69 3c 6e  >iPragCName; i<n
16f0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1710: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
1720: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 70 72 61  OLNAME_NAME, pra
1730: 67 43 4e 61 6d 65 5b 6a 5d 2c 20 53 51 4c 49 54  gCName[j], SQLIT
1740: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  E_STATIC);.    }
1750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1760: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1770: 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69  eturn a single i
1780: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f  nteger value..*/
1790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 74  .static void ret
17a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 56 64 62  urnSingleInt(Vdb
17b0: 65 20 2a 76 2c 20 69 36 34 20 76 61 6c 75 65 29  e *v, i64 value)
17c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
17d0: 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17e0: 49 6e 74 36 34 2c 20 30 2c 20 31 2c 20 30 2c 20  Int64, 0, 1, 0, 
17f0: 28 63 6f 6e 73 74 20 75 38 2a 29 26 76 61 6c 75  (const u8*)&valu
1800: 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
1810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1820: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
1830: 77 2c 20 31 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  w, 1, 1);.}../*.
1840: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1850: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69 6e   to return a sin
1860: 67 6c 65 20 74 65 78 74 20 76 61 6c 75 65 2e 0a  gle text value..
1870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1880: 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78 74 28  eturnSingleText(
1890: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
18a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18d0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
18e0: 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 20 20 20  har *zValue     
18f0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 62 65 20   /* Value to be 
1900: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 29 7b 0a 20  returned */.){. 
1910: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
1920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1930: 61 64 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 28  adString(v, 1, (
1940: 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 56 61 6c  const char*)zVal
1950: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
1960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1970: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
1980: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1990: 20 53 65 74 20 74 68 65 20 73 61 66 65 74 79 5f   Set the safety_
19a0: 6c 65 76 65 6c 20 61 6e 64 20 70 61 67 65 72 20  level and pager 
19b0: 66 6c 61 67 73 20 66 6f 72 20 70 61 67 65 72 20  flags for pager 
19c0: 69 44 62 2e 20 20 4f 72 20 69 66 20 69 44 62 3c  iDb.  Or if iDb<
19d0: 30 0a 2a 2a 20 73 65 74 20 74 68 65 73 65 20 76  0.** set these v
19e0: 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 70 61  alues for all pa
19f0: 67 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  gers..*/.#ifndef
1a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a10: 45 52 5f 50 52 41 47 4d 41 53 0a 73 74 61 74 69  ER_PRAGMAS.stati
1a20: 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 50 61 67  c void setAllPag
1a30: 65 72 46 6c 61 67 73 28 73 71 6c 69 74 65 33 20  erFlags(sqlite3 
1a40: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1a50: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1a60: 20 20 44 62 20 2a 70 44 62 20 3d 20 64 62 2d 3e    Db *pDb = db->
1a70: 61 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  aDb;.    int n =
1a80: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 20 20 61 73   db->nDb;.    as
1a90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 75 6c  sert( SQLITE_Ful
1aa0: 6c 46 53 79 6e 63 3d 3d 50 41 47 45 52 5f 46 55  lFSync==PAGER_FU
1ab0: 4c 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61  LLFSYNC );.    a
1ac0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 6b  ssert( SQLITE_Ck
1ad0: 70 74 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  ptFullFSync==PAG
1ae0: 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
1af0: 43 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  C );.    assert(
1b00: 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
1b10: 6c 6c 3d 3d 50 41 47 45 52 5f 43 41 43 48 45 53  ll==PAGER_CACHES
1b20: 50 49 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  PILL );.    asse
1b30: 72 74 28 20 28 50 41 47 45 52 5f 46 55 4c 4c 46  rt( (PAGER_FULLF
1b40: 53 59 4e 43 20 7c 20 50 41 47 45 52 5f 43 4b 50  SYNC | PAGER_CKP
1b50: 54 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41  T_FULLFSYNC | PA
1b60: 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 29 0a  GER_CACHESPILL).
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
1b80: 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
1b90: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ba0: 20 28 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65   (pDb->safety_le
1bb0: 76 65 6c 20 26 20 50 41 47 45 52 5f 53 59 4e 43  vel & PAGER_SYNC
1bc0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 29 3d 3d 70  HRONOUS_MASK)==p
1bd0: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1be0: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   );.    while( (
1bf0: 6e 2d 2d 29 20 3e 20 30 20 29 7b 0a 20 20 20 20  n--) > 0 ){.    
1c00: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
1c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c20: 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
1c30: 61 67 73 28 70 44 62 2d 3e 70 42 74 2c 0a 20 20  ags(pDb->pBt,.  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c50: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1c60: 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1c70: 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1c80: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
1c90: 20 20 20 70 44 62 2b 2b 3b 0a 20 20 20 20 7d 0a     pDb++;.    }.
1ca0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
1cb0: 66 69 6e 65 20 73 65 74 41 6c 6c 50 61 67 65 72  fine setAllPager
1cc0: 46 6c 61 67 73 28 58 29 20 20 2f 2a 20 6e 6f 2d  Flags(X)  /* no-
1cd0: 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f  op */.#endif.../
1ce0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
1cf0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
1d00: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
1d10: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
1d20: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
1d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
1d40: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
1d50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
1d60: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
1d70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d80: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
1d90: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
1da0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
1db0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
1dc0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
1dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1de0: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
1df0: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
1e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e10: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
1e20: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
1e30: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
1e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
1e50: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
1e60: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
1e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e80: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
1e90: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
1ea0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ec0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
1ed0: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
1ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
1ef0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
1f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
1f10: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
1f20: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
1f30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
1f40: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
1f50: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
1f60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1f70: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
1f80: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
1f90: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
1fa0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
1fb0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
1fc0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
1fd0: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
1fe0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
1ff0: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2000: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2010: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2020: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2030: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2040: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2050: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2060: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
2070: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2080: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
2090: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20a0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20b0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20d0: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
20e0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20f0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2100: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2110: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2120: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2130: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2140: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2150: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2160: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
2170: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
2180: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
2190: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
21a0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
21b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
21c0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
21d0: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
21e0: 2a 20 4c 6f 63 61 74 65 20 61 20 70 72 61 67 6d  * Locate a pragm
21f0: 61 20 69 6e 20 74 68 65 20 61 50 72 61 67 6d 61  a in the aPragma
2200: 4e 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  Name[] array..*/
2210: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 50 72  .static const Pr
2220: 61 67 6d 61 4e 61 6d 65 20 2a 70 72 61 67 6d 61  agmaName *pragma
2230: 4c 6f 63 61 74 65 28 63 6f 6e 73 74 20 63 68 61  Locate(const cha
2240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
2250: 20 75 70 72 2c 20 6c 77 72 2c 20 6d 69 64 20 3d   upr, lwr, mid =
2260: 20 30 2c 20 72 63 3b 0a 20 20 6c 77 72 20 3d 20   0, rc;.  lwr = 
2270: 30 3b 0a 20 20 75 70 72 20 3d 20 41 72 72 61 79  0;.  upr = Array
2280: 53 69 7a 65 28 61 50 72 61 67 6d 61 4e 61 6d 65  Size(aPragmaName
2290: 29 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  )-1;.  while( lw
22a0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
22b0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
22c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22d0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
22e0: 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b 6d 69 64   aPragmaName[mid
22f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
2300: 28 20 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ( rc==0 ) break;
2310: 0a 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b  .    if( rc<0 ){
2320: 0a 20 20 20 20 20 20 75 70 72 20 3d 20 6d 69 64  .      upr = mid
2330: 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   - 1;.    }else{
2340: 0a 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64  .      lwr = mid
2350: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
2360: 20 20 72 65 74 75 72 6e 20 6c 77 72 3e 75 70 72    return lwr>upr
2370: 20 3f 20 30 20 3a 20 26 61 50 72 61 67 6d 61 4e   ? 0 : &aPragmaN
2380: 61 6d 65 5b 6d 69 64 5d 3b 0a 7d 0a 0a 2f 2a 0a  ame[mid];.}../*.
2390: 2a 2a 20 48 65 6c 70 65 72 20 73 75 62 72 6f 75  ** Helper subrou
23a0: 74 69 6e 65 20 66 6f 72 20 50 52 41 47 4d 41 20  tine for PRAGMA 
23b0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3a  integrity_check:
23c0: 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  .**.** Generate 
23d0: 63 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20 61  code to output a
23e0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 72   single-column r
23f0: 65 73 75 6c 74 20 72 6f 77 20 77 69 74 68 20 74  esult row with t
2400: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 68 65 6c  he result.** hel
2410: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65  d in register re
2420: 67 52 65 73 75 6c 74 2e 20 20 44 65 63 72 65 6d  gResult.  Decrem
2430: 65 6e 74 20 74 68 65 20 72 65 73 75 6c 74 20 63  ent the result c
2440: 6f 75 6e 74 20 61 6e 64 20 68 61 6c 74 20 69 66  ount and halt if
2450: 0a 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  .** the maximum 
2460: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
2470: 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
2480: 69 73 73 75 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  issued..*/.stati
2490: 63 20 69 6e 74 20 69 6e 74 65 67 72 69 74 79 43  c int integrityC
24a0: 68 65 63 6b 52 65 73 75 6c 74 52 6f 77 28 56 64  heckResultRow(Vd
24b0: 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 52 65  be *v, int regRe
24c0: 73 75 6c 74 29 7b 0a 20 20 69 6e 74 20 61 64 64  sult){.  int add
24d0: 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  r;.  sqlite3Vdbe
24e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
24f0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
2500: 74 2c 20 31 29 3b 0a 20 20 61 64 64 72 20 3d 20  t, 1);.  addr = 
2510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2520: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  3(v, OP_IfPos, 1
2530: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2540: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 31  rentAddr(v)+2, 1
2550: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
2560: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
2570: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2580: 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72  Halt, 0, 0);.  r
2590: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
25a0: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
25b0: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
25c0: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
25d0: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
25e0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
25f0: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69 64  AGMA [schema.]id
2600: 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a   [= value].**.**
2610: 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   The identifier 
2620: 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
2630: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c  string.  The val
2640: 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  ue is a string, 
2650: 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  and.** identifie
2660: 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20  r, or a number. 
2670: 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73   If minusFlag is
2680: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
2690: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75  value is.** a nu
26a0: 6d 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72  mber that was pr
26b0: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
26c0: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  s sign..**.** If
26d0: 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 20 69   the left side i
26e0: 73 20 22 64 61 74 61 62 61 73 65 2e 69 64 22 20  s "database.id" 
26f0: 74 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65  then pId1 is the
2700: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
2710: 2a 20 61 6e 64 20 70 49 64 32 20 69 73 20 74 68  * and pId2 is th
2720: 65 20 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65  e id.  If the le
2730: 66 74 20 73 69 64 65 20 69 73 20 6a 75 73 74 20  ft side is just 
2740: 22 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69  "id" then pId1 i
2750: 73 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20  s the.** id and 
2760: 70 49 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74  pId2 is any empt
2770: 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  y string..*/.voi
2780: 64 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28  d sqlite3Pragma(
2790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27a0: 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31  , .  Token *pId1
27b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ,        /* Firs
27c0: 74 20 70 61 72 74 20 6f 66 20 5b 73 63 68 65 6d  t part of [schem
27d0: 61 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a 20  a.]id field */. 
27e0: 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20 20   Token *pId2,   
27f0: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
2800: 61 72 74 20 6f 66 20 5b 73 63 68 65 6d 61 2e 5d  art of [schema.]
2810: 69 64 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c  id field, or NUL
2820: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56  L */.  Token *pV
2830: 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f  alue,      /* To
2840: 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c  ken for <value>,
2850: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
2860: 74 20 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20  t minusFlag     
2870: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27    /* True if a '
2880: 2d 27 20 73 69 67 6e 20 70 72 65 63 65 64 65 64  -' sign preceded
2890: 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20   <value> */.){. 
28a0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30   char *zLeft = 0
28b0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  ;       /* Nul-t
28c0: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
28d0: 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20  string <id> */. 
28e0: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
28f0: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74  0;      /* Nul-t
2900: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
2910: 73 74 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20  string <value>, 
2920: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
2930: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
2940: 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
2950: 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f  ase name */.  To
2960: 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20  ken *pId;       
2970: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2980: 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f  to <id> token */
2990: 0a 20 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b  .  char *aFcntl[
29a0: 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67  4];       /* Arg
29b0: 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f  ument to SQLITE_
29c0: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a  FCNTL_PRAGMA */.
29d0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
29e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
29f0: 62 61 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c  base index for <
2a00: 64 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 69  database> */.  i
2a10: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
2a30: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 6d  eturn value form
2a40: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
2a50: 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74 65  AGMA */.  sqlite
2a60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2a70: 64 62 3b 20 20 20 20 2f 2a 20 54 68 65 20 64 61  db;    /* The da
2a80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2a90: 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  n */.  Db *pDb; 
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
2ac0: 66 69 63 20 64 61 74 61 62 61 73 65 20 62 65 69  fic database bei
2ad0: 6e 67 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a 20  ng pragmaed */. 
2ae0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
2af0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2b00: 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20  );  /* Prepared 
2b10: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63  statement */.  c
2b20: 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
2b30: 2a 70 50 72 61 67 6d 61 3b 20 20 20 2f 2a 20 54  *pPragma;   /* T
2b40: 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 0a 20 20  he pragma */..  
2b50: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
2b60: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
2b70: 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29 3b 0a  RunOnlyOnce(v);.
2b80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
2b90: 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 70   2;..  /* Interp
2ba0: 72 65 74 20 74 68 65 20 5b 73 63 68 65 6d 61 2e  ret the [schema.
2bb0: 5d 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72  ] part of the pr
2bc0: 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20  agma statement. 
2bd0: 69 44 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  iDb is the.  ** 
2be0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
2bf0: 61 62 61 73 65 20 74 68 69 73 20 70 72 61 67 6d  abase this pragm
2c00: 61 20 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69  a is being appli
2c10: 65 64 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b  ed to in db.aDb[
2c20: 5d 2e 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  ]. */.  iDb = sq
2c30: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
2c40: 28 70 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70  (pParse, pId1, p
2c50: 49 64 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66  Id2, &pId);.  if
2c60: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
2c70: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
2c80: 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 49  Db[iDb];..  /* I
2c90: 66 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  f the temp datab
2ca0: 61 73 65 20 68 61 73 20 62 65 65 6e 20 65 78 70  ase has been exp
2cb0: 6c 69 63 69 74 6c 79 20 6e 61 6d 65 64 20 61 73  licitly named as
2cc0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 0a 20 20   part of the .  
2cd0: 2a 2a 20 70 72 61 67 6d 61 2c 20 6d 61 6b 65 20  ** pragma, make 
2ce0: 73 75 72 65 20 69 74 20 69 73 20 6f 70 65 6e 2e  sure it is open.
2cf0: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62   .  */.  if( iDb
2d00: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 4f 70  ==1 && sqlite3Op
2d10: 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
2d20: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
2d30: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 7a 4c 65  turn;.  }..  zLe
2d40: 66 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ft = sqlite3Name
2d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 49  FromToken(db, pI
2d60: 64 29 3b 0a 20 20 69 66 28 20 21 7a 4c 65 66 74  d);.  if( !zLeft
2d70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2d80: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
2d90: 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74    zRight = sqlit
2da0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d  e3MPrintf(db, "-
2db0: 25 54 22 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  %T", pValue);.  
2dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68  }else{.    zRigh
2dd0: 74 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  t = sqlite3NameF
2de0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 56 61  romToken(db, pVa
2df0: 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  lue);.  }..  ass
2e00: 65 72 74 28 20 70 49 64 32 20 29 3b 0a 20 20 7a  ert( pId2 );.  z
2e10: 44 62 20 3d 20 70 49 64 32 2d 3e 6e 3e 30 20 3f  Db = pId2->n>0 ?
2e20: 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3a   pDb->zDbSName :
2e30: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
2e40: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
2e50: 65 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  e, SQLITE_PRAGMA
2e60: 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 2c  , zLeft, zRight,
2e70: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74   zDb) ){.    got
2e80: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
2e90: 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e 20  }..  /* Send an 
2ea0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
2eb0: 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GMA file-control
2ec0: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
2ed0: 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e 6e  ng VFS.  ** conn
2ee0: 65 63 74 69 6f 6e 2e 20 20 49 66 20 69 74 20 72  ection.  If it r
2ef0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2f00: 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68  , then assume th
2f10: 61 74 20 74 68 65 20 56 46 53 0a 20 20 2a 2a 20  at the VFS.  ** 
2f20: 68 61 6e 64 6c 65 64 20 74 68 65 20 70 72 61 67  handled the prag
2f30: 6d 61 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ma and generate 
2f40: 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65 64  a no-op prepared
2f50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2a   statement..  **
2f60: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
2f70: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 31 32 32 33 38  TION-OF: R-12238
2f80: 2d 35 35 31 32 30 20 57 68 65 6e 65 76 65 72 20  -55120 Whenever 
2f90: 61 20 50 52 41 47 4d 41 20 73 74 61 74 65 6d 65  a PRAGMA stateme
2fa0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 0a 20 20  nt is parsed,.  
2fb0: 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e  ** an SQLITE_FCN
2fc0: 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 20 63  TL_PRAGMA file c
2fd0: 6f 6e 74 72 6f 6c 20 69 73 20 73 65 6e 74 20 74  ontrol is sent t
2fe0: 6f 20 74 68 65 20 6f 70 65 6e 20 73 71 6c 69 74  o the open sqlit
2ff0: 65 33 5f 66 69 6c 65 0a 20 20 2a 2a 20 6f 62 6a  e3_file.  ** obj
3000: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3010: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
3020: 65 20 66 69 6c 65 20 74 6f 20 77 68 69 63 68 20  e file to which 
3030: 74 68 65 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20  the pragma.  ** 
3040: 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 73  statement refers
3050: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
3060: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
3070: 2d 32 39 38 37 35 2d 33 31 36 37 38 20 54 68 65  -29875-31678 The
3080: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3090: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
30a0: 41 47 4d 41 0a 20 20 2a 2a 20 66 69 6c 65 20 63  AGMA.  ** file c
30b0: 6f 6e 74 72 6f 6c 20 69 73 20 61 6e 20 61 72 72  ontrol is an arr
30c0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
30d0: 6f 20 73 74 72 69 6e 67 73 20 28 63 68 61 72 2a  o strings (char*
30e0: 2a 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a  *) in which the.
30f0: 20 20 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d    ** second elem
3100: 65 6e 74 20 6f 66 20 74 68 65 20 61 72 72 61 79  ent of the array
3110: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
3120: 74 68 65 20 70 72 61 67 6d 61 20 61 6e 64 20 74  the pragma and t
3130: 68 65 20 74 68 69 72 64 0a 20 20 2a 2a 20 65 6c  he third.  ** el
3140: 65 6d 65 6e 74 20 69 73 20 74 68 65 20 61 72 67  ement is the arg
3150: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 61  ument to the pra
3160: 67 6d 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  gma or NULL if t
3170: 68 65 20 70 72 61 67 6d 61 20 68 61 73 20 6e 6f  he pragma has no
3180: 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  .  ** argument..
3190: 20 20 2a 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d    */.  aFcntl[0]
31a0: 20 3d 20 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31   = 0;.  aFcntl[1
31b0: 5d 20 3d 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63  ] = zLeft;.  aFc
31c0: 6e 74 6c 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b  ntl[2] = zRight;
31d0: 0a 20 20 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30  .  aFcntl[3] = 0
31e0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
31f0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
3200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
3210: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
3220: 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
3230: 5f 50 52 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29  _PRAGMA, (void*)
3240: 61 46 63 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72  aFcntl);.  if( r
3250: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3270: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
3280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3290: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c  SetColName(v, 0,
32a0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 61   COLNAME_NAME, a
32b0: 46 63 6e 74 6c 5b 30 5d 2c 20 53 51 4c 49 54 45  Fcntl[0], SQLITE
32c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
32d0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65 78   returnSingleTex
32e0: 74 28 76 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b  t(v, aFcntl[0]);
32f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
3300: 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20  e(aFcntl[0]);.  
3310: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
3320: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  t;.  }.  if( rc!
3330: 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
3340: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 46 63 6e   ){.    if( aFcn
3350: 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  tl[0] ){.      s
3360: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3370: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 61 46 63  Parse, "%s", aFc
3380: 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 73  ntl[0]);.      s
3390: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 46 63 6e  qlite3_free(aFcn
33a0: 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  tl[0]);.    }.  
33b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
33c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
33d0: 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f 74 6f 20   = rc;.    goto 
33e0: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a  pragma_out;.  }.
33f0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
3400: 20 70 72 61 67 6d 61 20 69 6e 20 74 68 65 20 6c   pragma in the l
3410: 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a 2f 0a 20  ookup table */. 
3420: 20 70 50 72 61 67 6d 61 20 3d 20 70 72 61 67 6d   pPragma = pragm
3430: 61 4c 6f 63 61 74 65 28 7a 4c 65 66 74 29 3b 0a  aLocate(zLeft);.
3440: 20 20 69 66 28 20 70 50 72 61 67 6d 61 3d 3d 30    if( pPragma==0
3450: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
3460: 75 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ut;..  /* Make s
3470: 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
3480: 20 73 63 68 65 6d 61 20 69 73 20 6c 6f 61 64 65   schema is loade
3490: 64 20 69 66 20 74 68 65 20 70 72 61 67 6d 61 20  d if the pragma 
34a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 2a 2f  requires that */
34b0: 0a 20 20 69 66 28 20 28 70 50 72 61 67 6d 61 2d  .  if( (pPragma-
34c0: 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72 61 67  >mPragFlg & Prag
34d0: 46 6c 67 5f 4e 65 65 64 53 63 68 65 6d 61 29 21  Flg_NeedSchema)!
34e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
34f0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
3500: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
3510: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ragma_out;.  }..
3520: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
3530: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
3540: 6e 61 6d 65 73 20 66 6f 72 20 70 72 61 67 6d 61  names for pragma
3550: 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 72 65  s that return re
3560: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 66 28 20 28  sults */.  if( (
3570: 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c  pPragma->mPragFl
3580: 67 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f  g & PragFlg_NoCo
3590: 6c 75 6d 6e 73 29 3d 3d 30 20 0a 20 20 20 26 26  lumns)==0 .   &&
35a0: 20 28 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61   ((pPragma->mPra
35b0: 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f 4e  gFlg & PragFlg_N
35c0: 6f 43 6f 6c 75 6d 6e 73 31 29 3d 3d 30 20 7c 7c  oColumns1)==0 ||
35d0: 20 7a 52 69 67 68 74 3d 3d 30 29 0a 20 20 29 7b   zRight==0).  ){
35e0: 0a 20 20 20 20 73 65 74 50 72 61 67 6d 61 52 65  .    setPragmaRe
35f0: 73 75 6c 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  sultColumnNames(
3600: 76 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d  v, pPragma);.  }
3610: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
3620: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
3630: 72 61 67 6d 61 20 68 61 6e 64 6c 65 72 20 2a 2f  ragma handler */
3640: 0a 20 20 73 77 69 74 63 68 28 20 70 50 72 61 67  .  switch( pPrag
3650: 6d 61 2d 3e 65 50 72 61 67 54 79 70 20 29 7b 0a  ma->ePragTyp ){.
3660: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
3670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
3680: 52 5f 50 52 41 47 4d 41 53 29 20 26 26 20 21 64  R_PRAGMAS) && !d
3690: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
36a0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20  IT_DEPRECATED). 
36b0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
36c0: 20 5b 73 63 68 65 6d 61 2e 5d 64 65 66 61 75 6c   [schema.]defaul
36d0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  t_cache_size.  *
36e0: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
36f0: 61 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65  a.]default_cache
3700: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
3710: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
3720: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
3730: 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20  rent persistent 
3740: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
3750: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
3760: 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65  size.  The value
3770: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
3780: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
3790: 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e  of.  ** pages in
37a0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
37b0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
37c0: 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68 65 20  m sets both the 
37d0: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67  current.  ** pag
37e0: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
37f0: 75 65 20 61 6e 64 20 74 68 65 20 70 65 72 73 69  ue and the persi
3800: 73 74 65 6e 74 20 70 61 67 65 20 63 61 63 68 65  stent page cache
3810: 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a   size value.  **
3820: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
3830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
3840: 2a 2a 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65  **.  ** Older ve
3850: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
3860: 20 77 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64   would set the d
3870: 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a  efault cache siz
3880: 65 20 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61  e to a.  ** nega
3890: 74 69 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69  tive number to i
38a0: 6e 64 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e  ndicate synchron
38b0: 6f 75 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20  ous=OFF.  These 
38c0: 64 61 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75  days, synchronou
38d0: 73 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  s.  ** is always
38e0: 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72   on by default r
38f0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
3900: 20 73 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66   sign of the def
3910: 61 75 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20  ault cache.  ** 
3920: 73 69 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69  size.  But conti
3930: 6e 75 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  nue to take the 
3940: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
3950: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61  f the default ca
3960: 63 68 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  che.  ** size of
3970: 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
3980: 61 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a  atibility..  */.
3990: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44    case PragTyp_D
39a0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
39b0: 45 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  E: {.    static 
39c0: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
39d0: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
39e0: 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69  NO(2);.    stati
39f0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
3a00: 73 74 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  st getCacheSize[
3a10: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
3a20: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c  _Transaction, 0,
3a30: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20         /* 0 */. 
3a60: 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f       { OP_ReadCo
3a70: 6f 6b 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20  okie,  0, 1,    
3a80: 20 20 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c      BTREE_DEFAUL
3a90: 54 5f 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20  T_CACHE_SIZE},  
3aa0: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
3ab0: 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20  OP_IfPos,       
3ac0: 31 2c 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 8,        0},
3ad0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
3ae0: 67 65 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  ger,     0, 2,  
3af0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3b00: 7b 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20  { OP_Subtract,  
3b10: 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31    1, 2,        1
3b20: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66  },.      { OP_If
3b30: 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c  Pos,       1, 8,
3b40: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3b50: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
3b60: 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20      0, 1,       
3b70: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b90: 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  6 */.      { OP_
3ba0: 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20  Noop,        0, 
3bb0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
3bc0: 20 20 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52      { OP_ResultR
3bd0: 6f 77 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  ow,   1, 1,     
3be0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
3bf0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20    VdbeOp *aOp;. 
3c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
3c10: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
3c20: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
3c30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
3c40: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
3c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
3c60: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
3c70: 69 72 65 64 28 76 2c 20 41 72 72 61 79 53 69 7a  ired(v, ArraySiz
3c80: 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 29  e(getCacheSize))
3c90: 3b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 73 71  ;.      aOp = sq
3ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3cb0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
3cc0: 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67  getCacheSize), g
3cd0: 65 74 43 61 63 68 65 53 69 7a 65 2c 20 69 4c 6e  etCacheSize, iLn
3ce0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c  );.      if( ONL
3cf0: 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  Y_IF_REALLOC_STR
3d00: 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72  ESS(aOp==0) ) br
3d10: 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30  eak;.      aOp[0
3d20: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
3d30: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
3d40: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 36 5d 2e  b;.      aOp[6].
3d50: 70 31 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  p1 = SQLITE_DEFA
3d60: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a  ULT_CACHE_SIZE;.
3d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3d80: 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69   int size = sqli
3d90: 74 65 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69  te3AbsInt32(sqli
3da0: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29  te3Atoi(zRight))
3db0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3dc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
3dd0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
3de0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
3df0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3e00: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
3e10: 2c 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f  , BTREE_DEFAULT_
3e20: 43 41 43 48 45 5f 53 49 5a 45 2c 20 73 69 7a 65  CACHE_SIZE, size
3e30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3e40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3e50: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3e60: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 70 44 62   0) );.      pDb
3e70: 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65  ->pSchema->cache
3e80: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
3e90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
3ea0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 44 62  SetCacheSize(pDb
3eb0: 2d 3e 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68  ->pBt, pDb->pSch
3ec0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29  ema->cache_size)
3ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
3ee0: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
3ef0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41   !SQLITE_OMIT_PA
3f00: 47 45 52 5f 50 52 41 47 4d 41 53 20 26 26 20 21  GER_PRAGMAS && !
3f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
3f20: 45 43 41 54 45 44 20 2a 2f 0a 0a 23 69 66 20 21  ECATED */..#if !
3f30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3f40: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
3f50: 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  S).  /*.  **  PR
3f60: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f70: 67 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  ge_size.  **  PR
3f80: 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 70 61  AGMA [schema.]pa
3f90: 67 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  ge_size=N.  **. 
3fa0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
3fb0: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
3fc0: 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 66  urrent setting f
3fd0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  or the.  ** data
3fe0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20 69  base page size i
3ff0: 6e 20 62 79 74 65 73 2e 20 20 54 68 65 20 73 65  n bytes.  The se
4000: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
4010: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
4020: 20 70 61 67 65 20 73 69 7a 65 20 76 61 6c 75 65   page size value
4030: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 63 61 6e  .  The value can
4040: 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 0a   only be set if.
4050: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
4060: 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
4070: 65 6e 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  en created..  */
4080: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
4090: 50 41 47 45 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  PAGE_SIZE: {.   
40a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70 44   Btree *pBt = pD
40b0: 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  b->pBt;.    asse
40c0: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
40d0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
40e0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
40f0: 3d 20 41 4c 57 41 59 53 28 70 42 74 29 20 3f 20  = ALWAYS(pBt) ? 
4100: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
4110: 61 67 65 53 69 7a 65 28 70 42 74 29 20 3a 20 30  ageSize(pBt) : 0
4120: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  ;.      returnSi
4130: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 69 7a 65 29  ngleInt(v, size)
4140: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4150: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79     /* Malloc may
4160: 20 66 61 69 6c 20 77 68 65 6e 20 73 65 74 74 69   fail when setti
4170: 6e 67 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ng the page-size
4180: 2c 20 61 73 20 74 68 65 72 65 20 69 73 20 61 6e  , as there is an
4190: 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
41a0: 2a 2a 20 62 75 66 66 65 72 20 74 68 61 74 20 74  ** buffer that t
41b0: 68 65 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 20  he pager module 
41c0: 72 65 73 69 7a 65 73 20 75 73 69 6e 67 20 73 71  resizes using sq
41d0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e  lite3_realloc().
41e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
41f0: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
4200: 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a   = sqlite3Atoi(z
4210: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
4220: 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
4230: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
4240: 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
4250: 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 2d 31  >nextPagesize,-1
4260: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ,0) ){.        s
4270: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
4280: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
4290: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
42a0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
42b0: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73 65 63  GMA [schema.]sec
42c0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
42d0: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
42e0: 5d 73 65 63 75 72 65 5f 64 65 6c 65 74 65 3d 4f  ]secure_delete=O
42f0: 4e 2f 4f 46 46 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N/OFF.  **.  ** 
4300: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
4310: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
4320: 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  nt setting for t
4330: 68 65 0a 20 20 2a 2a 20 73 65 63 75 72 65 5f 64  he.  ** secure_d
4340: 65 6c 65 74 65 20 66 6c 61 67 2e 20 20 54 68 65  elete flag.  The
4350: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61   second form cha
4360: 6e 67 65 73 20 74 68 65 20 73 65 63 75 72 65 5f  nges the secure_
4370: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 66 6c 61 67  delete.  ** flag
4380: 20 73 65 74 74 69 6e 67 20 61 6e 64 20 72 65 70   setting and rep
4390: 6f 72 74 73 20 74 68 65 6e 65 77 20 76 61 6c 75  orts thenew valu
43a0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  e..  */.  case P
43b0: 72 61 67 54 79 70 5f 53 45 43 55 52 45 5f 44 45  ragTyp_SECURE_DE
43c0: 4c 45 54 45 3a 20 7b 0a 20 20 20 20 42 74 72 65  LETE: {.    Btre
43d0: 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42  e *pBt = pDb->pB
43e0: 74 3b 0a 20 20 20 20 69 6e 74 20 62 20 3d 20 2d  t;.    int b = -
43f0: 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
4400: 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  Bt!=0 );.    if(
4410: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
4420: 20 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 42   b = sqlite3GetB
4430: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
4440: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4450: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62   pId2->n==0 && b
4460: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
4470: 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
4480: 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
4490: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
44a0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
44b0: 72 65 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62  reDelete(db->aDb
44c0: 5b 69 69 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20  [ii].pBt, b);.  
44d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
44e0: 62 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  b = sqlite3Btree
44f0: 53 65 63 75 72 65 44 65 6c 65 74 65 28 70 42 74  SecureDelete(pBt
4500: 2c 20 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , b);.    return
4510: 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 62 29 3b  SingleInt(v, b);
4520: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4530: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4540: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 61 78 5f  MA [schema.]max_
4550: 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20  page_count.  ** 
4560: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4570: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
4580: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
4590: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
45a0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
45b0: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
45c0: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
45d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
45e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
45f0: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
4600: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
4610: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
4620: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
4630: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4640: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
4650: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
4660: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
4670: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
4680: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
4690: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
46a0: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
46b0: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
46c0: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
46d0: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
46e0: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
46f0: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
4700: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
4710: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
4720: 61 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20 20  a.]page_count.  
4730: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
4740: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
4750: 65 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  es in the specif
4760: 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ied database..  
4770: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
4780: 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b 0a  p_PAGE_COUNT: {.
4790: 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20      int iReg;.  
47a0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
47b0: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
47c0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65 67  , iDb);.    iReg
47d0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
47e0: 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  m;.    if( sqlit
47f0: 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b  e3Tolower(zLeft[
4800: 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20  0])=='p' ){.    
4810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4820: 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63 6f  Op2(v, OP_Pageco
4830: 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29 3b  unt, iDb, iReg);
4840: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4860: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67 63  Op3(v, OP_MaxPgc
4870: 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20 0a  nt, iDb, iReg, .
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
48a0: 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33 41  bsInt32(sqlite3A
48b0: 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a 20  toi(zRight)));. 
48c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
48d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
48e0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65 67  _ResultRow, iReg
48f0: 2c 20 31 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 1);.    break;
4900: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4910: 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e   PRAGMA [schema.
4920: 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20  ]locking_mode.  
4930: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  **  PRAGMA [sche
4940: 6d 61 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ma.]locking_mode
4950: 20 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75   = (normal|exclu
4960: 73 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73  sive).  */.  cas
4970: 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e  e PragTyp_LOCKIN
4980: 47 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f  G_MODE: {.    co
4990: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  nst char *zRet =
49a0: 20 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69   "normal";.    i
49b0: 6e 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f  nt eMode = getLo
49c0: 63 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74  ckingMode(zRight
49d0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32  );..    if( pId2
49e0: 2d 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d  ->n==0 && eMode=
49f0: 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
4a00: 44 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20  DE_QUERY ){.    
4a10: 20 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41    /* Simple "PRA
4a20: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
4a30: 3b 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ;" statement. Th
4a40: 69 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f  is is a query fo
4a50: 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  r.      ** the c
4a60: 75 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c  urrent default l
4a70: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69  ocking mode (whi
4a80: 63 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  ch may be differ
4a90: 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ent to.      ** 
4aa0: 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
4ab0: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
4ac0: 61 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f  abase)..      */
4ad0: 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64  .      eMode = d
4ae0: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b  b->dfltLockMode;
4af0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b00: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
4b10: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d  .      if( pId2-
4b20: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >n==0 ){.       
4b30: 20 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   /* This indicat
4b40: 65 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62  es that no datab
4b50: 61 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65  ase name was spe
4b60: 63 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20  cified as part. 
4b70: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
4b80: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e   PRAGMA command.
4b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4ba0: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d  e locking-mode m
4bb0: 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
4bc0: 2a 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74  * set on all att
4bd0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c  ached databases,
4be0: 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
4bf0: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20  main db file..  
4c00: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4c10: 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71   ** Also, the sq
4c20: 6c 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f  lite3.dfltLockMo
4c30: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  de variable is s
4c40: 65 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20  et so that.     
4c50: 20 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71     ** any subseq
4c60: 75 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20  uently attached 
4c70: 64 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75  databases also u
4c80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
4c90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
4ca0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  ing mode..      
4cb0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
4cc0: 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
4cd0: 65 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44  ert(pDb==&db->aD
4ce0: 62 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  b[0]);.        f
4cf0: 6f 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e  or(ii=2; ii<db->
4d00: 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  nDb; ii++){.    
4d10: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
4d20: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4d30: 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74  (db->aDb[ii].pBt
4d40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4d50: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
4d60: 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f  Mode(pPager, eMo
4d70: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  de);.        }. 
4d80: 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c         db->dfltL
4d90: 6f 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  ockMode = (u8)eM
4da0: 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
4db0: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
4dc0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44  te3BtreePager(pD
4dd0: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65  b->pBt);.      e
4de0: 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Mode = sqlite3Pa
4df0: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
4e00: 50 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  Pager, eMode);. 
4e10: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
4e20: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
4e30: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
4e40: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
4e50: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4e60: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
4e70: 49 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65  IVE );.    if( e
4e80: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4e90: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4ea0: 45 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20  E ){.      zRet 
4eb0: 3d 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20  = "exclusive";. 
4ec0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
4ed0: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 7a 52 65  ingleText(v, zRe
4ee0: 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  t);.    break;. 
4ef0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50   }..  /*.  **  P
4f00: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6a  RAGMA [schema.]j
4f10: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a  ournal_mode.  **
4f20: 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d 61    PRAGMA [schema
4f30: 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  .]journal_mode =
4f40: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
4f50: 20 20 20 20 20 20 20 20 20 20 20 28 64 65 6c 65             (dele
4f60: 74 65 7c 70 65 72 73 69 73 74 7c 6f 66 66 7c 74  te|persist|off|t
4f70: 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79 7c 77  runcate|memory|w
4f80: 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20 20 63  al|off).  */.  c
4f90: 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52  ase PragTyp_JOUR
4fa0: 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20  NAL_MODE: {.    
4fb0: 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20 20 20  int eMode;      
4fc0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
4fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
4fe0: 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20 2a 2f  E_XXX symbols */
4ff0: 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
5000: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5010: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 69  ounter */..    i
5020: 66 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( zRight==0 ){.
5030: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
5040: 65 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20  e is no "=MODE" 
5050: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
5060: 6d 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66  ma, do a query f
5070: 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
5080: 63 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a  current mode */.
5090: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41        eMode = PA
50a0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
50b0: 51 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65  QUERY;.    }else
50c0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
50d0: 61 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20  ar *zMode;.     
50e0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
50f0: 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29  Strlen30(zRight)
5100: 3b 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64  ;.      for(eMod
5110: 65 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71  e=0; (zMode = sq
5120: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65  lite3JournalMode
5130: 6e 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b  name(eMode))!=0;
5140: 20 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20   eMode++){.     
5150: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
5160: 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a  rNICmp(zRight, z
5170: 4d 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Mode, n)==0 ) br
5180: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5190: 20 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b     if( !zMode ){
51a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
51b0: 68 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  he "=MODE" part 
51c0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
51d0: 6e 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c  ny known journal
51e0: 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a   mode,.        *
51f0: 2a 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72  * then do a quer
5200: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f  y */.        eMo
5210: 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
5220: 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20  ALMODE_QUERY;.  
5230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5240: 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
5250: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
5260: 52 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30  RY && pId2->n==0
5270: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
5280: 76 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75  vert "PRAGMA jou
5290: 72 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20  rnal_mode" into 
52a0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
52b0: 72 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20  rnal_mode" */.  
52c0: 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20      iDb = 0;.   
52d0: 20 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a     pId2->n = 1;.
52e0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
52f0: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d  =db->nDb-1; ii>=
5300: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
5310: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  if( db->aDb[ii].
5320: 70 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20  pBt && (ii==iDb 
5330: 7c 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29  || pId2->n==0) )
5340: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5350: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
5360: 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73  , ii);.        s
5370: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5380: 28 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  (v, OP_JournalMo
5390: 64 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65  de, ii, 1, eMode
53a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
53b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
53c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
53d0: 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20  ultRow, 1, 1);. 
53e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
53f0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
5400: 20 5b 73 63 68 65 6d 61 2e 5d 6a 6f 75 72 6e 61   [schema.]journa
5410: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a  l_size_limit.  *
5420: 2a 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d  *  PRAGMA [schem
5430: 61 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  a.]journal_size_
5440: 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  limit=N.  **.  *
5450: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
5460: 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72   size limit on r
5470: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
5480: 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  files..  */.  ca
5490: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
54a0: 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b  AL_SIZE_LIMIT: {
54b0: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
54c0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
54d0: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
54e0: 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  ;.    i64 iLimit
54f0: 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a   = -2;.    if( z
5500: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
5510: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
5520: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  I64(zRight, &iLi
5530: 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mit);.      if( 
5540: 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d  iLimit<-1 ) iLim
5550: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  it = -1;.    }. 
5560: 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
5570: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
5580: 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c  izeLimit(pPager,
5590: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65   iLimit);.    re
55a0: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
55b0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 62 72   iLimit);.    br
55c0: 65 61 6b 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  eak;.  }..#endif
55d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
55e0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
55f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
5600: 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61 75 74  GMA [schema.]aut
5610: 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a 20 20 50  o_vacuum.  **  P
5620: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 61  RAGMA [schema.]a
5630: 75 74 6f 5f 76 61 63 75 75 6d 3d 4e 0a 20 20 2a  uto_vacuum=N.  *
5640: 2a 0a 20 20 2a 2a 20 47 65 74 20 6f 72 20 73 65  *.  ** Get or se
5650: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
5660: 68 65 20 64 61 74 61 62 61 73 65 20 27 61 75 74  he database 'aut
5670: 6f 2d 76 61 63 75 75 6d 27 20 70 61 72 61 6d 65  o-vacuum' parame
5680: 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  ter..  ** The va
5690: 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 3a 20 20  lue is one of:  
56a0: 30 20 4e 4f 4e 45 20 31 20 46 55 4c 4c 20 32 20  0 NONE 1 FULL 2 
56b0: 49 4e 43 52 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f  INCREMENTAL.  */
56c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
56d0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
56e0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 41    case PragTyp_A
56f0: 55 54 4f 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20  UTO_VACUUM: {.  
5700: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 70    Btree *pBt = p
5710: 44 62 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  Db->pBt;.    ass
5720: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
5730: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
5740: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
5750: 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
5760: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
5770: 63 75 75 6d 28 70 42 74 29 29 3b 0a 20 20 20 20  cuum(pBt));.    
5780: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
5790: 20 65 41 75 74 6f 20 3d 20 67 65 74 41 75 74 6f   eAuto = getAuto
57a0: 56 61 63 75 75 6d 28 7a 52 69 67 68 74 29 3b 0a  Vacuum(zRight);.
57b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 41        assert( eA
57c0: 75 74 6f 3e 3d 30 20 26 26 20 65 41 75 74 6f 3c  uto>=0 && eAuto<
57d0: 3d 32 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  =2 );.      db->
57e0: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 28 75  nextAutovac = (u
57f0: 38 29 65 41 75 74 6f 3b 0a 20 20 20 20 20 20 2f  8)eAuto;.      /
5800: 2a 20 43 61 6c 6c 20 53 65 74 41 75 74 6f 56 61  * Call SetAutoVa
5810: 63 75 75 6d 28 29 20 74 6f 20 73 65 74 20 69 6e  cuum() to set in
5820: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 74  itialize the int
5830: 65 72 6e 61 6c 20 61 75 74 6f 20 61 6e 64 0a 20  ernal auto and. 
5840: 20 20 20 20 20 2a 2a 20 69 6e 63 72 2d 76 61 63       ** incr-vac
5850: 75 75 6d 20 66 6c 61 67 73 2e 20 54 68 69 73 20  uum flags. This 
5860: 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
5870: 61 73 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ase this connect
5880: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 72 65  ion.      ** cre
5890: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
58a0: 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 69 6d  e file. It is im
58b0: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 69 74 20  portant that it 
58c0: 69 73 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  is created.     
58d0: 20 2a 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76   ** as an auto-v
58e0: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62  acuum capable db
58f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5900: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5910: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
5920: 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20 20 20  pBt, eAuto);.   
5930: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5940: 45 5f 4f 4b 20 26 26 20 28 65 41 75 74 6f 3d 3d  E_OK && (eAuto==
5950: 31 20 7c 7c 20 65 41 75 74 6f 3d 3d 32 29 20 29  1 || eAuto==2) )
5960: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  {.        /* Whe
5970: 6e 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75  n setting the au
5980: 74 6f 5f 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to_vacuum mode t
5990: 6f 20 65 69 74 68 65 72 20 22 66 75 6c 6c 22 20  o either "full" 
59a0: 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  or .        ** "
59b0: 69 6e 63 72 65 6d 65 6e 74 61 6c 22 2c 20 77 72  incremental", wr
59c0: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
59d0: 20 6d 65 74 61 5b 36 5d 20 69 6e 20 74 68 65 20   meta[6] in the 
59e0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
59f0: 20 2a 2a 20 66 69 6c 65 2e 20 42 65 66 6f 72 65   ** file. Before
5a00: 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 74 61   writing to meta
5a10: 5b 36 5d 2c 20 63 68 65 63 6b 20 74 68 61 74 20  [6], check that 
5a20: 6d 65 74 61 5b 33 5d 20 69 6e 64 69 63 61 74 65  meta[3] indicate
5a30: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
5a40: 74 20 74 68 69 73 20 72 65 61 6c 6c 79 20 69 73  t this really is
5a50: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
5a60: 63 61 70 61 62 6c 65 20 64 61 74 61 62 61 73 65  capable database
5a70: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5a80: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5a90: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
5aa0: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
5ab0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  );.        stati
5ac0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
5ad0: 73 74 20 73 65 74 4d 65 74 61 36 5b 5d 20 3d 20  st setMeta6[] = 
5ae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  {.          { OP
5af0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
5b00: 20 30 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20   0,         1,  
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b20: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
5b30: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61          { OP_Rea
5b40: 64 43 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20  dCookie,     0, 
5b50: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5b60: 20 20 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54     BTREE_LARGEST
5b70: 5f 52 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20  _ROOT_PAGE},.   
5b80: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20              1,  
5ba0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5bb0: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5bc0: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
5bd0: 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20 20 20     { OP_Halt,   
5be0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
5bf0: 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20 20 20  K, OE_Abort,    
5c00: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5c10: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b  3 */.          {
5c20: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
5c30: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 42      0,         B
5c40: 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55 55 4d  TREE_INCR_VACUUM
5c50: 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  , 0},    /* 4 */
5c60: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
5c70: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b      VdbeOp *aOp;
5c80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
5c90: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5ca0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
5cb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5cc0: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
5cd0: 63 52 65 71 75 69 72 65 64 28 76 2c 20 41 72 72  cRequired(v, Arr
5ce0: 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29  aySize(setMeta6)
5cf0: 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 20 3d  );.        aOp =
5d00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d10: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5d20: 7a 65 28 73 65 74 4d 65 74 61 36 29 2c 20 73 65  ze(setMeta6), se
5d30: 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b 0a 20 20  tMeta6, iLn);.  
5d40: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
5d50: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
5d60: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
5d70: 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 30 5d  ;.        aOp[0]
5d80: 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20  .p1 = iDb;.     
5d90: 20 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69     aOp[1].p1 = i
5da0: 44 62 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  Db;.        aOp[
5db0: 32 5d 2e 70 32 20 3d 20 69 41 64 64 72 2b 34 3b  2].p2 = iAddr+4;
5dc0: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 34 5d 2e  .        aOp[4].
5dd0: 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  p1 = iDb;.      
5de0: 20 20 61 4f 70 5b 34 5d 2e 70 33 20 3d 20 65 41    aOp[4].p3 = eA
5df0: 75 74 6f 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  uto - 1;.       
5e00: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
5e10: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
5e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5e30: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5e40: 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50  if..  /*.  **  P
5e50: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 69  RAGMA [schema.]i
5e60: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
5e70: 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  m(N).  **.  ** D
5e80: 6f 20 4e 20 73 74 65 70 73 20 6f 66 20 69 6e 63  o N steps of inc
5e90: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 69  remental vacuumi
5ea0: 6e 67 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ng on a database
5eb0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
5ec0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5ed0: 41 43 55 55 4d 0a 20 20 63 61 73 65 20 50 72 61  ACUUM.  case Pra
5ee0: 67 54 79 70 5f 49 4e 43 52 45 4d 45 4e 54 41 4c  gTyp_INCREMENTAL
5ef0: 5f 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 69  _VACUUM: {.    i
5f00: 6e 74 20 69 4c 69 6d 69 74 2c 20 61 64 64 72 3b  nt iLimit, addr;
5f10: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
5f20: 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 47 65  =0 || !sqlite3Ge
5f30: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
5f40: 69 4c 69 6d 69 74 29 20 7c 7c 20 69 4c 69 6d 69  iLimit) || iLimi
5f50: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  t<=0 ){.      iL
5f60: 69 6d 69 74 20 3d 20 30 78 37 66 66 66 66 66 66  imit = 0x7ffffff
5f70: 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  f;.    }.    sql
5f80: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5f90: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5fa0: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
5fb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5fc0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 4c  , OP_Integer, iL
5fd0: 69 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  imit, 1);.    ad
5fe0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5ff0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 63  AddOp1(v, OP_Inc
6000: 72 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 20 56  rVacuum, iDb); V
6010: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6030: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp1(v, OP_Resu
6040: 6c 74 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 73  ltRow, 1);.    s
6050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6060: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
6070: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
6080: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6090: 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64 64  OP_IfPos, 1, add
60a0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
60b0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
60c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
60d0: 61 64 64 72 29 3b 0a 20 20 20 20 62 72 65 61 6b  addr);.    break
60e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
60f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6100: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
6110: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
6120: 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68 65  A [schema.]cache
6130: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
6140: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6150: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
6160: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
6170: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
6180: 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74  rrent local sett
6190: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
61a0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
61b0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  . The second for
61c0: 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c  m sets the local
61d0: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
61e0: 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 66   size value.  If
61f0: 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65 20 74   N is positive t
6200: 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 0a  hen that is the.
6210: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
6220: 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
6230: 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  e.  If N is nega
6240: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  tive, then the. 
6250: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
6260: 67 65 73 20 69 73 20 61 64 6a 75 73 74 65 64 20  ges is adjusted 
6270: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
6280: 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69 62 79  e uses -N kibiby
6290: 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f  tes.  ** of memo
62a0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
62b0: 50 72 61 67 54 79 70 5f 43 41 43 48 45 5f 53 49  PragTyp_CACHE_SI
62c0: 5a 45 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE: {.    assert
62d0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
62e0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
62f0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0) );.    if( 
6300: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
6310: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
6320: 28 76 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  (v, pDb->pSchema
6330: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20  ->cache_size);. 
6340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6350: 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74  int size = sqlit
6360: 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  e3Atoi(zRight);.
6370: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
6380: 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  ma->cache_size =
6390: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c   size;.      sql
63a0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
63b0: 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20  eSize(pDb->pBt, 
63c0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
63d0: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
63e0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
63f0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
6400: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63 61 63 68  MA [schema.]cach
6410: 65 5f 73 70 69 6c 6c 0a 20 20 2a 2a 20 20 50 52  e_spill.  **  PR
6420: 41 47 4d 41 20 63 61 63 68 65 5f 73 70 69 6c 6c  AGMA cache_spill
6430: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 20 20 50  =BOOLEAN.  **  P
6440: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 63  RAGMA [schema.]c
6450: 61 63 68 65 5f 73 70 69 6c 6c 3d 4e 0a 20 20 2a  ache_spill=N.  *
6460: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
6470: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
6480: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
6490: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
64a0: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
64b0: 73 70 69 6c 6c 20 73 69 7a 65 2e 20 54 68 65 20  spill size. The 
64c0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 75 72 6e  second form turn
64d0: 73 20 63 61 63 68 65 20 73 70 69 6c 6c 20 6f 6e  s cache spill on
64e0: 0a 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 57  .  ** or off.  W
64f0: 68 65 6e 20 74 75 72 6e 6e 69 6e 67 20 63 61 63  hen turnning cac
6500: 68 65 20 73 70 69 6c 6c 20 6f 6e 2c 20 74 68 65  he spill on, the
6510: 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
6520: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
6530: 20 63 61 63 68 65 5f 73 69 7a 65 2e 20 20 54 68   cache_size.  Th
6540: 65 20 74 68 69 72 64 20 66 6f 72 6d 20 73 65 74  e third form set
6550: 73 20 61 20 73 70 69 6c 6c 20 73 69 7a 65 20 74  s a spill size t
6560: 68 61 74 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  hat.  ** may be 
6570: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 20 74  different form t
6580: 68 65 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  he cache size.. 
6590: 20 2a 2a 20 49 66 20 4e 20 69 73 20 70 6f 73 69   ** If N is posi
65a0: 74 69 76 65 20 74 68 65 6e 20 74 68 61 74 20 69  tive then that i
65b0: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
65c0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
65d0: 65 20 63 61 63 68 65 2e 20 20 49 66 20 4e 20 69  e cache.  If N i
65e0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
65f0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
6600: 20 6f 66 20 70 61 67 65 73 20 69 73 20 61 64 6a   of pages is adj
6610: 75 73 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  usted so that th
6620: 65 20 63 61 63 68 65 20 75 73 65 73 20 2d 4e 20  e cache uses -N 
6630: 6b 69 62 69 62 79 74 65 73 0a 20 20 2a 2a 20 6f  kibibytes.  ** o
6640: 66 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20  f memory..  **. 
6650: 20 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   ** If the numbe
6660: 72 20 6f 66 20 63 61 63 68 65 5f 73 70 69 6c 6c  r of cache_spill
6670: 20 70 61 67 65 73 20 69 73 20 6c 65 73 73 20 74   pages is less t
6680: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
6690: 66 0a 20 20 2a 2a 20 63 61 63 68 65 5f 73 69 7a  f.  ** cache_siz
66a0: 65 20 70 61 67 65 73 2c 20 6e 6f 20 73 70 69 6c  e pages, no spil
66b0: 6c 69 6e 67 20 6f 63 63 75 72 73 20 75 6e 74 69  ling occurs unti
66c0: 6c 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74  l the page count
66d0: 20 65 78 63 65 65 64 73 0a 20 20 2a 2a 20 74 68   exceeds.  ** th
66e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
66f0: 65 5f 73 69 7a 65 20 70 61 67 65 73 2e 0a 20 20  e_size pages..  
6700: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 63 68  **.  ** The cach
6710: 65 5f 73 70 69 6c 6c 3d 42 4f 4f 4c 45 41 4e 20  e_spill=BOOLEAN 
6720: 73 65 74 74 69 6e 67 20 61 70 70 6c 69 65 73 20  setting applies 
6730: 74 6f 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  to all attached 
6740: 73 63 68 65 6d 61 73 2c 0a 20 20 2a 2a 20 6e 6f  schemas,.  ** no
6750: 74 20 6a 75 73 74 20 74 68 65 20 73 63 68 65 6d  t just the schem
6760: 61 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a  a specified..  *
6770: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
6780: 5f 43 41 43 48 45 5f 53 50 49 4c 4c 3a 20 7b 0a  _CACHE_SPILL: {.
6790: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
67a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
67b0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
67c0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
67d0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
67e0: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 0a 20 20  nSingleInt(v,.  
67f0: 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67         (db->flag
6800: 73 20 26 20 53 51 4c 49 54 45 5f 43 61 63 68 65  s & SQLITE_Cache
6810: 53 70 69 6c 6c 29 3d 3d 30 20 3f 20 30 20 3a 20  Spill)==0 ? 0 : 
6820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
6830: 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
6840: 6c 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 30  lSize(pDb->pBt,0
6850: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
6860: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
6870: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
6880: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
6890: 67 68 74 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20  ght, &size) ){. 
68a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
68b0: 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
68c0: 70 44 62 2d 3e 70 42 74 2c 20 73 69 7a 65 29 3b  pDb->pBt, size);
68d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
68e0: 66 28 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  f( sqlite3GetBoo
68f0: 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 73 69 7a  lean(zRight, siz
6900: 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  e!=0) ){.       
6910: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6920: 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 3b  LITE_CacheSpill;
6930: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6940: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6950: 26 3d 20 7e 53 51 4c 49 54 45 5f 43 61 63 68 65  &= ~SQLITE_Cache
6960: 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  Spill;.      }. 
6970: 20 20 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72       setAllPager
6980: 46 6c 61 67 73 28 64 62 29 3b 0a 20 20 20 20 7d  Flags(db);.    }
6990: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
69a0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
69b0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6d 6d 61 70  MA [schema.]mmap
69c0: 5f 73 69 7a 65 28 4e 29 0a 20 20 2a 2a 0a 20 20  _size(N).  **.  
69d0: 2a 2a 20 55 73 65 64 20 74 6f 20 73 65 74 20 6d  ** Used to set m
69e0: 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69  apping size limi
69f0: 74 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 73  t. The mapping s
6a00: 69 7a 65 20 6c 69 6d 69 74 20 69 73 0a 20 20 2a  ize limit is.  *
6a10: 2a 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  * used to limit 
6a20: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 73 69  the aggregate si
6a30: 7a 65 20 6f 66 20 61 6c 6c 20 6d 65 6d 6f 72 79  ze of all memory
6a40: 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20   mapped regions 
6a50: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  of the.  ** data
6a60: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
6a70: 69 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  is parameter is 
6a80: 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  set to zero, the
6a90: 6e 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  n memory mapping
6aa0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
6ab0: 64 20 61 74 20 61 6c 6c 2e 20 20 49 66 20 4e 20  d at all.  If N 
6ac0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
6ad0: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 65  n the default me
6ae0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 6c 69  mory map.  ** li
6af0: 6d 69 74 20 64 65 74 65 72 6d 69 6e 65 64 20 62  mit determined b
6b00: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
6b10: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
6b20: 4d 41 50 5f 53 49 5a 45 29 20 69 73 20 73 65 74  MAP_SIZE) is set
6b30: 2e 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 61 6d  ..  ** The param
6b40: 65 74 65 72 20 4e 20 69 73 20 6d 65 61 73 75 72  eter N is measur
6b50: 65 64 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 2a  ed in bytes..  *
6b60: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 76 61 6c 75  *.  ** This valu
6b70: 65 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20  e is advisory.  
6b80: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56  The underlying V
6b90: 46 53 20 69 73 20 66 72 65 65 20 74 6f 20 6d 65  FS is free to me
6ba0: 6d 6f 72 79 20 6d 61 70 0a 20 20 2a 2a 20 61 73  mory map.  ** as
6bb0: 20 6c 69 74 74 6c 65 20 6f 72 20 61 73 20 6d 75   little or as mu
6bc0: 63 68 20 61 73 20 69 74 20 77 61 6e 74 73 2e 20  ch as it wants. 
6bd0: 20 45 78 63 65 70 74 2c 20 69 66 20 4e 20 69 73   Except, if N is
6be0: 20 73 65 74 20 74 6f 20 30 20 74 68 65 6e 20 74   set to 0 then t
6bf0: 68 65 0a 20 20 2a 2a 20 75 70 70 65 72 20 6c 61  he.  ** upper la
6c00: 79 65 72 73 20 77 69 6c 6c 20 6e 65 76 65 72 20  yers will never 
6c10: 69 6e 76 6f 6b 65 20 74 68 65 20 78 46 65 74 63  invoke the xFetc
6c20: 68 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20  h interfaces to 
6c30: 74 68 65 20 56 46 53 2e 0a 20 20 2a 2f 0a 20 20  the VFS..  */.  
6c40: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4d 4d 41  case PragTyp_MMA
6c50: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 73 71  P_SIZE: {.    sq
6c60: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
6c70: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
6c80: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 61  MAP_SIZE>0.    a
6c90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
6ca0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
6cb0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
6cc0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
6cd0: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
6ce0: 20 20 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48     sqlite3DecOrH
6cf0: 65 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20  exToI64(zRight, 
6d00: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
6d10: 73 7a 3c 30 20 29 20 73 7a 20 3d 20 73 71 6c 69  sz<0 ) sz = sqli
6d20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
6d30: 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 69 66  szMmap;.      if
6d40: 28 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64  ( pId2->n==0 ) d
6d50: 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 3b 0a  b->szMmap = sz;.
6d60: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d        for(ii=db-
6d70: 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69  >nDb-1; ii>=0; i
6d80: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i--){.        if
6d90: 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  ( db->aDb[ii].pB
6da0: 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c  t && (ii==iDb ||
6db0: 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a   pId2->n==0) ){.
6dc0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6dd0: 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
6de0: 69 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  it(db->aDb[ii].p
6df0: 42 74 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  Bt, sz);.       
6e00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6e10: 0a 20 20 20 20 73 7a 20 3d 20 2d 31 3b 0a 20 20  .    sz = -1;.  
6e20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
6e30: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
6e40: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  zDb, SQLITE_FCNT
6e50: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
6e60: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 7a 20  );.#else.    sz 
6e70: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 0;.    rc = SQ
6e80: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
6e90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6ea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6eb0: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
6ec0: 2c 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , sz);.    }else
6ed0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6ee0: 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
6ef0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6f00: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6f10: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  rc = rc;.    }. 
6f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6f30: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
6f40: 41 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a  A temp_store.  *
6f50: 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f  *   PRAGMA temp_
6f60: 73 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74  store = "default
6f70: 22 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65  "|"memory"|"file
6f80: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
6f90: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
6fa0: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
6fb0: 20 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67   temp_store flag
6fc0: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
6fd0: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
6fe0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63   does not make c
6ff0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69  hanges to the di
7000: 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  sk file and the 
7010: 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c  default.  ** val
7020: 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f  ue will be resto
7030: 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d  red the next tim
7040: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
7050: 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20  s opened..  **. 
7060: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74   ** Note that it
7070: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
7080: 20 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d   the library com
7090: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
70a0: 73 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69  s to.  ** overri
70b0: 64 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a  de this setting.
70c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
70d0: 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 3a 20  Typ_TEMP_STORE: 
70e0: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
70f0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
7100: 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 64 62  nSingleInt(v, db
7110: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 29 3b 0a 20  ->temp_store);. 
7120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7130: 63 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67  changeTempStorag
7140: 65 28 70 50 61 72 73 65 2c 20 7a 52 69 67 68 74  e(pParse, zRight
7150: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  );.    }.    bre
7160: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
7170: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
7180: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
7190: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
71a0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
71b0: 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74  ory = ""|"direct
71c0: 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20  ory_name".  **. 
71d0: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
71e0: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
71f0: 65 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74  e of the temp_st
7200: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c  ore_directory fl
7210: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
7220: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
7230: 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72  s a specific dir
7240: 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65  ectory to be use
7250: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
7260: 66 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74  files..  ** Sett
7270: 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74  ing to a null st
7280: 72 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20  ring reverts to 
7290: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70  the default temp
72a0: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
72b0: 73 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20  search..  ** If 
72c0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
72d0: 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ory is changed, 
72e0: 74 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54  then invalidateT
72f0: 65 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a  empStorage..  **
7300: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7310: 67 54 79 70 5f 54 45 4d 50 5f 53 54 4f 52 45 5f  gTyp_TEMP_STORE_
7320: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7330: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7340: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7350: 6c 65 54 65 78 74 28 76 2c 20 73 71 6c 69 74 65  leText(v, sqlite
7360: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7370: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
7380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7390: 54 5f 57 53 44 0a 20 20 20 20 20 20 69 66 28 20  T_WSD.      if( 
73a0: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
73b0: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
73c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
73d0: 65 33 4f 73 41 63 63 65 73 73 28 64 62 2d 3e 70  e3OsAccess(db->p
73e0: 56 66 73 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c  Vfs, zRight, SQL
73f0: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
7400: 52 49 54 45 2c 20 26 72 65 73 29 3b 0a 20 20 20  RITE, &res);.   
7410: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7420: 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30  ITE_OK || res==0
7430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7440: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7450: 61 72 73 65 2c 20 22 6e 6f 74 20 61 20 77 72 69  arse, "not a wri
7460: 74 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79 22  table directory"
7470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
7480: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
7490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
74a0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
74b0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20  _TEMP_STORE==0. 
74c0: 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45        || (SQLITE
74d0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26  _TEMP_STORE==1 &
74e0: 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  & db->temp_store
74f0: 3c 3d 31 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  <=1).       || (
7500: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7510: 45 3d 3d 32 20 26 26 20 64 62 2d 3e 74 65 6d 70  E==2 && db->temp
7520: 5f 73 74 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20  _store==1).     
7530: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
7540: 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67  lidateTempStorag
7550: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
7560: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7570: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 74 65  _free(sqlite3_te
7580: 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
7590: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
75a0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
75b0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
75c0: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
75d0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
75e0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
75f0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7600: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7610: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7620: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7630: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7640: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7650: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7660: 57 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  WIN.  /*.  **   
7670: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
7680: 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a  e_directory.  **
7690: 20 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73     PRAGMA data_s
76a0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d  tore_directory =
76b0: 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e   ""|"directory_n
76c0: 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  ame".  **.  ** R
76d0: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
76e0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
76f0: 74 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  the data_store_d
7700: 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20  irectory flag.  
7710: 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68  Changing.  ** th
7720: 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73  e value sets a s
7730: 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72  pecific director
7740: 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  y to be used for
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
7760: 74 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73  that.  ** were s
7770: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20  pecified with a 
7780: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
7790: 65 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61  e.  Setting to a
77a0: 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76   null string rev
77b0: 65 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  erts.  ** to the
77c0: 20 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73   default databas
77d0: 65 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69  e directory, whi
77e0: 63 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ch for database 
77f0: 66 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20  files specified 
7800: 77 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61  with.  ** a rela
7810: 74 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70  tive path will p
7820: 72 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64  robably be based
7830: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
7840: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
7850: 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20  e.  ** process. 
7860: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   Database file s
7870: 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e  pecified with an
7880: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61   absolute path a
7890: 72 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a  re not impacted.
78a0: 20 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74    ** by this set
78b0: 74 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73  ting, regardless
78c0: 20 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20   of its value.. 
78d0: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
78e0: 50 72 61 67 54 79 70 5f 44 41 54 41 5f 53 54 4f  PragTyp_DATA_STO
78f0: 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a  RE_DIRECTORY: {.
7900: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
7910: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
7920: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 73 71 6c  ingleText(v, sql
7930: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7940: 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ory);.    }else{
7950: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7960: 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 69  OMIT_WSD.      i
7970: 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a  f( zRight[0] ){.
7980: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
7990: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
79a0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 64 62  lite3OsAccess(db
79b0: 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68 74 2c 20  ->pVfs, zRight, 
79c0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
79d0: 41 44 57 52 49 54 45 2c 20 26 72 65 73 29 3b 0a  ADWRITE, &res);.
79e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
79f0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73  SQLITE_OK || res
7a00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7a10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7a20: 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 20  (pParse, "not a 
7a30: 77 72 69 74 61 62 6c 65 20 64 69 72 65 63 74 6f  writable directo
7a40: 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ry");.          
7a50: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
7a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7a70: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7a80: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 64 61  _free(sqlite3_da
7a90: 74 61 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  ta_directory);. 
7aa0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
7ab0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
7ac0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
7ad0: 74 6f 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  tory = sqlite3_m
7ae0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 52 69  printf("%s", zRi
7af0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
7b00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7b10: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
7b20: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  y = 0;.      }.#
7b30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7b40: 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20  OMIT_WSD */.    
7b50: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7b60: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
7b70: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
7b80: 4e 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20  NG_STYLE.  /*.  
7b90: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68  **   PRAGMA [sch
7ba0: 65 6d 61 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ema.]lock_proxy_
7bb0: 66 69 6c 65 0a 20 20 2a 2a 20 20 20 50 52 41 47  file.  **   PRAG
7bc0: 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 6c 6f 63 6b  MA [schema.]lock
7bd0: 5f 70 72 6f 78 79 5f 66 69 6c 65 20 3d 20 22 3a  _proxy_file = ":
7be0: 61 75 74 6f 3a 22 7c 22 6c 6f 63 6b 5f 66 69 6c  auto:"|"lock_fil
7bf0: 65 5f 70 61 74 68 22 0a 20 20 2a 2a 0a 20 20 2a  e_path".  **.  *
7c00: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
7c10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
7c20: 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65   lock_proxy_file
7c30: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
7c40: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
7c50: 73 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20  sets a specific 
7c60: 66 69 6c 65 20 74 6f 20 62 65 20 75 73 65 64 20  file to be used 
7c70: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 63 63  for database acc
7c80: 65 73 73 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 0a  ess locks..  **.
7c90: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
7ca0: 54 79 70 5f 4c 4f 43 4b 5f 50 52 4f 58 59 5f 46  Typ_LOCK_PROXY_F
7cb0: 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ILE: {.    if( !
7cc0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
7cd0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
7ce0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
7cf0: 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  r(pDb->pBt);.   
7d00: 20 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66     char *proxy_f
7d10: 69 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b  ile_path = NULL;
7d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7d30: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c  ile *pFile = sql
7d40: 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
7d50: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
7d60: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
7d70: 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c  lHint(pFile, SQL
7d80: 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
7d90: 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  YFILE, .        
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7db0: 20 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70     &proxy_file_p
7dc0: 61 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ath);.      retu
7dd0: 72 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20  rnSingleText(v, 
7de0: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 29  proxy_file_path)
7df0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e00: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
7e10: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7e20: 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  ager(pDb->pBt);.
7e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7e40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7e50: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7e60: 67 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ger);.      int 
7e70: 72 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  res;.      if( z
7e80: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7e90: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7ea0: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7eb0: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7ec0: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20      zRight);.   
7f00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
7f10: 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f      res=sqlite3O
7f20: 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69  sFileControl(pFi
7f30: 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  le, SQLITE_SET_L
7f40: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20      NULL);.     
7f80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73   }.      if( res
7f90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7fa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7fb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7fc0: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f  failed to set lo
7fd0: 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b  ck proxy file");
7fe0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72  .        goto pr
7ff0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
8000: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
8010: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  k;.  }.#endif /*
8020: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
8030: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 20  OCKING_STYLE */ 
8040: 20 20 20 20 20 0a 20 20 20 20 0a 20 20 2f 2a 0a       .    .  /*.
8050: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73    **   PRAGMA [s
8060: 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72 6f 6e 6f  chema.]synchrono
8070: 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  us.  **   PRAGMA
8080: 20 5b 73 63 68 65 6d 61 2e 5d 73 79 6e 63 68 72   [schema.]synchr
8090: 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52  onous=OFF|ON|NOR
80a0: 4d 41 4c 7c 46 55 4c 4c 7c 45 58 54 52 41 0a 20  MAL|FULL|EXTRA. 
80b0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
80c0: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
80d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
80e0: 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20  nchronous flag. 
80f0: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
8100: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64  he local value d
8110: 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61  oes not make cha
8120: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b  nges to the disk
8130: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20   file and the.  
8140: 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
8150: 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65   will be restore
8160: 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  d the next time 
8170: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
8180: 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a    ** opened..  *
8190: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
81a0: 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 3a 20 7b 0a  _SYNCHRONOUS: {.
81b0: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
81c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
81d0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70 44 62 2d  ingleInt(v, pDb-
81e0: 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31 29  >safety_level-1)
81f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8200: 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f     if( !db->auto
8210: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
8220: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8230: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
8240: 20 20 20 20 20 20 20 22 53 61 66 65 74 79 20 6c         "Safety l
8250: 65 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65 20  evel may not be 
8260: 63 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20 61  changed inside a
8270: 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a   transaction");.
8280: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8290: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
82a0: 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 28    int iLevel = (
82b0: 67 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a  getSafetyLevel(z
82c0: 52 69 67 68 74 2c 30 2c 31 29 2b 31 29 20 26 20  Right,0,1)+1) & 
82d0: 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
82e0: 53 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20  S_MASK;.        
82f0: 69 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29 20  if( iLevel==0 ) 
8300: 69 4c 65 76 65 6c 20 3d 20 31 3b 0a 20 20 20 20  iLevel = 1;.    
8310: 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
8320: 6c 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a  level = iLevel;.
8330: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 62 53 79          pDb->bSy
8340: 6e 63 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  ncSet = 1;.     
8350: 20 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c     setAllPagerFl
8360: 61 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ags(db);.      }
8370: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
8380: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
83a0: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  R_PRAGMAS */..#i
83b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
83c0: 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20  T_FLAG_PRAGMAS. 
83d0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c   case PragTyp_FL
83e0: 41 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  AG: {.    if( zR
83f0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
8400: 20 73 65 74 50 72 61 67 6d 61 52 65 73 75 6c 74   setPragmaResult
8410: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70  ColumnNames(v, p
8420: 50 72 61 67 6d 61 29 3b 0a 20 20 20 20 20 20 72  Pragma);.      r
8430: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
8440: 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 70  , (db->flags & p
8450: 50 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30  Pragma->iArg)!=0
8460: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
8470: 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
8480: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20  pPragma->iArg;  
8490: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
84a0: 73 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65 61  s to set or clea
84b0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
84c0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
84d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
84e0: 46 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70 70  Foreign key supp
84f0: 6f 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 65  ort may not be e
8500: 6e 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62 6c  nabled or disabl
8510: 65 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20  ed while not.   
8520: 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d       ** in auto-
8530: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f  commit mode.  */
8540: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26 3d  .        mask &=
8550: 20 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   ~(SQLITE_Foreig
8560: 6e 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeys);.      }.
8570: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
8580: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
8590: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74       if( db->aut
85a0: 68 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55  h.authLevel==UAU
85b0: 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20  TH_User ){.     
85c0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
85d0: 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65  ow non-admin use
85e0: 72 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  rs to modify the
85f0: 20 73 63 68 65 6d 61 20 61 72 62 69 74 72 61 72   schema arbitrar
8600: 69 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ily */.        m
8610: 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ask &= ~(SQLITE_
8620: 57 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20 20  WriteSchema);.  
8630: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8640: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
8650: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
8660: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
8670: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73  db->flags |= mas
8680: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
8690: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
86a0: 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  s &= ~mask;.    
86b0: 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51      if( mask==SQ
86c0: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29 20  LITE_DeferFKs ) 
86d0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
86e0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
86f0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79  }..      /* Many
8700: 20 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72 61   of the flag-pra
8710: 67 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65 20  gmas modify the 
8720: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
8730: 79 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20 20  y the SQL .     
8740: 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65 67   ** compiler (eg
8750: 2e 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29  . count_changes)
8760: 2e 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f  . So add an opco
8770: 64 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c 6c  de to expire all
8780: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
8790: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
87a0: 73 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69 6e  s after modifyin
87b0: 67 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75 65  g a pragma value
87c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
87d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
87e0: 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29  p0(v, OP_Expire)
87f0: 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 50 61  ;.      setAllPa
8800: 67 65 72 46 6c 61 67 73 28 64 62 29 3b 0a 20 20  gerFlags(db);.  
8810: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
8820: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8830: 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52  ITE_OMIT_FLAG_PR
8840: 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65  AGMAS */..#ifnde
8850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  f SQLITE_OMIT_SC
8860: 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a 20 20 2f  HEMA_PRAGMAS.  /
8870: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
8880: 74 61 62 6c 65 5f 69 6e 66 6f 28 3c 74 61 62 6c  table_info(<tabl
8890: 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  e>).  **.  ** Re
88a0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
88b0: 77 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  w for each colum
88c0: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  n of the named t
88d0: 61 62 6c 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e  able. The column
88e0: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  s of.  ** the re
88f0: 74 75 72 6e 65 64 20 64 61 74 61 20 73 65 74 20  turned data set 
8900: 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  are:.  **.  ** c
8910: 69 64 3a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  id:        Colum
8920: 6e 20 69 64 20 28 6e 75 6d 62 65 72 65 64 20 66  n id (numbered f
8930: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
8940: 74 2c 20 73 74 61 72 74 69 6e 67 20 61 74 20 30  t, starting at 0
8950: 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20 20 20 20  ).  ** name:    
8960: 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 20     Column name. 
8970: 20 2a 2a 20 74 79 70 65 3a 20 20 20 20 20 20 20   ** type:       
8980: 43 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  Column declarati
8990: 6f 6e 20 74 79 70 65 2e 0a 20 20 2a 2a 20 6e 6f  on type..  ** no
89a0: 74 6e 75 6c 6c 3a 20 20 20 20 54 72 75 65 20 69  tnull:    True i
89b0: 66 20 27 4e 4f 54 20 4e 55 4c 4c 27 20 69 73 20  f 'NOT NULL' is 
89c0: 70 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 64  part of column d
89d0: 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  eclaration.  ** 
89e0: 64 66 6c 74 5f 76 61 6c 75 65 3a 20 54 68 65 20  dflt_value: The 
89f0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8a00: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 69 66  r the column, if
8a10: 20 61 6e 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   any..  */.  cas
8a20: 65 20 50 72 61 67 54 79 70 5f 54 41 42 4c 45 5f  e PragTyp_TABLE_
8a30: 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74  INFO: if( zRight
8a40: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
8a50: 54 61 62 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  Tab;.    pTab = 
8a60: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
8a70: 6c 65 28 70 50 61 72 73 65 2c 20 4c 4f 43 41 54  le(pParse, LOCAT
8a80: 45 5f 4e 4f 45 52 52 2c 20 7a 52 69 67 68 74 2c  E_NOERR, zRight,
8a90: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
8aa0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Tab ){.      int
8ab0: 20 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e 74   i, k;.      int
8ac0: 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20   nHidden = 0;.  
8ad0: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
8ae0: 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
8af0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
8b00: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
8b10: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
8b20: 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20  >nMem = 6;.     
8b30: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
8b40: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
8b50: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
8b60: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
8b70: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
8b80: 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Tab);.      for(
8b90: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
8ba0: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
8bb0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
8bc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
8bd0: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
8be0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
8bf0: 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20  nHidden++;.     
8c00: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8c10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8c20: 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46   if( (pCol->colF
8c30: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
8c40: 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20  RIMKEY)==0 ){.  
8c50: 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20          k = 0;. 
8c60: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8c70: 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPk==0 ){.     
8c80: 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20       k = 1;.    
8c90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ca0: 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
8cb0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70  =pTab->nCol && p
8cc0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31  Pk->aiColumn[k-1
8cd0: 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20  ]!=i; k++){}.   
8ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
8cf0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 70 44 66  ssert( pCol->pDf
8d00: 6c 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 2d 3e 70  lt==0 || pCol->p
8d10: 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41  Dflt->op==TK_SPA
8d20: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
8d30: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
8d40: 64 28 76 2c 20 31 2c 20 22 69 73 73 69 73 69 22  d(v, 1, "issisi"
8d50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8d60: 20 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20 20 20   i-nHidden,.    
8d70: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
8d80: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
8d90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
8da0: 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22  lumnType(pCol,""
8db0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
8dc0: 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20    pCol->notNull 
8dd0: 3f 20 31 20 3a 20 30 2c 0a 20 20 20 20 20 20 20  ? 1 : 0,.       
8de0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44          pCol->pD
8df0: 66 6c 74 20 3f 20 70 43 6f 6c 2d 3e 70 44 66 6c  flt ? pCol->pDfl
8e00: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3a 20 30 2c  t->u.zToken : 0,
8e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e20: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
8e30: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
8e40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8e50: 42 55 47 0a 20 20 63 61 73 65 20 50 72 61 67 54  BUG.  case PragT
8e60: 79 70 5f 53 54 41 54 53 3a 20 7b 0a 20 20 20 20  yp_STATS: {.    
8e70: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
8e80: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
8e90: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
8ea0: 20 35 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   5;.    sqlite3C
8eb0: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
8ec0: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
8ed0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
8ee0: 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53  shFirst(&pDb->pS
8ef0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
8f00: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
8f10: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 20 20  Next(i)){.      
8f20: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
8f30: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
8f40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8f50: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31  beMultiLoad(v, 1
8f60: 2c 20 22 73 73 69 69 69 22 2c 0a 20 20 20 20 20  , "ssiii",.     
8f70: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
8f80: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 30 2c  e,.           0,
8f90: 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
8fa0: 2d 3e 73 7a 54 61 62 52 6f 77 2c 0a 20 20 20 20  ->szTabRow,.    
8fb0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f         pTab->nRo
8fc0: 77 4c 6f 67 45 73 74 2c 0a 20 20 20 20 20 20 20  wLogEst,.       
8fd0: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
8fe0: 67 73 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  gs);.      for(p
8ff0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
9000: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9010: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
9020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9030: 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20 22 73  ltiLoad(v, 2, "s
9040: 69 69 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20  iiiX",.         
9050: 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20    pIdx->zName,. 
9060: 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
9070: 73 7a 49 64 78 52 6f 77 2c 0a 20 20 20 20 20 20  szIdxRow,.      
9080: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77       pIdx->aiRow
9090: 4c 6f 67 45 73 74 5b 30 5d 2c 0a 20 20 20 20 20  LogEst[0],.     
90a0: 20 20 20 20 20 20 70 49 64 78 2d 3e 68 61 73 53        pIdx->hasS
90b0: 74 61 74 31 29 3b 0a 20 20 20 20 20 20 20 20 73  tat1);.        s
90c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
90d0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
90e0: 2c 20 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d  , 1, 5);.      }
90f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
9100: 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61  ak;.#endif..  ca
9110: 73 65 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58  se PragTyp_INDEX
9120: 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68  _INFO: if( zRigh
9130: 74 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t ){.    Index *
9140: 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20  pIdx;.    Table 
9150: 2a 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20  *pTab;.    pIdx 
9160: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
9170: 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a  ex(db, zRight, z
9180: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  Db);.    if( pId
9190: 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  x ){.      int i
91a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 3b 0a  ;.      int mx;.
91b0: 20 20 20 20 20 20 69 66 28 20 70 50 72 61 67 6d        if( pPragm
91c0: 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20 20 20  a->iArg ){.     
91d0: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64     /* PRAGMA ind
91e0: 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65 72 20  ex_xinfo (newer 
91f0: 76 65 72 73 69 6f 6e 20 77 69 74 68 20 6d 6f 72  version with mor
9200: 65 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75 6d  e rows and colum
9210: 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ns) */.        m
9220: 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  x = pIdx->nColum
9230: 6e 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  n;.        pPars
9240: 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20  e->nMem = 6;.   
9250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9260: 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65    /* PRAGMA inde
9270: 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79 20 76  x_info (legacy v
9280: 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 20  ersion) */.     
9290: 20 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 4b     mx = pIdx->nK
92a0: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  eyCol;.        p
92b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b  Parse->nMem = 3;
92c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
92d0: 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
92e0: 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  le;.      sqlite
92f0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
9300: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
9310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9320: 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 70 50 72 61  arse->nMem<=pPra
9330: 67 6d 61 2d 3e 6e 50 72 61 67 43 4e 61 6d 65 20  gma->nPragCName 
9340: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
9350: 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<mx; i++){.  
9360: 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20 3d        i16 cnum =
9370: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
9380: 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  i];.        sqli
9390: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
93a0: 28 76 2c 20 31 2c 20 22 69 69 73 58 22 2c 20 69  (v, 1, "iisX", i
93b0: 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , cnum,.        
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20       cnum<0 ? 0 
93e0: 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  : pTab->aCol[cnu
93f0: 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m].zName);.     
9400: 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e     if( pPragma->
9410: 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iArg ){.        
9420: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9430: 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73  tiLoad(v, 4, "is
9440: 69 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iX",.           
9450: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
9460: 72 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  r[i],.          
9470: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69    pIdx->azColl[i
9480: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ],.            i
9490: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  <pIdx->nKeyCol);
94a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
94b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
94c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
94d0: 74 52 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d  tRow, 1, pParse-
94e0: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  >nMem);.      }.
94f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9500: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
9510: 79 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69  yp_INDEX_LIST: i
9520: 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  f( zRight ){.   
9530: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9540: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9550: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54     int i;.    pT
9560: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
9570: 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74  Table(db, zRight
9580: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
9590: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 50  pTab ){.      pP
95a0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a  arse->nMem = 5;.
95b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
95c0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
95d0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
95e0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
95f0: 3e 70 49 6e 64 65 78 2c 20 69 3d 30 3b 20 70 49  >pIndex, i=0; pI
9600: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9610: 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Next, i++){.    
9620: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9630: 61 7a 4f 72 69 67 69 6e 5b 5d 20 3d 20 7b 20 22  azOrigin[] = { "
9640: 63 22 2c 20 22 75 22 2c 20 22 70 6b 22 20 7d 3b  c", "u", "pk" };
9650: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9660: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9670: 20 31 2c 20 22 69 73 69 73 69 22 2c 0a 20 20 20   1, "isisi",.   
9680: 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20          i,.     
9690: 20 20 20 20 20 20 70 49 64 78 2d 3e 7a 4e 61 6d        pIdx->zNam
96a0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 49 73  e,.           Is
96b0: 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
96c0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  ),.           az
96d0: 4f 72 69 67 69 6e 5b 70 49 64 78 2d 3e 69 64 78  Origin[pIdx->idx
96e0: 54 79 70 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Type],.         
96f0: 20 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78    pIdx->pPartIdx
9700: 57 68 65 72 65 21 3d 30 29 3b 0a 20 20 20 20 20  Where!=0);.     
9710: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
9720: 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72  reak;..  case Pr
9730: 61 67 54 79 70 5f 44 41 54 41 42 41 53 45 5f 4c  agTyp_DATABASE_L
9740: 49 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69  IST: {.    int i
9750: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
9760: 65 6d 20 3d 20 33 3b 0a 20 20 20 20 66 6f 72 28  em = 3;.    for(
9770: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
9780: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
9790: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d  db->aDb[i].pBt==
97a0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
97b0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
97c0: 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 21  aDb[i].zDbSName!
97d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
97e0: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
97f0: 28 76 2c 20 31 2c 20 22 69 73 73 22 2c 0a 20 20  (v, 1, "iss",.  
9800: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
9810: 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44     db->aDb[i].zD
9820: 62 53 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  bSName,.        
9830: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
9840: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
9850: 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 7d  [i].pBt));.    }
9860: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
9870: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 4f   case PragTyp_CO
9880: 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b 0a  LLATION_LIST: {.
9890: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
98a0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
98b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
98c0: 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 70 3d   = 2;.    for(p=
98d0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
98e0: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
98f0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
9900: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 43  ext(p)){.      C
9910: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9920: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
9930: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
9940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9950: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9960: 69 73 22 2c 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d  is", i++, pColl-
9970: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
9980: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 23 69 66   }.  break;..#if
9990: 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f  def SQLITE_INTRO
99a0: 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53  SPECTION_PRAGMAS
99b0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
99c0: 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b  FUNCTION_LIST: {
99d0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
99e0: 48 61 73 68 45 6c 65 6d 20 2a 6a 3b 0a 20 20 20  HashElem *j;.   
99f0: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 20   FuncDef *p;.   
9a00: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
9a10: 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  2;.    for(i=0; 
9a20: 69 3c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 48 41  i<SQLITE_FUNC_HA
9a30: 53 48 5f 53 5a 3b 20 69 2b 2b 29 7b 0a 20 20 20  SH_SZ; i++){.   
9a40: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 33     for(p=sqlite3
9a50: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
9a60: 2e 61 5b 69 5d 3b 20 70 3b 20 70 3d 70 2d 3e 75  .a[i]; p; p=p->u
9a70: 2e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  .pHash ){.      
9a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9a90: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 69  tiLoad(v, 1, "si
9aa0: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 31 29 3b  ", p->zName, 1);
9ab0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9ac0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9ad0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 32  _ResultRow, 1, 2
9ae0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9af0: 0a 20 20 20 20 66 6f 72 28 6a 3d 73 71 6c 69 74  .    for(j=sqlit
9b00: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9b10: 61 46 75 6e 63 29 3b 20 6a 3b 20 6a 3d 73 71 6c  aFunc); j; j=sql
9b20: 69 74 65 48 61 73 68 4e 65 78 74 28 6a 29 29 7b  iteHashNext(j)){
9b30: 0a 20 20 20 20 20 20 70 20 3d 20 28 46 75 6e 63  .      p = (Func
9b40: 44 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44  Def*)sqliteHashD
9b50: 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20 73 71  ata(j);.      sq
9b60: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9b70: 61 64 28 76 2c 20 31 2c 20 22 73 69 22 2c 20 70  ad(v, 1, "si", p
9b80: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
9b90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9ba0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
9bb0: 74 52 6f 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20  tRow, 1, 2);.   
9bc0: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
9bd0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9be0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9bf0: 45 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  E.  case PragTyp
9c00: 5f 4d 4f 44 55 4c 45 5f 4c 49 53 54 3a 20 7b 0a  _MODULE_LIST: {.
9c10: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6a 3b      HashElem *j;
9c20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
9c30: 6d 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a  m = 1;.    for(j
9c40: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
9c50: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
9c60: 6a 3b 20 6a 3d 73 71 6c 69 74 65 48 61 73 68 4e  j; j=sqliteHashN
9c70: 65 78 74 28 6a 29 29 7b 0a 20 20 20 20 20 20 4d  ext(j)){.      M
9c80: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
9c90: 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  odule*)sqliteHas
9ca0: 68 44 61 74 61 28 6a 29 3b 0a 20 20 20 20 20 20  hData(j);.      
9cb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9cc0: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 22 2c 20  Load(v, 1, "s", 
9cd0: 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pMod->zName);.  
9ce0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9cf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
9d00: 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20  ltRow, 1, 1);.  
9d10: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9d20: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9d30: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
9d40: 42 4c 45 20 2a 2f 0a 0a 20 20 63 61 73 65 20 50  BLE */..  case P
9d50: 72 61 67 54 79 70 5f 50 52 41 47 4d 41 5f 4c 49  ragTyp_PRAGMA_LI
9d60: 53 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ST: {.    int i;
9d70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9d80: 41 72 72 61 79 53 69 7a 65 28 61 50 72 61 67 6d  ArraySize(aPragm
9d90: 61 4e 61 6d 65 29 3b 20 69 2b 2b 29 7b 0a 20 20  aName); i++){.  
9da0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9db0: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9dc0: 73 22 2c 20 61 50 72 61 67 6d 61 4e 61 6d 65 5b  s", aPragmaName[
9dd0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
9de0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9df0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
9e00: 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ow, 1, 1);.    }
9e10: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
9e20: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
9e30: 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41  NTROSPECTION_PRA
9e40: 47 4d 41 53 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  GMAS */..#endif 
9e50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
9e60: 43 48 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f  CHEMA_PRAGMAS */
9e70: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9e80: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
9e90: 59 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  Y.  case PragTyp
9ea0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53  _FOREIGN_KEY_LIS
9eb0: 54 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b  T: if( zRight ){
9ec0: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a  .    FKey *pFK;.
9ed0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
9ee0: 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
9ef0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
9f00: 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20   zRight, zDb);. 
9f10: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
9f20: 20 20 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d       pFK = pTab-
9f30: 3e 70 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66  >pFKey;.      if
9f40: 28 20 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20  ( pFK ){.       
9f50: 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20   int i = 0; .   
9f60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
9f70: 6d 20 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 73  m = 8;.        s
9f80: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
9f90: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
9fa0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  Db);.        whi
9fb0: 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20  le(pFK){.       
9fc0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
9fd0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
9fe0: 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  FK->nCol; j++){.
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a000: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
a010: 28 76 2c 20 31 2c 20 22 69 69 73 73 73 73 73 73  (v, 1, "iissssss
a020: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a030: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
a040: 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 0a 20              j,. 
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20 20 20    pFK->zTo,.    
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
a080: 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e 61  Tab->aCol[pFK->a
a090: 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a 4e  Col[j].iFrom].zN
a0a0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
a0b0: 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 61 43 6f          pFK->aCo
a0c0: 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20 20 20  l[j].zCol,.     
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
a0e0: 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61 41  tionName(pFK->aA
a0f0: 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a 20 4f  ction[1]),  /* O
a100: 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20 20  N UPDATE */.    
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
a120: 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e 61  ctionName(pFK->a
a130: 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f 2a 20  Action[0]),  /* 
a140: 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20  ON DELETE */.   
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a160: 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20 20 20  "NONE");.       
a170: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2b     }.          +
a180: 2b 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  +i;.          pF
a190: 4b 20 3d 20 70 46 4b 2d 3e 70 4e 65 78 74 46 72  K = pFK->pNextFr
a1a0: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  om;.        }.  
a1b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a1c0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20    break;.#endif 
a1d0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
a1e0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
a1f0: 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  KEY) */..#ifndef
a200: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
a210: 45 49 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65 66  EIGN_KEY.#ifndef
a220: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
a230: 47 47 45 52 0a 20 20 63 61 73 65 20 50 72 61 67  GGER.  case Prag
a240: 54 79 70 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 5f  Typ_FOREIGN_KEY_
a250: 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20 46 4b 65  CHECK: {.    FKe
a260: 79 20 2a 70 46 4b 3b 20 20 20 20 20 20 20 20 20  y *pFK;         
a270: 20 20 20 20 2f 2a 20 41 20 66 6f 72 65 69 67 6e      /* A foreign
a280: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
a290: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
a2a0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
a2b0: 20 43 68 69 6c 64 20 74 61 62 6c 65 20 63 6f 6e   Child table con
a2c0: 74 61 69 6e 20 22 52 45 46 45 52 45 4e 43 45 53  tain "REFERENCES
a2d0: 22 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 20  " keyword */.   
a2e0: 20 54 61 62 6c 65 20 2a 70 50 61 72 65 6e 74 3b   Table *pParent;
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
a300: 74 20 74 61 62 6c 65 20 74 68 61 74 20 63 68 69  t table that chi
a310: 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  ld points to */.
a320: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
a330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a340: 64 65 78 20 69 6e 20 74 68 65 20 70 61 72 65 6e  dex in the paren
a350: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  t table */.    i
a360: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
a370: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a380: 75 6e 74 65 72 3a 20 20 46 6f 72 65 69 67 6e 20  unter:  Foreign 
a390: 6b 65 79 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  key number for p
a3a0: 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  Tab */.    int j
a3b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a3c0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
a3d0: 72 3a 20 20 46 69 65 6c 64 20 6f 66 20 74 68 65  r:  Field of the
a3e0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 2a 2f 0a   foreign key */.
a3f0: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b      HashElem *k;
a400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a410: 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 4e 65 78  op counter:  Nex
a420: 74 20 74 61 62 6c 65 20 69 6e 20 73 63 68 65 6d  t table in schem
a430: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 78 3b 20  a */.    int x; 
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 2f 2a 20 72 65 73 75 6c 74 20 76 61 72 69 61 62  /* result variab
a460: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  le */.    int re
a470: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
a480: 20 2f 2a 20 33 20 72 65 67 69 73 74 65 72 73 20   /* 3 registers 
a490: 74 6f 20 68 6f 6c 64 20 61 20 72 65 73 75 6c 74  to hold a result
a4a0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
a4b0: 72 65 67 4b 65 79 3b 20 20 20 20 20 20 20 20 20  regKey;         
a4c0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
a4d0: 6f 20 68 6f 6c 64 20 6b 65 79 20 66 6f 72 20 63  o hold key for c
a4e0: 68 65 63 6b 69 6e 67 20 74 68 65 20 46 4b 20 2a  hecking the FK *
a4f0: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
a500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a510: 52 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  Registers to hol
a520: 64 20 61 20 72 6f 77 20 66 72 6f 6d 20 70 54 61  d a row from pTa
a530: 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  b */.    int add
a540: 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
a550: 2f 2a 20 54 6f 70 20 6f 66 20 61 20 6c 6f 6f 70  /* Top of a loop
a560: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 65 69 67   checking foreig
a570: 6e 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 69 6e  n keys */.    in
a580: 74 20 61 64 64 72 4f 6b 3b 20 20 20 20 20 20 20  t addrOk;       
a590: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
a5a0: 65 20 69 66 20 74 68 65 20 6b 65 79 20 69 73 20  e if the key is 
a5b0: 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61  OK */.    int *a
a5c0: 69 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  iCols;          
a5d0: 20 2f 2a 20 63 68 69 6c 64 20 74 6f 20 70 61 72   /* child to par
a5e0: 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d 61 70 70 69  ent column mappi
a5f0: 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52 65  ng */..    regRe
a600: 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
a610: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
a620: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20 20  e->nMem += 4;.  
a630: 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61    regKey = ++pPa
a640: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
a650: 65 67 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  egRow = ++pParse
a660: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
a670: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
a680: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
a690: 3b 0a 20 20 20 20 6b 20 3d 20 73 71 6c 69 74 65  ;.    k = sqlite
a6a0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
a6b0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
a6c0: 3e 74 62 6c 48 61 73 68 29 3b 0a 20 20 20 20 77  >tblHash);.    w
a6d0: 68 69 6c 65 28 20 6b 20 29 7b 0a 20 20 20 20 20  hile( k ){.     
a6e0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
a6f0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71         pTab = sq
a700: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
a710: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 52 69 67  (pParse, 0, zRig
a720: 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20  ht, zDb);.      
a730: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    k = 0;.      }
a740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
a750: 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
a760: 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
a770: 20 20 20 20 20 20 20 20 6b 20 3d 20 73 71 6c 69          k = sqli
a780: 74 65 48 61 73 68 4e 65 78 74 28 6b 29 3b 0a 20  teHashNext(k);. 
a790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a7a0: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 54 61 62   pTab==0 || pTab
a7b0: 2d 3e 70 46 4b 65 79 3d 3d 30 20 29 20 63 6f 6e  ->pFKey==0 ) con
a7c0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c  tinue;.      sql
a7d0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
a7e0: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
a7f0: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
a800: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
a810: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 72 65 67  ( pTab->nCol+reg
a820: 52 6f 77 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  Row>pParse->nMem
a830: 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   ) pParse->nMem 
a840: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b 20 72  = pTab->nCol + r
a850: 65 67 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  egRow;.      sql
a860: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
a870: 61 72 73 65 2c 20 30 2c 20 69 44 62 2c 20 70 54  arse, 0, iDb, pT
a880: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
a890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a8a0: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
a8b0: 20 72 65 67 52 65 73 75 6c 74 2c 20 70 54 61 62   regResult, pTab
a8c0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
a8d0: 66 6f 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61  for(i=1, pFK=pTa
a8e0: 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69  b->pFKey; pFK; i
a8f0: 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65  ++, pFK=pFK->pNe
a900: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20  xtFrom){.       
a910: 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74   pParent = sqlit
a920: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
a930: 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a  pFK->zTo, zDb);.
a940: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
a950: 65 6e 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ent==0 ) continu
a960: 65 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  e;.        pIdx 
a970: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
a980: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
a990: 61 72 73 65 2c 20 69 44 62 2c 20 70 50 61 72 65  arse, iDb, pPare
a9a0: 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61  nt->tnum, 0, pPa
a9b0: 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  rent->zName);.  
a9c0: 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
a9d0: 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70  3FkLocateIndex(p
a9e0: 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
a9f0: 70 46 4b 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a  pFK, &pIdx, 0);.
aa00: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30          if( x==0
aa10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
aa20: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
aa30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
aa40: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
aa50: 2c 20 69 2c 20 69 44 62 2c 20 70 50 61 72 65 6e  , i, iDb, pParen
aa60: 74 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  t, OP_OpenRead);
aa70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
aa80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
aa90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
aaa0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
aab0: 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  i, pIdx->tnum, i
aac0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Db);.           
aad0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
aae0: 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
aaf0: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
ab00: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
ab10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d  e{.          k =
ab20: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
ab30: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
ab40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
ab50: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
ab60: 72 3e 30 20 7c 7c 20 70 46 4b 3d 3d 30 20 29 3b  r>0 || pFK==0 );
ab70: 0a 20 20 20 20 20 20 69 66 28 20 70 46 4b 20 29  .      if( pFK )
ab80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
ab90: 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69  ( pParse->nTab<i
aba0: 20 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20   ) pParse->nTab 
abb0: 3d 20 69 3b 0a 20 20 20 20 20 20 61 64 64 72 54  = i;.      addrT
abc0: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
abd0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
abe0: 69 6e 64 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ind, 0); VdbeCov
abf0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
ac00: 66 6f 72 28 69 3d 31 2c 20 70 46 4b 3d 70 54 61  for(i=1, pFK=pTa
ac10: 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 3b 20 69  b->pFKey; pFK; i
ac20: 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65  ++, pFK=pFK->pNe
ac30: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 20  xtFrom){.       
ac40: 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74   pParent = sqlit
ac50: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
ac60: 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62 29 3b 0a  pFK->zTo, zDb);.
ac70: 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30          pIdx = 0
ac80: 3b 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c 73  ;.        aiCols
ac90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
aca0: 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
acb0: 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74         x = sqlit
acc0: 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28  e3FkLocateIndex(
acd0: 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c  pParse, pParent,
ace0: 20 70 46 4b 2c 20 26 70 49 64 78 2c 20 26 61 69   pFK, &pIdx, &ai
acf0: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 20 20 20  Cols);.         
ad00: 20 61 73 73 65 72 74 28 20 78 3d 3d 30 20 29 3b   assert( x==0 );
ad10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ad20: 20 20 20 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69     addrOk = sqli
ad30: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ad40: 28 76 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  (v);..        /*
ad50: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ad60: 6f 20 72 65 61 64 20 74 68 65 20 63 68 69 6c 64  o read the child
ad70: 20 6b 65 79 20 76 61 6c 75 65 73 20 69 6e 74 6f   key values into
ad80: 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 20   registers.     
ad90: 20 20 20 2a 2a 20 72 65 67 52 6f 77 2e 2e 72 65     ** regRow..re
ada0: 67 52 6f 77 2b 6e 2e 20 49 66 20 61 6e 79 20 6f  gRow+n. If any o
adb0: 66 20 74 68 65 20 63 68 69 6c 64 20 6b 65 79 20  f the child key 
adc0: 76 61 6c 75 65 73 20 61 72 65 20 4e 55 4c 4c 2c  values are NULL,
add0: 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
ade0: 2a 20 72 6f 77 20 63 61 6e 6e 6f 74 20 63 61 75  * row cannot cau
adf0: 73 65 20 61 6e 20 46 4b 20 76 69 6f 6c 61 74 69  se an FK violati
ae00: 6f 6e 2e 20 4a 75 6d 70 20 64 69 72 65 63 74 6c  on. Jump directl
ae10: 79 20 74 6f 20 61 64 64 72 4f 6b 20 69 6e 20 0a  y to addrOk in .
ae20: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
ae30: 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  case. */.       
ae40: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d   for(j=0; j<pFK-
ae50: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
ae60: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
ae70: 3d 20 61 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c  = aiCols ? aiCol
ae80: 73 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c  s[j] : pFK->aCol
ae90: 5b 6a 5d 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20  [j].iFrom;.     
aea0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
aeb0: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
aec0: 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 30 2c  able(v, pTab, 0,
aed0: 20 69 43 6f 6c 2c 20 72 65 67 52 6f 77 2b 6a 29   iCol, regRow+j)
aee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
aef0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
af00: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52   OP_IsNull, regR
af10: 6f 77 2b 6a 2c 20 61 64 64 72 4f 6b 29 3b 20 56  ow+j, addrOk); V
af20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
af30: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
af40: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
af50: 6f 64 65 20 74 6f 20 71 75 65 72 79 20 74 68 65  ode to query the
af60: 20 70 61 72 65 6e 74 20 69 6e 64 65 78 20 66 6f   parent index fo
af70: 72 20 61 20 6d 61 74 63 68 69 6e 67 20 70 61 72  r a matching par
af80: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b  ent.        ** k
af90: 65 79 2e 20 49 66 20 61 20 6d 61 74 63 68 20 69  ey. If a match i
afa0: 73 20 66 6f 75 6e 64 2c 20 6a 75 6d 70 20 74 6f  s found, jump to
afb0: 20 61 64 64 72 4f 6b 2e 20 2a 2f 0a 20 20 20 20   addrOk. */.    
afc0: 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
afd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
afe0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
aff0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
b000: 67 52 6f 77 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c  gRow, pFK->nCol,
b010: 20 72 65 67 4b 65 79 2c 0a 20 20 20 20 20 20 20   regKey,.       
b020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e         sqlite3In
b030: 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 64  dexAffinityStr(d
b040: 62 2c 70 49 64 78 29 2c 20 70 46 4b 2d 3e 6e 43  b,pIdx), pFK->nC
b050: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ol);.          s
b060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b070: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
b080: 20 69 2c 20 61 64 64 72 4f 6b 2c 20 72 65 67 4b   i, addrOk, regK
b090: 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
b0a0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b0b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b0c0: 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a   if( pParent ){.
b0d0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d            int jm
b0e0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
b0f0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 3b  urrentAddr(v)+2;
b100: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b110: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b120: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 2c  OP_SeekRowid, i,
b130: 20 6a 6d 70 2c 20 72 65 67 52 6f 77 29 3b 20 56   jmp, regRow); V
b140: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b150: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b160: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
b170: 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rOk);.          
b180: 61 73 73 65 72 74 28 20 70 46 4b 2d 3e 6e 43 6f  assert( pFK->nCo
b190: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  l==1 );.        
b1a0: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  }..        /* Ge
b1b0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
b1c0: 65 70 6f 72 74 20 61 6e 20 46 4b 20 76 69 6f 6c  eport an FK viol
b1d0: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c  ation to the cal
b1e0: 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ler. */.        
b1f0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
b200: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
b210: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b220: 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30  2(v, OP_Rowid, 0
b230: 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a  , regResult+1);.
b240: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b250: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b260: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b270: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 65 73  _Null, 0, regRes
b280: 75 6c 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ult+1);.        
b290: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
b2a0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76  3VdbeMultiLoad(v
b2b0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 32 2c 20 22  , regResult+2, "
b2c0: 73 69 58 22 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20  siX", pFK->zTo, 
b2d0: 69 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  i-1);.        sq
b2e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b2f0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
b300: 20 72 65 67 52 65 73 75 6c 74 2c 20 34 29 3b 0a   regResult, 4);.
b310: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b320: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b330: 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20  v, addrOk);.    
b340: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b350: 65 28 64 62 2c 20 61 69 43 6f 6c 73 29 3b 0a 20  e(db, aiCols);. 
b360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
b370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b380: 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64  , OP_Next, 0, ad
b390: 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f  drTop+1); VdbeCo
b3a0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b3c0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
b3d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
b3e0: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  eak;.#endif /* !
b3f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b400: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a  MIT_TRIGGER) */.
b410: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b420: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
b430: 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a  OREIGN_KEY) */..
b440: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
b450: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 50 41   case PragTyp_PA
b460: 52 53 45 52 5f 54 52 41 43 45 3a 20 7b 0a 20 20  RSER_TRACE: {.  
b470: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
b480: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
b490: 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67  3GetBoolean(zRig
b4a0: 68 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  ht, 0) ){.      
b4b0: 20 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 54    sqlite3ParserT
b4c0: 72 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61  race(stdout, "pa
b4d0: 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 20 20  rser: ");.      
b4e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b4f0: 71 6c 69 74 65 33 50 61 72 73 65 72 54 72 61 63  qlite3ParserTrac
b500: 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  e(0, 0);.      }
b510: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
b520: 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ak;.#endif..  /*
b530: 20 52 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c   Reinstall the L
b540: 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e  IKE and GLOB fun
b550: 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72  ctions.  The var
b560: 69 61 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a  iant of LIKE.  *
b570: 2a 20 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63  * used will be c
b580: 61 73 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72  ase sensitive or
b590: 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f   not depending o
b5a0: 6e 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a  n the RHS..  */.
b5b0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
b5c0: 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49  ASE_SENSITIVE_LI
b5d0: 4b 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  KE: {.    if( zR
b5e0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
b5f0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b  lite3RegisterLik
b600: 65 46 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73  eFunctions(db, s
b610: 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e  qlite3GetBoolean
b620: 28 7a 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20  (zRight, 0));.  
b630: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
b640: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b650: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b660: 5f 45 52 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66  _ERROR_MAX.# def
b670: 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ine SQLITE_INTEG
b680: 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52  RITY_CHECK_ERROR
b690: 5f 4d 41 58 20 31 30 30 0a 23 65 6e 64 69 66 0a  _MAX 100.#endif.
b6a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b6b0: 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
b6c0: 48 45 43 4b 0a 20 20 2f 2a 20 20 20 20 50 52 41  HECK.  /*    PRA
b6d0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
b6e0: 65 63 6b 0a 20 20 2a 2a 20 20 20 20 50 52 41 47  eck.  **    PRAG
b6f0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
b700: 63 6b 28 4e 29 0a 20 20 2a 2a 20 20 20 20 50 52  ck(N).  **    PR
b710: 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b  AGMA quick_check
b720: 0a 20 20 2a 2a 20 20 20 20 50 52 41 47 4d 41 20  .  **    PRAGMA 
b730: 71 75 69 63 6b 5f 63 68 65 63 6b 28 4e 29 0a 20  quick_check(N). 
b740: 20 2a 2a 0a 20 20 2a 2a 20 56 65 72 69 66 79 20   **.  ** Verify 
b750: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
b760: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
b770: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 71 75   **.  ** The "qu
b780: 69 63 6b 5f 63 68 65 63 6b 22 20 69 73 20 72 65  ick_check" is re
b790: 64 75 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  duced version of
b7a0: 20 0a 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79   .  ** integrity
b7b0: 5f 63 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20  _check designed 
b7c0: 74 6f 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64  to detect most d
b7d0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
b7e0: 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  on.  ** without 
b7f0: 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
b800: 63 72 6f 73 73 2d 63 68 65 63 6b 69 6e 67 20 69  cross-checking i
b810: 6e 64 65 78 65 73 2e 20 20 51 75 69 63 6b 5f 63  ndexes.  Quick_c
b820: 68 65 63 6b 0a 20 20 2a 2a 20 69 73 20 6c 69 6e  heck.  ** is lin
b830: 65 61 72 20 74 69 6d 65 20 77 68 65 72 65 61 73  ear time whereas
b840: 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  e integrity_chec
b850: 6b 20 69 73 20 4f 28 4e 6c 6f 67 4e 29 2e 0a 20  k is O(NlogN).. 
b860: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
b870: 79 70 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  yp_INTEGRITY_CHE
b880: 43 4b 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c  CK: {.    int i,
b890: 20 6a 2c 20 61 64 64 72 2c 20 6d 78 45 72 72 3b   j, addr, mxErr;
b8a0: 0a 0a 20 20 20 20 69 6e 74 20 69 73 51 75 69 63  ..    int isQuic
b8b0: 6b 20 3d 20 28 73 71 6c 69 74 65 33 54 6f 6c 6f  k = (sqlite3Tolo
b8c0: 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d 27  wer(zLeft[0])=='
b8d0: 71 27 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  q');..    /* If 
b8e0: 74 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  the PRAGMA comma
b8f0: 6e 64 20 77 61 73 20 6f 66 20 74 68 65 20 66 6f  nd was of the fo
b900: 72 6d 20 22 50 52 41 47 4d 41 20 3c 64 62 3e 2e  rm "PRAGMA <db>.
b910: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22  integrity_check"
b920: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 69 44  ,.    ** then iD
b930: 62 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  b is set to the 
b940: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
b950: 61 62 61 73 65 20 69 64 65 6e 74 69 66 69 65 64  abase identified
b960: 20 62 79 20 3c 64 62 3e 2e 0a 20 20 20 20 2a 2a   by <db>..    **
b970: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
b980: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
b990: 64 61 74 61 62 61 73 65 20 69 44 62 20 6f 6e 6c  database iDb onl
b9a0: 79 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79  y is verified by
b9b0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 56 44 42 45  .    ** the VDBE
b9c0: 20 63 72 65 61 74 65 64 20 62 65 6c 6f 77 2e 0a   created below..
b9d0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74      **.    ** Ot
b9e0: 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
b9f0: 63 6f 6d 6d 61 6e 64 20 77 61 73 20 73 69 6d 70  command was simp
ba00: 6c 79 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67  ly "PRAGMA integ
ba10: 72 69 74 79 5f 63 68 65 63 6b 22 20 28 6f 72 0a  rity_check" (or.
ba20: 20 20 20 20 2a 2a 20 22 50 52 41 47 4d 41 20 71      ** "PRAGMA q
ba30: 75 69 63 6b 5f 63 68 65 63 6b 22 29 2c 20 74 68  uick_check"), th
ba40: 65 6e 20 69 44 62 20 69 73 20 73 65 74 20 74 6f  en iDb is set to
ba50: 20 30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65   0. In this case
ba60: 2c 20 73 65 74 20 69 44 62 0a 20 20 20 20 2a 2a  , set iDb.    **
ba70: 20 74 6f 20 2d 31 20 68 65 72 65 2c 20 74 6f 20   to -1 here, to 
ba80: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
ba90: 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 76 65  e VDBE should ve
baa0: 72 69 66 79 20 74 68 65 20 69 6e 74 65 67 72 69  rify the integri
bab0: 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c  ty.    ** of all
bac0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
bad0: 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ses.  */.    ass
bae0: 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20  ert( iDb>=0 );. 
baf0: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
bb00: 30 20 7c 7c 20 70 49 64 32 2d 3e 7a 20 29 3b 0a  0 || pId2->z );.
bb10: 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 7a 3d      if( pId2->z=
bb20: 3d 30 20 29 20 69 44 62 20 3d 20 2d 31 3b 0a 0a  =0 ) iDb = -1;..
bb30: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
bb40: 65 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  e the VDBE progr
bb50: 61 6d 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65  am */.    pParse
bb60: 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 0a 20 20 20  ->nMem = 6;..   
bb70: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69   /* Set the maxi
bb80: 6d 75 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74 20  mum error count 
bb90: 2a 2f 0a 20 20 20 20 6d 78 45 72 72 20 3d 20 53  */.    mxErr = S
bba0: 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f  QLITE_INTEGRITY_
bbb0: 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b  CHECK_ERROR_MAX;
bbc0: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
bbd0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bbe0: 47 65 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c  GetInt32(zRight,
bbf0: 20 26 6d 78 45 72 72 29 3b 0a 20 20 20 20 20 20   &mxErr);.      
bc00: 69 66 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a  if( mxErr<=0 ){.
bc10: 20 20 20 20 20 20 20 20 6d 78 45 72 72 20 3d 20          mxErr = 
bc20: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
bc30: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
bc40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bc50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bc70: 67 65 72 2c 20 6d 78 45 72 72 2d 31 2c 20 31 29  ger, mxErr-1, 1)
bc80: 3b 20 2f 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64  ; /* reg[1] hold
bc90: 73 20 65 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f  s errors left */
bca0: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69  ..    /* Do an i
bcb0: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 6f  ntegrity check o
bcc0: 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  n each database 
bcd0: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  file */.    for(
bce0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
bcf0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 48 61 73 68  i++){.      Hash
bd00: 45 6c 65 6d 20 2a 78 3b 0a 20 20 20 20 20 20 48  Elem *x;.      H
bd10: 61 73 68 20 2a 70 54 62 6c 73 3b 0a 20 20 20 20  ash *pTbls;.    
bd20: 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 0a 20 20    int *aRoot;.  
bd30: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
bd40: 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 49 64 78  .      int mxIdx
bd50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
bd60: 6e 49 64 78 3b 0a 0a 20 20 20 20 20 20 69 66 28  nIdx;..      if(
bd70: 20 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20   OMIT_TEMPDB && 
bd80: 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  i==1 ) continue;
bd90: 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3e 3d  .      if( iDb>=
bda0: 30 20 26 26 20 69 21 3d 69 44 62 20 29 20 63 6f  0 && i!=iDb ) co
bdb0: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73  ntinue;..      s
bdc0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
bdd0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
bde0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  );..      /* Do 
bdf0: 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68 65  an integrity che
be00: 63 6b 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65  ck of the B-Tree
be10: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
be20: 2a 2a 20 42 65 67 69 6e 20 62 79 20 66 69 6e 64  ** Begin by find
be30: 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ing the root pag
be40: 65 73 20 6e 75 6d 62 65 72 73 0a 20 20 20 20 20  es numbers.     
be50: 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c   ** for all tabl
be60: 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 69  es and indices i
be70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
be80: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
be90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
bea0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
beb0: 2c 20 69 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , i, 0) );.     
bec0: 20 70 54 62 6c 73 20 3d 20 26 64 62 2d 3e 61 44   pTbls = &db->aD
bed0: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  b[i].pSchema->tb
bee0: 6c 48 61 73 68 3b 0a 20 20 20 20 20 20 66 6f 72  lHash;.      for
bef0: 28 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65  (cnt=0, x=sqlite
bf00: 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29  HashFirst(pTbls)
bf10: 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73  ; x; x=sqliteHas
bf20: 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20  hNext(x)){.     
bf30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
bf40: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
bf50: 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65  x);.        Inde
bf60: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 20  x *pIdx;.       
bf70: 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
bf80: 61 62 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  ab) ) cnt++;.   
bf90: 20 20 20 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c       for(nIdx=0,
bfa0: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
bfb0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
bfc0: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78  Idx->pNext, nIdx
bfd0: 2b 2b 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20  ++){ cnt++; }.  
bfe0: 20 20 20 20 20 20 69 66 28 20 6e 49 64 78 3e 6d        if( nIdx>m
bff0: 78 49 64 78 20 29 20 6d 78 49 64 78 20 3d 20 6e  xIdx ) mxIdx = n
c000: 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
c010: 20 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74     aRoot = sqlit
c020: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c030: 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
c040: 28 63 6e 74 2b 31 29 29 3b 0a 20 20 20 20 20 20  (cnt+1));.      
c050: 69 66 28 20 61 52 6f 6f 74 3d 3d 30 20 29 20 62  if( aRoot==0 ) b
c060: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
c070: 63 6e 74 3d 30 2c 20 78 3d 73 71 6c 69 74 65 48  cnt=0, x=sqliteH
c080: 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b  ashFirst(pTbls);
c090: 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68   x; x=sqliteHash
c0a0: 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20  Next(x)){.      
c0b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c0c0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78  sqliteHashData(x
c0d0: 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  );.        Index
c0e0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20   *pIdx;.        
c0f0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
c100: 62 29 20 29 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b  b) ) aRoot[cnt++
c110: 5d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  ] = pTab->tnum;.
c120: 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
c130: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
c140: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
c150: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
c160: 20 20 61 52 6f 6f 74 5b 63 6e 74 2b 2b 5d 20 3d    aRoot[cnt++] =
c170: 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
c180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c190: 20 20 20 20 20 61 52 6f 6f 74 5b 63 6e 74 5d 20       aRoot[cnt] 
c1a0: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  = 0;..      /* M
c1b0: 61 6b 65 20 73 75 72 65 20 73 75 66 66 69 63 69  ake sure suffici
c1c0: 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ent number of re
c1d0: 67 69 73 74 65 72 73 20 68 61 76 65 20 62 65 65  gisters have bee
c1e0: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
c1f0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
c200: 6d 20 3d 20 4d 41 58 28 20 70 50 61 72 73 65 2d  m = MAX( pParse-
c210: 3e 6e 4d 65 6d 2c 20 38 2b 6d 78 49 64 78 20 29  >nMem, 8+mxIdx )
c220: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 74  ;..      /* Do t
c230: 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65 67 72  he b-tree integr
c240: 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20  ity checks */.  
c250: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c260: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp4(v, OP_Inte
c270: 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c  grityCk, 2, cnt,
c280: 20 31 2c 20 28 63 68 61 72 2a 29 61 52 6f 6f 74   1, (char*)aRoot
c290: 2c 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20  ,P4_INTARRAY);. 
c2a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c2b0: 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
c2c0: 69 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  i);.      addr =
c2d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c2e0: 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
c2f0: 20 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   2); VdbeCoverag
c300: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
c310: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
c320: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
c330: 33 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73  3, 0,.         s
c340: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
c350: 2c 20 22 2a 2a 2a 20 69 6e 20 64 61 74 61 62 61  , "*** in databa
c360: 73 65 20 25 73 20 2a 2a 2a 5c 6e 22 2c 20 64 62  se %s ***\n", db
c370: 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
c380: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 50 34 5f  e),.         P4_
c390: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
c3a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c3b0: 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 32 2c  3(v, OP_Move, 2,
c3c0: 20 34 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71   4, 1);.      sq
c3d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c3e0: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c  v, OP_Concat, 4,
c3f0: 20 33 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 6e   3, 2);.      in
c400: 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75  tegrityCheckResu
c410: 6c 74 52 6f 77 28 76 2c 20 32 29 3b 0a 20 20 20  ltRow(v, 2);.   
c420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
c430: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
c440: 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  ..      /* Make 
c450: 73 75 72 65 20 61 6c 6c 20 74 68 65 20 69 6e 64  sure all the ind
c460: 69 63 65 73 20 61 72 65 20 63 6f 6e 73 74 72 75  ices are constru
c470: 63 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  cted correctly..
c480: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
c490: 6f 72 28 78 3d 73 71 6c 69 74 65 48 61 73 68 46  or(x=sqliteHashF
c4a0: 69 72 73 74 28 70 54 62 6c 73 29 3b 20 78 3b 20  irst(pTbls); x; 
c4b0: 78 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  x=sqliteHashNext
c4c0: 28 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61  (x)){.        Ta
c4d0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
c4e0: 74 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20  teHashData(x);. 
c4f0: 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
c500: 64 78 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20  dx, *pPk;.      
c510: 20 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72 20    Index *pPrior 
c520: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
c530: 20 6c 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20   loopTop;.      
c540: 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20    int iDataCur, 
c550: 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
c560: 20 69 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20   int r1 = -1;.. 
c570: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
c580: 3e 74 6e 75 6d 3c 31 20 29 20 63 6f 6e 74 69 6e  >tnum<1 ) contin
c590: 75 65 3b 20 20 2f 2a 20 53 6b 69 70 20 56 49 45  ue;  /* Skip VIE
c5a0: 57 73 20 6f 72 20 56 49 52 54 55 41 4c 20 54 41  Ws or VIRTUAL TA
c5b0: 42 4c 45 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLEs */.        
c5c0: 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  if( pTab->pCheck
c5d0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
c5e0: 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
c5f0: 26 20 54 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 29  & TF_HasNotNull)
c600: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
c610: 28 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30  (pTab->pIndex==0
c620: 20 7c 7c 20 69 73 51 75 69 63 6b 29 0a 20 20 20   || isQuick).   
c630: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
c640: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
c650: 4e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68  No additional ch
c660: 65 63 6b 73 20 6e 65 65 64 65 64 20 66 6f 72 20  ecks needed for 
c670: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
c680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c690: 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70  pPk = HasRowid(p
c6a0: 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69 74  Tab) ? 0 : sqlit
c6b0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
c6c0: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
c6d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
c6e0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
c6f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
c700: 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63  penTableAndIndic
c710: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  es(pParse, pTab,
c720: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 30 2c   OP_OpenRead, 0,
c730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 20 20 31 2c 20 30 2c 20 26 69 44 61 74 61      1, 0, &iData
c760: 43 75 72 2c 20 26 69 49 64 78 43 75 72 29 3b 0a  Cur, &iIdxCur);.
c770: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c780: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c790: 49 6e 74 65 67 65 72 2c 20 30 2c 20 37 29 3b 0a  Integer, 0, 7);.
c7a0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
c7b0: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
c7c0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
c7d0: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29  Idx->pNext, j++)
c7e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
c7f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c800: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
c810: 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65 78 20 65  8+j); /* index e
c820: 6e 74 72 69 65 73 20 63 6f 75 6e 74 65 72 20 2a  ntries counter *
c830: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
c840: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
c850: 73 65 2d 3e 6e 4d 65 6d 3e 3d 38 2b 6a 20 29 3b  se->nMem>=8+j );
c860: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c870: 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49   sqlite3NoTempsI
c880: 6e 52 61 6e 67 65 28 70 50 61 72 73 65 2c 31 2c  nRange(pParse,1,
c890: 37 2b 6a 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7+j) );.        
c8a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c8b0: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
c8c0: 69 44 61 74 61 43 75 72 2c 20 30 29 3b 20 56 64  iDataCur, 0); Vd
c8d0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
c8e0: 20 20 20 20 20 20 20 6c 6f 6f 70 54 6f 70 20 3d         loopTop =
c8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c900: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
c910: 20 37 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   7, 1);.        
c920: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  /* Verify that a
c930: 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  ll NOT NULL colu
c940: 6d 6e 73 20 72 65 61 6c 6c 79 20 61 72 65 20 4e  mns really are N
c950: 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20  OT NULL */.     
c960: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
c970: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
c980: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
c990: 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20  zErr;.          
c9a0: 69 6e 74 20 6a 6d 70 32 3b 0a 20 20 20 20 20 20  int jmp2;.      
c9b0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d      if( j==pTab-
c9c0: 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75  >iPKey ) continu
c9d0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
c9e0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e   pTab->aCol[j].n
c9f0: 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f 6e 74  otNull==0 ) cont
ca00: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
ca10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
ca20: 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
ca30: 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75  v, pTab, iDataCu
ca40: 72 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20  r, j, 3);.      
ca50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ca60: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
ca70: 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
ca80: 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20 73          jmp2 = s
ca90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
caa0: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
cab0: 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  3); VdbeCoverage
cac0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  (v);.          z
cad0: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Err = sqlite3MPr
cae0: 69 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20 76  intf(db, "NULL v
caf0: 61 6c 75 65 20 69 6e 20 25 73 2e 25 73 22 2c 20  alue in %s.%s", 
cb00: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
cb30: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[j].zName);
cb40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cb50: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
cb60: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33  OP_String8, 0, 3
cb70: 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  , 0, zErr, P4_DY
cb80: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
cb90: 20 20 69 6e 74 65 67 72 69 74 79 43 68 65 63 6b    integrityCheck
cba0: 52 65 73 75 6c 74 52 6f 77 28 76 2c 20 33 29 3b  ResultRow(v, 3);
cbb0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cbc0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
cbd0: 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20  , jmp2);.       
cbe0: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65   }.        /* Ve
cbf0: 72 69 66 79 20 43 48 45 43 4b 20 63 6f 6e 73 74  rify CHECK const
cc00: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
cc10: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65    if( pTab->pChe
cc20: 63 6b 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73  ck && (db->flags
cc30: 20 26 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65   & SQLITE_Ignore
cc40: 43 68 65 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20  Checks)==0 ){.  
cc50: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
cc60: 20 2a 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74   *pCheck = sqlit
cc70: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
cc80: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
cc90: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
cca0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
ccb0: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
ccc0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 43 6b 46       int addrCkF
ccd0: 61 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 56 64  ault = sqlite3Vd
cce0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
cd00: 61 64 64 72 43 6b 4f 6b 20 3d 20 73 71 6c 69 74  addrCkOk = sqlit
cd10: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
cd20: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
cd30: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
cd40: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
cd50: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
cd60: 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 44  e->iSelfTab = iD
cd70: 61 74 61 43 75 72 3b 0a 20 20 20 20 20 20 20 20  ataCur;.        
cd80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
cd90: 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
cda0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
cdb0: 72 28 6b 3d 70 43 68 65 63 6b 2d 3e 6e 45 78 70  r(k=pCheck->nExp
cdc0: 72 2d 31 3b 20 6b 3e 30 3b 20 6b 2d 2d 29 7b 0a  r-1; k>0; k--){.
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
cde0: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
cdf0: 28 70 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d  (pParse, pCheck-
ce00: 3e 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 61 64 64  >a[k].pExpr, add
ce10: 72 43 6b 46 61 75 6c 74 2c 20 30 29 3b 0a 20 20  rCkFault, 0);.  
ce20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ce30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ce40: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
ce50: 2c 20 70 43 68 65 63 6b 2d 3e 61 5b 30 5d 2e 70  , pCheck->a[0].p
ce60: 45 78 70 72 2c 20 61 64 64 72 43 6b 4f 6b 2c 20  Expr, addrCkOk, 
ce70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ce80: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
ce90: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LL);.           
cea0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
ceb0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
cec0: 43 6b 46 61 75 6c 74 29 3b 0a 20 20 20 20 20 20  CkFault);.      
ced0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c        zErr = sql
cee0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
cef0: 22 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e  "CHECK constrain
cf00: 74 20 66 61 69 6c 65 64 20 69 6e 20 25 73 22 2c  t failed in %s",
cf10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf20: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
cf30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
cf40: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
cf50: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33  OP_String8, 0, 3
cf60: 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  , 0, zErr, P4_DY
cf70: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
cf80: 20 20 20 20 69 6e 74 65 67 72 69 74 79 43 68 65      integrityChe
cf90: 63 6b 52 65 73 75 6c 74 52 6f 77 28 76 2c 20 33  ckResultRow(v, 3
cfa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
cfb0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cfc0: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6b  eLabel(v, addrCk
cfd0: 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Ok);.           
cfe0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
cff0: 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
d000: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d010: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
d020: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
d030: 68 65 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  heck);.        }
d040: 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69  .        /* Vali
d050: 64 61 74 65 20 69 6e 64 65 78 20 65 6e 74 72 69  date index entri
d060: 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  es for the curre
d070: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  nt row */.      
d080: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d    for(j=0, pIdx=
d090: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
d0a0: 64 78 20 26 26 20 21 69 73 51 75 69 63 6b 3b 20  dx && !isQuick; 
d0b0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
d0c0: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , j++){.        
d0d0: 20 20 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33    int jmp2, jmp3
d0e0: 2c 20 6a 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20  , jmp4, jmp5;.  
d0f0: 20 20 20 20 20 20 20 20 69 6e 74 20 63 6b 55 6e          int ckUn
d100: 69 71 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  iq = sqlite3Vdbe
d110: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d120: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d          if( pPk=
d130: 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65  =pIdx ) continue
d140: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  ;.          r1 =
d150: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
d160: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
d170: 20 70 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c   pIdx, iDataCur,
d180: 20 30 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20   0, 0, &jmp3,.  
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 20 70 50 72 69 6f 72 2c 20 72 31 29       pPrior, r1)
d1c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 69  ;.          pPri
d1d0: 6f 72 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  or = pIdx;.     
d1e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d1f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
d200: 49 6d 6d 2c 20 38 2b 6a 2c 20 31 29 3b 20 20 2f  Imm, 8+j, 1);  /
d210: 2a 20 69 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72  * increment entr
d220: 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  y count */.     
d230: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
d240: 68 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74  hat an index ent
d250: 72 79 20 65 78 69 73 74 73 20 66 6f 72 20 74 68  ry exists for th
d260: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
d270: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  row */.         
d280: 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56   jmp2 = sqlite3V
d290: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
d2a0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 49 64 78 43 75  OP_Found, iIdxCu
d2b0: 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c 20 72 31 2c  r+j, ckUniq, r1,
d2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2e0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f         pIdx->nCo
d2f0: 6c 75 6d 6e 29 3b 20 56 64 62 65 43 6f 76 65 72  lumn); VdbeCover
d300: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
d310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
d320: 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 72  dString(v, 3, "r
d330: 6f 77 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ow ");.         
d340: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d350: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
d360: 20 37 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20   7, 3, 3);.     
d370: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d380: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c  LoadString(v, 4,
d390: 20 22 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20   " missing from 
d3a0: 69 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20  index ");.      
d3b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d3c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63  ddOp3(v, OP_Conc
d3d0: 61 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20  at, 4, 3, 3);.  
d3e0: 20 20 20 20 20 20 20 20 6a 6d 70 35 20 3d 20 73          jmp5 = s
d3f0: 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
d400: 72 69 6e 67 28 76 2c 20 34 2c 20 70 49 64 78 2d  ring(v, 4, pIdx-
d410: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
d420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d430: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  dOp3(v, OP_Conca
d440: 74 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20  t, 4, 3, 3);.   
d450: 20 20 20 20 20 20 20 6a 6d 70 34 20 3d 20 69 6e         jmp4 = in
d460: 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73 75  tegrityCheckResu
d470: 6c 74 52 6f 77 28 76 2c 20 33 29 3b 0a 20 20 20  ltRow(v, 3);.   
d480: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d490: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
d4a0: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  p2);.          /
d4b0: 2a 20 46 6f 72 20 55 4e 49 51 55 45 20 69 6e 64  * For UNIQUE ind
d4c0: 65 78 65 73 2c 20 76 65 72 69 66 79 20 74 68 61  exes, verify tha
d4d0: 74 20 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79  t only one entry
d4e0: 20 65 78 69 73 74 73 20 77 69 74 68 20 74 68 65   exists with the
d4f0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75  .          ** cu
d500: 72 72 65 6e 74 20 6b 65 79 2e 20 20 54 68 65 20  rrent key.  The 
d510: 65 6e 74 72 79 20 69 73 20 75 6e 69 71 75 65 20  entry is unique 
d520: 69 66 20 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d  if (1) any colum
d530: 6e 20 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20  n is NULL.      
d540: 20 20 20 20 2a 2a 20 6f 72 20 28 32 29 20 74 68      ** or (2) th
d550: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 68 61 73  e next entry has
d560: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 65 79   a different key
d570: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
d580: 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
d590: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
d5a0: 20 20 20 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20       int uniqOk 
d5b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d5c0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
d5d0: 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b         int jmp6;
d5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d5f0: 20 6b 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20   kk;.           
d600: 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49   for(kk=0; kk<pI
d610: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b  dx->nKeyCol; kk+
d620: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
d630: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64    int iCol = pId
d640: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b  x->aiColumn[kk];
d650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
d660: 73 73 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f  ssert( iCol!=XN_
d670: 52 4f 57 49 44 20 26 26 20 69 43 6f 6c 3c 70 54  ROWID && iCol<pT
d680: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
d690: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
d6a0: 6f 6c 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e 61  ol>=0 && pTab->a
d6b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c  Col[iCol].notNul
d6c0: 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d6e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d6f0: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b   OP_IsNull, r1+k
d700: 6b 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20  k, uniqOk);.    
d710: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
d720: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
d730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d740: 20 20 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69       jmp6 = sqli
d750: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d760: 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75   OP_Next, iIdxCu
d770: 72 2b 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61  r+j); VdbeCovera
d780: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
d790: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
d7a0: 74 6f 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20  to(v, uniqOk);. 
d7b0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d7c0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d7d0: 2c 20 6a 6d 70 36 29 3b 0a 20 20 20 20 20 20 20  , jmp6);.       
d7e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d7f0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
d800: 49 64 78 47 54 2c 20 69 49 64 78 43 75 72 2b 6a  IdxGT, iIdxCur+j
d810: 2c 20 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20  , uniqOk, r1,.  
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d840: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  Idx->nKeyCol); V
d850: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d860: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d870: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
d880: 67 28 76 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69  g(v, 3, "non-uni
d890: 71 75 65 20 65 6e 74 72 79 20 69 6e 20 69 6e 64  que entry in ind
d8a0: 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ex ");.         
d8b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
d8c0: 74 6f 28 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20  to(v, jmp5);.   
d8d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d8e0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d8f0: 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20  (v, uniqOk);.   
d900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d920: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b  mpHere(v, jmp4);
d930: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d940: 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78  e3ResolvePartIdx
d950: 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d  Label(pParse, jm
d960: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  p3);.        }. 
d970: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d980: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
d990: 65 78 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c  ext, iDataCur, l
d9a0: 6f 6f 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76  oopTop); VdbeCov
d9b0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
d9c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d9d0: 70 48 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70  pHere(v, loopTop
d9e0: 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  -1);.#ifndef SQL
d9f0: 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
da00: 55 4e 54 0a 20 20 20 20 20 20 20 20 69 66 28 20  UNT.        if( 
da10: 21 69 73 51 75 69 63 6b 20 29 7b 0a 20 20 20 20  !isQuick ){.    
da20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
da30: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 32  eLoadString(v, 2
da40: 2c 20 22 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e  , "wrong # of en
da50: 74 72 69 65 73 20 69 6e 20 69 6e 64 65 78 20 22  tries in index "
da60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
da70: 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  (j=0, pIdx=pTab-
da80: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
da90: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
daa0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
dab0: 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78     if( pPk==pIdx
dac0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
dad0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dae0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
daf0: 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2b  _Count, iIdxCur+
db00: 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  j, 3);.         
db10: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
db20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
db30: 50 5f 45 71 2c 20 38 2b 6a 2c 20 30 2c 20 33 29  P_Eq, 8+j, 0, 3)
db40: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
db50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
db60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
db70: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54  P5(v, SQLITE_NOT
db80: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
db90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
dba0: 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 70  adString(v, 3, p
dbb0: 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
dbc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dbd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
dbe0: 5f 43 6f 6e 63 61 74 2c 20 33 2c 20 32 2c 20 37  _Concat, 3, 2, 7
dbf0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
dc00: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 52 65 73  ntegrityCheckRes
dc10: 75 6c 74 52 6f 77 28 76 2c 20 37 29 3b 0a 20 20  ultRow(v, 7);.  
dc20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dc30: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
dc40: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20   addr);.        
dc50: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
dc60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
dc70: 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
dc80: 2f 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d  /.      } .    }
dc90: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 74 61  .    {.      sta
dca0: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c  tic const int iL
dcb0: 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f  n = VDBE_OFFSET_
dcc0: 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 20  LINENO(2);.     
dcd0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
dce0: 62 65 4f 70 4c 69 73 74 20 65 6e 64 43 6f 64 65  beOpList endCode
dcf0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
dd00: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20   OP_AddImm,     
dd10: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
dd20: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
dd30: 20 20 20 20 20 7b 20 4f 50 5f 49 66 4e 6f 74 5a       { OP_IfNotZ
dd40: 65 72 6f 2c 20 20 20 31 2c 20 34 2c 20 20 20 20  ero,   1, 4,    
dd50: 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20      0},    /* 1 
dd60: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
dd70: 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20  String8,     0, 
dd80: 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  3,        0},   
dd90: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
dda0: 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c   { OP_ResultRow,
ddb0: 20 20 20 33 2c 20 31 2c 20 20 20 20 20 20 20 20     3, 1,        
ddc0: 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20  0},    /* 3 */. 
ddd0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 56 64       };.      Vd
dde0: 62 65 4f 70 20 2a 61 4f 70 3b 0a 0a 20 20 20 20  beOp *aOp;..    
ddf0: 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    aOp = sqlite3V
de00: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
de10: 41 72 72 61 79 53 69 7a 65 28 65 6e 64 43 6f 64  ArraySize(endCod
de20: 65 29 2c 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e  e), endCode, iLn
de30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f 70  );.      if( aOp
de40: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b   ){.        aOp[
de50: 30 5d 2e 70 32 20 3d 20 31 2d 6d 78 45 72 72 3b  0].p2 = 1-mxErr;
de60: 0a 20 20 20 20 20 20 20 20 61 4f 70 5b 32 5d 2e  .        aOp[2].
de70: 70 34 74 79 70 65 20 3d 20 50 34 5f 53 54 41 54  p4type = P4_STAT
de80: 49 43 3b 0a 20 20 20 20 20 20 20 20 61 4f 70 5b  IC;.        aOp[
de90: 32 5d 2e 70 34 2e 7a 20 3d 20 22 6f 6b 22 3b 0a  2].p4.z = "ok";.
dea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
deb0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  }.  break;.#endi
dec0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ded0: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
dee0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
def0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
df00: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
df10: 41 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a 20  A encoding.  ** 
df20: 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e    PRAGMA encodin
df30: 67 20 3d 20 22 75 74 66 2d 38 22 7c 22 75 74 66  g = "utf-8"|"utf
df40: 2d 31 36 22 7c 22 75 74 66 2d 31 36 6c 65 22 7c  -16"|"utf-16le"|
df50: 22 75 74 66 2d 31 36 62 65 22 0a 20 20 2a 2a 0a  "utf-16be".  **.
df60: 20 20 2a 2a 20 49 6e 20 69 74 73 20 66 69 72 73    ** In its firs
df70: 74 20 66 6f 72 6d 2c 20 74 68 69 73 20 70 72 61  t form, this pra
df80: 67 6d 61 20 72 65 74 75 72 6e 73 20 74 68 65 20  gma returns the 
df90: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  encoding of the 
dfa0: 6d 61 69 6e 0a 20 20 2a 2a 20 64 61 74 61 62 61  main.  ** databa
dfb0: 73 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62  se. If the datab
dfc0: 61 73 65 20 69 73 20 6e 6f 74 20 69 6e 69 74 69  ase is not initi
dfd0: 61 6c 69 7a 65 64 2c 20 69 74 20 69 73 20 69 6e  alized, it is in
dfe0: 69 74 69 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20  itialized now.. 
dff0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
e000: 6f 6e 64 20 66 6f 72 6d 20 6f 66 20 74 68 69 73  ond form of this
e010: 20 70 72 61 67 6d 61 20 69 73 20 61 20 6e 6f 2d   pragma is a no-
e020: 6f 70 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64  op if the main d
e030: 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
e040: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
e050: 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  y been initializ
e060: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
e070: 20 69 74 20 73 65 74 73 20 74 68 65 20 64 65 66   it sets the def
e080: 61 75 6c 74 0a 20 20 2a 2a 20 65 6e 63 6f 64 69  ault.  ** encodi
e090: 6e 67 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ng that will be 
e0a0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 6d 61 69  used for the mai
e0b0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
e0c0: 69 66 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20  if a new file.  
e0d0: 2a 2a 20 69 73 20 63 72 65 61 74 65 64 2e 20 49  ** is created. I
e0e0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 61  f an existing ma
e0f0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
e100: 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65 6e   is opened, then
e110: 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c   the.  ** defaul
e120: 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  t text encoding 
e130: 66 6f 72 20 74 68 65 20 65 78 69 73 74 69 6e 67  for the existing
e140: 20 64 61 74 61 62 61 73 65 20 69 73 20 75 73 65   database is use
e150: 64 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e  d..  ** .  ** In
e160: 20 61 6c 6c 20 63 61 73 65 73 20 6e 65 77 20 64   all cases new d
e170: 61 74 61 62 61 73 65 73 20 63 72 65 61 74 65 64  atabases created
e180: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
e190: 48 20 63 6f 6d 6d 61 6e 64 20 61 72 65 0a 20 20  H command are.  
e1a0: 2a 2a 20 63 72 65 61 74 65 64 20 74 6f 20 75 73  ** created to us
e1b0: 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75  e the same defau
e1c0: 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  lt text encoding
e1d0: 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74   as the main dat
e1e0: 61 62 61 73 65 2e 20 49 66 0a 20 20 2a 2a 20 74  abase. If.  ** t
e1f0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e200: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 69 6e   has not been in
e210: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 2f 6f 72  itialized and/or
e220: 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 41 54   created when AT
e230: 54 41 43 48 0a 20 20 2a 2a 20 69 73 20 65 78 65  TACH.  ** is exe
e240: 63 75 74 65 64 2c 20 74 68 69 73 20 69 73 20 64  cuted, this is d
e250: 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 41  one before the A
e260: 54 54 41 43 48 20 6f 70 65 72 61 74 69 6f 6e 2e  TTACH operation.
e270: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68  .  **.  ** In th
e280: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 68  e second form th
e290: 69 73 20 70 72 61 67 6d 61 20 73 65 74 73 20 74  is pragma sets t
e2a0: 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
e2b0: 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 0a 20   to be used in. 
e2c0: 20 2a 2a 20 6e 65 77 20 64 61 74 61 62 61 73 65   ** new database
e2d0: 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 75   files created u
e2e0: 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
e2f0: 73 65 20 68 61 6e 64 6c 65 2e 20 49 74 20 69 73  se handle. It is
e300: 20 6f 6e 6c 79 0a 20 20 2a 2a 20 75 73 65 66 75   only.  ** usefu
e310: 6c 20 69 66 20 69 6e 76 6f 6b 65 64 20 69 6d 6d  l if invoked imm
e320: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74  ediately after t
e330: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e340: 20 69 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50   i.  */.  case P
e350: 72 61 67 54 79 70 5f 45 4e 43 4f 44 49 4e 47 3a  ragTyp_ENCODING:
e360: 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
e370: 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61  nst struct EncNa
e380: 6d 65 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  me {.      char 
e390: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75 38  *zName;.      u8
e3a0: 20 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e   enc;.    } encn
e3b0: 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ames[] = {.     
e3c0: 20 7b 20 22 55 54 46 38 22 2c 20 20 20 20 20 53   { "UTF8",     S
e3d0: 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20 20  QLITE_UTF8      
e3e0: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54    },.      { "UT
e3f0: 46 2d 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f  F-8",    SQLITE_
e400: 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c 20 20  UTF8        },  
e410: 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65  /* Must be eleme
e420: 6e 74 20 5b 31 5d 20 2a 2f 0a 20 20 20 20 20 20  nt [1] */.      
e430: 7b 20 22 55 54 46 2d 31 36 6c 65 22 2c 20 53 51  { "UTF-16le", SQ
e440: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20  LITE_UTF16LE    
e450: 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20   },  /* Must be 
e460: 65 6c 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20  element [2] */. 
e470: 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 62 65       { "UTF-16be
e480: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ", SQLITE_UTF16B
e490: 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73  E     },  /* Mus
e4a0: 74 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 33 5d  t be element [3]
e4b0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46   */.      { "UTF
e4c0: 31 36 6c 65 22 2c 20 20 53 51 4c 49 54 45 5f 55  16le",  SQLITE_U
e4d0: 54 46 31 36 4c 45 20 20 20 20 20 7d 2c 0a 20 20  TF16LE     },.  
e4e0: 20 20 20 20 7b 20 22 55 54 46 31 36 62 65 22 2c      { "UTF16be",
e4f0: 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45    SQLITE_UTF16BE
e500: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
e510: 22 55 54 46 2d 31 36 22 2c 20 20 20 30 20 20 20  "UTF-16",   0   
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
e530: 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31  , /* SQLITE_UTF1
e540: 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20  6NATIVE */.     
e550: 20 7b 20 22 55 54 46 31 36 22 2c 20 20 20 20 30   { "UTF16",    0
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55    }, /* SQLITE_U
e580: 54 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20  TF16NATIVE */.  
e590: 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
e5a0: 20 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74   };.    const st
e5b0: 72 75 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45  ruct EncName *pE
e5c0: 6e 63 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69  nc;.    if( !zRi
e5d0: 67 68 74 20 29 7b 20 20 20 20 2f 2a 20 22 50 52  ght ){    /* "PR
e5e0: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 22 20 2a  AGMA encoding" *
e5f0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
e600: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
e610: 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61  arse) ) goto pra
e620: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 61  gma_out;.      a
e630: 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b  ssert( encnames[
e640: 53 51 4c 49 54 45 5f 55 54 46 38 5d 2e 65 6e 63  SQLITE_UTF8].enc
e650: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b  ==SQLITE_UTF8 );
e660: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
e670: 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55  ncnames[SQLITE_U
e680: 54 46 31 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c  TF16LE].enc==SQL
e690: 49 54 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20  ITE_UTF16LE );. 
e6a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63       assert( enc
e6b0: 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46  names[SQLITE_UTF
e6c0: 31 36 42 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54  16BE].enc==SQLIT
e6d0: 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 20  E_UTF16BE );.   
e6e0: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54     returnSingleT
e6f0: 65 78 74 28 76 2c 20 65 6e 63 6e 61 6d 65 73 5b  ext(v, encnames[
e700: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 5d  ENC(pParse->db)]
e710: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  .zName);.    }el
e720: 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
e730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 50             /* "P
e740: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
e750: 20 58 58 58 22 20 2a 2f 0a 20 20 20 20 20 20 2f   XXX" */.      /
e760: 2a 20 4f 6e 6c 79 20 63 68 61 6e 67 65 20 74 68  * Only change th
e770: 65 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  e value of sqlit
e780: 65 2e 65 6e 63 20 69 66 20 74 68 65 20 64 61 74  e.enc if the dat
e790: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 69 73 20  abase handle is 
e7a0: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69  not.      ** ini
e7b0: 74 69 61 6c 69 7a 65 64 2e 20 49 66 20 74 68 65  tialized. If the
e7c0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
e7d0: 78 69 73 74 73 2c 20 74 68 65 20 6e 65 77 20 73  xists, the new s
e7e0: 71 6c 69 74 65 2e 65 6e 63 20 76 61 6c 75 65 0a  qlite.enc value.
e7f0: 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
e800: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
e810: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  n the schema is 
e820: 6e 65 78 74 20 6c 6f 61 64 65 64 2e 20 49 66 20  next loaded. If 
e830: 69 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  it does not.    
e840: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78 69    ** already exi
e850: 73 74 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  sts, it will be 
e860: 63 72 65 61 74 65 64 20 74 6f 20 75 73 65 20 74  created to use t
e870: 68 65 20 6e 65 77 20 65 6e 63 6f 64 69 6e 67 20  he new encoding 
e880: 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  value..      */.
e890: 20 20 20 20 20 20 69 66 28 20 0a 20 20 20 20 20        if( .     
e8a0: 20 20 20 21 28 44 62 48 61 73 50 72 6f 70 65 72     !(DbHasProper
e8b0: 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 53 63 68  ty(db, 0, DB_Sch
e8c0: 65 6d 61 4c 6f 61 64 65 64 29 29 20 7c 7c 20 0a  emaLoaded)) || .
e8d0: 20 20 20 20 20 20 20 20 44 62 48 61 73 50 72 6f          DbHasPro
e8e0: 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f  perty(db, 0, DB_
e8f0: 45 6d 70 74 79 29 20 0a 20 20 20 20 20 20 29 7b  Empty) .      ){
e900: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 45 6e  .        for(pEn
e910: 63 3d 26 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20  c=&encnames[0]; 
e920: 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e  pEnc->zName; pEn
e930: 63 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c++){.          
e940: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
e950: 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 70 45  rICmp(zRight, pE
e960: 6e 63 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  nc->zName) ){.  
e970: 20 20 20 20 20 20 20 20 20 20 53 43 48 45 4d 41            SCHEMA
e980: 5f 45 4e 43 28 64 62 29 20 3d 20 45 4e 43 28 64  _ENC(db) = ENC(d
e990: 62 29 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  b) =.           
e9a0: 20 20 20 20 20 70 45 6e 63 2d 3e 65 6e 63 20 3f       pEnc->enc ?
e9b0: 20 70 45 6e 63 2d 3e 65 6e 63 20 3a 20 53 51 4c   pEnc->enc : SQL
e9c0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
e9d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
e9e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
e9f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ea00: 20 20 69 66 28 20 21 70 45 6e 63 2d 3e 7a 4e 61    if( !pEnc->zNa
ea10: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
ea20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ea30: 70 50 61 72 73 65 2c 20 22 75 6e 73 75 70 70 6f  pParse, "unsuppo
ea40: 72 74 65 64 20 65 6e 63 6f 64 69 6e 67 3a 20 25  rted encoding: %
ea50: 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20  s", zRight);.   
ea60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ea70: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
ea80: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
ea90: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
eaa0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
eab0: 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52  _OMIT_SCHEMA_VER
eac0: 53 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 2f  SION_PRAGMAS.  /
ead0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
eae0: 5b 73 63 68 65 6d 61 2e 5d 73 63 68 65 6d 61 5f  [schema.]schema_
eaf0: 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50  version.  **   P
eb00: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 73  RAGMA [schema.]s
eb10: 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20  chema_version = 
eb20: 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20  <integer>.  **. 
eb30: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63   **   PRAGMA [sc
eb40: 68 65 6d 61 2e 5d 75 73 65 72 5f 76 65 72 73 69  hema.]user_versi
eb50: 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  on.  **   PRAGMA
eb60: 20 5b 73 63 68 65 6d 61 2e 5d 75 73 65 72 5f 76   [schema.]user_v
eb70: 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65  ersion = <intege
eb80: 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50  r>.  **.  **   P
eb90: 52 41 47 4d 41 20 5b 73 63 68 65 6d 61 2e 5d 66  RAGMA [schema.]f
eba0: 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74 0a 20 20  reelist_count.  
ebb0: 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  **.  **   PRAGMA
ebc0: 20 5b 73 63 68 65 6d 61 2e 5d 64 61 74 61 5f 76   [schema.]data_v
ebd0: 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a  ersion.  **.  **
ebe0: 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65 6d     PRAGMA [schem
ebf0: 61 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69  a.]application_i
ec00: 64 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  d.  **   PRAGMA 
ec10: 5b 73 63 68 65 6d 61 2e 5d 61 70 70 6c 69 63 61  [schema.]applica
ec20: 74 69 6f 6e 5f 69 64 20 3d 20 3c 69 6e 74 65 67  tion_id = <integ
ec30: 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er>.  **.  ** Th
ec40: 65 20 70 72 61 67 6d 61 27 73 20 73 63 68 65 6d  e pragma's schem
ec50: 61 5f 76 65 72 73 69 6f 6e 20 61 6e 64 20 75 73  a_version and us
ec60: 65 72 5f 76 65 72 73 69 6f 6e 20 61 72 65 20 75  er_version are u
ec70: 73 65 64 20 74 6f 20 73 65 74 20 6f 72 20 67 65  sed to set or ge
ec80: 74 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65  t.  ** the value
ec90: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2d 76   of the schema-v
eca0: 65 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 2d  ersion and user-
ecb0: 76 65 72 73 69 6f 6e 2c 20 72 65 73 70 65 63 74  version, respect
ecc0: 69 76 65 6c 79 2e 20 42 6f 74 68 0a 20 20 2a 2a  ively. Both.  **
ecd0: 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73   the schema-vers
ece0: 69 6f 6e 20 61 6e 64 20 74 68 65 20 75 73 65 72  ion and the user
ecf0: 2d 76 65 72 73 69 6f 6e 20 61 72 65 20 33 32 2d  -version are 32-
ed00: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
ed10: 65 72 73 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20  ers.  ** stored 
ed20: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
ed30: 68 65 61 64 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  header..  **.  *
ed40: 2a 20 54 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f  * The schema-coo
ed50: 6b 69 65 20 69 73 20 75 73 75 61 6c 6c 79 20 6f  kie is usually o
ed60: 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  nly manipulated 
ed70: 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53 51  internally by SQ
ed80: 4c 69 74 65 2e 20 49 74 0a 20 20 2a 2a 20 69 73  Lite. It.  ** is
ed90: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20   incremented by 
eda0: 53 51 4c 69 74 65 20 77 68 65 6e 65 76 65 72 20  SQLite whenever 
edb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
edc0: 65 6d 61 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ema is modified 
edd0: 28 62 79 0a 20 20 2a 2a 20 63 72 65 61 74 69 6e  (by.  ** creatin
ede0: 67 20 6f 72 20 64 72 6f 70 70 69 6e 67 20 61 20  g or dropping a 
edf0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 29 2e  table or index).
ee00: 20 54 68 65 20 73 63 68 65 6d 61 20 76 65 72 73   The schema vers
ee10: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 0a 20  ion is used by. 
ee20: 20 2a 2a 20 53 51 4c 69 74 65 20 65 61 63 68 20   ** SQLite each 
ee30: 74 69 6d 65 20 61 20 71 75 65 72 79 20 69 73 20  time a query is 
ee40: 65 78 65 63 75 74 65 64 20 74 6f 20 65 6e 73 75  executed to ensu
ee50: 72 65 20 74 68 61 74 20 74 68 65 20 69 6e 74 65  re that the inte
ee60: 72 6e 61 6c 20 63 61 63 68 65 0a 20 20 2a 2a 20  rnal cache.  ** 
ee70: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 75 73  of the schema us
ee80: 65 64 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ed when compilin
ee90: 67 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20  g the SQL query 
eea0: 6d 61 74 63 68 65 73 20 74 68 65 20 73 63 68 65  matches the sche
eeb0: 6d 61 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64  ma of.  ** the d
eec0: 61 74 61 62 61 73 65 20 61 67 61 69 6e 73 74 20  atabase against 
eed0: 77 68 69 63 68 20 74 68 65 20 63 6f 6d 70 69 6c  which the compil
eee0: 65 64 20 71 75 65 72 79 20 69 73 20 61 63 74 75  ed query is actu
eef0: 61 6c 6c 79 20 65 78 65 63 75 74 65 64 2e 0a 20  ally executed.. 
ef00: 20 2a 2a 20 53 75 62 76 65 72 74 69 6e 67 20 74   ** Subverting t
ef10: 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20 62 79  his mechanism by
ef20: 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73   using "PRAGMA s
ef30: 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 20 74  chema_version" t
ef40: 6f 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68  o modify.  ** th
ef50: 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e  e schema-version
ef60: 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20   is potentially 
ef70: 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 6d 61  dangerous and ma
ef80: 79 20 6c 65 61 64 20 74 6f 20 70 72 6f 67 72 61  y lead to progra
ef90: 6d 0a 20 20 2a 2a 20 63 72 61 73 68 65 73 20 6f  m.  ** crashes o
efa0: 72 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  r database corru
efb0: 70 74 69 6f 6e 2e 20 55 73 65 20 77 69 74 68 20  ption. Use with 
efc0: 63 61 75 74 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20  caution!.  **.  
efd0: 2a 2a 20 54 68 65 20 75 73 65 72 2d 76 65 72 73  ** The user-vers
efe0: 69 6f 6e 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ion is not used 
eff0: 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 53 51  internally by SQ
f000: 4c 69 74 65 2e 20 49 74 20 6d 61 79 20 62 65 20  Lite. It may be 
f010: 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 61 70 70  used by.  ** app
f020: 6c 69 63 61 74 69 6f 6e 73 20 66 6f 72 20 61 6e  lications for an
f030: 79 20 70 75 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a  y purpose..  */.
f040: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 48    case PragTyp_H
f050: 45 41 44 45 52 5f 56 41 4c 55 45 3a 20 7b 0a 20  EADER_VALUE: {. 
f060: 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d     int iCookie =
f070: 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20   pPragma->iArg; 
f080: 20 2f 2a 20 57 68 69 63 68 20 63 6f 6f 6b 69 65   /* Which cookie
f090: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
f0a0: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
f0b0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
f0c0: 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 7a   iDb);.    if( z
f0d0: 52 69 67 68 74 20 26 26 20 28 70 50 72 61 67 6d  Right && (pPragm
f0e0: 61 2d 3e 6d 50 72 61 67 46 6c 67 20 26 20 50 72  a->mPragFlg & Pr
f0f0: 61 67 46 6c 67 5f 52 65 61 64 4f 6e 6c 79 29 3d  agFlg_ReadOnly)=
f100: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  =0 ){.      /* W
f110: 72 69 74 65 20 74 68 65 20 73 70 65 63 69 66 69  rite the specifi
f120: 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  ed cookie value 
f130: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
f140: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
f150: 20 73 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b   setCookie[] = {
f160: 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72  .        { OP_Tr
f170: 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c  ansaction,    0,
f180: 20 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20    1,  0},    /* 
f190: 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f  0 */.        { O
f1a0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20 20 20  P_SetCookie,    
f1b0: 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20    0,  0,  0},   
f1c0: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7d   /* 1 */.      }
f1d0: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
f1e0: 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  aOp;.      sqlit
f1f0: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61  e3VdbeVerifyNoMa
f200: 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76 2c 20  llocRequired(v, 
f210: 41 72 72 61 79 53 69 7a 65 28 73 65 74 43 6f 6f  ArraySize(setCoo
f220: 6b 69 65 29 29 3b 0a 20 20 20 20 20 20 61 4f 70  kie));.      aOp
f230: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f240: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
f250: 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65 29 2c  Size(setCookie),
f260: 20 73 65 74 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a   setCookie, 0);.
f270: 20 20 20 20 20 20 69 66 28 20 4f 4e 4c 59 5f 49        if( ONLY_I
f280: 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  F_REALLOC_STRESS
f290: 28 61 4f 70 3d 3d 30 29 20 29 20 62 72 65 61 6b  (aOp==0) ) break
f2a0: 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30 5d 2e 70  ;.      aOp[0].p
f2b0: 31 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 61  1 = iDb;.      a
f2c0: 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44 62 3b 0a  Op[1].p1 = iDb;.
f2d0: 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20        aOp[1].p2 
f2e0: 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  = iCookie;.     
f2f0: 20 61 4f 70 5b 31 5d 2e 70 33 20 3d 20 73 71 6c   aOp[1].p3 = sql
f300: 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29  ite3Atoi(zRight)
f310: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f320: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
f330: 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20  pecified cookie 
f340: 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73  value */.      s
f350: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
f360: 4f 70 4c 69 73 74 20 72 65 61 64 43 6f 6f 6b 69  OpList readCooki
f370: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
f380: 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  { OP_Transaction
f390: 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d  ,     0,  0,  0}
f3a0: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
f3b0: 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f       { OP_ReadCo
f3c0: 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 31  okie,      0,  1
f3d0: 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a  ,  0},    /* 1 *
f3e0: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52  /.        { OP_R
f3f0: 65 73 75 6c 74 52 6f 77 2c 20 20 20 20 20 20 20  esultRow,       
f400: 31 2c 20 20 31 2c 20 20 30 7d 0a 20 20 20 20 20  1,  1,  0}.     
f410: 20 7d 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70   };.      VdbeOp
f420: 20 2a 61 4f 70 3b 0a 20 20 20 20 20 20 73 71 6c   *aOp;.      sql
f430: 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
f440: 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 76  MallocRequired(v
f450: 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65 61 64  , ArraySize(read
f460: 43 6f 6f 6b 69 65 29 29 3b 0a 20 20 20 20 20 20  Cookie));.      
f470: 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  aOp = sqlite3Vdb
f480: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
f490: 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b  raySize(readCook
f4a0: 69 65 29 2c 72 65 61 64 43 6f 6f 6b 69 65 2c 30  ie),readCookie,0
f4b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4f 4e 4c  );.      if( ONL
f4c0: 59 5f 49 46 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  Y_IF_REALLOC_STR
f4d0: 45 53 53 28 61 4f 70 3d 3d 30 29 20 29 20 62 72  ESS(aOp==0) ) br
f4e0: 65 61 6b 3b 0a 20 20 20 20 20 20 61 4f 70 5b 30  eak;.      aOp[0
f4f0: 5d 2e 70 31 20 3d 20 69 44 62 3b 0a 20 20 20 20  ].p1 = iDb;.    
f500: 20 20 61 4f 70 5b 31 5d 2e 70 31 20 3d 20 69 44    aOp[1].p1 = iD
f510: 62 3b 0a 20 20 20 20 20 20 61 4f 70 5b 31 5d 2e  b;.      aOp[1].
f520: 70 33 20 3d 20 69 43 6f 6f 6b 69 65 3b 0a 20 20  p3 = iCookie;.  
f530: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
f540: 65 75 73 61 62 6c 65 28 76 29 3b 0a 20 20 20 20  eusable(v);.    
f550: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  }.  }.  break;.#
f560: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f570: 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53  OMIT_SCHEMA_VERS
f580: 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  ION_PRAGMAS */..
f590: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f5a0: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
f5b0: 4e 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20 20 2a  N_DIAGS.  /*.  *
f5c0: 2a 20 20 20 50 52 41 47 4d 41 20 63 6f 6d 70 69  *   PRAGMA compi
f5d0: 6c 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a  le_options.  **.
f5e0: 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
f5f0: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6d  names of all com
f600: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
f610: 73 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 62  s used in this b
f620: 75 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f  uild,.  ** one o
f630: 70 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e 0a 20  ption per row.. 
f640: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
f650: 79 70 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f  yp_COMPILE_OPTIO
f660: 4e 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20  NS: {.    int i 
f670: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
f680: 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 70  har *zOpt;.    p
f690: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b  Parse->nMem = 1;
f6a0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4f 70  .    while( (zOp
f6b0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  t = sqlite3_comp
f6c0: 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69 2b  ileoption_get(i+
f6d0: 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  +))!=0 ){.      
f6e0: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
f6f0: 74 72 69 6e 67 28 76 2c 20 31 2c 20 7a 4f 70 74  tring(v, 1, zOpt
f700: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f710: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f720: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
f730: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f740: 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65  ite3VdbeReusable
f750: 28 76 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  (v);.  }.  break
f760: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
f770: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
f780: 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a  PTION_DIAGS */..
f790: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f7a0: 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a  MIT_WAL.  /*.  *
f7b0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 73 63 68 65  *   PRAGMA [sche
f7c0: 6d 61 2e 5d 77 61 6c 5f 63 68 65 63 6b 70 6f 69  ma.]wal_checkpoi
f7d0: 6e 74 20 3d 20 70 61 73 73 69 76 65 7c 66 75 6c  nt = passive|ful
f7e0: 6c 7c 72 65 73 74 61 72 74 7c 74 72 75 6e 63 61  l|restart|trunca
f7f0: 74 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65  te.  **.  ** Che
f800: 63 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61  ckpoint the data
f810: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
f820: 65 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 43 48  e PragTyp_WAL_CH
f830: 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20  ECKPOINT: {.    
f840: 69 6e 74 20 69 42 74 20 3d 20 28 70 49 64 32 2d  int iBt = (pId2-
f850: 3e 7a 3f 69 44 62 3a 53 51 4c 49 54 45 5f 4d 41  >z?iDb:SQLITE_MA
f860: 58 5f 41 54 54 41 43 48 45 44 29 3b 0a 20 20 20  X_ATTACHED);.   
f870: 20 69 6e 74 20 65 4d 6f 64 65 20 3d 20 53 51 4c   int eMode = SQL
f880: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
f890: 41 53 53 49 56 45 3b 0a 20 20 20 20 69 66 28 20  ASSIVE;.    if( 
f8a0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
f8b0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
f8c0: 6d 70 28 7a 52 69 67 68 74 2c 20 22 66 75 6c 6c  mp(zRight, "full
f8d0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
f8e0: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
f8f0: 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b  CHECKPOINT_FULL;
f900: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f910: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f920: 7a 52 69 67 68 74 2c 20 22 72 65 73 74 61 72 74  zRight, "restart
f930: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
f940: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
f950: 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41  CHECKPOINT_RESTA
f960: 52 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  RT;.      }else 
f970: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
f980: 6d 70 28 7a 52 69 67 68 74 2c 20 22 74 72 75 6e  mp(zRight, "trun
f990: 63 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  cate")==0 ){.   
f9a0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c       eMode = SQL
f9b0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
f9c0: 52 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 7d  RUNCATE;.      }
f9d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
f9e0: 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20  e->nMem = 3;.   
f9f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa00: 70 33 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f  p3(v, OP_Checkpo
fa10: 69 6e 74 2c 20 69 42 74 2c 20 65 4d 6f 64 65 2c  int, iBt, eMode,
fa20: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
fa30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fa40: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33  _ResultRow, 1, 3
fa50: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
fa60: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
fa70: 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  GMA wal_autochec
fa80: 6b 70 6f 69 6e 74 0a 20 20 2a 2a 20 20 20 50 52  kpoint.  **   PR
fa90: 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65  AGMA wal_autoche
faa0: 63 6b 70 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a  ckpoint = N.  **
fab0: 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  .  ** Configure 
fac0: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
fad0: 63 74 69 6f 6e 20 74 6f 20 61 75 74 6f 6d 61 74  ction to automat
fae0: 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e  ically checkpoin
faf0: 74 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a  t a database.  *
fb00: 2a 20 61 66 74 65 72 20 61 63 63 75 6d 75 6c 61  * after accumula
fb10: 74 69 6e 67 20 4e 20 66 72 61 6d 65 73 20 69 6e  ting N frames in
fb20: 20 74 68 65 20 6c 6f 67 2e 20 4f 72 20 71 75 65   the log. Or que
fb30: 72 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ry for the curre
fb40: 6e 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66  nt value.  ** of
fb50: 20 4e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   N..  */.  case 
fb60: 50 72 61 67 54 79 70 5f 57 41 4c 5f 41 55 54 4f  PragTyp_WAL_AUTO
fb70: 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20  CHECKPOINT: {.  
fb80: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
fb90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61        sqlite3_wa
fba0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
fbb0: 28 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69  (db, sqlite3Atoi
fbc0: 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d  (zRight));.    }
fbd0: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
fbe0: 65 49 6e 74 28 76 2c 20 0a 20 20 20 20 20 20 20  eInt(v, .       
fbf0: 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b  db->xWalCallback
fc00: 3d 3d 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  ==sqlite3WalDefa
fc10: 75 6c 74 48 6f 6f 6b 20 3f 20 0a 20 20 20 20 20  ultHook ? .     
fc20: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 54 52        SQLITE_PTR
fc30: 5f 54 4f 5f 49 4e 54 28 64 62 2d 3e 70 57 61 6c  _TO_INT(db->pWal
fc40: 41 72 67 29 20 3a 20 30 29 3b 0a 20 20 7d 0a 20  Arg) : 0);.  }. 
fc50: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a   break;.#endif..
fc60: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
fc70: 41 20 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a  A shrink_memory.
fc80: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
fc90: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32  ENTATION-OF: R-2
fca0: 33 34 34 35 2d 34 36 31 30 39 20 54 68 69 73 20  3445-46109 This 
fcb0: 70 72 61 67 6d 61 20 63 61 75 73 65 73 20 74 68  pragma causes th
fcc0: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
fcd0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 77 68  connection on wh
fce0: 69 63 68 20 69 74 20 69 73 20 69 6e 76 6f 6b 65  ich it is invoke
fcf0: 64 20 74 6f 20 66 72 65 65 20 75 70 20 61 73 20  d to free up as 
fd00: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 69  much memory as i
fd10: 74 0a 20 20 2a 2a 20 63 61 6e 2c 20 62 79 20 63  t.  ** can, by c
fd20: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 64  alling sqlite3_d
fd30: 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
fd40: 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ()..  */.  case 
fd50: 50 72 61 67 54 79 70 5f 53 48 52 49 4e 4b 5f 4d  PragTyp_SHRINK_M
fd60: 45 4d 4f 52 59 3a 20 7b 0a 20 20 20 20 73 71 6c  EMORY: {.    sql
fd70: 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
fd80: 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 20 20  memory(db);.    
fd90: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
fda0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 6f 70  .  **  PRAGMA op
fdb0: 74 69 6d 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41  timize.  **  PRA
fdc0: 47 4d 41 20 6f 70 74 69 6d 69 7a 65 28 4d 41 53  GMA optimize(MAS
fdd0: 4b 29 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  K).  **  PRAGMA 
fde0: 73 63 68 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 0a  schema.optimize.
fdf0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 73 63 68    **  PRAGMA sch
fe00: 65 6d 61 2e 6f 70 74 69 6d 69 7a 65 28 4d 41 53  ema.optimize(MAS
fe10: 4b 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 74  K).  **.  ** Att
fe20: 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65  empt to optimize
fe30: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
fe40: 41 6c 6c 20 73 63 68 65 6d 61 73 20 61 72 65 20  All schemas are 
fe50: 6f 70 74 69 6d 69 7a 65 64 20 69 6e 20 74 68 65  optimized in the
fe60: 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20   first.  ** two 
fe70: 66 6f 72 6d 73 2c 20 61 6e 64 20 6f 6e 6c 79 20  forms, and only 
fe80: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73 63  the specified sc
fe90: 68 65 6d 61 20 69 73 20 6f 70 74 69 6d 69 7a 65  hema is optimize
fea0: 64 20 69 6e 20 74 68 65 20 6c 61 74 74 65 72 20  d in the latter 
feb0: 74 77 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  two..  **.  ** T
fec0: 68 65 20 64 65 74 61 69 6c 73 20 6f 66 20 6f 70  he details of op
fed0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 70 65 72 66  timizations perf
fee0: 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 70 72  ormed by this pr
fef0: 61 67 6d 61 20 61 72 65 20 65 78 70 65 63 74 65  agma are expecte
ff00: 64 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65  d.  ** to change
ff10: 20 61 6e 64 20 69 6d 70 72 6f 76 65 20 6f 76 65   and improve ove
ff20: 72 20 74 69 6d 65 2e 20 20 41 70 70 6c 69 63 61  r time.  Applica
ff30: 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 61 6e 74  tions should ant
ff40: 69 63 69 70 61 74 65 20 74 68 61 74 0a 20 20 2a  icipate that.  *
ff50: 2a 20 74 68 69 73 20 70 72 61 67 6d 61 20 77 69  * this pragma wi
ff60: 6c 6c 20 70 65 72 66 6f 72 6d 20 6e 65 77 20 6f  ll perform new o
ff70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
ff80: 66 75 74 75 72 65 20 72 65 6c 65 61 73 65 73 2e  future releases.
ff90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f  .  **.  ** The o
ffa0: 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74  ptional argument
ffb0: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
ffc0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74   optimizations t
ffd0: 6f 20 70 65 72 66 6f 72 6d 3a 0a 20 20 2a 2a 0a  o perform:.  **.
ffe0: 20 20 2a 2a 20 20 20 20 30 78 30 30 30 31 20 20    **    0x0001  
fff0: 20 20 44 65 62 75 67 67 69 6e 67 20 6d 6f 64 65    Debugging mode
10000 2e 20 20 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c  .  Do not actual
10010 6c 79 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 6f  ly perform any o
10020 70 74 69 6d 69 7a 61 74 69 6f 6e 73 0a 20 20 2a  ptimizations.  *
10030 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  *              b
10040 75 74 20 69 6e 73 74 65 61 64 20 72 65 74 75 72  ut instead retur
10050 6e 20 6f 6e 65 20 6c 69 6e 65 20 6f 66 20 74 65  n one line of te
10060 78 74 20 66 6f 72 20 65 61 63 68 20 6f 70 74 69  xt for each opti
10070 6d 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20  mization.  **   
10080 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
10090 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
100a0 64 6f 6e 65 2e 20 20 4f 66 66 20 62 79 20 64 65  done.  Off by de
100b0 66 61 75 6c 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  fault..  **.  **
100c0 20 20 20 20 30 78 30 30 30 32 20 20 20 20 52 75      0x0002    Ru
100d0 6e 20 41 4e 41 4c 59 5a 45 20 6f 6e 20 74 61 62  n ANALYZE on tab
100e0 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 62  les that might b
100f0 65 6e 65 66 69 74 2e 20 20 4f 6e 20 62 79 20 64  enefit.  On by d
10100 65 66 61 75 6c 74 2e 0a 20 20 2a 2a 20 20 20 20  efault..  **    
10110 20 20 20 20 20 20 20 20 20 20 53 65 65 20 62 65            See be
10120 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  low for addition
10130 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
10140 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30 78 30    **.  **    0x0
10150 30 30 34 20 20 20 20 28 4e 6f 74 20 79 65 74 20  004    (Not yet 
10160 69 6d 70 6c 65 6d 65 6e 74 65 64 29 20 52 65 63  implemented) Rec
10170 6f 72 64 20 75 73 61 67 65 20 61 6e 64 20 70 65  ord usage and pe
10180 72 66 6f 72 6d 61 6e 63 65 20 0a 20 20 2a 2a 20  rformance .  ** 
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 66               inf
101a0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
101b0 65 20 63 75 72 72 65 6e 74 20 73 65 73 73 69 6f  e current sessio
101c0 6e 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 20 20  n in the.  **   
101d0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
101e0 61 73 65 20 66 69 6c 65 20 73 6f 20 74 68 61 74  ase file so that
101f0 20 69 74 20 77 69 6c 6c 20 62 65 20 61 76 61 69   it will be avai
10200 6c 61 62 6c 65 20 74 6f 20 22 6f 70 74 69 6d 69  lable to "optimi
10210 7a 65 22 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ze".  **        
10220 20 20 20 20 20 20 70 72 61 67 6d 61 73 20 72 75        pragmas ru
10230 6e 20 62 79 20 66 75 74 75 72 65 20 64 61 74 61  n by future data
10240 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
10250 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 30  ..  **.  **    0
10260 78 30 30 30 38 20 20 20 20 28 4e 6f 74 20 79 65  x0008    (Not ye
10270 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 20 43  t implemented) C
10280 72 65 61 74 65 20 69 6e 64 65 78 65 73 20 74 68  reate indexes th
10290 61 74 20 6d 69 67 68 74 20 68 61 76 65 0a 20 20  at might have.  
102a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
102b0 62 65 65 6e 20 68 65 6c 70 66 75 6c 20 74 6f 20  been helpful to 
102c0 72 65 63 65 6e 74 20 71 75 65 72 69 65 73 0a 20  recent queries. 
102d0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 66   **.  ** The def
102e0 61 75 6c 74 20 4d 41 53 4b 20 69 73 20 61 6e 64  ault MASK is and
102f0 20 61 6c 77 61 79 73 20 73 68 61 6c 6c 20 62 65   always shall be
10300 20 30 78 66 66 66 65 2e 20 20 30 78 66 66 66 65   0xfffe.  0xfffe
10310 20 6d 65 61 6e 73 20 70 65 72 66 6f 72 6d 20 61   means perform a
10320 6c 6c 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  ll    ** of the 
10330 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
10340 73 74 65 64 20 61 62 6f 76 65 20 65 78 63 65 70  sted above excep
10350 74 20 44 65 62 75 67 20 4d 6f 64 65 2c 20 69 6e  t Debug Mode, in
10360 63 6c 75 64 69 6e 67 20 6e 65 77 0a 20 20 2a 2a  cluding new.  **
10370 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74   optimizations t
10380 68 61 74 20 68 61 76 65 20 6e 6f 74 20 79 65 74  hat have not yet
10390 20 62 65 65 6e 20 69 6e 76 65 6e 74 65 64 2e 20   been invented. 
103a0 20 49 66 20 6e 65 77 20 6f 70 74 69 6d 69 7a 61   If new optimiza
103b0 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 65  tions are.  ** e
103c0 76 65 72 20 61 64 64 65 64 20 74 68 61 74 20 73  ver added that s
103d0 68 6f 75 6c 64 20 62 65 20 6f 66 66 20 62 79 20  hould be off by 
103e0 64 65 66 61 75 6c 74 2c 20 74 68 6f 73 65 20 6f  default, those o
103f0 66 66 2d 62 79 2d 64 65 66 61 75 6c 74 20 0a 20  ff-by-default . 
10400 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
10410 73 20 77 69 6c 6c 20 68 61 76 65 20 62 69 74 6d  s will have bitm
10420 61 73 6b 73 20 6f 66 20 30 78 31 30 30 30 30 20  asks of 0x10000 
10430 6f 72 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 0a  or larger..  **.
10440 20 20 2a 2a 20 44 45 54 45 52 4d 49 4e 41 54 49    ** DETERMINATI
10450 4f 4e 20 4f 46 20 57 48 45 4e 20 54 4f 20 52 55  ON OF WHEN TO RU
10460 4e 20 41 4e 41 4c 59 5a 45 0a 20 20 2a 2a 0a 20  N ANALYZE.  **. 
10470 20 2a 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   ** In the curre
10480 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
10490 6e 2c 20 61 20 74 61 62 6c 65 20 69 73 20 61 6e  n, a table is an
104a0 61 6c 79 7a 65 64 20 69 66 20 6f 6e 6c 79 20 69  alyzed if only i
104b0 66 20 61 6c 6c 20 6f 66 0a 20 20 2a 2a 20 74 68  f all of.  ** th
104c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
104d0 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
104e0 28 31 29 20 4d 41 53 4b 20 62 69 74 20 30 78 30  (1) MASK bit 0x0
104f0 32 20 69 73 20 73 65 74 2e 0a 20 20 2a 2a 0a 20  2 is set..  **. 
10500 20 2a 2a 20 28 32 29 20 54 68 65 20 71 75 65 72   ** (2) The quer
10510 79 20 70 6c 61 6e 6e 65 72 20 75 73 65 64 20 73  y planner used s
10520 71 6c 69 74 65 5f 73 74 61 74 31 2d 73 74 79 6c  qlite_stat1-styl
10530 65 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  e statistics for
10540 20 6f 6e 65 20 6f 72 0a 20 20 2a 2a 20 20 20 20   one or.  **    
10550 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 6f 66   more indexes of
10560 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 73 6f   the table at so
10570 6d 65 20 70 6f 69 6e 74 20 64 75 72 69 6e 67 20  me point during 
10580 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
10590 20 20 2a 2a 20 20 20 20 20 74 68 65 20 63 75 72    **     the cur
105a0 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  rent connection.
105b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 33 29 20 4f  .  **.  ** (3) O
105c0 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78  ne or more index
105d0 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
105e0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  are currently un
105f0 61 6e 61 6c 79 7a 65 64 20 4f 52 0a 20 20 2a 2a  analyzed OR.  **
10600 20 20 20 20 20 74 68 65 20 6e 75 6d 62 65 72 20       the number 
10610 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
10620 61 62 6c 65 20 68 61 73 20 69 6e 63 72 65 61 73  able has increas
10630 65 64 20 62 79 20 32 35 20 74 69 6d 65 73 20 6f  ed by 25 times o
10640 72 20 6d 6f 72 65 0a 20 20 2a 2a 20 20 20 20 20  r more.  **     
10650 73 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20 74  since the last t
10660 69 6d 65 20 41 4e 41 4c 59 5a 45 20 77 61 73 20  ime ANALYZE was 
10670 72 75 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  run..  **.  ** T
10680 68 65 20 72 75 6c 65 73 20 66 6f 72 20 77 68 65  he rules for whe
10690 6e 20 74 61 62 6c 65 73 20 61 72 65 20 61 6e 61  n tables are ana
106a0 6c 79 7a 65 64 20 61 72 65 20 6c 69 6b 65 6c 79  lyzed are likely
106b0 20 74 6f 20 63 68 61 6e 67 65 20 69 6e 0a 20 20   to change in.  
106c0 2a 2a 20 66 75 74 75 72 65 20 72 65 6c 65 61 73  ** future releas
106d0 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  es..  */.  case 
106e0 50 72 61 67 54 79 70 5f 4f 50 54 49 4d 49 5a 45  PragTyp_OPTIMIZE
106f0 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 4c  : {.    int iDbL
10700 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ast;           /
10710 2a 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  * Loop terminati
10720 6f 6e 20 70 6f 69 6e 74 20 66 6f 72 20 74 68 65  on point for the
10730 20 73 63 68 65 6d 61 20 6c 6f 6f 70 20 2a 2f 0a   schema loop */.
10740 20 20 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b      int iTabCur;
10750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
10760 72 73 6f 72 20 66 6f 72 20 61 20 74 61 62 6c 65  rsor for a table
10770 20 77 68 6f 73 65 20 73 69 7a 65 20 6e 65 65 64   whose size need
10780 73 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  s checking */.  
10790 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
107a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
107b0 20 6f 76 65 72 20 74 61 62 6c 65 73 20 6f 66 20   over tables of 
107c0 61 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20  a schema */.    
107d0 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 3b  Schema *pSchema;
107e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
107f0 72 72 65 6e 74 20 73 63 68 65 6d 61 20 2a 2f 0a  rrent schema */.
10800 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
10810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
10820 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68  table in the sch
10830 65 6d 61 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  ema */.    Index
10840 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
10850 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 66    /* An index of
10860 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
10870 20 20 4c 6f 67 45 73 74 20 73 7a 54 68 72 65 73    LogEst szThres
10880 68 6f 6c 64 3b 20 20 20 20 2f 2a 20 53 69 7a 65  hold;    /* Size
10890 20 74 68 72 65 73 68 6f 6c 64 20 61 62 6f 76 65   threshold above
108a0 20 77 68 69 63 68 20 72 65 61 6e 61 6c 79 73 69   which reanalysi
108b0 73 20 69 73 20 6e 65 65 64 64 20 2a 2f 0a 20 20  s is needd */.  
108c0 20 20 63 68 61 72 20 2a 7a 53 75 62 53 71 6c 3b    char *zSubSql;
108d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
108e0 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 74 68  statement for th
108f0 65 20 4f 50 5f 53 71 6c 45 78 65 63 20 6f 70 63  e OP_SqlExec opc
10900 6f 64 65 20 2a 2f 0a 20 20 20 20 75 33 32 20 6f  ode */.    u32 o
10910 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  pMask;          
10920 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6f 70 65    /* Mask of ope
10930 72 61 74 69 6f 6e 73 20 74 6f 20 70 65 72 66 6f  rations to perfo
10940 72 6d 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 7a  rm */..    if( z
10950 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 6f  Right ){.      o
10960 70 4d 61 73 6b 20 3d 20 28 75 33 32 29 73 71 6c  pMask = (u32)sql
10970 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29  ite3Atoi(zRight)
10980 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70 4d  ;.      if( (opM
10990 61 73 6b 20 26 20 30 78 30 32 29 3d 3d 30 20 29  ask & 0x02)==0 )
109a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
109b0 65 7b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20  e{.      opMask 
109c0 3d 20 30 78 66 66 66 65 3b 0a 20 20 20 20 7d 0a  = 0xfffe;.    }.
109d0 20 20 20 20 69 54 61 62 43 75 72 20 3d 20 70 50      iTabCur = pP
109e0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
109f0 20 20 66 6f 72 28 69 44 62 4c 61 73 74 20 3d 20    for(iDbLast = 
10a00 7a 44 62 3f 69 44 62 3a 64 62 2d 3e 6e 44 62 2d  zDb?iDb:db->nDb-
10a10 31 3b 20 69 44 62 3c 3d 69 44 62 4c 61 73 74 3b  1; iDb<=iDbLast;
10a20 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69   iDb++){.      i
10a30 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 6e 74  f( iDb==1 ) cont
10a40 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  inue;.      sqli
10a50 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
10a60 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
10a70 3b 0a 20 20 20 20 20 20 70 53 63 68 65 6d 61 20  ;.      pSchema 
10a80 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
10a90 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 66 6f  Schema;.      fo
10aa0 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
10ab0 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
10ac0 6c 48 61 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c  lHash); k; k=sql
10ad0 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
10ae0 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
10af0 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
10b00 73 68 44 61 74 61 28 6b 29 3b 0a 0a 20 20 20 20  shData(k);..    
10b10 20 20 20 20 2f 2a 20 49 66 20 74 61 62 6c 65 20      /* If table 
10b20 70 54 61 62 20 68 61 73 20 6e 6f 74 20 62 65 65  pTab has not bee
10b30 6e 20 75 73 65 64 20 69 6e 20 61 20 77 61 79 20  n used in a way 
10b40 74 68 61 74 20 77 6f 75 6c 64 20 62 65 6e 65 66  that would benef
10b50 69 74 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  it from.        
10b60 2a 2a 20 68 61 76 69 6e 67 20 61 6e 61 6c 79 73  ** having analys
10b70 69 73 20 73 74 61 74 69 73 74 69 63 73 20 64 75  is statistics du
10b80 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
10b90 20 73 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73   session, then s
10ba0 6b 69 70 20 69 74 2e 0a 20 20 20 20 20 20 20 20  kip it..        
10bb0 2a 2a 20 54 68 69 73 20 61 6c 73 6f 20 68 61 73  ** This also has
10bc0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 73   the effect of s
10bd0 6b 69 70 70 69 6e 67 20 76 69 72 74 75 61 6c 20  kipping virtual 
10be0 74 61 62 6c 65 73 20 61 6e 64 20 76 69 65 77 73  tables and views
10bf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
10c00 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
10c10 26 20 54 46 5f 53 74 61 74 73 55 73 65 64 29 3d  & TF_StatsUsed)=
10c20 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
10c30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 6e 61          /* Reana
10c40 6c 79 7a 65 20 69 66 20 74 68 65 20 74 61 62 6c  lyze if the tabl
10c50 65 20 69 73 20 32 35 20 74 69 6d 65 73 20 6c 61  e is 25 times la
10c60 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
10c70 73 74 20 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20  st analysis */. 
10c80 20 20 20 20 20 20 20 73 7a 54 68 72 65 73 68 6f         szThresho
10c90 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  ld = pTab->nRowL
10ca0 6f 67 45 73 74 20 2b 20 34 36 3b 20 61 73 73 65  ogEst + 46; asse
10cb0 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  rt( sqlite3LogEs
10cc0 74 28 32 35 29 3d 3d 34 36 20 29 3b 0a 20 20 20  t(25)==46 );.   
10cd0 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
10ce0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
10cf0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
10d00 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  xt){.          i
10d10 66 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61  f( !pIdx->hasSta
10d20 74 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t1 ){.          
10d30 20 20 73 7a 54 68 72 65 73 68 6f 6c 64 20 3d 20    szThreshold = 
10d40 30 3b 20 2f 2a 20 41 6c 77 61 79 73 20 61 6e 61  0; /* Always ana
10d50 6c 79 7a 65 20 69 66 20 61 6e 79 20 69 6e 64 65  lyze if any inde
10d60 78 20 6c 61 63 6b 73 20 73 74 61 74 69 73 74 69  x lacks statisti
10d70 63 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  cs */.          
10d80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10d90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
10da0 20 20 20 20 20 20 20 69 66 28 20 73 7a 54 68 72         if( szThr
10db0 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20  eshold ){.      
10dc0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
10dd0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
10de0 62 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  bCur, iDb, pTab,
10df0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
10e00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10e10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10e20 5f 49 66 53 6d 61 6c 6c 65 72 2c 20 69 54 61 62  _IfSmaller, iTab
10e30 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Cur, .          
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10e50 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
10e60 74 41 64 64 72 28 76 29 2b 32 2b 28 6f 70 4d 61  tAddr(v)+2+(opMa
10e70 73 6b 26 31 29 2c 20 73 7a 54 68 72 65 73 68 6f  sk&1), szThresho
10e80 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ld);.          V
10e90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
10ea0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10eb0 20 20 7a 53 75 62 53 71 6c 20 3d 20 73 71 6c 69    zSubSql = sqli
10ec0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
10ed0 41 4e 41 4c 59 5a 45 20 5c 22 25 77 5c 22 2e 5c  ANALYZE \"%w\".\
10ee0 22 25 77 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  "%w\"",.        
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
10f10 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
10f20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
10f30 20 20 20 20 20 20 69 66 28 20 6f 70 4d 61 73 6b        if( opMask
10f40 20 26 20 30 78 30 31 20 29 7b 0a 20 20 20 20 20   & 0x01 ){.     
10f50 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
10f60 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
10f70 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
10f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10f90 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
10fa0 67 38 2c 20 30 2c 20 72 31 2c 20 30 2c 20 7a 53  g8, 0, r1, 0, zS
10fb0 75 62 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49  ubSql, P4_DYNAMI
10fc0 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  C);.          sq
10fd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10fe0 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
10ff0 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r1, 1);.       
11000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11020 4f 70 34 28 76 2c 20 4f 50 5f 53 71 6c 45 78 65  Op4(v, OP_SqlExe
11030 63 2c 20 30 2c 20 30 2c 20 30 2c 20 7a 53 75 62  c, 0, 0, 0, zSub
11040 53 71 6c 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Sql, P4_DYNAMIC)
11050 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11060 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
11070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
11080 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20  v, OP_Expire);. 
11090 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
110a0 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
110b0 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a 20  A busy_timeout. 
110c0 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73   **   PRAGMA bus
110d0 79 5f 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20 20  y_timeout = N.  
110e0 2a 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71 6c  **.  ** Call sql
110f0 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
11100 74 28 64 62 2c 20 4e 29 2e 20 20 52 65 74 75 72  t(db, N).  Retur
11110 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  n the current ti
11120 6d 65 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a 2a  meout value.  **
11130 20 69 66 20 6f 6e 65 20 69 73 20 73 65 74 2e 20   if one is set. 
11140 20 49 66 20 6e 6f 20 62 75 73 79 20 68 61 6e 64   If no busy hand
11150 6c 65 72 20 6f 72 20 61 20 64 69 66 66 65 72 65  ler or a differe
11160 6e 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  nt busy handler 
11170 69 73 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 6e  is set.  ** then
11180 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
11190 20 53 65 74 74 69 6e 67 20 74 68 65 20 62 75 73   Setting the bus
111a0 79 5f 74 69 6d 65 6f 75 74 20 74 6f 20 30 20 6f  y_timeout to 0 o
111b0 72 20 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a 20  r negative.  ** 
111c0 64 69 73 61 62 6c 65 73 20 74 68 65 20 74 69 6d  disables the tim
111d0 65 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 63  eout..  */.  /*c
111e0 61 73 65 20 50 72 61 67 54 79 70 5f 42 55 53 59  ase PragTyp_BUSY
111f0 5f 54 49 4d 45 4f 55 54 2a 2f 20 64 65 66 61 75  _TIMEOUT*/ defau
11200 6c 74 3a 20 7b 0a 20 20 20 20 61 73 73 65 72 74  lt: {.    assert
11210 28 20 70 50 72 61 67 6d 61 2d 3e 65 50 72 61 67  ( pPragma->ePrag
11220 54 79 70 3d 3d 50 72 61 67 54 79 70 5f 42 55 53  Typ==PragTyp_BUS
11230 59 5f 54 49 4d 45 4f 55 54 20 29 3b 0a 20 20 20  Y_TIMEOUT );.   
11240 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
11250 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
11260 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 73 71  y_timeout(db, sq
11270 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
11280 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ));.    }.    re
11290 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
112a0 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
112b0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
112c0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  }..  /*.  **   P
112d0 52 41 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f  RAGMA soft_heap_
112e0 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52 41  limit.  **   PRA
112f0 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  GMA soft_heap_li
11300 6d 69 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a  mit = N.  **.  *
11310 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
11320 2d 4f 46 3a 20 52 2d 32 36 33 34 33 2d 34 35 39  -OF: R-26343-459
11330 33 30 20 54 68 69 73 20 70 72 61 67 6d 61 20 69  30 This pragma i
11340 6e 76 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20  nvokes the.  ** 
11350 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
11360 70 5f 6c 69 6d 69 74 36 34 28 29 20 69 6e 74 65  p_limit64() inte
11370 72 66 61 63 65 20 77 69 74 68 20 74 68 65 20 61  rface with the a
11380 72 67 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20  rgument N, if N 
11390 69 73 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  is.  ** specifie
113a0 64 20 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e  d and is a non-n
113b0 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e  egative integer.
113c0 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
113d0 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31  TION-OF: R-64451
113e0 2d 30 37 31 36 33 20 54 68 65 20 73 6f 66 74 5f  -07163 The soft_
113f0 68 65 61 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d  heap_limit pragm
11400 61 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65  a always.  ** re
11410 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 69  turns the same i
11420 6e 74 65 67 65 72 20 74 68 61 74 20 77 6f 75 6c  nteger that woul
11430 64 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  d be returned by
11440 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
11450 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
11460 74 36 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61  t64(-1) C-langua
11470 67 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ge function..  *
11480 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
11490 5f 53 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54  _SOFT_HEAP_LIMIT
114a0 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
114b0 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28  int64 N;.    if(
114c0 20 7a 52 69 67 68 74 20 26 26 20 73 71 6c 69 74   zRight && sqlit
114d0 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
114e0 7a 52 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c  zRight, &N)==SQL
114f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11500 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
11510 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20  p_limit64(N);.  
11520 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
11530 6e 67 6c 65 49 6e 74 28 76 2c 20 73 71 6c 69 74  ngleInt(v, sqlit
11540 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
11550 69 74 36 34 28 2d 31 29 29 3b 0a 20 20 20 20 62  it64(-1));.    b
11560 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
11570 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 68    **   PRAGMA th
11580 72 65 61 64 73 0a 20 20 2a 2a 20 20 20 50 52 41  reads.  **   PRA
11590 47 4d 41 20 74 68 72 65 61 64 73 20 3d 20 4e 0a  GMA threads = N.
115a0 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67    **.  ** Config
115b0 75 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ure the maximum 
115c0 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65 72  number of worker
115d0 20 74 68 72 65 61 64 73 2e 20 20 52 65 74 75 72   threads.  Retur
115e0 6e 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 6d  n the new.  ** m
115f0 61 78 69 6d 75 6d 2c 20 77 68 69 63 68 20 6d 69  aximum, which mi
11600 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ght be less than
11610 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
11620 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
11630 54 48 52 45 41 44 53 3a 20 7b 0a 20 20 20 20 73  THREADS: {.    s
11640 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a  qlite3_int64 N;.
11650 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 0a 20      if( zRight. 
11660 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 44 65      && sqlite3De
11670 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52 69 67  cOrHexToI64(zRig
11680 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54 45 5f  ht, &N)==SQLITE_
11690 4f 4b 0a 20 20 20 20 20 26 26 20 4e 3e 3d 30 0a  OK.     && N>=0.
116a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
116b0 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53  ite3_limit(db, S
116c0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
116d0 45 52 5f 54 48 52 45 41 44 53 2c 20 28 69 6e 74  ER_THREADS, (int
116e0 29 28 4e 26 30 78 37 66 66 66 66 66 66 66 29 29  )(N&0x7fffffff))
116f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
11700 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 73  rnSingleInt(v, s
11710 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c  qlite3_limit(db,
11720 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
11730 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 2d 31  RKER_THREADS, -1
11740 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
11750 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
11760 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
11770 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
11780 54 45 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  TEST).  /*.  ** 
11790 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
117a0 6e 74 20 73 74 61 74 65 20 6f 66 20 66 69 6c 65  nt state of file
117b0 20 6c 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64 61   logs for all da
117c0 74 61 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20 63  tabases.  */.  c
117d0 61 73 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b  ase PragTyp_LOCK
117e0 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 73  _STATUS: {.    s
117f0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
11800 20 2a 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61   *const azLockNa
11810 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22  me[] = {.      "
11820 75 6e 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61 72  unlocked", "shar
11830 65 64 22 2c 20 22 72 65 73 65 72 76 65 64 22 2c  ed", "reserved",
11840 20 22 70 65 6e 64 69 6e 67 22 2c 20 22 65 78 63   "pending", "exc
11850 6c 75 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20  lusive".    };. 
11860 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50     int i;.    pP
11870 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a  arse->nMem = 2;.
11880 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
11890 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
118a0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a      Btree *pBt;.
118b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
118c0 20 2a 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e   *zState = "unkn
118d0 6f 77 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74 20  own";.      int 
118e0 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  j;.      if( db-
118f0 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
11900 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
11910 20 20 20 20 20 20 70 42 74 20 3d 20 64 62 2d 3e        pBt = db->
11920 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
11930 20 20 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20    if( pBt==0 || 
11940 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
11950 72 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  r(pBt)==0 ){.   
11960 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20 22 63       zState = "c
11970 6c 6f 73 65 64 22 3b 0a 20 20 20 20 20 20 7d 65  losed";.      }e
11980 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
11990 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
119a0 20 69 20 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   i ? db->aDb[i].
119b0 7a 44 62 53 4e 61 6d 65 20 3a 20 30 2c 20 0a 20  zDbSName : 0, . 
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c      SQLITE_FCNTL
119f0 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 6a 29 3d  _LOCKSTATE, &j)=
11a00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11a10 20 20 20 20 20 20 20 7a 53 74 61 74 65 20 3d 20         zState = 
11a20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b 0a 20  azLockName[j];. 
11a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
11a40 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
11a50 64 28 76 2c 20 31 2c 20 22 73 73 22 2c 20 64 62  d(v, 1, "ss", db
11a60 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
11a70 65 2c 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20  e, zState);.    
11a80 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
11a90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
11aa0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
11ab0 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
11ac0 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a  KEY: {.    if( z
11ad0 52 69 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f  Right ) sqlite3_
11ae0 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  key_v2(db, zDb, 
11af0 7a 52 69 67 68 74 2c 20 73 71 6c 69 74 65 33 53  zRight, sqlite3S
11b00 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 29  trlen30(zRight))
11b10 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
11b20 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
11b30 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28  REKEY: {.    if(
11b40 20 7a 52 69 67 68 74 20 29 20 73 71 6c 69 74 65   zRight ) sqlite
11b50 33 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a  3_rekey_v2(db, z
11b60 44 62 2c 20 7a 52 69 67 68 74 2c 20 73 71 6c 69  Db, zRight, sqli
11b70 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52 69 67  te3Strlen30(zRig
11b80 68 74 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ht));.    break;
11b90 0a 20 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67  .  }.  case Prag
11ba0 54 79 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20  Typ_HEXKEY: {.  
11bb0 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
11bc0 20 20 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a        u8 iByte;.
11bd0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
11be0 20 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d     char zKey[40]
11bf0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
11c00 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65   iByte=0; i<size
11c10 6f 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71  of(zKey)*2 && sq
11c20 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 52  lite3Isxdigit(zR
11c30 69 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a  ight[i]); i++){.
11c40 20 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20          iByte = 
11c50 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c  (iByte<<4) + sql
11c60 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69  ite3HexToInt(zRi
11c70 67 68 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ght[i]);.       
11c80 20 69 66 28 20 28 69 26 31 29 21 3d 30 20 29 20   if( (i&1)!=0 ) 
11c90 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74  zKey[i/2] = iByt
11ca0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
11cb0 20 69 66 28 20 28 7a 4c 65 66 74 5b 33 5d 20 26   if( (zLeft[3] &
11cc0 20 30 78 66 29 3d 3d 30 78 62 20 29 7b 0a 20 20   0xf)==0xb ){.  
11cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65        sqlite3_ke
11ce0 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b  y_v2(db, zDb, zK
11cf0 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20  ey, i/2);.      
11d00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
11d10 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28  qlite3_rekey_v2(
11d20 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69  db, zDb, zKey, i
11d30 2f 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  /2);.      }.   
11d40 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
11d50 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
11d60 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
11d70 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65  CODEC) || define
11d80 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
11d90 43 45 52 4f 44 29 0a 20 20 63 61 73 65 20 50 72  CEROD).  case Pr
11da0 61 67 54 79 70 5f 41 43 54 49 56 41 54 45 5f 45  agTyp_ACTIVATE_E
11db0 58 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a  XTENSIONS: if( z
11dc0 52 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20  Right ){.#ifdef 
11dd0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
11de0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11df0 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c  StrNICmp(zRight,
11e00 20 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29   "see-", 4)==0 )
11e10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11e20 61 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52  activate_see(&zR
11e30 69 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a  ight[4]);.    }.
11e40 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
11e50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f  LITE_ENABLE_CERO
11e60 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
11e70 33 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74  3StrNICmp(zRight
11e80 2c 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d  , "cerod-", 6)==
11e90 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11ea0 65 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f  e3_activate_cero
11eb0 64 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20  d(&zRight[6]);. 
11ec0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
11ed0 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
11ee0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74  .  } /* End of t
11ef0 68 65 20 50 52 41 47 4d 41 20 73 77 69 74 63 68  he PRAGMA switch
11f00 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   */..  /* The fo
11f10 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 69 73  llowing block is
11f20 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
11f30 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
11f40 64 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c  defined. Its onl
11f50 79 0a 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 69  y.  ** purpose i
11f60 73 20 74 6f 20 65 78 65 63 75 74 65 20 61 73 73  s to execute ass
11f70 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
11f80 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
11f90 69 66 20 74 68 65 0a 20 20 2a 2a 20 50 72 61 67  if the.  ** Prag
11fa0 46 6c 67 5f 4e 6f 43 6f 6c 75 6d 6e 73 31 20 66  Flg_NoColumns1 f
11fb0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
11fc0 68 65 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  he caller specif
11fd0 69 65 64 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a  ied an argument.
11fe0 20 20 2a 2a 20 74 6f 20 74 68 65 20 50 52 41 47    ** to the PRAG
11ff0 4d 41 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  MA, the implemen
12000 74 61 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 61  tation has not a
12010 64 64 65 64 20 61 6e 79 20 4f 50 5f 52 65 73 75  dded any OP_Resu
12020 6c 74 52 6f 77 20 0a 20 20 2a 2a 20 69 6e 73 74  ltRow .  ** inst
12030 72 75 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  ructions to the 
12040 56 4d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  VM.  */.  if( (p
12050 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 67  Pragma->mPragFlg
12060 20 26 20 50 72 61 67 46 6c 67 5f 4e 6f 43 6f 6c   & PragFlg_NoCol
12070 75 6d 6e 73 31 29 20 26 26 20 7a 52 69 67 68 74  umns1) && zRight
12080 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
12090 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c  dbeVerifyNoResul
120a0 74 52 6f 77 28 76 29 3b 0a 20 20 7d 0a 0a 70 72  tRow(v);.  }..pr
120b0 61 67 6d 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  agma_out:.  sqli
120c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4c  te3DbFree(db, zL
120d0 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  eft);.  sqlite3D
120e0 62 46 72 65 65 28 64 62 2c 20 7a 52 69 67 68 74  bFree(db, zRight
120f0 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  );.}.#ifndef SQL
12100 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12110 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  TABLE./*********
12120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12160 2a 2a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ****.** Implemen
12170 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 70 6f  tation of an epo
12180 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74  nymous virtual t
12190 61 62 6c 65 20 74 68 61 74 20 72 75 6e 73 20 61  able that runs a
121a0 20 70 72 61 67 6d 61 2e 0a 2a 2a 0a 2a 2f 0a 74   pragma..**.*/.t
121b0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 72  ypedef struct Pr
121c0 61 67 6d 61 56 74 61 62 20 50 72 61 67 6d 61 56  agmaVtab PragmaV
121d0 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72  tab;.typedef str
121e0 75 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75  uct PragmaVtabCu
121f0 72 73 6f 72 20 50 72 61 67 6d 61 56 74 61 62 43  rsor PragmaVtabC
12200 75 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 50 72  ursor;.struct Pr
12210 61 67 6d 61 56 74 61 62 20 7b 0a 20 20 73 71 6c  agmaVtab {.  sql
12220 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20  ite3_vtab base; 
12230 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63         /* Base c
12240 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20 66  lass.  Must be f
12250 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  irst */.  sqlite
12260 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
12270 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
12280 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
12290 6f 20 77 68 69 63 68 20 69 74 20 62 65 6c 6f 6e  o which it belon
122a0 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 50 72  gs */.  const Pr
122b0 61 67 6d 61 4e 61 6d 65 20 2a 70 4e 61 6d 65 3b  agmaName *pName;
122c0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
122d0 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20 75 38 20   pragma */.  u8 
122e0 6e 48 69 64 64 65 6e 3b 20 20 20 20 20 20 20 20  nHidden;        
122f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12300 20 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d   of hidden colum
12310 6e 73 20 2a 2f 0a 20 20 75 38 20 69 48 69 64 64  ns */.  u8 iHidd
12320 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
12330 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
12340 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 63  e first hidden c
12350 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 73 74 72 75  olumn */.};.stru
12360 63 74 20 50 72 61 67 6d 61 56 74 61 62 43 75 72  ct PragmaVtabCur
12370 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sor {.  sqlite3_
12380 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
12390 3b 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e  ; /* Base class.
123a0 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20    Must be first 
123b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
123c0 74 20 2a 70 50 72 61 67 6d 61 3b 20 20 20 20 2f  t *pPragma;    /
123d0 2a 20 54 68 65 20 70 72 61 67 6d 61 20 73 74 61  * The pragma sta
123e0 74 65 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f  tement to run */
123f0 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
12400 69 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20  iRowid;      /* 
12410 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f  Current rowid */
12420 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 32  .  char *azArg[2
12430 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ];           /* 
12440 56 61 6c 75 65 20 6f 66 20 74 68 65 20 61 72 67  Value of the arg
12450 75 6d 65 6e 74 20 61 6e 64 20 73 63 68 65 6d 61  ument and schema
12460 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 50   */.};../* .** P
12470 72 61 67 6d 61 20 76 69 72 74 75 61 6c 20 74 61  ragma virtual ta
12480 62 6c 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6e 6e  ble module xConn
12490 65 63 74 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ect method..*/.s
124a0 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
124b0 56 74 61 62 43 6f 6e 6e 65 63 74 28 0a 20 20 73  VtabConnect(.  s
124c0 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
124d0 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20  id *pAux,.  int 
124e0 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
124f0 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20   *const*argv,.  
12500 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
12510 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a  pVtab,.  char **
12520 70 7a 45 72 72 0a 29 7b 0a 20 20 63 6f 6e 73 74  pzErr.){.  const
12530 20 50 72 61 67 6d 61 4e 61 6d 65 20 2a 70 50 72   PragmaName *pPr
12540 61 67 6d 61 20 3d 20 28 63 6f 6e 73 74 20 50 72  agma = (const Pr
12550 61 67 6d 61 4e 61 6d 65 2a 29 70 41 75 78 3b 0a  agmaName*)pAux;.
12560 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54    PragmaVtab *pT
12570 61 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ab = 0;.  int rc
12580 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
12590 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b  char cSep = '(';
125a0 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b  .  StrAccum acc;
125b0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30  .  char zBuf[200
125c0 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ];..  UNUSED_PAR
125d0 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
125e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
125f0 28 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65  (argv);.  sqlite
12600 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61  3StrAccumInit(&a
12610 63 63 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a  cc, 0, zBuf, siz
12620 65 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20  eof(zBuf), 0);. 
12630 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
12640 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20  AppendAll(&acc, 
12650 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 22  "CREATE TABLE x"
12660 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  );.  for(i=0, j=
12670 70 50 72 61 67 6d 61 2d 3e 69 50 72 61 67 43 4e  pPragma->iPragCN
12680 61 6d 65 3b 20 69 3c 70 50 72 61 67 6d 61 2d 3e  ame; i<pPragma->
12690 6e 50 72 61 67 43 4e 61 6d 65 3b 20 69 2b 2b 2c  nPragCName; i++,
126a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   j++){.    sqlit
126b0 65 33 58 50 72 69 6e 74 66 28 26 61 63 63 2c 20  e3XPrintf(&acc, 
126c0 22 25 63 5c 22 25 73 5c 22 22 2c 20 63 53 65 70  "%c\"%s\"", cSep
126d0 2c 20 70 72 61 67 43 4e 61 6d 65 5b 6a 5d 29 3b  , pragCName[j]);
126e0 0a 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27 3b  .    cSep = ',';
126f0 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d 30 20  .  }.  if( i==0 
12700 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
12710 72 69 6e 74 66 28 26 61 63 63 2c 20 22 28 5c 22  rintf(&acc, "(\"
12720 25 73 5c 22 22 2c 20 70 50 72 61 67 6d 61 2d 3e  %s\"", pPragma->
12730 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 63 53 65 70  zName);.    cSep
12740 20 3d 20 27 2c 27 3b 0a 20 20 20 20 69 2b 2b 3b   = ',';.    i++;
12750 0a 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20  .  }.  j = 0;.  
12760 69 66 28 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72  if( pPragma->mPr
12770 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67 5f  agFlg & PragFlg_
12780 52 65 73 75 6c 74 31 20 29 7b 0a 20 20 20 20 73  Result1 ){.    s
12790 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
127a0 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c 20 22 2c  pendAll(&acc, ",
127b0 61 72 67 20 48 49 44 44 45 4e 22 29 3b 0a 20 20  arg HIDDEN");.  
127c0 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    j++;.  }.  if(
127d0 20 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46   pPragma->mPragF
127e0 6c 67 20 26 20 28 50 72 61 67 46 6c 67 5f 53 63  lg & (PragFlg_Sc
127f0 68 65 6d 61 4f 70 74 7c 50 72 61 67 46 6c 67 5f  hemaOpt|PragFlg_
12800 53 63 68 65 6d 61 52 65 71 29 20 29 7b 0a 20 20  SchemaReq) ){.  
12810 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
12820 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63 63 2c  mAppendAll(&acc,
12830 20 22 2c 73 63 68 65 6d 61 20 48 49 44 44 45 4e   ",schema HIDDEN
12840 22 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d  ");.    j++;.  }
12850 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
12860 75 6d 41 70 70 65 6e 64 28 26 61 63 63 2c 20 22  umAppend(&acc, "
12870 29 22 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  )", 1);.  sqlite
12880 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
12890 26 61 63 63 29 3b 0a 20 20 61 73 73 65 72 74 28  &acc);.  assert(
128a0 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 20 3c 20   strlen(zBuf) < 
128b0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29  sizeof(zBuf)-1 )
128c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
128d0 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62  _declare_vtab(db
128e0 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72  , zBuf);.  if( r
128f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12900 20 20 20 20 70 54 61 62 20 3d 20 28 50 72 61 67      pTab = (Prag
12910 6d 61 56 74 61 62 2a 29 73 71 6c 69 74 65 33 5f  maVtab*)sqlite3_
12920 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50 72  malloc(sizeof(Pr
12930 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20 20 20  agmaVtab));.    
12940 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
12950 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12960 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
12970 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
12980 70 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pTab, 0, sizeof(
12990 50 72 61 67 6d 61 56 74 61 62 29 29 3b 0a 20 20  PragmaVtab));.  
129a0 20 20 20 20 70 54 61 62 2d 3e 70 4e 61 6d 65 20      pTab->pName 
129b0 3d 20 70 50 72 61 67 6d 61 3b 0a 20 20 20 20 20  = pPragma;.     
129c0 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a   pTab->db = db;.
129d0 20 20 20 20 20 20 70 54 61 62 2d 3e 69 48 69 64        pTab->iHid
129e0 64 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  den = i;.      p
129f0 54 61 62 2d 3e 6e 48 69 64 64 65 6e 20 3d 20 6a  Tab->nHidden = j
12a00 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
12a10 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71  .    *pzErr = sq
12a20 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
12a30 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
12a40 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20  sg(db));.  }..  
12a50 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74  *ppVtab = (sqlit
12a60 65 33 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20  e3_vtab*)pTab;. 
12a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12a80 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72  * .** Pragma vir
12a90 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
12aa0 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65  e xDisconnect me
12ab0 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
12ac0 69 6e 74 20 70 72 61 67 6d 61 56 74 61 62 44 69  int pragmaVtabDi
12ad0 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33  sconnect(sqlite3
12ae0 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
12af0 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54 61   PragmaVtab *pTa
12b00 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62 2a  b = (PragmaVtab*
12b10 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65  )pVtab;.  sqlite
12b20 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20  3_free(pTab);.  
12b30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12b40 3b 0a 7d 0a 0a 2f 2a 20 46 69 67 75 72 65 20 6f  ;.}../* Figure o
12b50 75 74 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  ut the best inde
12b60 78 20 74 6f 20 75 73 65 20 74 6f 20 73 65 61 72  x to use to sear
12b70 63 68 20 61 20 70 72 61 67 6d 61 20 76 69 72 74  ch a pragma virt
12b80 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
12b90 20 54 68 65 72 65 20 61 72 65 20 6e 6f 74 20 72   There are not r
12ba0 65 61 6c 6c 79 20 61 6e 79 20 69 6e 64 65 78 20  eally any index 
12bb0 63 68 6f 69 63 65 73 2e 20 20 42 75 74 20 77 65  choices.  But we
12bc0 20 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75 72 61   want to encoura
12bd0 67 65 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  ge the.** query 
12be0 70 6c 61 6e 6e 65 72 20 74 6f 20 67 69 76 65 20  planner to give 
12bf0 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  == constraints o
12c00 6e 20 61 73 20 6d 61 6e 79 20 68 69 64 64 65 6e  n as many hidden
12c10 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 0a 2a   parameters as.*
12c20 2a 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20  * possible, and 
12c30 65 73 70 65 63 69 61 6c 6c 79 20 6f 6e 20 74 68  especially on th
12c40 65 20 66 69 72 73 74 20 68 69 64 64 65 6e 20 70  e first hidden p
12c50 61 72 61 6d 65 74 65 72 2e 20 20 53 6f 20 72 65  arameter.  So re
12c60 74 75 72 6e 20 61 0a 2a 2a 20 68 69 67 68 20 63  turn a.** high c
12c70 6f 73 74 20 69 66 20 68 69 64 64 65 6e 20 70 61  ost if hidden pa
12c80 72 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e 63  rameters are unc
12c90 6f 6e 73 74 72 61 69 6e 65 64 2e 0a 2a 2f 0a 73  onstrained..*/.s
12ca0 74 61 74 69 63 20 69 6e 74 20 70 72 61 67 6d 61  tatic int pragma
12cb0 56 74 61 62 42 65 73 74 49 6e 64 65 78 28 73 71  VtabBestIndex(sq
12cc0 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c  lite3_vtab *tab,
12cd0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
12ce0 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a  nfo *pIdxInfo){.
12cf0 20 20 50 72 61 67 6d 61 56 74 61 62 20 2a 70 54    PragmaVtab *pT
12d00 61 62 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  ab = (PragmaVtab
12d10 2a 29 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73  *)tab;.  const s
12d20 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
12d30 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
12d40 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  pConstraint;.  i
12d50 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73  nt i, j;.  int s
12d60 65 65 6e 5b 32 5d 3b 0a 0a 20 20 70 49 64 78 49  een[2];..  pIdxI
12d70 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
12d80 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a  st = (double)1;.
12d90 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 48 69 64    if( pTab->nHid
12da0 64 65 6e 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e  den==0 ){ return
12db0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20   SQLITE_OK; }.  
12dc0 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  pConstraint = pI
12dd0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
12de0 69 6e 74 3b 0a 20 20 73 65 65 6e 5b 30 5d 20 3d  int;.  seen[0] =
12df0 20 30 3b 0a 20 20 73 65 65 6e 5b 31 5d 20 3d 20   0;.  seen[1] = 
12e00 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
12e10 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
12e20 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e  raint; i++, pCon
12e30 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20  straint++){.    
12e40 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
12e50 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e  >usable==0 ) con
12e60 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
12e70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d  Constraint->op!=
12e80 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
12e90 53 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e  STRAINT_EQ ) con
12ea0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
12eb0 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
12ec0 75 6d 6e 20 3c 20 70 54 61 62 2d 3e 69 48 69 64  umn < pTab->iHid
12ed0 64 65 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  den ) continue;.
12ee0 20 20 20 20 6a 20 3d 20 70 43 6f 6e 73 74 72 61      j = pConstra
12ef0 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70  int->iColumn - p
12f00 54 61 62 2d 3e 69 48 69 64 64 65 6e 3b 0a 20 20  Tab->iHidden;.  
12f10 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20 32 20    assert( j < 2 
12f20 29 3b 0a 20 20 20 20 73 65 65 6e 5b 6a 5d 20 3d  );.    seen[j] =
12f30 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   i+1;.  }.  if( 
12f40 73 65 65 6e 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  seen[0]==0 ){.  
12f50 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
12f60 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
12f70 62 6c 65 29 32 31 34 37 34 38 33 36 34 37 3b 0a  ble)2147483647;.
12f80 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
12f90 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 31  timatedRows = 21
12fa0 34 37 34 38 33 36 34 37 3b 0a 20 20 20 20 72 65  47483647;.    re
12fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12fc0 20 20 7d 0a 20 20 6a 20 3d 20 73 65 65 6e 5b 30    }.  j = seen[0
12fd0 5d 2d 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  ]-1;.  pIdxInfo-
12fe0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
12ff0 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  e[j].argvIndex =
13000 20 31 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   1;.  pIdxInfo->
13010 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
13020 5b 6a 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  [j].omit = 1;.  
13030 69 66 28 20 73 65 65 6e 5b 31 5d 3d 3d 30 20 29  if( seen[1]==0 )
13040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13050 4b 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  K;.  pIdxInfo->e
13060 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28  stimatedCost = (
13070 64 6f 75 62 6c 65 29 32 30 3b 0a 20 20 70 49 64  double)20;.  pId
13080 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
13090 52 6f 77 73 20 3d 20 32 30 3b 0a 20 20 6a 20 3d  Rows = 20;.  j =
130a0 20 73 65 65 6e 5b 31 5d 2d 31 3b 0a 20 20 70 49   seen[1]-1;.  pI
130b0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
130c0 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76  intUsage[j].argv
130d0 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 70 49 64  Index = 2;.  pId
130e0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
130f0 6e 74 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20  ntUsage[j].omit 
13100 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
13110 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43  LITE_OK;.}../* C
13120 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
13130 6f 72 20 66 6f 72 20 74 68 65 20 70 72 61 67 6d  or for the pragm
13140 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13150 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
13160 61 67 6d 61 56 74 61 62 4f 70 65 6e 28 73 71 6c  agmaVtabOpen(sql
13170 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
13180 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
13190 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72  ursor **ppCursor
131a0 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
131b0 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 70  ursor *pCsr;.  p
131c0 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
131d0 62 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33  bCursor*)sqlite3
131e0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  _malloc(sizeof(*
131f0 70 43 73 72 29 29 3b 0a 20 20 69 66 28 20 70 43  pCsr));.  if( pC
13200 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  sr==0 ) return S
13210 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
13220 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73  emset(pCsr, 0, s
13230 69 7a 65 6f 66 28 50 72 61 67 6d 61 56 74 61 62  izeof(PragmaVtab
13240 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72  Cursor));.  pCsr
13250 2d 3e 62 61 73 65 2e 70 56 74 61 62 20 3d 20 70  ->base.pVtab = p
13260 56 74 61 62 3b 0a 20 20 2a 70 70 43 75 72 73 6f  Vtab;.  *ppCurso
13270 72 20 3d 20 26 70 43 73 72 2d 3e 62 61 73 65 3b  r = &pCsr->base;
13280 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13290 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43 6c 65 61 72  _OK;.}../* Clear
132a0 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 66 72 6f   all content fro
132b0 6d 20 70 72 61 67 6d 61 20 76 69 72 74 75 61 6c  m pragma virtual
132c0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 2a   table cursor. *
132d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
132e0 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c  agmaVtabCursorCl
132f0 65 61 72 28 50 72 61 67 6d 61 56 74 61 62 43 75  ear(PragmaVtabCu
13300 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  rsor *pCsr){.  i
13310 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt i;.  sqlite3_
13320 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70  finalize(pCsr->p
13330 50 72 61 67 6d 61 29 3b 0a 20 20 70 43 73 72 2d  Pragma);.  pCsr-
13340 3e 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20  >pPragma = 0;.  
13350 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
13360 53 69 7a 65 28 70 43 73 72 2d 3e 61 7a 41 72 67  Size(pCsr->azArg
13370 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
13380 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
13390 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 70  azArg[i]);.    p
133a0 43 73 72 2d 3e 61 7a 41 72 67 5b 69 5d 20 3d 20  Csr->azArg[i] = 
133b0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6c 6f  0;.  }.}../* Clo
133c0 73 65 20 61 20 70 72 61 67 6d 61 20 76 69 72 74  se a pragma virt
133d0 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
133e0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
133f0 72 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 28 73  ragmaVtabClose(s
13400 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13410 6f 72 20 2a 63 75 72 29 7b 0a 20 20 50 72 61 67  or *cur){.  Prag
13420 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70 43  maVtabCursor *pC
13430 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61 62  sr = (PragmaVtab
13440 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70  Cursor*)cur;.  p
13450 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43  ragmaVtabCursorC
13460 6c 65 61 72 28 70 43 73 72 29 3b 0a 20 20 73 71  lear(pCsr);.  sq
13470 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29  lite3_free(pCsr)
13480 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13490 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61  E_OK;.}../* Adva
134a0 6e 63 65 20 74 68 65 20 70 72 61 67 6d 61 20 76  nce the pragma v
134b0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
134c0 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
134d0 72 6f 77 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  row */.static in
134e0 74 20 70 72 61 67 6d 61 56 74 61 62 4e 65 78 74  t pragmaVtabNext
134f0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
13500 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
13510 72 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62  r){.  PragmaVtab
13520 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
13530 50 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72  PragmaVtabCursor
13540 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
13550 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13560 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  _OK;..  /* Incre
13570 6d 65 6e 74 20 74 68 65 20 78 52 6f 77 69 64 20  ment the xRowid 
13580 76 61 6c 75 65 20 2a 2f 0a 20 20 70 43 73 72 2d  value */.  pCsr-
13590 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 61 73 73  >iRowid++;.  ass
135a0 65 72 74 28 20 70 43 73 72 2d 3e 70 50 72 61 67  ert( pCsr->pPrag
135b0 6d 61 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  ma );.  if( SQLI
135c0 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f  TE_ROW!=sqlite3_
135d0 73 74 65 70 28 70 43 73 72 2d 3e 70 50 72 61 67  step(pCsr->pPrag
135e0 6d 61 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ma) ){.    rc = 
135f0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
13600 28 70 43 73 72 2d 3e 70 50 72 61 67 6d 61 29 3b  (pCsr->pPragma);
13610 0a 20 20 20 20 70 43 73 72 2d 3e 70 50 72 61 67  .    pCsr->pPrag
13620 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 72 61 67  ma = 0;.    prag
13630 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65 61  maVtabCursorClea
13640 72 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72  r(pCsr);.  }.  r
13650 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
13660 0a 2a 2a 20 50 72 61 67 6d 61 20 76 69 72 74 75  .** Pragma virtu
13670 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
13680 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 0a  xFilter method..
13690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
136a0 61 67 6d 61 56 74 61 62 46 69 6c 74 65 72 28 0a  agmaVtabFilter(.
136b0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
136c0 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
136d0 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75  or, .  int idxNu
136e0 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  m, const char *i
136f0 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67  dxStr,.  int arg
13700 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
13710 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 50 72 61   **argv.){.  Pra
13720 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
13730 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
13740 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
13750 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74  rsor;.  PragmaVt
13760 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
13770 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75  maVtab*)(pVtabCu
13780 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20  rsor->pVtab);.  
13790 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c  int rc;.  int i,
137a0 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 61   j;.  StrAccum a
137b0 63 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  cc;.  char *zSql
137c0 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
137d0 4d 45 54 45 52 28 69 64 78 4e 75 6d 29 3b 0a 20  METER(idxNum);. 
137e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
137f0 52 28 69 64 78 53 74 72 29 3b 0a 20 20 70 72 61  R(idxStr);.  pra
13800 67 6d 61 56 74 61 62 43 75 72 73 6f 72 43 6c 65  gmaVtabCursorCle
13810 61 72 28 70 43 73 72 29 3b 0a 20 20 6a 20 3d 20  ar(pCsr);.  j = 
13820 28 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e 6d 50  (pTab->pName->mP
13830 72 61 67 46 6c 67 20 26 20 50 72 61 67 46 6c 67  ragFlg & PragFlg
13840 5f 52 65 73 75 6c 74 31 29 21 3d 30 20 3f 20 30  _Result1)!=0 ? 0
13850 20 3a 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   : 1;.  for(i=0;
13860 20 69 3c 61 72 67 63 3b 20 69 2b 2b 2c 20 6a 2b   i<argc; i++, j+
13870 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
13880 6a 3c 41 72 72 61 79 53 69 7a 65 28 70 43 73 72  j<ArraySize(pCsr
13890 2d 3e 61 7a 41 72 67 29 20 29 3b 0a 20 20 20 20  ->azArg) );.    
138a0 70 43 73 72 2d 3e 61 7a 41 72 67 5b 6a 5d 20 3d  pCsr->azArg[j] =
138b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
138c0 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76  ("%s", sqlite3_v
138d0 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
138e0 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 43 73  ]));.    if( pCs
138f0 72 2d 3e 61 7a 41 72 67 5b 6a 5d 3d 3d 30 20 29  r->azArg[j]==0 )
13900 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
13910 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
13920 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13930 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63  StrAccumInit(&ac
13940 63 2c 20 30 2c 20 30 2c 20 30 2c 20 70 54 61 62  c, 0, 0, 0, pTab
13950 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
13960 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
13970 4e 47 54 48 5d 29 3b 0a 20 20 73 71 6c 69 74 65  NGTH]);.  sqlite
13980 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
13990 6c 6c 28 26 61 63 63 2c 20 22 50 52 41 47 4d 41  ll(&acc, "PRAGMA
139a0 20 22 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d   ");.  if( pCsr-
139b0 3e 61 7a 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20  >azArg[1] ){.   
139c0 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
139d0 26 61 63 63 2c 20 22 25 51 2e 22 2c 20 70 43 73  &acc, "%Q.", pCs
139e0 72 2d 3e 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  r->azArg[1]);.  
139f0 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
13a00 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 61 63  cumAppendAll(&ac
13a10 63 2c 20 70 54 61 62 2d 3e 70 4e 61 6d 65 2d 3e  c, pTab->pName->
13a20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 43  zName);.  if( pC
13a30 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 20 29 7b 0a  sr->azArg[0] ){.
13a40 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
13a50 74 66 28 26 61 63 63 2c 20 22 3d 25 51 22 2c 20  tf(&acc, "=%Q", 
13a60 70 43 73 72 2d 3e 61 7a 41 72 67 5b 30 5d 29 3b  pCsr->azArg[0]);
13a70 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71  .  }.  zSql = sq
13a80 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
13a90 69 73 68 28 26 61 63 63 29 3b 0a 20 20 69 66 28  ish(&acc);.  if(
13aa0 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
13ab0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
13ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
13ad0 72 65 70 61 72 65 5f 76 32 28 70 54 61 62 2d 3e  repare_v2(pTab->
13ae0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
13af0 43 73 72 2d 3e 70 50 72 61 67 6d 61 2c 20 30 29  Csr->pPragma, 0)
13b00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
13b10 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63  (zSql);.  if( rc
13b20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13b30 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45     pTab->base.zE
13b40 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
13b50 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
13b60 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54 61  lite3_errmsg(pTa
13b70 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 72 65 74  b->db));.    ret
13b80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
13b90 74 75 72 6e 20 70 72 61 67 6d 61 56 74 61 62 4e  turn pragmaVtabN
13ba0 65 78 74 28 70 56 74 61 62 43 75 72 73 6f 72 29  ext(pVtabCursor)
13bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 61 67 6d  ;.}../*.** Pragm
13bc0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
13bd0 6d 6f 64 75 6c 65 20 78 45 6f 66 20 6d 65 74 68  module xEof meth
13be0 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
13bf0 74 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66 28  t pragmaVtabEof(
13c00 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13c10 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
13c20 29 7b 0a 20 20 50 72 61 67 6d 61 56 74 61 62 43  ){.  PragmaVtabC
13c30 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 50  ursor *pCsr = (P
13c40 72 61 67 6d 61 56 74 61 62 43 75 72 73 6f 72 2a  ragmaVtabCursor*
13c50 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
13c60 72 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 50  return (pCsr->pP
13c70 72 61 67 6d 61 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  ragma==0);.}../*
13c80 20 54 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74   The xColumn met
13c90 68 6f 64 20 73 69 6d 70 6c 79 20 72 65 74 75 72  hod simply retur
13ca0 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ns the correspon
13cb0 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  ding column from
13cc0 0a 2a 2a 20 74 68 65 20 50 52 41 47 4d 41 2e 20  .** the PRAGMA. 
13cd0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
13ce0 70 72 61 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e  pragmaVtabColumn
13cf0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
13d00 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
13d10 72 73 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33  rsor, .  sqlite3
13d20 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a  _context *ctx, .
13d30 20 20 69 6e 74 20 69 0a 29 7b 0a 20 20 50 72 61    int i.){.  Pra
13d40 67 6d 61 56 74 61 62 43 75 72 73 6f 72 20 2a 70  gmaVtabCursor *p
13d50 43 73 72 20 3d 20 28 50 72 61 67 6d 61 56 74 61  Csr = (PragmaVta
13d60 62 43 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  bCursor*)pVtabCu
13d70 72 73 6f 72 3b 0a 20 20 50 72 61 67 6d 61 56 74  rsor;.  PragmaVt
13d80 61 62 20 2a 70 54 61 62 20 3d 20 28 50 72 61 67  ab *pTab = (Prag
13d90 6d 61 56 74 61 62 2a 29 28 70 56 74 61 62 43 75  maVtab*)(pVtabCu
13da0 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20  rsor->pVtab);.  
13db0 69 66 28 20 69 3c 70 54 61 62 2d 3e 69 48 69 64  if( i<pTab->iHid
13dc0 64 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  den ){.    sqlit
13dd0 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
13de0 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ctx, sqlite3_col
13df0 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e  umn_value(pCsr->
13e00 70 50 72 61 67 6d 61 2c 20 69 29 29 3b 0a 20 20  pPragma, i));.  
13e10 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
13e20 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
13e30 74 78 2c 20 70 43 73 72 2d 3e 61 7a 41 72 67 5b  tx, pCsr->azArg[
13e40 69 2d 70 54 61 62 2d 3e 69 48 69 64 64 65 6e 5d  i-pTab->iHidden]
13e50 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  ,-1,SQLITE_TRANS
13e60 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74  IENT);.  }.  ret
13e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13e80 0a 0a 2f 2a 20 0a 2a 2a 20 50 72 61 67 6d 61 20  ../* .** Pragma 
13e90 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
13ea0 64 75 6c 65 20 78 52 6f 77 69 64 20 6d 65 74 68  dule xRowid meth
13eb0 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
13ec0 74 20 70 72 61 67 6d 61 56 74 61 62 52 6f 77 69  t pragmaVtabRowi
13ed0 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  d(sqlite3_vtab_c
13ee0 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
13ef0 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  or, sqlite_int64
13f00 20 2a 70 29 7b 0a 20 20 50 72 61 67 6d 61 56 74   *p){.  PragmaVt
13f10 61 62 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  abCursor *pCsr =
13f20 20 28 50 72 61 67 6d 61 56 74 61 62 43 75 72 73   (PragmaVtabCurs
13f30 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  or*)pVtabCursor;
13f40 0a 20 20 2a 70 20 3d 20 70 43 73 72 2d 3e 69 52  .  *p = pCsr->iR
13f50 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  owid;.  return S
13f60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
13f70 54 68 65 20 70 72 61 67 6d 61 20 76 69 72 74 75  The pragma virtu
13f80 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  al table object 
13f90 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
13fa0 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 70  sqlite3_module p
13fb0 72 61 67 6d 61 56 74 61 62 4d 6f 64 75 6c 65 20  ragmaVtabModule 
13fc0 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20  = {.  0,        
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fe0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
13ff0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 63 72   /* xCreate - cr
14020 65 61 74 65 20 61 20 74 61 62 6c 65 20 2a 2f 0a  eate a table */.
14030 20 20 70 72 61 67 6d 61 56 74 61 62 43 6f 6e 6e    pragmaVtabConn
14040 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ect,           /
14050 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20 63 6f 6e  * xConnect - con
14060 6e 65 63 74 20 74 6f 20 61 6e 20 65 78 69 73 74  nect to an exist
14070 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  ing table */.  p
14080 72 61 67 6d 61 56 74 61 62 42 65 73 74 49 6e 64  ragmaVtabBestInd
14090 65 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ex,         /* x
140a0 42 65 73 74 49 6e 64 65 78 20 2d 20 44 65 74 65  BestIndex - Dete
140b0 72 6d 69 6e 65 20 73 65 61 72 63 68 20 73 74 72  rmine search str
140c0 61 74 65 67 79 20 2a 2f 0a 20 20 70 72 61 67 6d  ategy */.  pragm
140d0 61 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 2c  aVtabDisconnect,
140e0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63          /* xDisc
140f0 6f 6e 6e 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e  onnect - Disconn
14100 65 63 74 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  ect from a table
14110 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14130 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d     /* xDestroy -
14140 20 44 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f   Drop a table */
14150 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4f 70 65  .  pragmaVtabOpe
14160 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
14170 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20  /* xOpen - open 
14180 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72  a cursor */.  pr
14190 61 67 6d 61 56 74 61 62 43 6c 6f 73 65 2c 20 20  agmaVtabClose,  
141a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
141b0 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63  lose - close a c
141c0 75 72 73 6f 72 20 2a 2f 0a 20 20 70 72 61 67 6d  ursor */.  pragm
141d0 61 56 74 61 62 46 69 6c 74 65 72 2c 20 20 20 20  aVtabFilter,    
141e0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74          /* xFilt
141f0 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73  er - configure s
14200 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  can constraints 
14210 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62 4e  */.  pragmaVtabN
14220 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
14230 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76    /* xNext - adv
14240 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  ance a cursor */
14250 0a 20 20 70 72 61 67 6d 61 56 74 61 62 45 6f 66  .  pragmaVtabEof
14260 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14270 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 70 72 61  /* xEof */.  pra
14280 67 6d 61 56 74 61 62 43 6f 6c 75 6d 6e 2c 20 20  gmaVtabColumn,  
14290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
142a0 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61  lumn - read data
142b0 20 2a 2f 0a 20 20 70 72 61 67 6d 61 56 74 61 62   */.  pragmaVtab
142c0 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
142d0 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72     /* xRowid - r
142e0 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c  ead data */.  0,
142f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
14310 70 64 61 74 65 20 2d 20 77 72 69 74 65 20 64 61  pdate - write da
14320 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ta */.  0,      
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14340 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2d       /* xBegin -
14350 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
14360 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  on */.  0,      
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20       /* xSync - 
14390 73 79 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e  sync transaction
143a0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
143b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143c0 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d 20     /* xCommit - 
143d0 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74 69  commit transacti
143e0 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  on */.  0,      
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14400 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63       /* xRollbac
14410 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61  k - rollback tra
14420 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 30 2c  nsaction */.  0,
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
14450 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2d 20 66 75  indFunction - fu
14460 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
14470 6e 67 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ng */.  0,      
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20       /* xRename 
144a0 2d 20 72 65 6e 61 6d 65 20 74 68 65 20 74 61 62  - rename the tab
144b0 6c 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  le */.  0,      
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144d0 20 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69       /* xSavepoi
144e0 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  nt */.  0,      
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65       /* xRelease
14510 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54     /* xRollbackT
14540 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  o */.};../*.** C
14550 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a  heck to see if z
14560 54 61 62 4e 61 6d 65 20 69 73 20 72 65 61 6c 6c  TabName is reall
14570 79 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  y the name of a 
14580 70 72 61 67 6d 61 2e 20 20 49 66 20 69 74 20 69  pragma.  If it i
14590 73 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 67 69 73  s,.** then regis
145a0 74 65 72 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73  ter an eponymous
145b0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 66   virtual table f
145c0 6f 72 20 74 68 61 74 20 70 72 61 67 6d 61 20 61  or that pragma a
145d0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70  nd return.** a p
145e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 6f  ointer to the Mo
145f0 64 75 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  dule object for 
14600 74 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20  the new virtual 
14610 74 61 62 6c 65 2e 0a 2a 2f 0a 4d 6f 64 75 6c 65  table..*/.Module
14620 20 2a 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56   *sqlite3PragmaV
14630 74 61 62 52 65 67 69 73 74 65 72 28 73 71 6c 69  tabRegister(sqli
14640 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
14650 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63  har *zName){.  c
14660 6f 6e 73 74 20 50 72 61 67 6d 61 4e 61 6d 65 20  onst PragmaName 
14670 2a 70 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  *pName;.  assert
14680 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
14690 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d  mp(zName, "pragm
146a0 61 5f 22 2c 20 37 29 3d 3d 30 20 29 3b 0a 20 20  a_", 7)==0 );.  
146b0 70 4e 61 6d 65 20 3d 20 70 72 61 67 6d 61 4c 6f  pName = pragmaLo
146c0 63 61 74 65 28 7a 4e 61 6d 65 2b 37 29 3b 0a 20  cate(zName+7);. 
146d0 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 20   if( pName==0 ) 
146e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
146f0 28 70 4e 61 6d 65 2d 3e 6d 50 72 61 67 46 6c 67  (pName->mPragFlg
14700 20 26 20 28 50 72 61 67 46 6c 67 5f 52 65 73 75   & (PragFlg_Resu
14710 6c 74 30 7c 50 72 61 67 46 6c 67 5f 52 65 73 75  lt0|PragFlg_Resu
14720 6c 74 31 29 29 3d 3d 30 20 29 20 72 65 74 75 72  lt1))==0 ) retur
14730 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  n 0;.  assert( s
14740 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
14750 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61  db->aModule, zNa
14760 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  me)==0 );.  retu
14770 72 6e 20 73 71 6c 69 74 65 33 56 74 61 62 43 72  rn sqlite3VtabCr
14780 65 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a  eateModule(db, z
14790 4e 61 6d 65 2c 20 26 70 72 61 67 6d 61 56 74 61  Name, &pragmaVta
147a0 62 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 2a 29  bModule, (void*)
147b0 70 4e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65  pName, 0);.}..#e
147c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
147d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
147e0 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
147f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d  QLITE_OMIT_PRAGM
14800 41 20 2a 2f 0a                                   A */.