/ Hex Artifact Content
Login

Artifact 8fd4c8a12e25f0d916426f160255ebe25415eba7:


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 20  or ON or NORMAL 
04c0: 61 6e 64 20 32 20 66 6f 72 20 46 55 4c 4c 2e 20  and 2 for FULL. 
04d0: 20 52 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e   Return 1 for an
04e0: 20 65 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e   empty or .** un
04f0: 72 65 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e  recognized strin
0500: 67 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65  g argument.  The
0510: 20 46 55 4c 4c 20 6f 70 74 69 6f 6e 20 69 73 20   FULL option is 
0520: 64 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20 69 66  disallowed.** if
0530: 20 74 68 65 20 6f 6d 69 74 46 75 6c 6c 20 70 61   the omitFull pa
0540: 72 61 6d 65 74 65 72 20 69 74 20 31 2e 0a 2a 2a  rameter it 1..**
0550: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
0560: 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  e values returne
0570: 64 20 61 72 65 20 6f 6e 65 20 6c 65 73 73 20 74  d are one less t
0580: 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  hat the values t
0590: 68 61 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65  hat.** should be
05a0: 20 70 61 73 73 65 64 20 69 6e 74 6f 20 73 71 6c   passed into sql
05b0: 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66 65  ite3BtreeSetSafe
05c0: 74 79 4c 65 76 65 6c 28 29 2e 20 20 54 68 65 20  tyLevel().  The 
05d0: 69 73 20 64 6f 6e 65 0a 2a 2a 20 74 6f 20 73 75  is done.** to su
05e0: 70 70 6f 72 74 20 6c 65 67 61 63 79 20 53 51 4c  pport legacy SQL
05f0: 20 63 6f 64 65 2e 20 20 54 68 65 20 73 61 66 65   code.  The safe
0600: 74 79 20 6c 65 76 65 6c 20 75 73 65 64 20 74 6f  ty level used to
0610: 20 62 65 20 62 6f 6f 6c 65 61 6e 0a 2a 2a 20 61   be boolean.** a
0620: 6e 64 20 6f 6c 64 65 72 20 73 63 72 69 70 74 73  nd older scripts
0630: 20 6d 61 79 20 68 61 76 65 20 75 73 65 64 20 6e   may have used n
0640: 75 6d 62 65 72 73 20 30 20 66 6f 72 20 4f 46 46  umbers 0 for OFF
0650: 20 61 6e 64 20 31 20 66 6f 72 20 4f 4e 2e 0a 2a   and 1 for ON..*
0660: 2f 0a 73 74 61 74 69 63 20 75 38 20 67 65 74 53  /.static u8 getS
0670: 61 66 65 74 79 4c 65 76 65 6c 28 63 6f 6e 73 74  afetyLevel(const
0680: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6f 6d   char *z, int om
0690: 69 74 46 75 6c 6c 2c 20 75 38 20 64 66 6c 74 29  itFull, u8 dflt)
06a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
06c0: 2a 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34  * 123456789 1234
06d0: 35 36 37 38 39 20 2a 2f 0a 20 20 73 74 61 74 69  56789 */.  stati
06e0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 54 65  c const char zTe
06f0: 78 74 5b 5d 20 3d 20 22 6f 6e 6f 66 66 61 6c 73  xt[] = "onoffals
0700: 65 79 65 73 74 72 75 65 66 75 6c 6c 22 3b 0a 20  eyestruefull";. 
0710: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
0720: 20 69 4f 66 66 73 65 74 5b 5d 20 3d 20 7b 30 2c   iOffset[] = {0,
0730: 20 31 2c 20 32 2c 20 34 2c 20 39 2c 20 31 32 2c   1, 2, 4, 9, 12,
0740: 20 31 36 7d 3b 0a 20 20 73 74 61 74 69 63 20 63   16};.  static c
0750: 6f 6e 73 74 20 75 38 20 69 4c 65 6e 67 74 68 5b  onst u8 iLength[
0760: 5d 20 3d 20 7b 32 2c 20 32 2c 20 33 2c 20 35 2c  ] = {2, 2, 3, 5,
0770: 20 33 2c 20 34 2c 20 34 7d 3b 0a 20 20 73 74 61   3, 4, 4};.  sta
0780: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 69 56 61  tic const u8 iVa
0790: 6c 75 65 5b 5d 20 3d 20 20 7b 31 2c 20 30 2c 20  lue[] =  {1, 0, 
07a0: 30 2c 20 30 2c 20 31 2c 20 31 2c 20 32 7d 3b 0a  0, 0, 1, 1, 2};.
07b0: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66    int i, n;.  if
07c0: 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  ( sqlite3Isdigit
07d0: 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (*z) ){.    retu
07e0: 72 6e 20 28 75 38 29 73 71 6c 69 74 65 33 41 74  rn (u8)sqlite3At
07f0: 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d  oi(z);.  }.  n =
0800: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
0810: 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  (z);.  for(i=0; 
0820: 69 3c 41 72 72 61 79 53 69 7a 65 28 69 4c 65 6e  i<ArraySize(iLen
0830: 67 74 68 29 2d 6f 6d 69 74 46 75 6c 6c 3b 20 69  gth)-omitFull; i
0840: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65  ++){.    if( iLe
0850: 6e 67 74 68 5b 69 5d 3d 3d 6e 20 26 26 20 73 71  ngth[i]==n && sq
0860: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 7a  lite3StrNICmp(&z
0870: 54 65 78 74 5b 69 4f 66 66 73 65 74 5b 69 5d 5d  Text[iOffset[i]]
0880: 2c 7a 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,z,n)==0 ){.    
0890: 20 20 72 65 74 75 72 6e 20 69 56 61 6c 75 65 5b    return iValue[
08a0: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i];.    }.  }.  
08b0: 72 65 74 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a  return dflt;.}..
08c0: 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
08d0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
08e0: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   as a boolean va
08f0: 6c 75 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  lue..*/.u8 sqlit
0900: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e  e3GetBoolean(con
0910: 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 38 20 64  st char *z, u8 d
0920: 66 6c 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  flt){.  return g
0930: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c  etSafetyLevel(z,
0940: 31 2c 64 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f  1,dflt)!=0;.}../
0950: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 47 65 74  * The sqlite3Get
0960: 42 6f 6f 6c 65 61 6e 28 29 20 66 75 6e 63 74 69  Boolean() functi
0970: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 6f 74  on is used by ot
0980: 68 65 72 20 6d 6f 64 75 6c 65 73 20 62 75 74 20  her modules but 
0990: 74 68 65 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72  the.** remainder
09a0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   of this file is
09b0: 20 73 70 65 63 69 66 69 63 20 74 6f 20 50 52 41   specific to PRA
09c0: 47 4d 41 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  GMA processing. 
09d0: 20 53 6f 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20   So omit.** the 
09e0: 72 65 73 74 20 6f 66 20 74 68 65 20 66 69 6c 65  rest of the file
09f0: 20 69 66 20 50 52 41 47 4d 41 73 20 61 72 65 20   if PRAGMAs are 
0a00: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
0a10: 20 62 75 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21   build..*/.#if !
0a20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
0a30: 4d 49 54 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a  MIT_PRAGMA)../*.
0a40: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
0a50: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
0a60: 20 61 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20   a locking mode 
0a70: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
0a80: 20 69 6e 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d   int getLockingM
0a90: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
0aa0: 7a 29 7b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20  z){.  if( z ){. 
0ab0: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
0ac0: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 65 78 63  3StrICmp(z, "exc
0ad0: 6c 75 73 69 76 65 22 29 20 29 20 72 65 74 75 72  lusive") ) retur
0ae0: 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  n PAGER_LOCKINGM
0af0: 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  ODE_EXCLUSIVE;. 
0b00: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
0b10: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72  3StrICmp(z, "nor
0b20: 6d 61 6c 22 29 20 29 20 72 65 74 75 72 6e 20 50  mal") ) return P
0b30: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0b40: 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72  _NORMAL;.  }.  r
0b50: 65 74 75 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b  eturn PAGER_LOCK
0b60: 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d  INGMODE_QUERY;.}
0b70: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0b80: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
0b90: 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  ./*.** Interpret
0ba0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
0bb0: 67 20 61 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  g as an auto-vac
0bc0: 75 75 6d 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a  uum mode value..
0bd0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
0be0: 69 6e 67 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f  ing strings, "no
0bf0: 6e 65 22 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20  ne", "full" and 
0c00: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 20 61 72  "incremental" ar
0c10: 65 20 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  e .** acceptable
0c20: 2c 20 61 73 20 61 72 65 20 74 68 65 69 72 20 6e  , as are their n
0c30: 75 6d 65 72 69 63 20 65 71 75 69 76 61 6c 65 6e  umeric equivalen
0c40: 74 73 3a 20 30 2c 20 31 20 61 6e 64 20 32 20 72  ts: 0, 1 and 2 r
0c50: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a  espectively..*/.
0c60: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 75  static int getAu
0c70: 74 6f 56 61 63 75 75 6d 28 63 6f 6e 73 74 20 63  toVacuum(const c
0c80: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
0c90: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0ca0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f  e3StrICmp(z, "no
0cb0: 6e 65 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ne") ) return BT
0cc0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
0cd0: 4f 4e 45 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ONE;.  if( 0==sq
0ce0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0cf0: 22 66 75 6c 6c 22 29 20 29 20 72 65 74 75 72 6e  "full") ) return
0d00: 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
0d10: 4d 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d  M_FULL;.  if( 0=
0d20: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
0d30: 7a 2c 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22  z, "incremental"
0d40: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0d50: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
0d60: 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 41  ;.  i = sqlite3A
0d70: 74 6f 69 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  toi(z);.  return
0d80: 20 28 75 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d   (u8)((i>=0&&i<=
0d90: 32 29 3f 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69  2)?i:0);.}.#endi
0da0: 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  f /* ifndef SQLI
0db0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
0dc0: 55 4d 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  UM */..#ifndef S
0dd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
0de0: 5f 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49  _PRAGMAS./*.** I
0df0: 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69 76  nterpret the giv
0e00: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 74  en string as a t
0e10: 65 6d 70 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e  emp db location.
0e20: 20 52 65 74 75 72 6e 20 31 20 66 6f 72 20 66 69   Return 1 for fi
0e30: 6c 65 0a 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d  le.** backed tem
0e40: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
0e50: 2c 20 32 20 66 6f 72 20 74 68 65 20 52 65 64 2d  , 2 for the Red-
0e60: 42 6c 61 63 6b 20 74 72 65 65 20 69 6e 20 6d 65  Black tree in me
0e70: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  mory database.**
0e80: 20 61 6e 64 20 30 20 74 6f 20 75 73 65 20 74 68   and 0 to use th
0e90: 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64  e compile-time d
0ea0: 65 66 61 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  efault..*/.stati
0eb0: 63 20 69 6e 74 20 67 65 74 54 65 6d 70 53 74 6f  c int getTempSto
0ec0: 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  re(const char *z
0ed0: 29 7b 0a 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27  ){.  if( z[0]>='
0ee0: 30 27 20 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20  0' && z[0]<='2' 
0ef0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 5b  ){.    return z[
0f00: 30 5d 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73  0] - '0';.  }els
0f10: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
0f20: 49 43 6d 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d  ICmp(z, "file")=
0f30: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
0f40: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
0f50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
0f60: 2c 20 22 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29  , "memory")==0 )
0f70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  {.    return 2;.
0f80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
0f90: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  urn 0;.  }.}.#en
0fa0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41  dif /* SQLITE_PA
0fb0: 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  GER_PRAGMAS */..
0fc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0fd0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
0fe0: 53 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  S./*.** Invalida
0ff0: 74 65 20 74 65 6d 70 20 73 74 6f 72 61 67 65 2c  te temp storage,
1000: 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65   either when the
1010: 20 74 65 6d 70 20 73 74 6f 72 61 67 65 20 69 73   temp storage is
1020: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d   changed.** from
1030: 20 64 65 66 61 75 6c 74 2c 20 6f 72 20 77 68 65   default, or whe
1040: 6e 20 27 66 69 6c 65 27 20 61 6e 64 20 74 68 65  n 'file' and the
1050: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
1060: 63 74 6f 72 79 20 68 61 73 20 63 68 61 6e 67 65  ctory has change
1070: 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d.*/.static int 
1080: 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53 74  invalidateTempSt
1090: 6f 72 61 67 65 28 50 61 72 73 65 20 2a 70 50 61  orage(Parse *pPa
10a0: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
10b0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10c0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
10d0: 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20  1].pBt!=0 ){.   
10e0: 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f   if( !db->autoCo
10f0: 6d 6d 69 74 20 7c 7c 20 73 71 6c 69 74 65 33 42  mmit || sqlite3B
1100: 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e  treeIsInReadTran
1110: 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  s(db->aDb[1].pBt
1120: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1130: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1140: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 73 74  e, "temporary st
1150: 6f 72 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20  orage cannot be 
1160: 63 68 61 6e 67 65 64 20 22 0a 20 20 20 20 20 20  changed ".      
1170: 20 20 22 66 72 6f 6d 20 77 69 74 68 69 6e 20 61    "from within a
1180: 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a   transaction");.
1190: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11a0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
11b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
11c0: 65 43 6c 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31  eClose(db->aDb[1
11d0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e  ].pBt);.    db->
11e0: 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a  aDb[1].pBt = 0;.
11f0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
1200: 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
1210: 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a  ection(db);.  }.
1220: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1230: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
1240: 53 51 4c 49 54 45 5f 50 41 47 45 52 5f 50 52 41  SQLITE_PAGER_PRA
1250: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
1260: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1270: 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a  ER_PRAGMAS./*.**
1280: 20 49 66 20 74 68 65 20 54 45 4d 50 20 64 61 74   If the TEMP dat
1290: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2c 20 63  abase is open, c
12a0: 6c 6f 73 65 20 69 74 20 61 6e 64 20 6d 61 72 6b  lose it and mark
12b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
12c0: 68 65 6d 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69  hema.** as needi
12d0: 6e 67 20 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54  ng reloading.  T
12e0: 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
12f0: 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20   when using the 
1300: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
1310: 45 0a 2a 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f  E.** or DEFAULT_
1320: 54 45 4d 50 5f 53 54 4f 52 45 20 70 72 61 67 6d  TEMP_STORE pragm
1330: 61 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  as..*/.static in
1340: 74 20 63 68 61 6e 67 65 54 65 6d 70 53 74 6f 72  t changeTempStor
1350: 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
1360: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1370: 53 74 6f 72 61 67 65 54 79 70 65 29 7b 0a 20 20  StorageType){.  
1380: 69 6e 74 20 74 73 20 3d 20 67 65 74 54 65 6d 70  int ts = getTemp
1390: 53 74 6f 72 65 28 7a 53 74 6f 72 61 67 65 54 79  Store(zStorageTy
13a0: 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pe);.  sqlite3 *
13b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
13c0: 0a 20 20 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f  .  if( db->temp_
13d0: 73 74 6f 72 65 3d 3d 74 73 20 29 20 72 65 74 75  store==ts ) retu
13e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13f0: 69 66 28 20 69 6e 76 61 6c 69 64 61 74 65 54 65  if( invalidateTe
1400: 6d 70 53 74 6f 72 61 67 65 28 20 70 50 61 72 73  mpStorage( pPars
1410: 65 20 29 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  e ) != SQLITE_OK
1420: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1430: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1440: 0a 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  .  db->temp_stor
1450: 65 20 3d 20 28 75 38 29 74 73 3b 0a 20 20 72 65  e = (u8)ts;.  re
1460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1470: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1480: 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  TE_PAGER_PRAGMAS
1490: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74   */../*.** Set t
14a0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
14b0: 66 69 72 73 74 20 4e 20 63 6f 6c 75 6d 6e 73 20  first N columns 
14c0: 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  to the values in
14d0: 20 61 7a 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74   azCol[].*/.stat
14e0: 69 63 20 76 6f 69 64 20 73 65 74 41 6c 6c 43 6f  ic void setAllCo
14f0: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 56 64 62  lumnNames(.  Vdb
1500: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
1510: 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79      /* The query
1520: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1530: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  ion */.  int N, 
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
1560: 75 6d 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  umns */.  const 
1570: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 20 20 20  char **azCol    
1580: 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 63 6f 6c   /* Names of col
1590: 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  umns */.){.  int
15a0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   i;.  sqlite3Vdb
15b0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 4e  eSetNumCols(v, N
15c0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
15d0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  N; i++){.    sql
15e0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
15f0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
1600: 5f 4e 41 4d 45 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  _NAME, azCol[i],
1610: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1620: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1630: 69 64 20 73 65 74 4f 6e 65 43 6f 6c 75 6d 6e 4e  id setOneColumnN
1640: 61 6d 65 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  ame(Vdbe *v, con
1650: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 73  st char *z){.  s
1660: 65 74 41 6c 6c 43 6f 6c 75 6d 6e 4e 61 6d 65 73  etAllColumnNames
1670: 28 76 2c 20 31 2c 20 26 7a 29 3b 0a 7d 0a 0a 2f  (v, 1, &z);.}../
1680: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1690: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73  de to return a s
16a0: 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 76 61  ingle integer va
16b0: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lue..*/.static v
16c0: 6f 69 64 20 72 65 74 75 72 6e 53 69 6e 67 6c 65  oid returnSingle
16d0: 49 6e 74 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  Int(Vdbe *v, con
16e0: 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c  st char *zLabel,
16f0: 20 69 36 34 20 76 61 6c 75 65 29 7b 0a 20 20 73   i64 value){.  s
1700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1710: 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34  Dup8(v, OP_Int64
1720: 2c 20 30 2c 20 31 2c 20 30 2c 20 28 63 6f 6e 73  , 0, 1, 0, (cons
1730: 74 20 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34  t u8*)&value, P4
1740: 5f 49 4e 54 36 34 29 3b 0a 20 20 73 65 74 4f 6e  _INT64);.  setOn
1750: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 28 76 2c 20 7a  eColumnName(v, z
1760: 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
1770: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1780: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
1790: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  1);.}../*.** Gen
17a0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
17b0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 74 65  turn a single te
17c0: 78 74 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  xt value..*/.sta
17d0: 74 69 63 20 76 6f 69 64 20 72 65 74 75 72 6e 53  tic void returnS
17e0: 69 6e 67 6c 65 54 65 78 74 28 0a 20 20 56 64 62  ingleText(.  Vdb
17f0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
1800: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
1810: 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
1820: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1830: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1840: 4c 61 62 65 6c 2c 20 20 20 20 20 2f 2a 20 4e 61  Label,     /* Na
1850: 6d 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  me of the result
1860: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
1870: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 20  st char *zValue 
1880: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1890: 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a   be returned */.
18a0: 29 7b 0a 20 20 69 66 28 20 7a 56 61 6c 75 65 20  ){.  if( zValue 
18b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
18c0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
18d0: 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  1, (const char*)
18e0: 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 73 65 74  zValue);.    set
18f0: 4f 6e 65 43 6f 6c 75 6d 6e 4e 61 6d 65 28 76 2c  OneColumnName(v,
1900: 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 73 71   zLabel);.    sq
1910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1920: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
1930: 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a   1, 1);.  }.}...
1940: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 61  /*.** Set the sa
1950: 66 65 74 79 5f 6c 65 76 65 6c 20 61 6e 64 20 70  fety_level and p
1960: 61 67 65 72 20 66 6c 61 67 73 20 66 6f 72 20 70  ager flags for p
1970: 61 67 65 72 20 69 44 62 2e 20 20 4f 72 20 69 66  ager iDb.  Or if
1980: 20 69 44 62 3c 30 0a 2a 2a 20 73 65 74 20 74 68   iDb<0.** set th
1990: 65 73 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ese values for a
19a0: 6c 6c 20 70 61 67 65 72 73 2e 0a 2a 2f 0a 23 69  ll pagers..*/.#i
19b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19c0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
19d0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 41  static void setA
19e0: 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 73 71 6c  llPagerFlags(sql
19f0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
1a00: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
1a10: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
1a20: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 20 20 69 6e   db->aDb;.    in
1a30: 74 20 6e 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  t n = db->nDb;. 
1a40: 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
1a50: 45 5f 46 75 6c 6c 46 53 79 6e 63 3d 3d 50 41 47  E_FullFSync==PAG
1a60: 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 3b 0a  ER_FULLFSYNC );.
1a70: 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
1a80: 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63  TE_CkptFullFSync
1a90: 3d 3d 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c  ==PAGER_CKPT_FUL
1aa0: 4c 46 53 59 4e 43 20 29 3b 0a 20 20 20 20 61 73  LFSYNC );.    as
1ab0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 61 63  sert( SQLITE_Cac
1ac0: 68 65 53 70 69 6c 6c 3d 3d 50 41 47 45 52 5f 43  heSpill==PAGER_C
1ad0: 41 43 48 45 53 50 49 4c 4c 20 29 3b 0a 20 20 20  ACHESPILL );.   
1ae0: 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
1af0: 46 55 4c 4c 46 53 59 4e 43 20 7c 20 50 41 47 45  FULLFSYNC | PAGE
1b00: 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43  R_CKPT_FULLFSYNC
1b10: 20 7c 20 50 41 47 45 52 5f 43 41 43 48 45 53 50   | PAGER_CACHESP
1b20: 49 4c 4c 29 0a 20 20 20 20 20 20 20 20 20 20 20  ILL).           
1b30: 20 20 3d 3d 20 20 50 41 47 45 52 5f 46 4c 41 47    ==  PAGER_FLAG
1b40: 53 5f 4d 41 53 4b 20 29 3b 0a 20 20 20 20 61 73  S_MASK );.    as
1b50: 73 65 72 74 28 20 28 70 44 62 2d 3e 73 61 66 65  sert( (pDb->safe
1b60: 74 79 5f 6c 65 76 65 6c 20 26 20 50 41 47 45 52  ty_level & PAGER
1b70: 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
1b80: 4b 29 3d 3d 70 44 62 2d 3e 73 61 66 65 74 79 5f  K)==pDb->safety_
1b90: 6c 65 76 65 6c 20 29 3b 0a 20 20 20 20 77 68 69  level );.    whi
1ba0: 6c 65 28 20 28 6e 2d 2d 29 20 3e 20 30 20 29 7b  le( (n--) > 0 ){
1bb0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
1bc0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
1bd0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
1be0: 67 65 72 46 6c 61 67 73 28 70 44 62 2d 3e 70 42  gerFlags(pDb->pB
1bf0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1c00: 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
1c10: 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61  level | (db->fla
1c20: 67 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53  gs & PAGER_FLAGS
1c30: 5f 4d 41 53 4b 29 20 29 3b 0a 20 20 20 20 20 20  _MASK) );.      
1c40: 7d 0a 20 20 20 20 20 20 70 44 62 2b 2b 3b 0a 20  }.      pDb++;. 
1c50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
1c60: 0a 23 20 64 65 66 69 6e 65 20 73 65 74 41 6c 6c  .# define setAll
1c70: 50 61 67 65 72 46 6c 61 67 73 28 58 29 20 20 2f  PagerFlags(X)  /
1c80: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69  * no-op */.#endi
1c90: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  f.../*.** Return
1ca0: 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
1cb0: 65 20 6e 61 6d 65 20 66 6f 72 20 61 20 63 6f 6e  e name for a con
1cc0: 73 74 72 61 69 6e 74 20 72 65 73 6f 6c 75 74 69  straint resoluti
1cd0: 6f 6e 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  on action..*/.#i
1ce0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1cf0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 73 74  T_FOREIGN_KEY.st
1d00: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1d10: 2a 61 63 74 69 6f 6e 4e 61 6d 65 28 75 38 20 61  *actionName(u8 a
1d20: 63 74 69 6f 6e 29 7b 0a 20 20 63 6f 6e 73 74 20  ction){.  const 
1d30: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
1d40: 77 69 74 63 68 28 20 61 63 74 69 6f 6e 20 29 7b  witch( action ){
1d50: 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 53 65 74  .    case OE_Set
1d60: 4e 75 6c 6c 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  Null:  zName = "
1d70: 53 45 54 20 4e 55 4c 4c 22 3b 20 20 20 20 20 20  SET NULL";      
1d80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d90: 65 20 4f 45 5f 53 65 74 44 66 6c 74 3a 20 20 7a  e OE_SetDflt:  z
1da0: 4e 61 6d 65 20 3d 20 22 53 45 54 20 44 45 46 41  Name = "SET DEFA
1db0: 55 4c 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ULT";     break;
1dc0: 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 43 61 73  .    case OE_Cas
1dd0: 63 61 64 65 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  cade:  zName = "
1de0: 43 41 53 43 41 44 45 22 3b 20 20 20 20 20 20 20  CASCADE";       
1df0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1e00: 65 20 4f 45 5f 52 65 73 74 72 69 63 74 3a 20 7a  e OE_Restrict: z
1e10: 4e 61 6d 65 20 3d 20 22 52 45 53 54 52 49 43 54  Name = "RESTRICT
1e20: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
1e30: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
1e40: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
1e50: 4e 4f 20 41 43 54 49 4f 4e 22 3b 20 20 0a 20 20  NO ACTION";  .  
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 61 73 73 65 72 74 28 20 61 63 74 69      assert( acti
1e80: 6f 6e 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 20 62  on==OE_None ); b
1e90: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1ea0: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
1eb0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  if.../*.** Param
1ec0: 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
1ed0: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 50 41  be one of the PA
1ee0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1ef0: 58 58 58 20 63 6f 6e 73 74 61 6e 74 73 0a 2a 2a  XXX constants.**
1f00: 20 64 65 66 69 6e 65 64 20 69 6e 20 70 61 67 65   defined in page
1f10: 72 2e 68 2e 20 54 68 69 73 20 66 75 6e 63 74 69  r.h. This functi
1f20: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 61  on returns the a
1f30: 73 73 6f 63 69 61 74 65 64 20 6c 6f 77 65 72 63  ssociated lowerc
1f40: 61 73 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d  ase.** journal-m
1f50: 6f 64 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e  ode name..*/.con
1f60: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1f70: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28  JournalModename(
1f80: 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 73 74  int eMode){.  st
1f90: 61 74 69 63 20 63 68 61 72 20 2a 20 63 6f 6e 73  atic char * cons
1fa0: 74 20 61 7a 4d 6f 64 65 4e 61 6d 65 5b 5d 20 3d  t azModeName[] =
1fb0: 20 7b 0a 20 20 20 20 22 64 65 6c 65 74 65 22 2c   {.    "delete",
1fc0: 20 22 70 65 72 73 69 73 74 22 2c 20 22 6f 66 66   "persist", "off
1fd0: 22 2c 20 22 74 72 75 6e 63 61 74 65 22 2c 20 22  ", "truncate", "
1fe0: 6d 65 6d 6f 72 79 22 0a 23 69 66 6e 64 65 66 20  memory".#ifndef 
1ff0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2000: 20 20 20 20 20 2c 20 22 77 61 6c 22 0a 23 65 6e       , "wal".#en
2010: 64 69 66 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72  dif.  };.  asser
2020: 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
2030: 4d 4f 44 45 5f 44 45 4c 45 54 45 3d 3d 30 20 29  MODE_DELETE==0 )
2040: 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2050: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
2060: 52 53 49 53 54 3d 3d 31 20 29 3b 0a 20 20 61 73  RSIST==1 );.  as
2070: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
2080: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3d 3d 32 20 29  NALMODE_OFF==2 )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
20a0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
20b0: 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 61  UNCATE==3 );.  a
20c0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
20d0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3d  RNALMODE_MEMORY=
20e0: 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
20f0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2100: 45 5f 57 41 4c 3d 3d 35 20 29 3b 0a 20 20 61 73  E_WAL==5 );.  as
2110: 73 65 72 74 28 20 65 4d 6f 64 65 3e 3d 30 20 26  sert( eMode>=0 &
2120: 26 20 65 4d 6f 64 65 3c 3d 41 72 72 61 79 53 69  & eMode<=ArraySi
2130: 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29 20 29  ze(azModeName) )
2140: 3b 0a 0a 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  ;..  if( eMode==
2150: 41 72 72 61 79 53 69 7a 65 28 61 7a 4d 6f 64 65  ArraySize(azMode
2160: 4e 61 6d 65 29 20 29 20 72 65 74 75 72 6e 20 30  Name) ) return 0
2170: 3b 0a 20 20 72 65 74 75 72 6e 20 61 7a 4d 6f 64  ;.  return azMod
2180: 65 4e 61 6d 65 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a  eName[eMode];.}.
2190: 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61  ./*.** Process a
21a0: 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e   pragma statemen
21b0: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d  t.  .**.** Pragm
21c0: 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20 66  as are of this f
21d0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
21e0: 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
21f0: 2e 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a  .]id [= value].*
2200: 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66  *.** The identif
2210: 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  ier might also b
2220: 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65  e a string.  The
2230: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
2240: 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74  ng, and.** ident
2250: 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62  ifier, or a numb
2260: 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61  er.  If minusFla
2270: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
2280: 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  the value is.** 
2290: 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61  a number that wa
22a0: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
22b0: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
22c0: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69  * If the left si
22d0: 64 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e  de is "database.
22e0: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
22f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
2300: 6d 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69  me.** and pId2 i
2310: 73 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68  s the id.  If th
2320: 65 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a  e left side is j
2330: 75 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49  ust "id" then pI
2340: 64 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20  d1 is the.** id 
2350: 61 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20  and pId2 is any 
2360: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f  empty string..*/
2370: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61  .void sqlite3Pra
2380: 67 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gma(.  Parse *pP
2390: 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  arse, .  Token *
23a0: 70 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20  pId1,        /* 
23b0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 64  First part of [d
23c0: 61 74 61 62 61 73 65 2e 5d 69 64 20 66 69 65 6c  atabase.]id fiel
23d0: 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49  d */.  Token *pI
23e0: 64 32 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 65  d2,        /* Se
23f0: 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 5b 64 61  cond part of [da
2400: 74 61 62 61 73 65 2e 5d 69 64 20 66 69 65 6c 64  tabase.]id field
2410: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
2420: 6f 6b 65 6e 20 2a 70 56 61 6c 75 65 2c 20 20 20  oken *pValue,   
2430: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 66 6f 72 20     /* Token for 
2440: 3c 76 61 6c 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c  <value>, or NULL
2450: 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 75 73 46   */.  int minusF
2460: 6c 61 67 20 20 20 20 20 20 20 2f 2a 20 54 72 75  lag       /* Tru
2470: 65 20 69 66 20 61 20 27 2d 27 20 73 69 67 6e 20  e if a '-' sign 
2480: 70 72 65 63 65 64 65 64 20 3c 76 61 6c 75 65 3e  preceded <value>
2490: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
24a0: 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Left = 0;       
24b0: 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
24c0: 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 3c  d UTF-8 string <
24d0: 69 64 3e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  id> */.  char *z
24e0: 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20  Right = 0;      
24f0: 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
2500: 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 3c  d UTF-8 string <
2510: 76 61 6c 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20  value>, or NULL 
2520: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2530: 2a 7a 44 62 20 3d 20 30 3b 20 20 20 2f 2a 20 54  *zDb = 0;   /* T
2540: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
2550: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64   */.  Token *pId
2560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2570: 50 6f 69 6e 74 65 72 20 74 6f 20 3c 69 64 3e 20  Pointer to <id> 
2580: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20  token */.  char 
2590: 2a 61 46 63 6e 74 6c 5b 34 5d 3b 20 20 20 20 20  *aFcntl[4];     
25a0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
25b0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
25c0: 41 47 4d 41 20 2a 2f 0a 20 20 69 6e 74 20 69 44  AGMA */.  int iD
25d0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
25e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 64   /* Database ind
25f0: 65 78 20 66 6f 72 20 3c 64 61 74 61 62 61 73 65  ex for <database
2600: 3e 20 2a 2f 0a 20 20 69 6e 74 20 6c 77 72 2c 20  > */.  int lwr, 
2610: 75 70 72 2c 20 6d 69 64 20 3d 20 30 3b 20 20 20  upr, mid = 0;   
2620: 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 73 65      /* Binary se
2630: 61 72 63 68 20 62 6f 75 6e 64 73 20 2a 2f 0a 20  arch bounds */. 
2640: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2660: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f   return value fo
2670: 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  rm SQLITE_FCNTL_
2680: 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69  PRAGMA */.  sqli
2690: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
26a0: 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68 65 20  ->db;    /* The 
26b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
26c0: 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62  ion */.  Db *pDb
26d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
26f0: 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20 62  cific database b
2700: 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20 2a 2f  eing pragmaed */
2710: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
2720: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
2730: 73 65 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65  se);  /* Prepare
2740: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
2750: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 50   const struct sP
2760: 72 61 67 6d 61 4e 61 6d 65 73 20 2a 70 50 72 61  ragmaNames *pPra
2770: 67 6d 61 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30  gma;..  if( v==0
2780: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2790: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
27a0: 6e 63 65 28 76 29 3b 0a 20 20 70 50 61 72 73 65  nce(v);.  pParse
27b0: 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 0a 20 20 2f  ->nMem = 2;..  /
27c0: 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20  * Interpret the 
27d0: 5b 64 61 74 61 62 61 73 65 2e 5d 20 70 61 72 74  [database.] part
27e0: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 73   of the pragma s
27f0: 74 61 74 65 6d 65 6e 74 2e 20 69 44 62 20 69 73  tatement. iDb is
2800: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
2810: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2820: 74 68 69 73 20 70 72 61 67 6d 61 20 69 73 20 62  this pragma is b
2830: 65 69 6e 67 20 61 70 70 6c 69 65 64 20 74 6f 20  eing applied to 
2840: 69 6e 20 64 62 2e 61 44 62 5b 5d 2e 20 2a 2f 0a  in db.aDb[]. */.
2850: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
2860: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
2870: 65 2c 20 70 49 64 31 2c 20 70 49 64 32 2c 20 26  e, pId1, pId2, &
2880: 70 49 64 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  pId);.  if( iDb<
2890: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 44  0 ) return;.  pD
28a0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
28b0: 5d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ];..  /* If the 
28c0: 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 68 61  temp database ha
28d0: 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c  s been explicitl
28e0: 79 20 6e 61 6d 65 64 20 61 73 20 70 61 72 74 20  y named as part 
28f0: 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 72 61  of the .  ** pra
2900: 67 6d 61 2c 20 6d 61 6b 65 20 73 75 72 65 20 69  gma, make sure i
2910: 74 20 69 73 20 6f 70 65 6e 2e 20 0a 20 20 2a 2f  t is open. .  */
2920: 0a 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26  .  if( iDb==1 &&
2930: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
2940: 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29  Database(pParse)
2950: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
2960: 20 20 7d 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73    }..  zLeft = s
2970: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
2980: 6b 65 6e 28 64 62 2c 20 70 49 64 29 3b 0a 20 20  ken(db, pId);.  
2990: 69 66 28 20 21 7a 4c 65 66 74 20 29 20 72 65 74  if( !zLeft ) ret
29a0: 75 72 6e 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73  urn;.  if( minus
29b0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69 67  Flag ){.    zRig
29c0: 68 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ht = sqlite3MPri
29d0: 6e 74 66 28 64 62 2c 20 22 2d 25 54 22 2c 20 70  ntf(db, "-%T", p
29e0: 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Value);.  }else{
29f0: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71  .    zRight = sq
2a00: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
2a10: 65 6e 28 64 62 2c 20 70 56 61 6c 75 65 29 3b 0a  en(db, pValue);.
2a20: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
2a30: 49 64 32 20 29 3b 0a 20 20 7a 44 62 20 3d 20 70  Id2 );.  zDb = p
2a40: 49 64 32 2d 3e 6e 3e 30 20 3f 20 70 44 62 2d 3e  Id2->n>0 ? pDb->
2a50: 7a 4e 61 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28  zName : 0;.  if(
2a60: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
2a70: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
2a80: 5f 50 52 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20  _PRAGMA, zLeft, 
2a90: 7a 52 69 67 68 74 2c 20 7a 44 62 29 20 29 7b 0a  zRight, zDb) ){.
2aa0: 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f      goto pragma_
2ab0: 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  out;.  }..  /* S
2ac0: 65 6e 64 20 61 6e 20 53 51 4c 49 54 45 5f 46 43  end an SQLITE_FC
2ad0: 4e 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 2d  NTL_PRAGMA file-
2ae0: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75  control to the u
2af0: 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 0a 20 20  nderlying VFS.  
2b00: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  ** connection.  
2b10: 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  If it returns SQ
2b20: 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20 61 73  LITE_OK, then as
2b30: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 56 46  sume that the VF
2b40: 53 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 64 20 74  S.  ** handled t
2b50: 68 65 20 70 72 61 67 6d 61 20 61 6e 64 20 67 65  he pragma and ge
2b60: 6e 65 72 61 74 65 20 61 20 6e 6f 2d 6f 70 20 70  nerate a no-op p
2b70: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
2b80: 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50  t..  **.  ** IMP
2b90: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
2ba0: 52 2d 31 32 32 33 38 2d 35 35 31 32 30 20 57 68  R-12238-55120 Wh
2bb0: 65 6e 65 76 65 72 20 61 20 50 52 41 47 4d 41 20  enever a PRAGMA 
2bc0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
2bd0: 73 65 64 2c 0a 20 20 2a 2a 20 61 6e 20 53 51 4c  sed,.  ** an SQL
2be0: 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41  ITE_FCNTL_PRAGMA
2bf0: 20 66 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73   file control is
2c00: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 6f 70 65   sent to the ope
2c10: 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 20  n sqlite3_file. 
2c20: 20 2a 2a 20 6f 62 6a 65 63 74 20 63 6f 72 72 65   ** object corre
2c30: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
2c40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2c50: 20 77 68 69 63 68 20 74 68 65 20 70 72 61 67 6d   which the pragm
2c60: 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
2c70: 20 72 65 66 65 72 73 2e 0a 20 20 2a 2a 0a 20 20   refers..  **.  
2c80: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
2c90: 4e 2d 4f 46 3a 20 52 2d 32 39 38 37 35 2d 33 31  N-OF: R-29875-31
2ca0: 36 37 38 20 54 68 65 20 61 72 67 75 6d 65 6e 74  678 The argument
2cb0: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 46   to the SQLITE_F
2cc0: 43 4e 54 4c 5f 50 52 41 47 4d 41 0a 20 20 2a 2a  CNTL_PRAGMA.  **
2cd0: 20 66 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73   file control is
2ce0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
2cf0: 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 73  nters to strings
2d00: 20 28 63 68 61 72 2a 2a 29 20 69 6e 20 77 68 69   (char**) in whi
2d10: 63 68 20 74 68 65 0a 20 20 2a 2a 20 73 65 63 6f  ch the.  ** seco
2d20: 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  nd element of th
2d30: 65 20 61 72 72 61 79 20 69 73 20 74 68 65 20 6e  e array is the n
2d40: 61 6d 65 20 6f 66 20 74 68 65 20 70 72 61 67 6d  ame of the pragm
2d50: 61 20 61 6e 64 20 74 68 65 20 74 68 69 72 64 0a  a and the third.
2d60: 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 20 69 73 20    ** element is 
2d70: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
2d80: 74 68 65 20 70 72 61 67 6d 61 20 6f 72 20 4e 55  the pragma or NU
2d90: 4c 4c 20 69 66 20 74 68 65 20 70 72 61 67 6d 61  LL if the pragma
2da0: 20 68 61 73 20 6e 6f 0a 20 20 2a 2a 20 61 72 67   has no.  ** arg
2db0: 75 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 46  ument..  */.  aF
2dc0: 63 6e 74 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61  cntl[0] = 0;.  a
2dd0: 46 63 6e 74 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74  Fcntl[1] = zLeft
2de0: 3b 0a 20 20 61 46 63 6e 74 6c 5b 32 5d 20 3d 20  ;.  aFcntl[2] = 
2df0: 7a 52 69 67 68 74 3b 0a 20 20 61 46 63 6e 74 6c  zRight;.  aFcntl
2e00: 5b 33 5d 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62  [3] = 0;.  db->b
2e10: 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
2e20: 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
2e30: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2e40: 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
2e50: 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 2c 20  E_FCNTL_PRAGMA, 
2e60: 28 76 6f 69 64 2a 29 61 46 63 6e 74 6c 29 3b 0a  (void*)aFcntl);.
2e70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
2e90: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 22  nSingleText(v, "
2ea0: 72 65 73 75 6c 74 22 2c 20 61 46 63 6e 74 6c 5b  result", aFcntl[
2eb0: 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0]);.    sqlite3
2ec0: 5f 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29  _free(aFcntl[0])
2ed0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d  ;.    goto pragm
2ee0: 61 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  a_out;.  }.  if(
2ef0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
2f00: 4f 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20  OUND ){.    if( 
2f10: 61 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20  aFcntl[0] ){.   
2f20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2f30: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
2f40: 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20   aFcntl[0]);.   
2f50: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2f60: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
2f70: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  }.    pParse->nE
2f80: 72 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65  rr++;.    pParse
2f90: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67  ->rc = rc;.    g
2fa0: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
2fb0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
2fc0: 20 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74   the pragma in t
2fd0: 68 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20  he lookup table 
2fe0: 2a 2f 0a 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  */.  lwr = 0;.  
2ff0: 75 70 72 20 3d 20 41 72 72 61 79 53 69 7a 65 28  upr = ArraySize(
3000: 61 50 72 61 67 6d 61 4e 61 6d 65 73 29 2d 31 3b  aPragmaNames)-1;
3010: 0a 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75  .  while( lwr<=u
3020: 70 72 20 29 7b 0a 20 20 20 20 6d 69 64 20 3d 20  pr ){.    mid = 
3030: 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20  (lwr+upr)/2;.   
3040: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
3050: 72 69 63 6d 70 28 7a 4c 65 66 74 2c 20 61 50 72  ricmp(zLeft, aPr
3060: 61 67 6d 61 4e 61 6d 65 73 5b 6d 69 64 5d 2e 7a  agmaNames[mid].z
3070: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Name);.    if( r
3080: 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  c==0 ) break;.  
3090: 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
30a0: 20 20 20 20 75 70 72 20 3d 20 6d 69 64 20 2d 20      upr = mid - 
30b0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
30c0: 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 20 2b 20      lwr = mid + 
30d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
30e0: 66 28 20 6c 77 72 3e 75 70 72 20 29 20 67 6f 74  f( lwr>upr ) got
30f0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
3100: 70 50 72 61 67 6d 61 20 3d 20 26 61 50 72 61 67  pPragma = &aPrag
3110: 6d 61 4e 61 6d 65 73 5b 6d 69 64 5d 3b 0a 0a 20  maNames[mid];.. 
3120: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
3130: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
3140: 61 20 69 73 20 6c 6f 61 64 65 64 20 69 66 20 74  a is loaded if t
3150: 68 65 20 70 72 61 67 6d 61 20 72 65 71 75 69 72  he pragma requir
3160: 65 73 20 74 68 61 74 20 2a 2f 0a 20 20 69 66 28  es that */.  if(
3170: 20 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67   (pPragma->mPrag
3180: 46 6c 61 67 20 26 20 50 72 61 67 46 6c 61 67 5f  Flag & PragFlag_
3190: 4e 65 65 64 53 63 68 65 6d 61 29 21 3d 30 20 29  NeedSchema)!=0 )
31a0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
31b0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
31c0: 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  se) ) goto pragm
31d0: 61 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  a_out;.  }..  /*
31e0: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70 70   Jump to the app
31f0: 72 6f 70 72 69 61 74 65 20 70 72 61 67 6d 61 20  ropriate pragma 
3200: 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 73 77 69  handler */.  swi
3210: 74 63 68 28 20 70 50 72 61 67 6d 61 2d 3e 65 50  tch( pPragma->eP
3220: 72 61 67 54 79 70 20 29 7b 0a 20 20 0a 23 69 66  ragTyp ){.  .#if
3230: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3240: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
3250: 4d 41 53 29 20 26 26 20 21 64 65 66 69 6e 65 64  MAS) && !defined
3260: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50  (SQLITE_OMIT_DEP
3270: 52 45 43 41 54 45 44 29 0a 20 20 2f 2a 0a 20 20  RECATED).  /*.  
3280: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
3290: 62 61 73 65 2e 5d 64 65 66 61 75 6c 74 5f 63 61  base.]default_ca
32a0: 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50  che_size.  **  P
32b0: 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
32c0: 5d 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73  ]default_cache_s
32d0: 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize=N.  **.  ** 
32e0: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
32f0: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
3300: 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20 73 65  nt persistent se
3310: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
3320: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
3330: 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72  ze.  The value r
3340: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d  eturned is the m
3350: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3360: 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  .  ** pages in t
3370: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
3380: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
3390: 73 65 74 73 20 62 6f 74 68 20 74 68 65 20 63 75  sets both the cu
33a0: 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20  rrent.  ** page 
33b0: 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65  cache size value
33c0: 20 61 6e 64 20 74 68 65 20 70 65 72 73 69 73 74   and the persist
33d0: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 73  ent page cache s
33e0: 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73  ize value.  ** s
33f0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
3400: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a  abase file..  **
3410: 0a 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65 72 73  .  ** Older vers
3420: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77  ions of SQLite w
3430: 6f 75 6c 64 20 73 65 74 20 74 68 65 20 64 65 66  ould set the def
3440: 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 20  ault cache size 
3450: 74 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61 74 69  to a.  ** negati
3460: 76 65 20 6e 75 6d 62 65 72 20 74 6f 20 69 6e 64  ve number to ind
3470: 69 63 61 74 65 20 73 79 6e 63 68 72 6f 6e 6f 75  icate synchronou
3480: 73 3d 4f 46 46 2e 20 20 54 68 65 73 65 20 64 61  s=OFF.  These da
3490: 79 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  ys, synchronous.
34a0: 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 6f    ** is always o
34b0: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 72 65 67  n by default reg
34c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
34d0: 69 67 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75  ign of the defau
34e0: 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69  lt cache.  ** si
34f0: 7a 65 2e 20 20 42 75 74 20 63 6f 6e 74 69 6e 75  ze.  But continu
3500: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 61 62  e to take the ab
3510: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
3520: 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68  the default cach
3530: 65 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 68  e.  ** size of h
3540: 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74  istorical compat
3550: 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a 20 20  ibility..  */.  
3560: 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 45 46  case PragTyp_DEF
3570: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3a  AULT_CACHE_SIZE:
3580: 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
3590: 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44  nst int iLn = VD
35a0: 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f  BE_OFFSET_LINENO
35b0: 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20  (2);.    static 
35c0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
35d0: 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20   getCacheSize[] 
35e0: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 54  = {.      { OP_T
35f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30  ransaction, 0, 0
3600: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20       /* 0 */.   
3630: 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b     { OP_ReadCook
3640: 69 65 2c 20 20 30 2c 20 31 2c 20 20 20 20 20 20  ie,  0, 1,      
3650: 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f    BTREE_DEFAULT_
3660: 43 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20 2f 2a  CACHE_SIZE},  /*
3670: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
3680: 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c  _IfPos,       1,
3690: 20 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   8,        0},. 
36a0: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
36b0: 72 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20  r,     0, 2,    
36c0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
36d0: 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 20 20 20  OP_Subtract,    
36e0: 31 2c 20 32 2c 20 20 20 20 20 20 20 20 31 7d 2c  1, 2,        1},
36f0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f  .      { OP_IfPo
3700: 73 2c 20 20 20 20 20 20 20 31 2c 20 38 2c 20 20  s,       1, 8,  
3710: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3720: 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
3730: 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20 30    0, 1,        0
3740: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  },              
3750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 20             /* 6 
3760: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 6f  */.      { OP_No
3770: 6f 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  op,        0, 0,
3780: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3790: 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77    { OP_ResultRow
37a0: 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
37b0: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
37c0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71  int addr;.    sq
37d0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
37e0: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
37f0: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20  if( !zRight ){. 
3800: 20 20 20 20 20 73 65 74 4f 6e 65 43 6f 6c 75 6d       setOneColum
3810: 6e 4e 61 6d 65 28 76 2c 20 22 63 61 63 68 65 5f  nName(v, "cache_
3820: 73 69 7a 65 22 29 3b 0a 20 20 20 20 20 20 70 50  size");.      pP
3830: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
3840: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
3850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3860: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
3870: 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67  getCacheSize), g
3880: 65 74 43 61 63 68 65 53 69 7a 65 2c 69 4c 6e 29  etCacheSize,iLn)
3890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
38a0: 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 61  dbeChangeP1(v, a
38b0: 64 64 72 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  ddr, iDb);.     
38c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
38d0: 67 65 50 31 28 76 2c 20 61 64 64 72 2b 31 2c 20  geP1(v, addr+1, 
38e0: 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
38f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
3900: 76 2c 20 61 64 64 72 2b 36 2c 20 53 51 4c 49 54  v, addr+6, SQLIT
3910: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
3920: 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65  SIZE);.    }else
3930: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
3940: 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
3950: 33 32 28 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  32(sqlite3Atoi(z
3960: 52 69 67 68 74 29 29 3b 0a 20 20 20 20 20 20 73  Right));.      s
3970: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
3980: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
3990: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , 0, iDb);.     
39a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
39b0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
39c0: 2c 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20 20 20  , size, 1);.    
39d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
39e0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
39f0: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
3a00: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
3a10: 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  ZE, 1);.      as
3a20: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3a30: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3a40: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
3a50: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
3a60: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
3a70: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
3a80: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
3a90: 65 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d  e(pDb->pBt, pDb-
3aa0: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
3ab0: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  size);.    }.   
3ac0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
3ad0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
3ae0: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
3af0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
3b00: 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a  _DEPRECATED */..
3b10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
3b20: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
3b30: 52 41 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a  RAGMAS).  /*.  *
3b40: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
3b50: 61 73 65 2e 5d 70 61 67 65 5f 73 69 7a 65 0a 20  ase.]page_size. 
3b60: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74   **  PRAGMA [dat
3b70: 61 62 61 73 65 2e 5d 70 61 67 65 5f 73 69 7a 65  abase.]page_size
3b80: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  =N.  **.  ** The
3b90: 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f   first form repo
3ba0: 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rts the current 
3bb0: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
3bc0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
3bd0: 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ge size in bytes
3be0: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  .  The second fo
3bf0: 72 6d 20 73 65 74 73 20 74 68 65 0a 20 20 2a 2a  rm sets the.  **
3c00: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73   database page s
3c10: 69 7a 65 20 76 61 6c 75 65 2e 20 20 54 68 65 20  ize value.  The 
3c20: 76 61 6c 75 65 20 63 61 6e 20 6f 6e 6c 79 20 62  value can only b
3c30: 65 20 73 65 74 20 69 66 0a 20 20 2a 2a 20 74 68  e set if.  ** th
3c40: 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  e database has n
3c50: 6f 74 20 79 65 74 20 62 65 65 6e 20 63 72 65 61  ot yet been crea
3c60: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
3c70: 20 50 72 61 67 54 79 70 5f 50 41 47 45 5f 53 49   PragTyp_PAGE_SI
3c80: 5a 45 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20  ZE: {.    Btree 
3c90: 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b  *pBt = pDb->pBt;
3ca0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
3cb0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21  !=0 );.    if( !
3cc0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
3cd0: 69 6e 74 20 73 69 7a 65 20 3d 20 41 4c 57 41 59  int size = ALWAY
3ce0: 53 28 70 42 74 29 20 3f 20 73 71 6c 69 74 65 33  S(pBt) ? sqlite3
3cf0: 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
3d00: 28 70 42 74 29 20 3a 20 30 3b 0a 20 20 20 20 20  (pBt) : 0;.     
3d10: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
3d20: 28 76 2c 20 22 70 61 67 65 5f 73 69 7a 65 22 2c  (v, "page_size",
3d30: 20 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73   size);.    }els
3d40: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c  e{.      /* Mall
3d50: 6f 63 20 6d 61 79 20 66 61 69 6c 20 77 68 65 6e  oc may fail when
3d60: 20 73 65 74 74 69 6e 67 20 74 68 65 20 70 61 67   setting the pag
3d70: 65 2d 73 69 7a 65 2c 20 61 73 20 74 68 65 72 65  e-size, as there
3d80: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a   is an internal.
3d90: 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
3da0: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d  that the pager m
3db0: 6f 64 75 6c 65 20 72 65 73 69 7a 65 73 20 75 73  odule resizes us
3dc0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  ing sqlite3_real
3dd0: 6c 6f 63 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  loc()..      */.
3de0: 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 50 61        db->nextPa
3df0: 67 65 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  gesize = sqlite3
3e00: 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20  Atoi(zRight);.  
3e10: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
3e20: 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
3e30: 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
3e40: 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
3e50: 69 7a 65 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20  ize,-1,0) ){.   
3e60: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
3e70: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
3e80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
3e90: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
3ea0: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
3eb0: 62 61 73 65 2e 5d 73 65 63 75 72 65 5f 64 65 6c  base.]secure_del
3ec0: 65 74 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ete.  **  PRAGMA
3ed0: 20 5b 64 61 74 61 62 61 73 65 2e 5d 73 65 63 75   [database.]secu
3ee0: 72 65 5f 64 65 6c 65 74 65 3d 4f 4e 2f 4f 46 46  re_delete=ON/OFF
3ef0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
3f00: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
3f10: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  s the current se
3f20: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
3f30: 2a 2a 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  ** secure_delete
3f40: 20 66 6c 61 67 2e 20 20 54 68 65 20 73 65 63 6f   flag.  The seco
3f50: 6e 64 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20  nd form changes 
3f60: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
3f70: 65 0a 20 20 2a 2a 20 66 6c 61 67 20 73 65 74 74  e.  ** flag sett
3f80: 69 6e 67 20 61 6e 64 20 72 65 70 6f 72 74 73 20  ing and reports 
3f90: 74 68 65 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20  thenew value..  
3fa0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
3fb0: 70 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a  p_SECURE_DELETE:
3fc0: 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42   {.    Btree *pB
3fd0: 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20  t = pDb->pBt;.  
3fe0: 20 20 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20    int b = -1;.  
3ff0: 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30    assert( pBt!=0
4000: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67   );.    if( zRig
4010: 68 74 20 29 7b 0a 20 20 20 20 20 20 62 20 3d 20  ht ){.      b = 
4020: 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
4030: 6e 28 7a 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  n(zRight, 0);.  
4040: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 32    }.    if( pId2
4050: 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e 3d 30 20 29  ->n==0 && b>=0 )
4060: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
4070: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
4080: 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b  ii<db->nDb; ii++
4090: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
40a0: 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
40b0: 65 74 65 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  ete(db->aDb[ii].
40c0: 70 42 74 2c 20 62 29 3b 0a 20 20 20 20 20 20 7d  pBt, b);.      }
40d0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 20 3d 20 73  .    }.    b = s
40e0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
40f0: 65 44 65 6c 65 74 65 28 70 42 74 2c 20 62 29 3b  eDelete(pBt, b);
4100: 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c  .    returnSingl
4110: 65 49 6e 74 28 76 2c 20 22 73 65 63 75 72 65 5f  eInt(v, "secure_
4120: 64 65 6c 65 74 65 22 2c 20 62 29 3b 0a 20 20 20  delete", b);.   
4130: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
4140: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
4150: 64 61 74 61 62 61 73 65 2e 5d 6d 61 78 5f 70 61  database.]max_pa
4160: 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 50  ge_count.  **  P
4170: 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
4180: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
4190: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
41a0: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
41b0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
41c0: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
41d0: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
41e0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
41f0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4200: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
4210: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
4220: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
4230: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
4240: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4250: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
4260: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
4270: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
4280: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
4290: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
42a0: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
42b0: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
42c0: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
42d0: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
42e0: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
42f0: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
4300: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
4310: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
4320: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
4330: 61 73 65 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a  ase.]page_count.
4340: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
4350: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
4360: 61 67 65 73 20 69 6e 20 74 68 65 20 73 70 65 63  ages in the spec
4370: 69 66 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a  ified database..
4380: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
4390: 54 79 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20  Typ_PAGE_COUNT: 
43a0: 7b 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a  {.    int iReg;.
43b0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
43c0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
43d0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52  se, iDb);.    iR
43e0: 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
43f0: 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Mem;.    if( sql
4400: 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66  ite3Tolower(zLef
4410: 74 5b 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20  t[0])=='p' ){.  
4420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4430: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65  ddOp2(v, OP_Page
4440: 63 6f 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67  count, iDb, iReg
4450: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
4460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4470: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50  ddOp3(v, OP_MaxP
4480: 67 63 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c  gcnt, iDb, iReg,
4490: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
44a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
44b0: 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65  3AbsInt32(sqlite
44c0: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b  3Atoi(zRight)));
44d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
44e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
44f0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52  OP_ResultRow, iR
4500: 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  eg, 1);.    sqli
4510: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
4520: 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  s(v, 1);.    sql
4530: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
4540: 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45  me(v, 0, COLNAME
4550: 5f 4e 41 4d 45 2c 20 7a 4c 65 66 74 2c 20 53 51  _NAME, zLeft, SQ
4560: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
4570: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
4580: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
4590: 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
45a0: 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a 2a 20  cking_mode.  ** 
45b0: 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
45c0: 65 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20  e.]locking_mode 
45d0: 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73  = (normal|exclus
45e0: 69 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ive).  */.  case
45f0: 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47   PragTyp_LOCKING
4600: 5f 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e  _MODE: {.    con
4610: 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  st char *zRet = 
4620: 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e  "normal";.    in
4630: 74 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63  t eMode = getLoc
4640: 6b 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29  kingMode(zRight)
4650: 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d  ;..    if( pId2-
4660: 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d  >n==0 && eMode==
4670: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
4680: 45 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20  E_QUERY ){.     
4690: 20 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47   /* Simple "PRAG
46a0: 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b  MA locking_mode;
46b0: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  " statement. Thi
46c0: 73 20 69 73 20 61 20 71 75 65 72 79 20 66 6f 72  s is a query for
46d0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
46e0: 72 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f  rrent default lo
46f0: 63 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63  cking mode (whic
4700: 68 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  h may be differe
4710: 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  nt to.      ** t
4720: 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
4730: 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
4740: 62 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  base)..      */.
4750: 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62        eMode = db
4760: 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a  ->dfltLockMode;.
4770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4780: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
4790: 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e        if( pId2->
47a0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
47b0: 2f 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  /* This indicate
47c0: 73 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61  s that no databa
47d0: 73 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63  se name was spec
47e0: 69 66 69 65 64 20 61 73 20 70 61 72 74 0a 20 20  ified as part.  
47f0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
4800: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20  PRAGMA command. 
4810: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
4820: 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75   locking-mode mu
4830: 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
4840: 20 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61   set on all atta
4850: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 20  ched databases, 
4860: 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  as well as the m
4870: 61 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20  ain db file..   
4880: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
4890: 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c  ** Also, the sql
48a0: 69 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64  ite3.dfltLockMod
48b0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  e variable is se
48c0: 74 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20  t so that.      
48d0: 20 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75    ** any subsequ
48e0: 65 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20 64  ently attached d
48f0: 61 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73  atabases also us
4900: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  e the specified.
4910: 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69          ** locki
4920: 6e 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20  ng mode..       
4930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4940: 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
4950: 72 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62  rt(pDb==&db->aDb
4960: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
4970: 72 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e  r(ii=2; ii<db->n
4980: 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  Db; ii++){.     
4990: 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
49a0: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
49b0: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29  db->aDb[ii].pBt)
49c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
49d0: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
49e0: 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64  ode(pPager, eMod
49f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
4a00: 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f        db->dfltLo
4a10: 63 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  ckMode = (u8)eMo
4a20: 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
4a30: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
4a40: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62  e3BtreePager(pDb
4a50: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d  ->pBt);.      eM
4a60: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ode = sqlite3Pag
4a70: 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50  erLockingMode(pP
4a80: 61 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  ager, eMode);.  
4a90: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
4aa0: 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
4ab0: 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
4ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
4ad0: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
4ae0: 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
4af0: 56 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  VE );.    if( eM
4b00: 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
4b10: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
4b20: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d   ){.      zRet =
4b30: 20 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20   "exclusive";.  
4b40: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69    }.    returnSi
4b50: 6e 67 6c 65 54 65 78 74 28 76 2c 20 22 6c 6f 63  ngleText(v, "loc
4b60: 6b 69 6e 67 5f 6d 6f 64 65 22 2c 20 7a 52 65 74  king_mode", zRet
4b70: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
4b80: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  }..  /*.  **  PR
4b90: 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
4ba0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a  journal_mode.  *
4bb0: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
4bc0: 61 73 65 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  ase.]journal_mod
4bd0: 65 20 3d 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  e =.  **        
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64                (d
4bf0: 65 6c 65 74 65 7c 70 65 72 73 69 73 74 7c 6f 66  elete|persist|of
4c00: 66 7c 74 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72  f|truncate|memor
4c10: 79 7c 77 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a  y|wal|off).  */.
4c20: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4a    case PragTyp_J
4c30: 4f 55 52 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20  OURNAL_MODE: {. 
4c40: 20 20 20 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20     int eMode;   
4c50: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
4c60: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
4c70: 4d 4f 44 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73  MODE_XXX symbols
4c80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   */.    int ii; 
4c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
4ca0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
4cb0: 20 20 73 65 74 4f 6e 65 43 6f 6c 75 6d 6e 4e 61    setOneColumnNa
4cc0: 6d 65 28 76 2c 20 22 6a 6f 75 72 6e 61 6c 5f 6d  me(v, "journal_m
4cd0: 6f 64 65 22 29 3b 0a 20 20 20 20 69 66 28 20 7a  ode");.    if( z
4ce0: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
4cf0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
4d00: 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70 61 72 74   no "=MODE" part
4d10: 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61 2c 20   of the pragma, 
4d20: 64 6f 20 61 20 71 75 65 72 79 20 66 6f 72 20 74  do a query for t
4d30: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  he.      ** curr
4d40: 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ent mode */.    
4d50: 20 20 65 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f    eMode = PAGER_
4d60: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
4d70: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
4d80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4d90: 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20 69 6e 74  zMode;.      int
4da0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
4db0: 65 6e 33 30 28 7a 52 69 67 68 74 29 3b 0a 20 20  en30(zRight);.  
4dc0: 20 20 20 20 66 6f 72 28 65 4d 6f 64 65 3d 30 3b      for(eMode=0;
4dd0: 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65   (zMode = sqlite
4de0: 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65  3JournalModename
4df0: 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20 65 4d 6f  (eMode))!=0; eMo
4e00: 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  de++){.        i
4e10: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
4e20: 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d 6f 64 65  mp(zRight, zMode
4e30: 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  , n)==0 ) break;
4e40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4e50: 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a 20 20 20  f( !zMode ){.   
4e60: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 22       /* If the "
4e70: 3d 4d 4f 44 45 22 20 70 61 72 74 20 64 6f 65 73  =MODE" part does
4e80: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 6b   not match any k
4e90: 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  nown journal mod
4ea0: 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  e,.        ** th
4eb0: 65 6e 20 64 6f 20 61 20 71 75 65 72 79 20 2a 2f  en do a query */
4ec0: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
4ed0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
4ee0: 44 45 5f 51 55 45 52 59 3b 0a 20 20 20 20 20 20  DE_QUERY;.      
4ef0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4f00: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
4f10: 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 26  RNALMODE_QUERY &
4f20: 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a  & pId2->n==0 ){.
4f30: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
4f40: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
4f50: 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22 50 52 41  _mode" into "PRA
4f60: 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c  GMA main.journal
4f70: 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20 20 20 20  _mode" */.      
4f80: 69 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  iDb = 0;.      p
4f90: 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20 20 20 20  Id2->n = 1;.    
4fa0: 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 64 62 2d  }.    for(ii=db-
4fb0: 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69  >nDb-1; ii>=0; i
4fc0: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i--){.      if( 
4fd0: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20  db->aDb[ii].pBt 
4fe0: 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70  && (ii==iDb || p
4ff0: 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20  Id2->n==0) ){.  
5000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5010: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 69  eUsesBtree(v, ii
5020: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5030: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5040: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 2c 20  OP_JournalMode, 
5050: 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29 3b 0a 20  ii, 1, eMode);. 
5060: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5080: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
5090: 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 62  ow, 1, 1);.    b
50a0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
50b0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61    **  PRAGMA [da
50c0: 74 61 62 61 73 65 2e 5d 6a 6f 75 72 6e 61 6c 5f  tabase.]journal_
50d0: 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20  size_limit.  ** 
50e0: 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
50f0: 65 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  e.]journal_size_
5100: 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  limit=N.  **.  *
5110: 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65  * Get or set the
5120: 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e 20 72   size limit on r
5130: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
5140: 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  files..  */.  ca
5150: 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55 52 4e  se PragTyp_JOURN
5160: 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a 20 7b  AL_SIZE_LIMIT: {
5170: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
5180: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
5190: 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29  ePager(pDb->pBt)
51a0: 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  ;.    i64 iLimit
51b0: 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a   = -2;.    if( z
51c0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
51d0: 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
51e0: 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69 4c 69  I64(zRight, &iLi
51f0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mit);.      if( 
5200: 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d  iLimit<-1 ) iLim
5210: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  it = -1;.    }. 
5220: 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
5230: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
5240: 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65 72 2c  izeLimit(pPager,
5250: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 72 65   iLimit);.    re
5260: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
5270: 20 22 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c   "journal_size_l
5280: 69 6d 69 74 22 2c 20 69 4c 69 6d 69 74 29 3b 0a  imit", iLimit);.
5290: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
52a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
52b0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
52c0: 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  MAS */..  /*.  *
52d0: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
52e0: 61 73 65 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d  ase.]auto_vacuum
52f0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  .  **  PRAGMA [d
5300: 61 74 61 62 61 73 65 2e 5d 61 75 74 6f 5f 76 61  atabase.]auto_va
5310: 63 75 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  cuum=N.  **.  **
5320: 20 47 65 74 20 6f 72 20 73 65 74 20 74 68 65 20   Get or set the 
5330: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
5340: 61 62 61 73 65 20 27 61 75 74 6f 2d 76 61 63 75  abase 'auto-vacu
5350: 75 6d 27 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  um' parameter.. 
5360: 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73   ** The value is
5370: 20 6f 6e 65 20 6f 66 3a 20 20 30 20 4e 4f 4e 45   one of:  0 NONE
5380: 20 31 20 46 55 4c 4c 20 32 20 49 4e 43 52 45 4d   1 FULL 2 INCREM
5390: 45 4e 54 41 4c 0a 20 20 2a 2f 0a 23 69 66 6e 64  ENTAL.  */.#ifnd
53a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
53b0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 63 61 73 65  UTOVACUUM.  case
53c0: 20 50 72 61 67 54 79 70 5f 41 55 54 4f 5f 56 41   PragTyp_AUTO_VA
53d0: 43 55 55 4d 3a 20 7b 0a 20 20 20 20 42 74 72 65  CUUM: {.    Btre
53e0: 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42  e *pBt = pDb->pB
53f0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
5400: 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  Bt!=0 );.    if(
5410: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
5420: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
5430: 74 28 76 2c 20 22 61 75 74 6f 5f 76 61 63 75 75  t(v, "auto_vacuu
5440: 6d 22 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65  m", sqlite3Btree
5450: 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42  GetAutoVacuum(pB
5460: 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t));.    }else{.
5470: 20 20 20 20 20 20 69 6e 74 20 65 41 75 74 6f 20        int eAuto 
5480: 3d 20 67 65 74 41 75 74 6f 56 61 63 75 75 6d 28  = getAutoVacuum(
5490: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  zRight);.      a
54a0: 73 73 65 72 74 28 20 65 41 75 74 6f 3e 3d 30 20  ssert( eAuto>=0 
54b0: 26 26 20 65 41 75 74 6f 3c 3d 32 20 29 3b 0a 20  && eAuto<=2 );. 
54c0: 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 41 75 74       db->nextAut
54d0: 6f 76 61 63 20 3d 20 28 75 38 29 65 41 75 74 6f  ovac = (u8)eAuto
54e0: 3b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20  ;.      /* Call 
54f0: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 29 20  SetAutoVacuum() 
5500: 74 6f 20 73 65 74 20 69 6e 69 74 69 61 6c 69 7a  to set initializ
5510: 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 61  e the internal a
5520: 75 74 6f 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  uto and.      **
5530: 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 66 6c 61   incr-vacuum fla
5540: 67 73 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  gs. This is requ
5550: 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69  ired in case thi
5560: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  s connection.   
5570: 20 20 20 2a 2a 20 63 72 65 61 74 65 73 20 74 68     ** creates th
5580: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5590: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
55a0: 20 74 68 61 74 20 69 74 20 69 73 20 63 72 65 61   that it is crea
55b0: 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ted.      ** as 
55c0: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  an auto-vacuum c
55d0: 61 70 61 62 6c 65 20 64 62 2e 0a 20 20 20 20 20  apable db..     
55e0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
55f0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
5600: 74 6f 56 61 63 75 75 6d 28 70 42 74 2c 20 65 41  toVacuum(pBt, eA
5610: 75 74 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  uto);.      if( 
5620: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
5630: 20 28 65 41 75 74 6f 3d 3d 31 20 7c 7c 20 65 41   (eAuto==1 || eA
5640: 75 74 6f 3d 3d 32 29 20 29 7b 0a 20 20 20 20 20  uto==2) ){.     
5650: 20 20 20 2f 2a 20 57 68 65 6e 20 73 65 74 74 69     /* When setti
5660: 6e 67 20 74 68 65 20 61 75 74 6f 5f 76 61 63 75  ng the auto_vacu
5670: 75 6d 20 6d 6f 64 65 20 74 6f 20 65 69 74 68 65  um mode to eithe
5680: 72 20 22 66 75 6c 6c 22 20 6f 72 20 0a 20 20 20  r "full" or .   
5690: 20 20 20 20 20 2a 2a 20 22 69 6e 63 72 65 6d 65       ** "increme
56a0: 6e 74 61 6c 22 2c 20 77 72 69 74 65 20 74 68 65  ntal", write the
56b0: 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 36   value of meta[6
56c0: 5d 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  ] in the databas
56d0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  e.        ** fil
56e0: 65 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  e. Before writin
56f0: 67 20 74 6f 20 6d 65 74 61 5b 36 5d 2c 20 63 68  g to meta[6], ch
5700: 65 63 6b 20 74 68 61 74 20 6d 65 74 61 5b 33 5d  eck that meta[3]
5710: 20 69 6e 64 69 63 61 74 65 73 0a 20 20 20 20 20   indicates.     
5720: 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
5730: 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 75 74  really is an aut
5740: 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
5750: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
5760: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74     */.        st
5770: 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69  atic const int i
5780: 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54  Ln = VDBE_OFFSET
5790: 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20  _LINENO(2);.    
57a0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
57b0: 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74 4d   VdbeOpList setM
57c0: 65 74 61 36 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  eta6[] = {.     
57d0: 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61       { OP_Transa
57e0: 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20 20 20  ction,    0,    
57f0: 20 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20       1,         
5800: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
5810: 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  * 0 */.         
5820: 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65   { OP_ReadCookie
5830: 2c 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  ,     0,        
5840: 20 31 2c 20 20 20 20 20 20 20 20 20 42 54 52 45   1,         BTRE
5850: 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50  E_LARGEST_ROOT_P
5860: 41 47 45 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  AGE},.          
5870: 7b 20 4f 50 5f 49 66 2c 20 20 20 20 20 20 20 20  { OP_If,        
5880: 20 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20       1,         
5890: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
58a0: 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32 20 2a     0},    /* 2 *
58b0: 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50  /.          { OP
58c0: 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 20 20 20  _Halt,          
58d0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 41   SQLITE_OK, OE_A
58e0: 62 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 30  bort,          0
58f0: 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20  },    /* 3 */.  
5900: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74          { OP_Int
5910: 65 67 65 72 2c 20 20 20 20 20 20 20 20 30 2c 20  eger,        0, 
5920: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5930: 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20             0},  
5940: 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20    /* 4 */.      
5950: 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b      { OP_SetCook
5960: 69 65 2c 20 20 20 20 20 20 30 2c 20 20 20 20 20  ie,      0,     
5970: 20 20 20 20 42 54 52 45 45 5f 49 4e 43 52 5f 56      BTREE_INCR_V
5980: 41 43 55 55 4d 2c 20 31 7d 2c 20 20 20 20 2f 2a  ACUUM, 1},    /*
5990: 20 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 3b   5 */.        };
59a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64  .        int iAd
59b0: 64 72 3b 0a 20 20 20 20 20 20 20 20 69 41 64 64  dr;.        iAdd
59c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
59d0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
59e0: 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36 29 2c  ySize(setMeta6),
59f0: 20 73 65 74 4d 65 74 61 36 2c 20 69 4c 6e 29 3b   setMeta6, iLn);
5a00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5a10: 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
5a20: 69 41 64 64 72 2c 20 69 44 62 29 3b 0a 20 20 20  iAddr, iDb);.   
5a30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5a40: 43 68 61 6e 67 65 50 31 28 76 2c 20 69 41 64 64  ChangeP1(v, iAdd
5a50: 72 2b 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  r+1, iDb);.     
5a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5a70: 61 6e 67 65 50 32 28 76 2c 20 69 41 64 64 72 2b  angeP2(v, iAddr+
5a80: 32 2c 20 69 41 64 64 72 2b 34 29 3b 0a 20 20 20  2, iAddr+4);.   
5a90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5aa0: 43 68 61 6e 67 65 50 31 28 76 2c 20 69 41 64 64  ChangeP1(v, iAdd
5ab0: 72 2b 34 2c 20 65 41 75 74 6f 2d 31 29 3b 0a 20  r+4, eAuto-1);. 
5ac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5ad0: 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 41  beChangeP1(v, iA
5ae0: 64 64 72 2b 35 2c 20 69 44 62 29 3b 0a 20 20 20  ddr+5, iDb);.   
5af0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5b00: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
5b10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5b20: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
5b30: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
5b40: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
5b50: 61 73 65 2e 5d 69 6e 63 72 65 6d 65 6e 74 61 6c  ase.]incremental
5b60: 5f 76 61 63 75 75 6d 28 4e 29 0a 20 20 2a 2a 0a  _vacuum(N).  **.
5b70: 20 20 2a 2a 20 44 6f 20 4e 20 73 74 65 70 73 20    ** Do N steps 
5b80: 6f 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  of incremental v
5b90: 61 63 75 75 6d 69 6e 67 20 6f 6e 20 61 20 64 61  acuuming on a da
5ba0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
5bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5bc0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 63 61  _AUTOVACUUM.  ca
5bd0: 73 65 20 50 72 61 67 54 79 70 5f 49 4e 43 52 45  se PragTyp_INCRE
5be0: 4d 45 4e 54 41 4c 5f 56 41 43 55 55 4d 3a 20 7b  MENTAL_VACUUM: {
5bf0: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c  .    int iLimit,
5c00: 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28 20 7a   addr;.    if( z
5c10: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 21 73 71 6c  Right==0 || !sql
5c20: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69  ite3GetInt32(zRi
5c30: 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 20 7c 7c  ght, &iLimit) ||
5c40: 20 69 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a 20 20   iLimit<=0 ){.  
5c50: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 30 78 37      iLimit = 0x7
5c60: 66 66 66 66 66 66 66 3b 0a 20 20 20 20 7d 0a 20  fffffff;.    }. 
5c70: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
5c80: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
5c90: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
5ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5cb0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
5cc0: 65 72 2c 20 69 4c 69 6d 69 74 2c 20 31 29 3b 0a  er, iLimit, 1);.
5cd0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
5ce0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
5cf0: 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 2c 20 69  OP_IncrVacuum, i
5d00: 44 62 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Db); VdbeCoverag
5d10: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
5d20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5d30: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 29 3b  P_ResultRow, 1);
5d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5d50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
5d60: 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20 20 20  Imm, 1, -1);.   
5d70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d80: 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
5d90: 31 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f  1, addr); VdbeCo
5da0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
5db0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5dc0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
5dd0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64   break;.  }.#end
5de0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
5df0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
5e00: 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20  AGMAS.  /*.  ** 
5e10: 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
5e20: 65 2e 5d 63 61 63 68 65 5f 73 69 7a 65 0a 20 20  e.]cache_size.  
5e30: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
5e40: 62 61 73 65 2e 5d 63 61 63 68 65 5f 73 69 7a 65  base.]cache_size
5e50: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  =N.  **.  ** The
5e60: 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f   first form repo
5e70: 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rts the current 
5e80: 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f  local setting fo
5e90: 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  r the.  ** page 
5ea0: 63 61 63 68 65 20 73 69 7a 65 2e 20 54 68 65 20  cache size. The 
5eb0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73  second form sets
5ec0: 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20   the local.  ** 
5ed0: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
5ee0: 76 61 6c 75 65 2e 20 20 49 66 20 4e 20 69 73 20  value.  If N is 
5ef0: 70 6f 73 69 74 69 76 65 20 74 68 65 6e 20 74 68  positive then th
5f00: 61 74 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e  at is the.  ** n
5f10: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
5f20: 6e 20 74 68 65 20 63 61 63 68 65 2e 20 20 49 66  n the cache.  If
5f30: 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20   N is negative, 
5f40: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6e 75  then the.  ** nu
5f50: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 73  mber of pages is
5f60: 20 61 64 6a 75 73 74 65 64 20 73 6f 20 74 68 61   adjusted so tha
5f70: 74 20 74 68 65 20 63 61 63 68 65 20 75 73 65 73  t the cache uses
5f80: 20 2d 4e 20 6b 69 62 69 62 79 74 65 73 0a 20 20   -N kibibytes.  
5f90: 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 20 20  ** of memory..  
5fa0: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
5fb0: 70 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20 7b 0a  p_CACHE_SIZE: {.
5fc0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
5fd0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
5fe0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
5ff0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  ;.    if( !zRigh
6000: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
6010: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
6020: 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
6030: 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20  pragma_out;.    
6040: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
6050: 74 28 76 2c 20 22 63 61 63 68 65 5f 73 69 7a 65  t(v, "cache_size
6060: 22 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  ", pDb->pSchema-
6070: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
6080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
6090: 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65  nt size = sqlite
60a0: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20  3Atoi(zRight);. 
60b0: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
60c0: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  a->cache_size = 
60d0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
60e0: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
60f0: 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c 20 70  Size(pDb->pBt, p
6100: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63  Db->pSchema->cac
6110: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  he_size);.      
6120: 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53  if( sqlite3ReadS
6130: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
6140: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
6150: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
6160: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
6170: 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
6180: 73 65 2e 5d 6d 6d 61 70 5f 73 69 7a 65 28 4e 29  se.]mmap_size(N)
6190: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  **.  ** Used 
61a0: 74 6f 20 73 65 74 20 6d 61 70 70 69 6e 67 20 73  to set mapping s
61b0: 69 7a 65 20 6c 69 6d 69 74 2e 20 54 68 65 20 6d  ize limit. The m
61c0: 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69  apping size limi
61d0: 74 20 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 74  t is.  ** used t
61e0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 61 67 67 72  o limit the aggr
61f0: 65 67 61 74 65 20 73 69 7a 65 20 6f 66 20 61 6c  egate size of al
6200: 6c 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  l memory mapped 
6210: 72 65 67 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  regions of the. 
6220: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
6230: 65 2e 20 49 66 20 74 68 69 73 20 70 61 72 61 6d  e. If this param
6240: 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 7a  eter is set to z
6250: 65 72 6f 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ero, then memory
6260: 20 6d 61 70 70 69 6e 67 0a 20 20 2a 2a 20 69 73   mapping.  ** is
6270: 20 6e 6f 74 20 75 73 65 64 20 61 74 20 61 6c 6c   not used at all
6280: 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74  .  If N is negat
6290: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ive, then the de
62a0: 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 6d 61 70  fault memory map
62b0: 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 64 65 74 65  .  ** limit dete
62c0: 72 6d 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65  rmined by sqlite
62d0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
62e0: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
62f0: 29 20 69 73 20 73 65 74 2e 0a 20 20 2a 2a 20 54  ) is set..  ** T
6300: 68 65 20 70 61 72 61 6d 65 74 65 72 20 4e 20 69  he parameter N i
6310: 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20 62 79  s measured in by
6320: 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tes..  **.  ** T
6330: 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 64 76  his value is adv
6340: 69 73 6f 72 79 2e 20 20 54 68 65 20 75 6e 64 65  isory.  The unde
6350: 72 6c 79 69 6e 67 20 56 46 53 20 69 73 20 66 72  rlying VFS is fr
6360: 65 65 20 74 6f 20 6d 65 6d 6f 72 79 20 6d 61 70  ee to memory map
6370: 0a 20 20 2a 2a 20 61 73 20 6c 69 74 74 6c 65 20  .  ** as little 
6380: 6f 72 20 61 73 20 6d 75 63 68 20 61 73 20 69 74  or as much as it
6390: 20 77 61 6e 74 73 2e 20 20 45 78 63 65 70 74 2c   wants.  Except,
63a0: 20 69 66 20 4e 20 69 73 20 73 65 74 20 74 6f 20   if N is set to 
63b0: 30 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  0 then the.  ** 
63c0: 75 70 70 65 72 20 6c 61 79 65 72 73 20 77 69 6c  upper layers wil
63d0: 6c 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 20 74  l never invoke t
63e0: 68 65 20 78 46 65 74 63 68 20 69 6e 74 65 72 66  he xFetch interf
63f0: 61 63 65 73 20 74 6f 20 74 68 65 20 56 46 53 2e  aces to the VFS.
6400: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
6410: 67 54 79 70 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  gTyp_MMAP_SIZE: 
6420: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
6430: 74 36 34 20 73 7a 3b 0a 23 69 66 20 53 51 4c 49  t64 sz;.#if SQLI
6440: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
6450: 3e 30 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  >0.    assert( s
6460: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
6470: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
6480: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69  ) );.    if( zRi
6490: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ght ){.      int
64a0: 20 69 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   ii;.      sqlit
64b0: 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
64c0: 7a 52 69 67 68 74 2c 20 26 73 7a 29 3b 0a 20 20  zRight, &sz);.  
64d0: 20 20 20 20 69 66 28 20 73 7a 3c 30 20 29 20 73      if( sz<0 ) s
64e0: 7a 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  z = sqlite3Globa
64f0: 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a  lConfig.szMmap;.
6500: 20 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e        if( pId2->
6510: 6e 3d 3d 30 20 29 20 64 62 2d 3e 73 7a 4d 6d 61  n==0 ) db->szMma
6520: 70 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 66 6f  p = sz;.      fo
6530: 72 28 69 69 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  r(ii=db->nDb-1; 
6540: 69 69 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20  ii>=0; ii--){.  
6550: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
6560: 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28 69 69  b[ii].pBt && (ii
6570: 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d 3e 6e  ==iDb || pId2->n
6580: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
6590: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
65a0: 74 4d 6d 61 70 4c 69 6d 69 74 28 64 62 2d 3e 61  tMmapLimit(db->a
65b0: 44 62 5b 69 69 5d 2e 70 42 74 2c 20 73 7a 29 3b  Db[ii].pBt, sz);
65c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
65d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 20   }.    }.    sz 
65e0: 3d 20 2d 31 3b 0a 20 20 20 20 72 63 20 3d 20 73  = -1;.    rc = s
65f0: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
6600: 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  rol(db, zDb, SQL
6610: 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
6620: 49 5a 45 2c 20 26 73 7a 29 3b 0a 23 65 6c 73 65  IZE, &sz);.#else
6630: 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20  .    sz = 0;.   
6640: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6650: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
6660: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6670: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
6680: 67 6c 65 49 6e 74 28 76 2c 20 22 6d 6d 61 70 5f  gleInt(v, "mmap_
6690: 73 69 7a 65 22 2c 20 73 7a 29 3b 0a 20 20 20 20  size", sz);.    
66a0: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
66b0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
66c0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
66d0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Err++;.      pPa
66e0: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
66f0: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
6700: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
6710: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
6720: 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  e.  **   PRAGMA 
6730: 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 22 64 65  temp_store = "de
6740: 66 61 75 6c 74 22 7c 22 6d 65 6d 6f 72 79 22 7c  fault"|"memory"|
6750: 22 66 69 6c 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  "file".  **.  **
6760: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
6770: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
6780: 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72 65  f the temp_store
6790: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
67a0: 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20  .  ** the local 
67b0: 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d  value does not m
67c0: 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ake changes to t
67d0: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64  he disk file and
67e0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a   the default.  *
67f0: 2a 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  * value will be 
6800: 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78  restored the nex
6810: 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
6820: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2e 0a 20  ase is opened.. 
6830: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
6840: 61 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  at it is possibl
6850: 65 20 66 6f 72 20 74 68 65 20 6c 69 62 72 61 72  e for the librar
6860: 79 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  y compile-time o
6870: 70 74 69 6f 6e 73 20 74 6f 0a 20 20 2a 2a 20 6f  ptions to.  ** o
6880: 76 65 72 72 69 64 65 20 74 68 69 73 20 73 65 74  verride this set
6890: 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ting.  */.  case
68a0: 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53 54   PragTyp_TEMP_ST
68b0: 4f 52 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 21  ORE: {.    if( !
68c0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
68d0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
68e0: 76 2c 20 22 74 65 6d 70 5f 73 74 6f 72 65 22 2c  v, "temp_store",
68f0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 29   db->temp_store)
6900: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6910: 20 20 20 63 68 61 6e 67 65 54 65 6d 70 53 74 6f     changeTempSto
6920: 72 61 67 65 28 70 50 61 72 73 65 2c 20 7a 52 69  rage(pParse, zRi
6930: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
6940: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
6950: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
6960: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
6970: 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ory.  **   PRAGM
6980: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
6990: 65 63 74 6f 72 79 20 3d 20 22 22 7c 22 64 69 72  ectory = ""|"dir
69a0: 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a  ectory_name".  *
69b0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72  *.  ** Return or
69c0: 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76   set the local v
69d0: 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65 6d 70  alue of the temp
69e0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
69f0: 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67   flag.  Changing
6a00: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
6a10: 73 65 74 73 20 61 20 73 70 65 63 69 66 69 63 20  sets a specific 
6a20: 64 69 72 65 63 74 6f 72 79 20 74 6f 20 62 65 20  directory to be 
6a30: 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  used for tempora
6a40: 72 79 20 66 69 6c 65 73 2e 0a 20 20 2a 2a 20 53  ry files..  ** S
6a50: 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c  etting to a null
6a60: 20 73 74 72 69 6e 67 20 72 65 76 65 72 74 73 20   string reverts 
6a70: 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 74  to the default t
6a80: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
6a90: 72 79 20 73 65 61 72 63 68 2e 0a 20 20 2a 2a 20  ry search..  ** 
6aa0: 49 66 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  If temporary dir
6ab0: 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65  ectory is change
6ac0: 64 2c 20 74 68 65 6e 20 69 6e 76 61 6c 69 64 61  d, then invalida
6ad0: 74 65 54 65 6d 70 53 74 6f 72 61 67 65 2e 0a 20  teTempStorage.. 
6ae0: 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
6af0: 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53 54 4f  PragTyp_TEMP_STO
6b00: 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a  RE_DIRECTORY: {.
6b10: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
6b20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
6b30: 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 22 74 65  ingleText(v, "te
6b40: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
6b50: 72 79 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  ry", sqlite3_tem
6b60: 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
6b70: 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66    }else{.#ifndef
6b80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44   SQLITE_OMIT_WSD
6b90: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68  .      if( zRigh
6ba0: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  t[0] ){.        
6bb0: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
6bc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
6bd0: 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73 2c 20  ccess(db->pVfs, 
6be0: 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45 5f 41  zRight, SQLITE_A
6bf0: 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 2c  CCESS_READWRITE,
6c00: 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20   &res);.        
6c10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6c20: 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20  K || res==0 ){. 
6c30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6c40: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6c50: 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62 6c 65   "not a writable
6c60: 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a 20 20   directory");.  
6c70: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61          goto pra
6c80: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  gma_out;.       
6c90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6ca0: 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45 4d 50   if( SQLITE_TEMP
6cb0: 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20 20 20  _STORE==0.      
6cc0: 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d 50   || (SQLITE_TEMP
6cd0: 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64 62 2d  _STORE==1 && db-
6ce0: 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31 29 0a  >temp_store<=1).
6cf0: 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c 49 54         || (SQLIT
6d00: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 20  E_TEMP_STORE==2 
6d10: 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  && db->temp_stor
6d20: 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  e==1).      ){. 
6d30: 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
6d40: 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70 50 61  eTempStorage(pPa
6d50: 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
6d60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6d70: 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  (sqlite3_temp_di
6d80: 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 20 20  rectory);.      
6d90: 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b  if( zRight[0] ){
6da0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6db0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
6dc0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
6dd0: 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74 29 3b  f("%s", zRight);
6de0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6df0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
6e00: 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30  mp_directory = 0
6e10: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
6e20: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6e30: 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  WSD */.    }.   
6e40: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69 66   break;.  }..#if
6e50: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20   SQLITE_OS_WIN. 
6e60: 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   /*.  **   PRAGM
6e70: 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  A data_store_dir
6e80: 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52  ectory.  **   PR
6e90: 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f  AGMA data_store_
6ea0: 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22  directory = ""|"
6eb0: 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a  directory_name".
6ec0: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
6ed0: 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61   or set the loca
6ee0: 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  l value of the d
6ef0: 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
6f00: 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67  ory flag.  Chang
6f10: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c  ing.  ** the val
6f20: 75 65 20 73 65 74 73 20 61 20 73 70 65 63 69 66  ue sets a specif
6f30: 69 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  ic directory to 
6f40: 62 65 20 75 73 65 64 20 66 6f 72 20 64 61 74 61  be used for data
6f50: 62 61 73 65 20 66 69 6c 65 73 20 74 68 61 74 0a  base files that.
6f60: 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63 69 66    ** were specif
6f70: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
6f80: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 53  ive pathname.  S
6f90: 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c  etting to a null
6fa0: 20 73 74 72 69 6e 67 20 72 65 76 65 72 74 73 0a   string reverts.
6fb0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65 66 61    ** to the defa
6fc0: 75 6c 74 20 64 61 74 61 62 61 73 65 20 64 69 72  ult database dir
6fd0: 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20 66 6f  ectory, which fo
6fe0: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  r database files
6ff0: 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68 0a   specified with.
7000: 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76 65 20    ** a relative 
7010: 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62 61 62  path will probab
7020: 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  ly be based on t
7030: 68 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63  he current direc
7040: 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a  tory for the.  *
7050: 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61 74 61  * process.  Data
7060: 62 61 73 65 20 66 69 6c 65 20 73 70 65 63 69 66  base file specif
7070: 69 65 64 20 77 69 74 68 20 61 6e 20 61 62 73 6f  ied with an abso
7080: 6c 75 74 65 20 70 61 74 68 20 61 72 65 20 6e 6f  lute path are no
7090: 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a 2a 20  t impacted.  ** 
70a0: 62 79 20 74 68 69 73 20 73 65 74 74 69 6e 67 2c  by this setting,
70b0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 69   regardless of i
70c0: 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a 20  ts value..  **. 
70d0: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
70e0: 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f 44 49  yp_DATA_STORE_DI
70f0: 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20 20 69  RECTORY: {.    i
7100: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
7110: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
7120: 54 65 78 74 28 76 2c 20 22 64 61 74 61 5f 73 74  Text(v, "data_st
7130: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 2c 20  ore_directory", 
7140: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
7150: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 65 6c  ectory);.    }el
7160: 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se{.#ifndef SQLI
7170: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20  TE_OMIT_WSD.    
7180: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
7190: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
71a0: 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
71b0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
71c0: 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68  (db->pVfs, zRigh
71d0: 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  t, SQLITE_ACCESS
71e0: 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72 65 73  _READWRITE, &res
71f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
7200: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
7210: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
7220: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7230: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74  Msg(pParse, "not
7240: 20 61 20 77 72 69 74 61 62 6c 65 20 64 69 72 65   a writable dire
7250: 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20  ctory");.       
7260: 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f     goto pragma_o
7270: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
7280: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7290: 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74 65 33  te3_free(sqlite3
72a0: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 29  _data_directory)
72b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  ;.      if( zRig
72c0: 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ht[0] ){.       
72d0: 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
72e0: 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69 74 65  rectory = sqlite
72f0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
7300: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  zRight);.      }
7310: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
7320: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
7330: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  tory = 0;.      
7340: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7350: 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f 0a 20  TE_OMIT_WSD */. 
7360: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
7370: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
7380: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
7390: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 2f 2a  CKING_STYLE.  /*
73a0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
73b0: 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
73c0: 72 6f 78 79 5f 66 69 6c 65 0a 20 20 2a 2a 20 20  roxy_file.  **  
73d0: 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
73e0: 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
73f0: 6c 65 20 3d 20 22 3a 61 75 74 6f 3a 22 7c 22 6c  le = ":auto:"|"l
7400: 6f 63 6b 5f 66 69 6c 65 5f 70 61 74 68 22 0a 20  ock_file_path". 
7410: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
7420: 6f 72 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  or set the value
7430: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 5f 70 72 6f   of the lock_pro
7440: 78 79 5f 66 69 6c 65 20 66 6c 61 67 2e 20 20 43  xy_file flag.  C
7450: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
7460: 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70   value sets a sp
7470: 65 63 69 66 69 63 20 66 69 6c 65 20 74 6f 20 62  ecific file to b
7480: 65 20 75 73 65 64 20 66 6f 72 20 64 61 74 61 62  e used for datab
7490: 61 73 65 20 61 63 63 65 73 73 20 6c 6f 63 6b 73  ase access locks
74a0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61  ..  **.  */.  ca
74b0: 73 65 20 50 72 61 67 54 79 70 5f 4c 4f 43 4b 5f  se PragTyp_LOCK_
74c0: 50 52 4f 58 59 5f 46 49 4c 45 3a 20 7b 0a 20 20  PROXY_FILE: {.  
74d0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
74e0: 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50  .      Pager *pP
74f0: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
7500: 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42  reePager(pDb->pB
7510: 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t);.      char *
7520: 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68 20  proxy_file_path 
7530: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 73 71  = NULL;.      sq
7540: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
7550: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
7560: 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
7570: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
7580: 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69  eControlHint(pFi
7590: 6c 65 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  le, SQLITE_GET_L
75a0: 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20  OCKPROXYFILE, . 
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 20 20 20 20 20 20 20 20 26 70 72 6f 78 79            &proxy
75d0: 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20  _file_path);.   
75e0: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54     returnSingleT
75f0: 65 78 74 28 76 2c 20 22 6c 6f 63 6b 5f 70 72 6f  ext(v, "lock_pro
7600: 78 79 5f 66 69 6c 65 22 2c 20 70 72 6f 78 79 5f  xy_file", proxy_
7610: 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20 20 20  file_path);.    
7620: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 61 67  }else{.      Pag
7630: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
7640: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
7650: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
7660: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
7670: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
7680: 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
7690: 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20        int res;. 
76a0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b       if( zRight[
76b0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  0] ){.        re
76c0: 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  s=sqlite3OsFileC
76d0: 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51  ontrol(pFile, SQ
76e0: 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
76f0: 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20  XYFILE, .       
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 52                zR
7720: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 20 65  ight);.      } e
7730: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 72 65  lse {.        re
7740: 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  s=sqlite3OsFileC
7750: 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51  ontrol(pFile, SQ
7760: 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
7770: 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20  XYFILE, .       
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
77a0: 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
77b0: 20 20 20 69 66 28 20 72 65 73 21 3d 53 51 4c 49     if( res!=SQLI
77c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
77d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
77e0: 28 70 50 61 72 73 65 2c 20 22 66 61 69 6c 65 64  (pParse, "failed
77f0: 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20 70 72 6f   to set lock pro
7800: 78 79 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  xy file");.     
7810: 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f     goto pragma_o
7820: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
7830: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7840: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7850: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
7860: 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20 20 20 0a  _STYLE */      .
7870: 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20      .  /*.  **  
7880: 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
7890: 65 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  e.]synchronous. 
78a0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 64 61   **   PRAGMA [da
78b0: 74 61 62 61 73 65 2e 5d 73 79 6e 63 68 72 6f 6e  tabase.]synchron
78c0: 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41  ous=OFF|ON|NORMA
78d0: 4c 7c 46 55 4c 4c 0a 20 20 2a 2a 0a 20 20 2a 2a  L|FULL.  **.  **
78e0: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
78f0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
7900: 66 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75  f the synchronou
7910: 73 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e  s flag.  Changin
7920: 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c  g.  ** the local
7930: 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20   value does not 
7940: 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20  make changes to 
7950: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e  the disk file an
7960: 64 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75  d the.  ** defau
7970: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
7980: 20 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65   restored the ne
7990: 78 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  xt time the data
79a0: 62 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65  base is.  ** ope
79b0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ned..  */.  case
79c0: 20 50 72 61 67 54 79 70 5f 53 59 4e 43 48 52 4f   PragTyp_SYNCHRO
79d0: 4e 4f 55 53 3a 20 7b 0a 20 20 20 20 69 66 28 20  NOUS: {.    if( 
79e0: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
79f0: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
7a00: 28 76 2c 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73  (v, "synchronous
7a10: 22 2c 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  ", pDb->safety_l
7a20: 65 76 65 6c 2d 31 29 3b 0a 20 20 20 20 7d 65 6c  evel-1);.    }el
7a30: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64  se{.      if( !d
7a40: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
7a50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7a60: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7a70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53   .            "S
7a80: 61 66 65 74 79 20 6c 65 76 65 6c 20 6d 61 79 20  afety level may 
7a90: 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 69  not be changed i
7aa0: 6e 73 69 64 65 20 61 20 74 72 61 6e 73 61 63 74  nside a transact
7ab0: 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ion");.      }el
7ac0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
7ad0: 69 4c 65 76 65 6c 20 3d 20 28 67 65 74 53 61 66  iLevel = (getSaf
7ae0: 65 74 79 4c 65 76 65 6c 28 7a 52 69 67 68 74 2c  etyLevel(zRight,
7af0: 30 2c 31 29 2b 31 29 20 26 20 50 41 47 45 52 5f  0,1)+1) & PAGER_
7b00: 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
7b10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4c  ;.        if( iL
7b20: 65 76 65 6c 3d 3d 30 20 29 20 69 4c 65 76 65 6c  evel==0 ) iLevel
7b30: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44   = 1;.        pD
7b40: 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
7b50: 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  = iLevel;.      
7b60: 20 20 73 65 74 41 6c 6c 50 61 67 65 72 46 6c 61    setAllPagerFla
7b70: 67 73 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  gs(db);.      }.
7b80: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7b90: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
7ba0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
7bb0: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
7bc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7bd0: 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 0a 20 20  _FLAG_PRAGMAS.  
7be0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 46 4c 41  case PragTyp_FLA
7bf0: 47 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  G: {.    if( zRi
7c00: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
7c10: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
7c20: 76 2c 20 70 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d  v, pPragma->zNam
7c30: 65 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  e, (db->flags & 
7c40: 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 29 21 3d  pPragma->iArg)!=
7c50: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
7c60: 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d        int mask =
7c70: 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67 3b 20   pPragma->iArg; 
7c80: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69     /* Mask of bi
7c90: 74 73 20 74 6f 20 73 65 74 20 6f 72 20 63 6c 65  ts to set or cle
7ca0: 61 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ar. */.      if(
7cb0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
7cc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
7cd0: 20 46 6f 72 65 69 67 6e 20 6b 65 79 20 73 75 70   Foreign key sup
7ce0: 70 6f 72 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  port may not be 
7cf0: 65 6e 61 62 6c 65 64 20 6f 72 20 64 69 73 61 62  enabled or disab
7d00: 6c 65 64 20 77 68 69 6c 65 20 6e 6f 74 0a 20 20  led while not.  
7d10: 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f        ** in auto
7d20: 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a  -commit mode.  *
7d30: 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 26  /.        mask &
7d40: 3d 20 7e 28 53 51 4c 49 54 45 5f 46 6f 72 65 69  = ~(SQLITE_Forei
7d50: 67 6e 4b 65 79 73 29 3b 0a 20 20 20 20 20 20 7d  gnKeys);.      }
7d60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
7d70: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
7d80: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75        if( db->au
7d90: 74 68 2e 61 75 74 68 4c 65 76 65 6c 3d 3d 55 41  th.authLevel==UA
7da0: 55 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20  UTH_User ){.    
7db0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
7dc0: 6c 6f 77 20 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73  low non-admin us
7dd0: 65 72 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ers to modify th
7de0: 65 20 73 63 68 65 6d 61 20 61 72 62 69 74 72 61  e schema arbitra
7df0: 72 69 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  rily */.        
7e00: 6d 61 73 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45  mask &= ~(SQLITE
7e10: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3b 0a 20  _WriteSchema);. 
7e20: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
7e30: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7e40: 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  GetBoolean(zRigh
7e50: 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t, 0) ){.       
7e60: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 6d 61   db->flags |= ma
7e70: 73 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  sk;.      }else{
7e80: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
7e90: 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  gs &= ~mask;.   
7ea0: 20 20 20 20 20 69 66 28 20 6d 61 73 6b 3d 3d 53       if( mask==S
7eb0: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 20 29  QLITE_DeferFKs )
7ec0: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
7ed0: 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  mCons = 0;.     
7ee0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6e   }..      /* Man
7ef0: 79 20 6f 66 20 74 68 65 20 66 6c 61 67 2d 70 72  y of the flag-pr
7f00: 61 67 6d 61 73 20 6d 6f 64 69 66 79 20 74 68 65  agmas modify the
7f10: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
7f20: 62 79 20 74 68 65 20 53 51 4c 20 0a 20 20 20 20  by the SQL .    
7f30: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 28 65    ** compiler (e
7f40: 67 2e 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73  g. count_changes
7f50: 29 2e 20 53 6f 20 61 64 64 20 61 6e 20 6f 70 63  ). So add an opc
7f60: 6f 64 65 20 74 6f 20 65 78 70 69 72 65 20 61 6c  ode to expire al
7f70: 6c 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69  l.      ** compi
7f80: 6c 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  led SQL statemen
7f90: 74 73 20 61 66 74 65 72 20 6d 6f 64 69 66 79 69  ts after modifyi
7fa0: 6e 67 20 61 20 70 72 61 67 6d 61 20 76 61 6c 75  ng a pragma valu
7fb0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
7fc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7fd0: 4f 70 32 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op2(v, OP_Expire
7fe0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
7ff0: 65 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28  etAllPagerFlags(
8000: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  db);.    }.    b
8010: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
8020: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8030: 46 4c 41 47 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  FLAG_PRAGMAS */.
8040: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8050: 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47  OMIT_SCHEMA_PRAG
8060: 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  MAS.  /*.  **   
8070: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
8080: 6f 28 3c 74 61 62 6c 65 3e 29 0a 20 20 2a 2a 0a  o(<table>).  **.
8090: 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69    ** Return a si
80a0: 6e 67 6c 65 20 72 6f 77 20 66 6f 72 20 65 61 63  ngle row for eac
80b0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
80c0: 6e 61 6d 65 64 20 74 61 62 6c 65 2e 20 54 68 65  named table. The
80d0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a   columns of.  **
80e0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 64 61   the returned da
80f0: 74 61 20 73 65 74 20 61 72 65 3a 0a 20 20 2a 2a  ta set are:.  **
8100: 0a 20 20 2a 2a 20 63 69 64 3a 20 20 20 20 20 20  .  ** cid:      
8110: 20 20 43 6f 6c 75 6d 6e 20 69 64 20 28 6e 75 6d    Column id (num
8120: 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20  bered from left 
8130: 74 6f 20 72 69 67 68 74 2c 20 73 74 61 72 74 69  to right, starti
8140: 6e 67 20 61 74 20 30 29 0a 20 20 2a 2a 20 6e 61  ng at 0).  ** na
8150: 6d 65 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  me:       Column
8160: 20 6e 61 6d 65 0a 20 20 2a 2a 20 74 79 70 65 3a   name.  ** type:
8170: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 64 65         Column de
8180: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 2e 0a  claration type..
8190: 20 20 2a 2a 20 6e 6f 74 6e 75 6c 6c 3a 20 20 20    ** notnull:   
81a0: 20 54 72 75 65 20 69 66 20 27 4e 4f 54 20 4e 55   True if 'NOT NU
81b0: 4c 4c 27 20 69 73 20 70 61 72 74 20 6f 66 20 63  LL' is part of c
81c0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
81d0: 6e 0a 20 20 2a 2a 20 64 66 6c 74 5f 76 61 6c 75  n.  ** dflt_valu
81e0: 65 3a 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  e: The default v
81f0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  alue for the col
8200: 75 6d 6e 2c 20 69 66 20 61 6e 79 2e 0a 20 20 2a  umn, if any..  *
8210: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
8220: 5f 54 41 42 4c 45 5f 49 4e 46 4f 3a 20 69 66 28  _TABLE_INFO: if(
8230: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 54   zRight ){.    T
8240: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
8250: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
8260: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67  ndTable(db, zRig
8270: 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  ht, zDb);.    if
8280: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
8290: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
82a0: 72 20 2a 61 7a 43 6f 6c 5b 5d 20 3d 20 7b 0a 20  r *azCol[] = {. 
82b0: 20 20 20 20 20 20 20 20 22 63 69 64 22 2c 20 22          "cid", "
82c0: 6e 61 6d 65 22 2c 20 22 74 79 70 65 22 2c 20 22  name", "type", "
82d0: 6e 6f 74 6e 75 6c 6c 22 2c 20 22 64 66 6c 74 5f  notnull", "dflt_
82e0: 76 61 6c 75 65 22 2c 20 22 70 6b 22 0a 20 20 20  value", "pk".   
82f0: 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
8300: 69 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20  i, k;.      int 
8310: 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20 20  nHidden = 0;.   
8320: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b     Column *pCol;
8330: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50  .      Index *pP
8340: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
8350: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
8360: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
8370: 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20 20 20  nMem = 6;.      
8380: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
8390: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
83a0: 69 44 62 29 3b 0a 20 20 20 20 20 20 73 65 74 41  iDb);.      setA
83b0: 6c 6c 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c  llColumnNames(v,
83c0: 20 36 2c 20 61 7a 43 6f 6c 29 3b 20 61 73 73 65   6, azCol); asse
83d0: 72 74 28 20 36 3d 3d 41 72 72 61 79 53 69 7a 65  rt( 6==ArraySize
83e0: 28 61 7a 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  (azCol) );.     
83f0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
8400: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
8410: 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  e, pTab);.      
8420: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
8430: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
8440: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
8450: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  l++){.        if
8460: 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  ( IsHiddenColumn
8470: 28 70 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  (pCol) ){.      
8480: 20 20 20 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20      nHidden++;. 
8490: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
84a0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
84b0: 20 20 20 20 20 69 66 28 20 28 70 43 6f 6c 2d 3e       if( (pCol->
84c0: 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c  colFlags & COLFL
84d0: 41 47 5f 50 52 49 4d 4b 45 59 29 3d 3d 30 20 29  AG_PRIMKEY)==0 )
84e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20  {.          k = 
84f0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
8500: 20 69 66 28 20 70 50 6b 3d 3d 30 20 29 7b 0a 20   if( pPk==0 ){. 
8510: 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31 3b 0a           k = 1;.
8520: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8530: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31           for(k=1
8540: 3b 20 6b 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ; k<=pTab->nCol 
8550: 26 26 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  && pPk->aiColumn
8560: 5b 6b 2d 31 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d  [k-1]!=i; k++){}
8570: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8580: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
8590: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69  ltiLoad(v, 1, "i
85a0: 73 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20 20  ssisi",.        
85b0: 20 20 20 20 20 20 20 69 2d 6e 48 69 64 64 65 6e         i-nHidden
85c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
85d0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pCol->zName,.  
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
85f0: 6c 2d 3e 7a 54 79 70 65 20 3f 20 70 43 6f 6c 2d  l->zType ? pCol-
8600: 3e 7a 54 79 70 65 20 3a 20 22 22 2c 0a 20 20 20  >zType : "",.   
8610: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
8620: 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a 20  ->notNull ? 1 : 
8630: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
8640: 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 2c 0a 20    pCol->zDflt,. 
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 29                k)
8660: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8670: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8680: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
8690: 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  6);.      }.    
86a0: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
86b0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
86c0: 54 41 54 53 3a 20 7b 0a 20 20 20 20 73 74 61 74  TATS: {.    stat
86d0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
86e0: 7a 43 6f 6c 5b 5d 20 3d 20 7b 20 22 74 61 62 6c  zCol[] = { "tabl
86f0: 65 22 2c 20 22 69 6e 64 65 78 22 2c 20 22 77 69  e", "index", "wi
8700: 64 74 68 22 2c 20 22 68 65 69 67 68 74 22 20 7d  dth", "height" }
8710: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
8720: 78 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20  x;.    HashElem 
8730: 2a 69 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  *i;.    v = sqli
8740: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
8750: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
8760: 6e 4d 65 6d 20 3d 20 34 3b 0a 20 20 20 20 73 71  nMem = 4;.    sq
8770: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
8780: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
8790: 62 29 3b 0a 20 20 20 20 73 65 74 41 6c 6c 43 6f  b);.    setAllCo
87a0: 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 34 2c 20  lumnNames(v, 4, 
87b0: 61 7a 43 6f 6c 29 3b 20 20 61 73 73 65 72 74 28  azCol);  assert(
87c0: 20 34 3d 3d 41 72 72 61 79 53 69 7a 65 28 61 7a   4==ArraySize(az
87d0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  Col) );.    for(
87e0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
87f0: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
8800: 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d  >tblHash); i; i=
8810: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
8820: 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  )){.      Table 
8830: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
8840: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 20  shData(i);.     
8850: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
8860: 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 73 73 69  iLoad(v, 1, "ssi
8870: 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  i",.           p
8880: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
8890: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
88a0: 20 20 20 20 20 28 69 6e 74 29 73 71 6c 69 74 65       (int)sqlite
88b0: 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 54 61  3LogEstToInt(pTa
88c0: 62 2d 3e 73 7a 54 61 62 52 6f 77 29 2c 0a 20 20  b->szTabRow),.  
88d0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 73 71           (int)sq
88e0: 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
88f0: 28 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  (pTab->nRowLogEs
8900: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
8910: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8920: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
8930: 20 34 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   4);.      for(p
8940: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
8950: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
8960: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
8970: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
8980: 6c 74 69 4c 6f 61 64 28 76 2c 20 32 2c 20 22 73  ltiLoad(v, 2, "s
8990: 69 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ii",.           
89a0: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pIdx->zName,.   
89b0: 20 20 20 20 20 20 20 20 28 69 6e 74 29 73 71 6c          (int)sql
89c0: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
89d0: 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 29 2c  pIdx->szIdxRow),
89e0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74  .           (int
89f0: 29 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f  )sqlite3LogEstTo
8a00: 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c  Int(pIdx->aiRowL
8a10: 6f 67 45 73 74 5b 30 5d 29 29 3b 0a 20 20 20 20  ogEst[0]));.    
8a20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8a30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
8a40: 6c 74 52 6f 77 2c 20 31 2c 20 34 29 3b 0a 20 20  ltRow, 1, 4);.  
8a50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8a60: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61 73 65    break;..  case
8a70: 20 50 72 61 67 54 79 70 5f 49 4e 44 45 58 5f 49   PragTyp_INDEX_I
8a80: 4e 46 4f 3a 20 69 66 28 20 7a 52 69 67 68 74 20  NFO: if( zRight 
8a90: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
8aa0: 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
8ab0: 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20 3d 20  Tab;.    pIdx = 
8ac0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
8ad0: 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  (db, zRight, zDb
8ae0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
8af0: 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ){.      static 
8b00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f  const char *azCo
8b10: 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  l[] = {.        
8b20: 20 22 73 65 71 6e 6f 22 2c 20 22 63 69 64 22 2c   "seqno", "cid",
8b30: 20 22 6e 61 6d 65 22 2c 20 22 64 65 73 63 22 2c   "name", "desc",
8b40: 20 22 63 6f 6c 6c 22 2c 20 22 6b 65 79 22 0a 20   "coll", "key". 
8b50: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
8b60: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d  t i;.      int m
8b70: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  x;.      if( pPr
8b80: 61 67 6d 61 2d 3e 69 41 72 67 20 29 7b 0a 20 20  agma->iArg ){.  
8b90: 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
8ba0: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 28 6e 65 77  index_xinfo (new
8bb0: 65 72 20 76 65 72 73 69 6f 6e 20 77 69 74 68 20  er version with 
8bc0: 6d 6f 72 65 20 72 6f 77 73 20 61 6e 64 20 63 6f  more rows and co
8bd0: 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20 20 20 20 20  lumns) */.      
8be0: 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 43 6f    mx = pIdx->nCo
8bf0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 50  lumn;.        pP
8c00: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a  arse->nMem = 6;.
8c10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8c20: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
8c30: 6e 64 65 78 5f 69 6e 66 6f 20 28 6c 65 67 61 63  ndex_info (legac
8c40: 79 20 76 65 72 73 69 6f 6e 29 20 2a 2f 0a 20 20  y version) */.  
8c50: 20 20 20 20 20 20 6d 78 20 3d 20 70 49 64 78 2d        mx = pIdx-
8c60: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
8c70: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
8c80: 20 33 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   3;.      }.    
8c90: 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70    pTab = pIdx->p
8ca0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c  Table;.      sql
8cb0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
8cc0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
8cd0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8ce0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 41   pParse->nMem<=A
8cf0: 72 72 61 79 53 69 7a 65 28 61 7a 43 6f 6c 29 20  rraySize(azCol) 
8d00: 29 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 43  );.      setAllC
8d10: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 70 50  olumnNames(v, pP
8d20: 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 61 7a 43 6f  arse->nMem, azCo
8d30: 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  l);.      for(i=
8d40: 30 3b 20 69 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20  0; i<mx; i++){. 
8d50: 20 20 20 20 20 20 20 69 31 36 20 63 6e 75 6d 20         i16 cnum 
8d60: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
8d70: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  [i];.        sql
8d80: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
8d90: 64 28 76 2c 20 31 2c 20 22 69 69 73 22 2c 20 69  d(v, 1, "iis", i
8da0: 2c 20 63 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  , cnum,.        
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 20 20 20 20 63 6e 75 6d 3c 30 20 3f 20 30 20       cnum<0 ? 0 
8dd0: 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  : pTab->aCol[cnu
8de0: 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m].zName);.     
8df0: 20 20 20 69 66 28 20 70 50 72 61 67 6d 61 2d 3e     if( pPragma->
8e00: 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iArg ){.        
8e10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
8e20: 74 69 4c 6f 61 64 28 76 2c 20 34 2c 20 22 69 73  tiLoad(v, 4, "is
8e30: 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i",.            
8e40: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
8e50: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
8e60: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
8e70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 3c  ,.            i<
8e80: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a  pIdx->nKeyCol);.
8e90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8eb0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
8ec0: 52 6f 77 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  Row, 1, pParse->
8ed0: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nMem);.      }. 
8ee0: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
8ef0: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
8f00: 70 5f 49 4e 44 45 58 5f 4c 49 53 54 3a 20 69 66  p_INDEX_LIST: if
8f10: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
8f20: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
8f30: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
8f40: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 54 61    int i;.    pTa
8f50: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
8f60: 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c  able(db, zRight,
8f70: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
8f80: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 74 61  Tab ){.      sta
8f90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
8fa0: 61 7a 43 6f 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20  azCol[] = {.    
8fb0: 20 20 20 20 22 73 65 71 22 2c 20 22 6e 61 6d 65      "seq", "name
8fc0: 22 2c 20 22 75 6e 69 71 75 65 22 2c 20 22 6f 72  ", "unique", "or
8fd0: 69 67 69 6e 22 2c 20 22 70 61 72 74 69 61 6c 22  igin", "partial"
8fe0: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
8ff0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
9000: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
9010: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
9020: 20 35 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   5;.      sqlite
9030: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
9040: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
9050: 20 20 20 20 20 20 73 65 74 41 6c 6c 43 6f 6c 75        setAllColu
9060: 6d 6e 4e 61 6d 65 73 28 76 2c 20 35 2c 20 61 7a  mnNames(v, 5, az
9070: 43 6f 6c 29 3b 20 20 61 73 73 65 72 74 28 20 35  Col);  assert( 5
9080: 3d 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 43 6f  ==ArraySize(azCo
9090: 6c 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  l) );.      for(
90a0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
90b0: 78 2c 20 69 3d 30 3b 20 70 49 64 78 3b 20 70 49  x, i=0; pIdx; pI
90c0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
90d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
90e0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f 72 69 67  nst char *azOrig
90f0: 69 6e 5b 5d 20 3d 20 7b 20 22 63 22 2c 20 22 75  in[] = { "c", "u
9100: 22 2c 20 22 70 6b 22 20 7d 3b 0a 20 20 20 20 20  ", "pk" };.     
9110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
9120: 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69  ltiLoad(v, 1, "i
9130: 73 69 73 69 22 2c 0a 20 20 20 20 20 20 20 20 20  sisi",.         
9140: 20 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20    i,.           
9150: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pIdx->zName,.   
9160: 20 20 20 20 20 20 20 20 49 73 55 6e 69 71 75 65          IsUnique
9170: 49 6e 64 65 78 28 70 49 64 78 29 2c 0a 20 20 20  Index(pIdx),.   
9180: 20 20 20 20 20 20 20 20 61 7a 4f 72 69 67 69 6e          azOrigin
9190: 5b 70 49 64 78 2d 3e 69 64 78 54 79 70 65 5d 2c  [pIdx->idxType],
91a0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
91b0: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
91c0: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  =0);.        sql
91d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
91e0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
91f0: 31 2c 20 35 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 5);.      }. 
9200: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
9210: 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  ;..  case PragTy
9220: 70 5f 44 41 54 41 42 41 53 45 5f 4c 49 53 54 3a  p_DATABASE_LIST:
9230: 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
9240: 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 5b  nst char *azCol[
9250: 5d 20 3d 20 7b 20 22 73 65 71 22 2c 20 22 6e 61  ] = { "seq", "na
9260: 6d 65 22 2c 20 22 66 69 6c 65 22 20 7d 3b 0a 20  me", "file" };. 
9270: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 50     int i;.    pP
9280: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a  arse->nMem = 3;.
9290: 20 20 20 20 73 65 74 41 6c 6c 43 6f 6c 75 6d 6e      setAllColumn
92a0: 4e 61 6d 65 73 28 76 2c 20 33 2c 20 61 7a 43 6f  Names(v, 3, azCo
92b0: 6c 29 3b 20 61 73 73 65 72 74 28 20 33 3d 3d 41  l); assert( 3==A
92c0: 72 72 61 79 53 69 7a 65 28 61 7a 43 6f 6c 29 20  rraySize(azCol) 
92d0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
92e0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
92f0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
9300: 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 20 63  Db[i].pBt==0 ) c
9310: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
9320: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
9330: 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ].zName!=0 );.  
9340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9350: 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22  ultiLoad(v, 1, "
9360: 69 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 69  iss",.         i
9370: 2c 0a 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ,.         db->a
9380: 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20  Db[i].zName,.   
9390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
93a0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
93b0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a  ->aDb[i].pBt));.
93c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
93d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
93e0: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a  sultRow, 1, 3);.
93f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
9400: 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61 67 54  k;..  case PragT
9410: 79 70 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53  yp_COLLATION_LIS
9420: 54 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  T: {.    static 
9430: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f  const char *azCo
9440: 6c 5b 5d 20 3d 20 7b 20 22 73 65 71 22 2c 20 22  l[] = { "seq", "
9450: 6e 61 6d 65 22 20 7d 3b 0a 20 20 20 20 69 6e 74  name" };.    int
9460: 20 69 20 3d 20 30 3b 0a 20 20 20 20 48 61 73 68   i = 0;.    Hash
9470: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 70 50 61  Elem *p;.    pPa
9480: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20  rse->nMem = 2;. 
9490: 20 20 20 73 65 74 41 6c 6c 43 6f 6c 75 6d 6e 4e     setAllColumnN
94a0: 61 6d 65 73 28 76 2c 20 32 2c 20 61 7a 43 6f 6c  ames(v, 2, azCol
94b0: 29 3b 20 61 73 73 65 72 74 28 20 32 3d 3d 41 72  ); assert( 2==Ar
94c0: 72 61 79 53 69 7a 65 28 61 7a 43 6f 6c 29 20 29  raySize(azCol) )
94d0: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
94e0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
94f0: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 70 3b 20 70  >aCollSeq); p; p
9500: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9510: 70 29 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  p)){.      CollS
9520: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c  eq *pColl = (Col
9530: 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73  lSeq *)sqliteHas
9540: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
9550: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
9560: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 22 2c  Load(v, 1, "is",
9570: 20 69 2b 2b 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   i++, pColl->zNa
9580: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
9590: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
95a0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
95b0: 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   2);.    }.  }. 
95c0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f   break;.#endif /
95d0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43  * SQLITE_OMIT_SC
95e0: 48 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  HEMA_PRAGMAS */.
95f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9600: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
9610: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9620: 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 4c 49 53 54  FOREIGN_KEY_LIST
9630: 3a 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a  : if( zRight ){.
9640: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20      FKey *pFK;. 
9650: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
9660: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
9670: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
9680: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
9690: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
96a0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
96b0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
96c0: 20 20 20 20 20 20 70 46 4b 20 3d 20 70 54 61 62        pFK = pTab
96d0: 2d 3e 70 46 4b 65 79 3b 0a 20 20 20 20 20 20 69  ->pFKey;.      i
96e0: 66 28 20 70 46 4b 20 29 7b 0a 20 20 20 20 20 20  f( pFK ){.      
96f0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
9700: 68 61 72 20 2a 61 7a 43 6f 6c 5b 5d 20 3d 20 7b  har *azCol[] = {
9710: 0a 20 20 20 20 20 20 20 20 20 20 20 22 69 64 22  .           "id"
9720: 2c 20 22 73 65 71 22 2c 20 22 74 61 62 6c 65 22  , "seq", "table"
9730: 2c 20 22 66 72 6f 6d 22 2c 20 22 74 6f 22 2c 20  , "from", "to", 
9740: 22 6f 6e 5f 75 70 64 61 74 65 22 2c 20 22 6f 6e  "on_update", "on
9750: 5f 64 65 6c 65 74 65 22 2c 0a 20 20 20 20 20 20  _delete",.      
9760: 20 20 20 20 20 22 6d 61 74 63 68 22 0a 20 20 20       "match".   
9770: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
9780: 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20  int i = 0; .    
9790: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
97a0: 20 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 73 71   = 8;.        sq
97b0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
97c0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
97d0: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 65 74 41  b);.        setA
97e0: 6c 6c 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c  llColumnNames(v,
97f0: 20 38 2c 20 61 7a 43 6f 6c 29 3b 20 61 73 73 65   8, azCol); asse
9800: 72 74 28 20 38 3d 3d 41 72 72 61 79 53 69 7a 65  rt( 8==ArraySize
9810: 28 61 7a 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  (azCol) );.     
9820: 20 20 20 77 68 69 6c 65 28 70 46 4b 29 7b 0a 20     while(pFK){. 
9830: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
9840: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
9850: 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20  0; j<pFK->nCol; 
9860: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
9870: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c    sqlite3VdbeMul
9880: 74 69 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 69  tiLoad(v, 1, "ii
9890: 73 73 73 73 73 73 22 2c 0a 20 20 20 20 20 20 20  ssssss",.       
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 0a 20              i,. 
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20    j,.           
98d0: 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 7a 54 6f          pFK->zTo
98e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
98f0: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
9900: 70 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72  pFK->aCol[j].iFr
9910: 6f 6d 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  om].zName,.     
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
9930: 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c  K->aCol[j].zCol,
9940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9950: 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70      actionName(p
9960: 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 29 2c  FK->aAction[1]),
9970: 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 2a    /* ON UPDATE *
9980: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
9990: 20 20 20 20 20 61 63 74 69 6f 6e 4e 61 6d 65 28       actionName(
99a0: 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29  pFK->aAction[0])
99b0: 2c 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20  ,  /* ON DELETE 
99c0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
99d0: 20 20 20 20 20 20 22 4e 4f 4e 45 22 29 3b 0a 20        "NONE");. 
99e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
99f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9a00: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
9a10: 20 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   8);.          }
9a20: 0a 20 20 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a  .          ++i;.
9a30: 20 20 20 20 20 20 20 20 20 20 70 46 4b 20 3d 20            pFK = 
9a40: 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  pFK->pNextFrom;.
9a50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9a60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
9a70: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  eak;.#endif /* !
9a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9a90: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29  MIT_FOREIGN_KEY)
9aa0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
9ab0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
9ac0: 5f 4b 45 59 0a 23 69 66 6e 64 65 66 20 53 51 4c  _KEY.#ifndef SQL
9ad0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
9ae0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
9af0: 46 4f 52 45 49 47 4e 5f 4b 45 59 5f 43 48 45 43  FOREIGN_KEY_CHEC
9b00: 4b 3a 20 7b 0a 20 20 20 20 46 4b 65 79 20 2a 70  K: {.    FKey *p
9b10: 46 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  FK;             
9b20: 2f 2a 20 41 20 66 6f 72 65 69 67 6e 20 6b 65 79  /* A foreign key
9b30: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
9b40: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
9b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69            /* Chi
9b60: 6c 64 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ld table contain
9b70: 20 22 52 45 46 45 52 45 4e 43 45 53 22 20 6b 65   "REFERENCES" ke
9b80: 79 77 6f 72 64 20 2a 2f 0a 20 20 20 20 54 61 62  yword */.    Tab
9b90: 6c 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  le *pParent;    
9ba0: 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 61      /* Parent ta
9bb0: 62 6c 65 20 74 68 61 74 20 63 68 69 6c 64 20 70  ble that child p
9bc0: 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20  oints to */.    
9bd0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
9be0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9bf0: 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  in the parent ta
9c00: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ble */.    int i
9c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9c20: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9c30: 72 3a 20 20 46 6f 72 65 69 67 6e 20 6b 65 79 20  r:  Foreign key 
9c40: 6e 75 6d 62 65 72 20 66 6f 72 20 70 54 61 62 20  number for pTab 
9c50: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20  */.    int j;   
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c70: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20   Loop counter:  
9c80: 46 69 65 6c 64 20 6f 66 20 74 68 65 20 66 6f 72  Field of the for
9c90: 65 69 67 6e 20 6b 65 79 20 2a 2f 0a 20 20 20 20  eign key */.    
9ca0: 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
9cb0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
9cc0: 6f 75 6e 74 65 72 3a 20 20 4e 65 78 74 20 74 61  ounter:  Next ta
9cd0: 62 6c 65 20 69 6e 20 73 63 68 65 6d 61 20 2a 2f  ble in schema */
9ce0: 0a 20 20 20 20 69 6e 74 20 78 3b 20 20 20 20 20  .    int x;     
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
9d00: 65 73 75 6c 74 20 76 61 72 69 61 62 6c 65 20 2a  esult variable *
9d10: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 73  /.    int regRes
9d20: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ult;         /* 
9d30: 33 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  3 registers to h
9d40: 6f 6c 64 20 61 20 72 65 73 75 6c 74 20 72 6f 77  old a result row
9d50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4b   */.    int regK
9d60: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ey;            /
9d70: 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f  * Register to ho
9d80: 6c 64 20 6b 65 79 20 66 6f 72 20 63 68 65 63 6b  ld key for check
9d90: 69 6e 67 20 74 68 65 20 46 4b 20 2a 2f 0a 20 20  ing the FK */.  
9da0: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 20 20 20    int regRow;   
9db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
9dc0: 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20  sters to hold a 
9dd0: 72 6f 77 20 66 72 6f 6d 20 70 54 61 62 20 2a 2f  row from pTab */
9de0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70  .    int addrTop
9df0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
9e00: 6f 70 20 6f 66 20 61 20 6c 6f 6f 70 20 63 68 65  op of a loop che
9e10: 63 6b 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65  cking foreign ke
9e20: 79 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ys */.    int ad
9e30: 64 72 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20  drOk;           
9e40: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
9e50: 20 74 68 65 20 6b 65 79 20 69 73 20 4f 4b 20 2a   the key is OK *
9e60: 2f 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c  /.    int *aiCol
9e70: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
9e80: 63 68 69 6c 64 20 74 6f 20 70 61 72 65 6e 74 20  child to parent 
9e90: 63 6f 6c 75 6d 6e 20 6d 61 70 70 69 6e 67 20 2a  column mapping *
9ea0: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
9eb0: 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 5b 5d  st char *azCol[]
9ec0: 20 3d 20 7b 20 22 74 61 62 6c 65 22 2c 20 22 72   = { "table", "r
9ed0: 6f 77 69 64 22 2c 20 22 70 61 72 65 6e 74 22 2c  owid", "parent",
9ee0: 20 22 66 6b 69 64 22 20 7d 3b 0a 0a 20 20 20 20   "fkid" };..    
9ef0: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 50 61 72  regResult = pPar
9f00: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
9f10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
9f20: 34 3b 0a 20 20 20 20 72 65 67 4b 65 79 20 3d 20  4;.    regKey = 
9f30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
9f40: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 2b 2b 70      regRow = ++p
9f50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
9f60: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
9f70: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
9f80: 20 73 65 74 41 6c 6c 43 6f 6c 75 6d 6e 4e 61 6d   setAllColumnNam
9f90: 65 73 28 76 2c 20 34 2c 20 61 7a 43 6f 6c 29 3b  es(v, 4, azCol);
9fa0: 20 61 73 73 65 72 74 28 20 34 3d 3d 41 72 72 61   assert( 4==Arra
9fb0: 79 53 69 7a 65 28 61 7a 43 6f 6c 29 20 29 3b 0a  ySize(azCol) );.
9fc0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
9fd0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
9fe0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6b 20  se, iDb);.    k 
9ff0: 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  = sqliteHashFirs
a000: 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t(&db->aDb[iDb].
a010: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
a020: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 20  );.    while( k 
a030: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  ){.      if( zRi
a040: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ght ){.        p
a050: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
a060: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
a070: 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29   0, zRight, zDb)
a080: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b  ;.        k = 0;
a090: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a0a0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
a0b0: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
a0c0: 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20  ata(k);.        
a0d0: 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65  k = sqliteHashNe
a0e0: 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xt(k);.      }. 
a0f0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
a100: 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d   || pTab->pFKey=
a110: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
a120: 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
a130: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
a140: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
a150: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
a160: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
a170: 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50 61 72  nCol+regRow>pPar
a180: 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73  se->nMem ) pPars
a190: 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62 2d 3e  e->nMem = pTab->
a1a0: 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b 0a 20  nCol + regRow;. 
a1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
a1c0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
a1d0: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
a1e0: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
a1f0: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
a200: 74 72 69 6e 67 28 76 2c 20 72 65 67 52 65 73 75  tring(v, regResu
a210: 6c 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  lt, pTab->zName)
a220: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c  ;.      for(i=1,
a230: 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79   pFK=pTab->pFKey
a240: 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d  ; pFK; i++, pFK=
a250: 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pFK->pNextFrom){
a260: 0a 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74  .        pParent
a270: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
a280: 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f  ble(db, pFK->zTo
a290: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , zDb);.        
a2a0: 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29  if( pParent==0 )
a2b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a2c0: 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20     pIdx = 0;.   
a2d0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
a2e0: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
a2f0: 62 2c 20 70 50 61 72 65 6e 74 2d 3e 74 6e 75 6d  b, pParent->tnum
a300: 2c 20 30 2c 20 70 50 61 72 65 6e 74 2d 3e 7a 4e  , 0, pParent->zN
a310: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20  ame);.        x 
a320: 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74  = sqlite3FkLocat
a330: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
a340: 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49  Parent, pFK, &pI
a350: 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  dx, 0);.        
a360: 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20  if( x==0 ){.    
a370: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d        if( pIdx==
a380: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
a390: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
a3a0: 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 44 62  e(pParse, i, iDb
a3b0: 2c 20 70 50 61 72 65 6e 74 2c 20 4f 50 5f 4f 70  , pParent, OP_Op
a3c0: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 20  enRead);.       
a3d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a3e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a3f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
a400: 65 6e 52 65 61 64 2c 20 69 2c 20 70 49 64 78 2d  enRead, i, pIdx-
a410: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
a420: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a430: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
a440: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
a450: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a470: 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
a480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a4a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4b0: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70  rse->nErr>0 || p
a4c0: 46 4b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  FK==0 );.      i
a4d0: 66 28 20 70 46 4b 20 29 20 62 72 65 61 6b 3b 0a  f( pFK ) break;.
a4e0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
a4f0: 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50 61 72 73  ->nTab<i ) pPars
a500: 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a 20 20 20  e->nTab = i;.   
a510: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c     addrTop = sql
a520: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
a530: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30 29 3b  , OP_Rewind, 0);
a540: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a550: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c  ;.      for(i=1,
a560: 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b 65 79   pFK=pTab->pFKey
a570: 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d  ; pFK; i++, pFK=
a580: 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pFK->pNextFrom){
a590: 0a 20 20 20 20 20 20 20 20 70 50 61 72 65 6e 74  .        pParent
a5a0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
a5b0: 62 6c 65 28 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f  ble(db, pFK->zTo
a5c0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , zDb);.        
a5d0: 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  pIdx = 0;.      
a5e0: 20 20 61 69 43 6f 6c 73 20 3d 20 30 3b 0a 20 20    aiCols = 0;.  
a5f0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e        if( pParen
a600: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78  t ){.          x
a610: 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61   = sqlite3FkLoca
a620: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
a630: 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70  pParent, pFK, &p
a640: 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a 20  Idx, &aiCols);. 
a650: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
a660: 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   x==0 );.       
a670: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f   }.        addrO
a680: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
a690: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
a6a0: 20 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74       if( pParent
a6b0: 20 26 26 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20   && pIdx==0 ){. 
a6c0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4b 65           int iKe
a6d0: 79 20 3d 20 70 46 4b 2d 3e 61 43 6f 6c 5b 30 5d  y = pFK->aCol[0]
a6e0: 2e 69 46 72 6f 6d 3b 0a 20 20 20 20 20 20 20 20  .iFrom;.        
a6f0: 20 20 61 73 73 65 72 74 28 20 69 4b 65 79 3e 3d    assert( iKey>=
a700: 30 20 26 26 20 69 4b 65 79 3c 70 54 61 62 2d 3e  0 && iKey<pTab->
a710: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  nCol );.        
a720: 20 20 69 66 28 20 69 4b 65 79 21 3d 70 54 61 62    if( iKey!=pTab
a730: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
a740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a750: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
a760: 6f 6c 75 6d 6e 2c 20 30 2c 20 69 4b 65 79 2c 20  olumn, 0, iKey, 
a770: 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  regRow);.       
a780: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75       sqlite3Colu
a790: 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
a7a0: 62 2c 20 69 4b 65 79 2c 20 72 65 67 52 6f 77 29  b, iKey, regRow)
a7b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
a7c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a7d0: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
a7e0: 67 52 6f 77 2c 20 61 64 64 72 4f 6b 29 3b 20 56  gRow, addrOk); V
a7f0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a800: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a810: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a820: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
a830: 65 67 52 6f 77 2c 20 0a 20 20 20 20 20 20 20 20  egRow, .        
a840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a850: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
a860: 2b 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +3); VdbeCoverag
a870: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
a880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a890: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a8a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
a8b0: 2c 20 30 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  , 0, regRow);.  
a8c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a8d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a8e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
a8f0: 78 69 73 74 73 2c 20 69 2c 20 30 2c 20 72 65 67  xists, i, 0, reg
a900: 52 6f 77 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Row); VdbeCovera
a910: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
a920: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
a930: 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20  (v, addrOk);.   
a940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a950: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71  beJumpHere(v, sq
a960: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
a970: 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20  Addr(v)-2);.    
a980: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a990: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
a9a0: 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  pFK->nCol; j++){
a9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a9c0: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
a9d0: 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
a9e0: 70 54 61 62 2c 20 30 2c 0a 20 20 20 20 20 20 20  pTab, 0,.       
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 20 61 69 43 6f 6c 73 20 3f 20 61 69       aiCols ? ai
aa10: 43 6f 6c 73 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61  Cols[j] : pFK->a
aa20: 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 2c 20 72 65  Col[j].iFrom, re
aa30: 67 52 6f 77 2b 6a 29 3b 0a 20 20 20 20 20 20 20  gRow+j);.       
aa40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aa50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
aa60: 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a 2c 20 61  ull, regRow+j, a
aa70: 64 64 72 4f 6b 29 3b 20 56 64 62 65 43 6f 76 65  ddrOk); VdbeCove
aa80: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
aa90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
aaa0: 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
aab0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aac0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
aad0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
aae0: 67 52 6f 77 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c  gRow, pFK->nCol,
aaf0: 20 72 65 67 4b 65 79 2c 0a 20 20 20 20 20 20 20   regKey,.       
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e         sqlite3In
ab20: 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 64  dexAffinityStr(d
ab30: 62 2c 70 49 64 78 29 2c 20 70 46 4b 2d 3e 6e 43  b,pIdx), pFK->nC
ab40: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ol);.           
ab50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab60: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
ab70: 64 2c 20 69 2c 20 61 64 64 72 4f 6b 2c 20 72 65  d, i, addrOk, re
ab80: 67 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  gKey, 0);.      
ab90: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
aba0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
abb0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
abc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
abd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
abe0: 69 64 2c 20 30 2c 20 72 65 67 52 65 73 75 6c 74  id, 0, regResult
abf0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
ac00: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
ac10: 64 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2b 32  d(v, regResult+2
ac20: 2c 20 22 73 69 22 2c 20 70 46 4b 2d 3e 7a 54 6f  , "si", pFK->zTo
ac30: 2c 20 69 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , i-1);.        
ac40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ac50: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
ac60: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 34 29  w, regResult, 4)
ac70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ac80: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
ac90: 6c 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20  l(v, addrOk);.  
aca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
acb0: 72 65 65 28 64 62 2c 20 61 69 43 6f 6c 73 29 3b  ree(db, aiCols);
acc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
acd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ace0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20  (v, OP_Next, 0, 
acf0: 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65  addrTop+1); Vdbe
ad00: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
ad10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
ad20: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
ad30: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
ad40: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
ad50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ad60: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a  _OMIT_TRIGGER) *
ad70: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  /.#endif /* !def
ad80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ad90: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
ada0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
adb0: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
adc0: 50 41 52 53 45 52 5f 54 52 41 43 45 3a 20 7b 0a  PARSER_TRACE: {.
add0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
ade0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
adf0: 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  te3GetBoolean(zR
ae00: 69 67 68 74 2c 20 30 29 20 29 7b 0a 20 20 20 20  ight, 0) ){.    
ae10: 20 20 20 20 73 71 6c 69 74 65 33 50 61 72 73 65      sqlite3Parse
ae20: 72 54 72 61 63 65 28 73 74 64 65 72 72 2c 20 22  rTrace(stderr, "
ae30: 70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20  parser: ");.    
ae40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae50: 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 54 72   sqlite3ParserTr
ae60: 61 63 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 20  ace(0, 0);.     
ae70: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
ae80: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  reak;.#endif..  
ae90: 2f 2a 20 52 65 69 6e 73 74 61 6c 6c 20 74 68 65  /* Reinstall the
aea0: 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20 66   LIKE and GLOB f
aeb0: 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 76  unctions.  The v
aec0: 61 72 69 61 6e 74 20 6f 66 20 4c 49 4b 45 0a 20  ariant of LIKE. 
aed0: 20 2a 2a 20 75 73 65 64 20 77 69 6c 6c 20 62 65   ** used will be
aee0: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 20   case sensitive 
aef0: 6f 72 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67  or not depending
af00: 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   on the RHS..  *
af10: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
af20: 5f 43 41 53 45 5f 53 45 4e 53 49 54 49 56 45 5f  _CASE_SENSITIVE_
af30: 4c 49 4b 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  LIKE: {.    if( 
af40: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
af50: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c  sqlite3RegisterL
af60: 69 6b 65 46 75 6e 63 74 69 6f 6e 73 28 64 62 2c  ikeFunctions(db,
af70: 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
af80: 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 29 3b 0a  an(zRight, 0));.
af90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
afa0: 6b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  k;..#ifndef SQLI
afb0: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
afc0: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 0a 23 20 64  CK_ERROR_MAX.# d
afd0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54  efine SQLITE_INT
afe0: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
aff0: 4f 52 5f 4d 41 58 20 31 30 30 0a 23 65 6e 64 69  OR_MAX 100.#endi
b000: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
b010: 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
b020: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 50 72 61 67  _CHECK.  /* Prag
b030: 6d 61 20 22 71 75 69 63 6b 5f 63 68 65 63 6b 22  ma "quick_check"
b040: 20 69 73 20 72 65 64 75 63 65 64 20 76 65 72 73   is reduced vers
b050: 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 69 6e 74  ion of .  ** int
b060: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 64 65 73  egrity_check des
b070: 69 67 6e 65 64 20 74 6f 20 64 65 74 65 63 74 20  igned to detect 
b080: 6d 6f 73 74 20 64 61 74 61 62 61 73 65 20 63 6f  most database co
b090: 72 72 75 70 74 69 6f 6e 0a 20 20 2a 2a 20 77 69  rruption.  ** wi
b0a0: 74 68 6f 75 74 20 6d 6f 73 74 20 6f 66 20 74 68  thout most of th
b0b0: 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
b0c0: 66 75 6c 6c 20 69 6e 74 65 67 72 69 74 79 2d 63  full integrity-c
b0d0: 68 65 63 6b 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  heck..  */.  cas
b0e0: 65 20 50 72 61 67 54 79 70 5f 49 4e 54 45 47 52  e PragTyp_INTEGR
b0f0: 49 54 59 5f 43 48 45 43 4b 3a 20 7b 0a 20 20 20  ITY_CHECK: {.   
b100: 20 69 6e 74 20 69 2c 20 6a 2c 20 61 64 64 72 2c   int i, j, addr,
b110: 20 6d 78 45 72 72 3b 0a 0a 20 20 20 20 2f 2a 20   mxErr;..    /* 
b120: 43 6f 64 65 20 74 68 61 74 20 61 70 70 65 61 72  Code that appear
b130: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
b140: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 63 68  the integrity ch
b150: 65 63 6b 2e 20 20 49 66 20 6e 6f 20 65 72 72 6f  eck.  If no erro
b160: 72 0a 20 20 20 20 2a 2a 20 6d 65 73 73 61 67 65  r.    ** message
b170: 73 20 68 61 76 65 20 62 65 65 6e 20 67 65 6e 65  s have been gene
b180: 72 61 74 65 64 2c 20 6f 75 74 70 75 74 20 4f 4b  rated, output OK
b190: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 6f 75 74  .  Otherwise out
b1a0: 70 75 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  put the.    ** e
b1b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 20  rror message.   
b1c0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
b1d0: 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56  onst int iLn = V
b1e0: 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e  DBE_OFFSET_LINEN
b1f0: 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69 63  O(2);.    static
b200: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
b210: 74 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a  t endCode[] = {.
b220: 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d        { OP_AddIm
b230: 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20  m,      1, 0,   
b240: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30       0},    /* 0
b250: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49   */.      { OP_I
b260: 66 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 30  f,          1, 0
b270: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
b280: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
b290: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20  OP_String8,     
b2a0: 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
b2b0: 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20      /* 2 */.    
b2c0: 20 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77    { OP_ResultRow
b2d0: 2c 20 20 20 33 2c 20 31 2c 20 20 20 20 20 20 20  ,   3, 1,       
b2e0: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 0a 20 20 20   0},.    };..   
b2f0: 20 69 6e 74 20 69 73 51 75 69 63 6b 20 3d 20 28   int isQuick = (
b300: 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 7a  sqlite3Tolower(z
b310: 4c 65 66 74 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a  Left[0])=='q');.
b320: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
b330: 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 77 61  RAGMA command wa
b340: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 50  s of the form "P
b350: 52 41 47 4d 41 20 3c 64 62 3e 2e 69 6e 74 65 67  RAGMA <db>.integ
b360: 72 69 74 79 5f 63 68 65 63 6b 22 2c 0a 20 20 20  rity_check",.   
b370: 20 2a 2a 20 74 68 65 6e 20 69 44 62 20 69 73 20   ** then iDb is 
b380: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
b390: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
b3a0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 3c   identified by <
b3b0: 64 62 3e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  db>..    ** In t
b3c0: 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 69 6e  his case, the in
b3d0: 74 65 67 72 69 74 79 20 6f 66 20 64 61 74 61 62  tegrity of datab
b3e0: 61 73 65 20 69 44 62 20 6f 6e 6c 79 20 69 73 20  ase iDb only is 
b3f0: 76 65 72 69 66 69 65 64 20 62 79 0a 20 20 20 20  verified by.    
b400: 2a 2a 20 74 68 65 20 56 44 42 45 20 63 72 65 61  ** the VDBE crea
b410: 74 65 64 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ted below..    *
b420: 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69  *.    ** Otherwi
b430: 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6d 6d 61  se, if the comma
b440: 6e 64 20 77 61 73 20 73 69 6d 70 6c 79 20 22 50  nd was simply "P
b450: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
b460: 63 68 65 63 6b 22 20 28 6f 72 0a 20 20 20 20 2a  check" (or.    *
b470: 2a 20 22 50 52 41 47 4d 41 20 71 75 69 63 6b 5f  * "PRAGMA quick_
b480: 63 68 65 63 6b 22 29 2c 20 74 68 65 6e 20 69 44  check"), then iD
b490: 62 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 49  b is set to 0. I
b4a0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74  n this case, set
b4b0: 20 69 44 62 0a 20 20 20 20 2a 2a 20 74 6f 20 2d   iDb.    ** to -
b4c0: 31 20 68 65 72 65 2c 20 74 6f 20 69 6e 64 69 63  1 here, to indic
b4d0: 61 74 65 20 74 68 61 74 20 74 68 65 20 56 44 42  ate that the VDB
b4e0: 45 20 73 68 6f 75 6c 64 20 76 65 72 69 66 79 20  E should verify 
b4f0: 74 68 65 20 69 6e 74 65 67 72 69 74 79 0a 20 20  the integrity.  
b500: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 61 74 74 61    ** of all atta
b510: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e 20  ched databases. 
b520: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
b530: 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73  iDb>=0 );.    as
b540: 73 65 72 74 28 20 69 44 62 3d 3d 30 20 7c 7c 20  sert( iDb==0 || 
b550: 70 49 64 32 2d 3e 7a 20 29 3b 0a 20 20 20 20 69  pId2->z );.    i
b560: 66 28 20 70 49 64 32 2d 3e 7a 3d 3d 30 20 29 20  f( pId2->z==0 ) 
b570: 69 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f  iDb = -1;..    /
b580: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
b590: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 2a 2f   VDBE program */
b5a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
b5b0: 6d 20 3d 20 36 3b 0a 20 20 20 20 73 65 74 4f 6e  m = 6;.    setOn
b5c0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 28 76 2c 20 22  eColumnName(v, "
b5d0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22  integrity_check"
b5e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  );..    /* Set t
b5f0: 68 65 20 6d 61 78 69 6d 75 6d 20 65 72 72 6f 72  he maximum error
b600: 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 6d 78   count */.    mx
b610: 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  Err = SQLITE_INT
b620: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
b630: 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 69 66 28 20  OR_MAX;.    if( 
b640: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
b650: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
b660: 7a 52 69 67 68 74 2c 20 26 6d 78 45 72 72 29 3b  zRight, &mxErr);
b670: 0a 20 20 20 20 20 20 69 66 28 20 6d 78 45 72 72  .      if( mxErr
b680: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  <=0 ){.        m
b690: 78 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e  xErr = SQLITE_IN
b6a0: 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52  TEGRITY_CHECK_ER
b6b0: 52 4f 52 5f 4d 41 58 3b 0a 20 20 20 20 20 20 7d  ROR_MAX;.      }
b6c0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b6d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b6e0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 78 45 72  OP_Integer, mxEr
b6f0: 72 2c 20 31 29 3b 20 20 2f 2a 20 72 65 67 5b 31  r, 1);  /* reg[1
b700: 5d 20 68 6f 6c 64 73 20 65 72 72 6f 72 73 20 6c  ] holds errors l
b710: 65 66 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44  eft */..    /* D
b720: 6f 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63  o an integrity c
b730: 68 65 63 6b 20 6f 6e 20 65 61 63 68 20 64 61 74  heck on each dat
b740: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
b750: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
b760: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
b770: 20 20 48 61 73 68 45 6c 65 6d 20 2a 78 3b 0a 20    HashElem *x;. 
b780: 20 20 20 20 20 48 61 73 68 20 2a 70 54 62 6c 73       Hash *pTbls
b790: 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  ;.      int cnt 
b7a0: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
b7b0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
b7c0: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==1 ) continue;.
b7d0: 20 20 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30        if( iDb>=0
b7e0: 20 26 26 20 69 21 3d 69 44 62 20 29 20 63 6f 6e   && i!=iDb ) con
b7f0: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 73 71  tinue;..      sq
b800: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
b810: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29  chema(pParse, i)
b820: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
b830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b840: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31 29  (v, OP_IfPos, 1)
b850: 3b 20 2f 2a 20 48 61 6c 74 20 69 66 20 6f 75 74  ; /* Halt if out
b860: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
b870: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b880: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
b890: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b8a0: 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a  OP_Halt, 0, 0);.
b8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b8c0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b8d0: 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f  r);..      /* Do
b8e0: 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68   an integrity ch
b8f0: 65 63 6b 20 6f 66 20 74 68 65 20 42 2d 54 72 65  eck of the B-Tre
b900: 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  e.      **.     
b910: 20 2a 2a 20 42 65 67 69 6e 20 62 79 20 66 69 6c   ** Begin by fil
b920: 6c 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 32  ling registers 2
b930: 2c 20 33 2c 20 2e 2e 2e 20 77 69 74 68 20 74 68  , 3, ... with th
b940: 65 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d  e root pages num
b950: 62 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f  bers.      ** fo
b960: 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  r all tables and
b970: 20 69 6e 64 69 63 65 73 20 69 6e 20 74 68 65 20   indices in the 
b980: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
b990: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
b9a0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
b9b0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 2c 20 30  texHeld(db, i, 0
b9c0: 29 20 29 3b 0a 20 20 20 20 20 20 70 54 62 6c 73  ) );.      pTbls
b9d0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 70   = &db->aDb[i].p
b9e0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
b9f0: 0a 20 20 20 20 20 20 66 6f 72 28 78 3d 73 71 6c  .      for(x=sql
ba00: 69 74 65 48 61 73 68 46 69 72 73 74 28 70 54 62  iteHashFirst(pTb
ba10: 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65  ls); x; x=sqlite
ba20: 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20  HashNext(x)){.  
ba30: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
ba40: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
ba50: 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49  ta(x);.        I
ba60: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
ba70: 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
ba80: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
ba90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
baa0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bab0: 67 65 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  ger, pTab->tnum,
bac0: 20 32 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   2+cnt);.       
bad0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
bae0: 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a  v, "%s", pTab->z
baf0: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
bb00: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
bb10: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70   }.        for(p
bb20: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
bb30: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
bb40: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
bb50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bb60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
bb70: 65 67 65 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  eger, pIdx->tnum
bb80: 2c 20 32 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , 2+cnt);.      
bb90: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
bba0: 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
bbb0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
bbc0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
bbd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
bbe0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
bbf0: 73 75 66 66 69 63 69 65 6e 74 20 6e 75 6d 62 65  sufficient numbe
bc00: 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68  r of registers h
bc10: 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
bc20: 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72  ed */.      pPar
bc30: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 20  se->nMem = MAX( 
bc40: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 63 6e  pParse->nMem, cn
bc50: 74 2b 38 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  t+8 );..      /*
bc60: 20 44 6f 20 74 68 65 20 62 2d 74 72 65 65 20 69   Do the b-tree i
bc70: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 73 20  ntegrity checks 
bc80: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
bc90: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
bca0: 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 32 2c  _IntegrityCk, 2,
bcb0: 20 63 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20   cnt, 1);.      
bcc0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
bcd0: 65 50 35 28 76 2c 20 28 75 38 29 69 29 3b 0a 20  eP5(v, (u8)i);. 
bce0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
bcf0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
bd00: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 32 29 3b 20   OP_IsNull, 2); 
bd10: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
bd20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bd30: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
bd40: 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c  tring8, 0, 3, 0,
bd50: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
bd60: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2a 2a  3MPrintf(db, "**
bd70: 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 25 73  * in database %s
bd80: 20 2a 2a 2a 5c 6e 22 2c 20 64 62 2d 3e 61 44 62   ***\n", db->aDb
bd90: 5b 69 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  [i].zName),.    
bda0: 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29       P4_DYNAMIC)
bdb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bdc0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
bdd0: 4d 6f 76 65 2c 20 32 2c 20 34 2c 20 31 29 3b 0a  Move, 2, 4, 1);.
bde0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bdf0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
be00: 6e 63 61 74 2c 20 34 2c 20 33 2c 20 32 29 3b 0a  ncat, 4, 3, 2);.
be10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
be20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
be30: 73 75 6c 74 52 6f 77 2c 20 32 2c 20 31 29 3b 0a  sultRow, 2, 1);.
be40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
be50: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
be60: 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61  r);..      /* Ma
be70: 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
be80: 69 6e 64 69 63 65 73 20 61 72 65 20 63 6f 6e 73  indices are cons
be90: 74 72 75 63 74 65 64 20 63 6f 72 72 65 63 74 6c  tructed correctl
bea0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
beb0: 20 20 66 6f 72 28 78 3d 73 71 6c 69 74 65 48 61    for(x=sqliteHa
bec0: 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b 20  shFirst(pTbls); 
bed0: 78 20 26 26 20 21 69 73 51 75 69 63 6b 3b 20 78  x && !isQuick; x
bee0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
bef0: 78 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  x)){.        Tab
bf00: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
bf10: 65 48 61 73 68 44 61 74 61 28 78 29 3b 0a 20 20  eHashData(x);.  
bf20: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
bf30: 78 2c 20 2a 70 50 6b 3b 0a 20 20 20 20 20 20 20  x, *pPk;.       
bf40: 20 49 6e 64 65 78 20 2a 70 50 72 69 6f 72 20 3d   Index *pPrior =
bf50: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
bf60: 6c 6f 6f 70 54 6f 70 3b 0a 20 20 20 20 20 20 20  loopTop;.       
bf70: 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20 69   int iDataCur, i
bf80: 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
bf90: 69 6e 74 20 72 31 20 3d 20 2d 31 3b 0a 0a 20 20  int r1 = -1;..  
bfa0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
bfb0: 70 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f 6e 74  pIndex==0 ) cont
bfc0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 50  inue;.        pP
bfd0: 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54 61  k = HasRowid(pTa
bfe0: 62 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  b) ? 0 : sqlite3
bff0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
c000: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 61  pTab);.        a
c010: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c020: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
c030: 50 6f 73 2c 20 31 29 3b 20 20 2f 2a 20 53 74 6f  Pos, 1);  /* Sto
c040: 70 20 69 66 20 6f 75 74 20 6f 66 20 65 72 72 6f  p if out of erro
c050: 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64  rs */.        Vd
c060: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
c070: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c080: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48  beAddOp2(v, OP_H
c090: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  alt, 0, 0);.    
c0a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c0b0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
c0c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c0d0: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
c0e0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
c0f0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
c100: 65 41 6e 64 49 6e 64 69 63 65 73 28 70 50 61 72  eAndIndices(pPar
c110: 73 65 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  se, pTab, OP_Ope
c120: 6e 52 65 61 64 2c 20 30 2c 0a 20 20 20 20 20 20  nRead, 0,.      
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
c150: 30 2c 20 26 69 44 61 74 61 43 75 72 2c 20 26 69  0, &iDataCur, &i
c160: 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 20  IdxCur);.       
c170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c180: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
c190: 2c 20 30 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  , 0, 7);.       
c1a0: 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70   for(j=0, pIdx=p
c1b0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
c1c0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
c1d0: 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ext, j++){.     
c1e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c1f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c200: 65 67 65 72 2c 20 30 2c 20 38 2b 6a 29 3b 20 2f  eger, 0, 8+j); /
c210: 2a 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  * index entries 
c220: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
c230: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
c240: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28  rse->nMem = MAX(
c250: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 38 2b  pParse->nMem, 8+
c260: 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  j);.        sqli
c270: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c280: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44 61 74   OP_Rewind, iDat
c290: 61 43 75 72 2c 20 30 29 3b 20 56 64 62 65 43 6f  aCur, 0); VdbeCo
c2a0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
c2b0: 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73 71 6c     loopTop = sql
c2c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c2d0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 37 2c 20  , OP_AddImm, 7, 
c2e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56  1);.        /* V
c2f0: 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 4e  erify that all N
c300: 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
c310: 72 65 61 6c 6c 79 20 61 72 65 20 4e 4f 54 20 4e  really are NOT N
c320: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ULL */.        f
c330: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
c340: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
c350: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
c360: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
c370: 6a 6d 70 32 2c 20 6a 6d 70 33 3b 0a 20 20 20 20  jmp2, jmp3;.    
c380: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
c390: 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69  b->iPKey ) conti
c3a0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
c3b0: 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  f( pTab->aCol[j]
c3c0: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 63 6f  .notNull==0 ) co
c3d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
c3e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c3f0: 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
c400: 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61  e(v, pTab, iData
c410: 43 75 72 2c 20 6a 2c 20 33 29 3b 0a 20 20 20 20  Cur, j, 3);.    
c420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c430: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
c440: 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
c450: 20 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d            jmp2 =
c460: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c470: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
c480: 2c 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 3); VdbeCovera
c490: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
c4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c4b0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
c4c0: 20 31 2c 20 2d 31 29 3b 20 2f 2a 20 44 65 63 72   1, -1); /* Decr
c4d0: 65 6d 65 6e 74 20 65 72 72 6f 72 20 6c 69 6d 69  ement error limi
c4e0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a  t */.          z
c4f0: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Err = sqlite3MPr
c500: 69 6e 74 66 28 64 62 2c 20 22 4e 55 4c 4c 20 76  intf(db, "NULL v
c510: 61 6c 75 65 20 69 6e 20 25 73 2e 25 73 22 2c 20  alue in %s.%s", 
c520: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
c550: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[j].zName);
c560: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c570: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
c580: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33  OP_String8, 0, 3
c590: 2c 20 30 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  , 0, zErr, P4_DY
c5a0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
c5b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c5c0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
c5d0: 52 6f 77 2c 20 33 2c 20 31 29 3b 0a 20 20 20 20  Row, 3, 1);.    
c5e0: 20 20 20 20 20 20 6a 6d 70 33 20 3d 20 73 71 6c        jmp3 = sql
c5f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
c600: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31 29 3b 20  , OP_IfPos, 1); 
c610: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
c620: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c630: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
c640: 4f 50 5f 48 61 6c 74 29 3b 0a 20 20 20 20 20 20  OP_Halt);.      
c650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c660: 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 32 29  umpHere(v, jmp2)
c670: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c680: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c690: 76 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20 20 20  v, jmp3);.      
c6a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 56    }.        /* V
c6b0: 61 6c 69 64 61 74 65 20 69 6e 64 65 78 20 65 6e  alidate index en
c6c0: 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 63 75  tries for the cu
c6d0: 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20  rrent row */.   
c6e0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
c6f0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
c700: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
c710: 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20  ->pNext, j++){. 
c720: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70           int jmp
c730: 32 2c 20 6a 6d 70 33 2c 20 6a 6d 70 34 2c 20 6a  2, jmp3, jmp4, j
c740: 6d 70 35 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp5;.          i
c750: 6e 74 20 63 6b 55 6e 69 71 20 3d 20 73 71 6c 69  nt ckUniq = sqli
c760: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
c770: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (v);.          i
c780: 66 28 20 70 50 6b 3d 3d 70 49 64 78 20 29 20 63  f( pPk==pIdx ) c
c790: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
c7a0: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
c7b0: 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
c7c0: 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 44  pParse, pIdx, iD
c7d0: 61 74 61 43 75 72 2c 20 30 2c 20 30 2c 20 26 6a  ataCur, 0, 0, &j
c7e0: 6d 70 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mp3,.           
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
c810: 6f 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  or, r1);.       
c820: 20 20 20 70 50 72 69 6f 72 20 3d 20 70 49 64 78     pPrior = pIdx
c830: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c840: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c850: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 38 2b 6a 2c   OP_AddImm, 8+j,
c860: 20 31 29 3b 20 20 2f 2a 20 69 6e 63 72 65 6d 65   1);  /* increme
c870: 6e 74 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a  nt entry count *
c880: 2f 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  /.          /* V
c890: 65 72 69 66 79 20 74 68 61 74 20 61 6e 20 69 6e  erify that an in
c8a0: 64 65 78 20 65 6e 74 72 79 20 65 78 69 73 74 73  dex entry exists
c8b0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
c8c0: 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20   table row */.  
c8d0: 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d 20 73          jmp2 = s
c8e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
c8f0: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
c900: 20 69 49 64 78 43 75 72 2b 6a 2c 20 63 6b 55 6e   iIdxCur+j, ckUn
c910: 69 71 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20  iq, r1,.        
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
c940: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 20 56 64  dx->nColumn); Vd
c950: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
c960: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c970: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c980: 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b  _AddImm, 1, -1);
c990: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 65 72   /* Decrement er
c9a0: 72 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20  ror limit */.   
c9b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c9c0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
c9d0: 33 2c 20 22 72 6f 77 20 22 29 3b 0a 20 20 20 20  3, "row ");.    
c9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c9f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
ca00: 6e 63 61 74 2c 20 37 2c 20 33 2c 20 33 29 3b 0a  ncat, 7, 3, 3);.
ca10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ca20: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
ca30: 76 2c 20 34 2c 20 22 20 6d 69 73 73 69 6e 67 20  v, 4, " missing 
ca40: 66 72 6f 6d 20 69 6e 64 65 78 20 22 29 3b 0a 20  from index ");. 
ca50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ca60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ca70: 5f 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33  _Concat, 4, 3, 3
ca80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70  );.          jmp
ca90: 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4c  5 = sqlite3VdbeL
caa0: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20  oadString(v, 4, 
cab0: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
cac0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cad0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
cae0: 43 6f 6e 63 61 74 2c 20 34 2c 20 33 2c 20 33 29  Concat, 4, 3, 3)
caf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cb00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cb10: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 33   OP_ResultRow, 3
cb20: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
cb30: 6a 6d 70 34 20 3d 20 73 71 6c 69 74 65 33 56 64  jmp4 = sqlite3Vd
cb40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
cb50: 66 50 6f 73 2c 20 31 29 3b 20 56 64 62 65 43 6f  fPos, 1); VdbeCo
cb60: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
cb70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cb80: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c  AddOp0(v, OP_Hal
cb90: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
cba0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
cbb0: 65 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20  e(v, jmp2);.    
cbc0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49        /* For UNI
cbd0: 51 55 45 20 69 6e 64 65 78 65 73 2c 20 76 65 72  QUE indexes, ver
cbe0: 69 66 79 20 74 68 61 74 20 6f 6e 6c 79 20 6f 6e  ify that only on
cbf0: 65 20 65 6e 74 72 79 20 65 78 69 73 74 73 20 77  e entry exists w
cc00: 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 20 20  ith the.        
cc10: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 6b 65 79    ** current key
cc20: 2e 20 20 54 68 65 20 65 6e 74 72 79 20 69 73 20  .  The entry is 
cc30: 75 6e 69 71 75 65 20 69 66 20 28 31 29 20 61 6e  unique if (1) an
cc40: 79 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  y column is NULL
cc50: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
cc60: 20 28 32 29 20 74 68 65 20 6e 65 78 74 20 65 6e   (2) the next en
cc70: 74 72 79 20 68 61 73 20 61 20 64 69 66 66 65 72  try has a differ
cc80: 65 6e 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20  ent key */.     
cc90: 20 20 20 20 20 69 66 28 20 49 73 55 6e 69 71 75       if( IsUniqu
cca0: 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a  eIndex(pIdx) ){.
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
ccc0: 75 6e 69 71 4f 6b 20 3d 20 73 71 6c 69 74 65 33  uniqOk = sqlite3
ccd0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
cce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
ccf0: 74 20 6a 6d 70 36 3b 0a 20 20 20 20 20 20 20 20  t jmp6;.        
cd00: 20 20 20 20 69 6e 74 20 6b 6b 3b 0a 20 20 20 20      int kk;.    
cd10: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 6b 3d 30          for(kk=0
cd20: 3b 20 6b 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  ; kk<pIdx->nKeyC
cd30: 6f 6c 3b 20 6b 6b 2b 2b 29 7b 0a 20 20 20 20 20  ol; kk++){.     
cd40: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f           int iCo
cd50: 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
cd60: 6d 6e 5b 6b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  mn[kk];.        
cd70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
cd80: 6f 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20  ol!=XN_ROWID && 
cd90: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
cda0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
cdb0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
cdc0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cdd0: 2e 6e 6f 74 4e 75 6c 6c 20 29 20 63 6f 6e 74 69  .notNull ) conti
cde0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
cdf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ce00: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
ce10: 6c 2c 20 72 31 2b 6b 6b 2c 20 75 6e 69 71 4f 6b  l, r1+kk, uniqOk
ce20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ce30: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ce40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 36              jmp6
ce60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ce70: 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp1(v, OP_Next,
ce80: 20 69 49 64 78 43 75 72 2b 6a 29 3b 20 56 64 62   iIdxCur+j); Vdb
ce90: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
cea0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ceb0: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 75 6e 69  3VdbeGoto(v, uni
cec0: 71 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  qOk);.          
ced0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
cee0: 70 48 65 72 65 28 76 2c 20 6a 6d 70 36 29 3b 0a  pHere(v, jmp6);.
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
cf00: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
cf10: 28 76 2c 20 4f 50 5f 49 64 78 47 54 2c 20 69 49  (v, OP_IdxGT, iI
cf20: 64 78 43 75 72 2b 6a 2c 20 75 6e 69 71 4f 6b 2c  dxCur+j, uniqOk,
cf30: 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r1,.           
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 4b 65 79        pIdx->nKey
cf60: 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Col); VdbeCovera
cf70: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
cf80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf90: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
cfa0: 6d 2c 20 31 2c 20 2d 31 29 3b 20 2f 2a 20 44 65  m, 1, -1); /* De
cfb0: 63 72 65 6d 65 6e 74 20 65 72 72 6f 72 20 6c 69  crement error li
cfc0: 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  mit */.         
cfd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
cfe0: 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c 20 22  adString(v, 3, "
cff0: 6e 6f 6e 2d 75 6e 69 71 75 65 20 65 6e 74 72 79  non-unique entry
d000: 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a 20 20   in index ");.  
d010: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d020: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 6d 70  3VdbeGoto(v, jmp
d030: 35 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  5);.            
d040: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d050: 76 65 4c 61 62 65 6c 28 76 2c 20 75 6e 69 71 4f  veLabel(v, uniqO
d060: 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
d070: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d080: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
d090: 20 6a 6d 70 34 29 3b 0a 20 20 20 20 20 20 20 20   jmp4);.        
d0a0: 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
d0b0: 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61  PartIdxLabel(pPa
d0c0: 72 73 65 2c 20 6a 6d 70 33 29 3b 0a 20 20 20 20  rse, jmp3);.    
d0d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
d0e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d0f0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 44 61 74  v, OP_Next, iDat
d100: 61 43 75 72 2c 20 6c 6f 6f 70 54 6f 70 29 3b 20  aCur, loopTop); 
d110: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d120: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d130: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d140: 6c 6f 6f 70 54 6f 70 2d 31 29 3b 0a 23 69 66 6e  loopTop-1);.#ifn
d150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d160: 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20  BTREECOUNT.     
d170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
d180: 61 64 53 74 72 69 6e 67 28 76 2c 20 32 2c 20 22  adString(v, 2, "
d190: 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72 69  wrong # of entri
d1a0: 65 73 20 69 6e 20 69 6e 64 65 78 20 22 29 3b 0a  es in index ");.
d1b0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
d1c0: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
d1d0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
d1e0: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29  Idx->pNext, j++)
d1f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
d200: 70 50 6b 3d 3d 70 49 64 78 20 29 20 63 6f 6e 74  pPk==pIdx ) cont
d210: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
d220: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d230: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d240: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d250: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d260: 20 4f 50 5f 49 66 50 6f 73 2c 20 31 2c 20 61 64   OP_IfPos, 1, ad
d270: 64 72 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  dr+2); VdbeCover
d280: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
d290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d2a0: 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op2(v, OP_Halt, 
d2b0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
d2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d2d0: 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
d2e0: 69 49 64 78 43 75 72 2b 6a 2c 20 33 29 3b 0a 20  iIdxCur+j, 3);. 
d2f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d300: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d310: 5f 45 71 2c 20 38 2b 6a 2c 20 61 64 64 72 2b 38  _Eq, 8+j, addr+8
d320: 2c 20 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 3); VdbeCovera
d330: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
d340: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
d350: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
d360: 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  OTNULL);.       
d370: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d380: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
d390: 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20 20 20 20 20  m, 1, -1);.     
d3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d3b0: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 33 2c  LoadString(v, 3,
d3c0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pIdx->zName);. 
d3d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d3e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d3f0: 5f 43 6f 6e 63 61 74 2c 20 33 2c 20 32 2c 20 37  _Concat, 3, 2, 7
d400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d410: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d420: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
d430: 37 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  7, 1);.        }
d440: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d450: 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
d460: 54 20 2a 2f 0a 20 20 20 20 20 20 7d 20 0a 20 20  T */.      } .  
d470: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
d480: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
d490: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
d4a0: 28 65 6e 64 43 6f 64 65 29 2c 20 65 6e 64 43 6f  (endCode), endCo
d4b0: 64 65 2c 20 69 4c 6e 29 3b 0a 20 20 20 20 73 71  de, iLn);.    sq
d4c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d4d0: 32 28 76 2c 20 61 64 64 72 2c 20 2d 6d 78 45 72  2(v, addr, -mxEr
d4e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
d4f0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d500: 64 64 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  ddr+1);.    sqli
d510: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
d520: 76 2c 20 61 64 64 72 2b 32 2c 20 22 6f 6b 22 2c  v, addr+2, "ok",
d530: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P4_STATIC);.  }
d540: 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  .  break;.#endif
d550: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
d560: 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
d570: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
d580: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
d590: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
d5a0: 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20   encoding.  **  
d5b0: 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67   PRAGMA encoding
d5c0: 20 3d 20 22 75 74 66 2d 38 22 7c 22 75 74 66 2d   = "utf-8"|"utf-
d5d0: 31 36 22 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22  16"|"utf-16le"|"
d5e0: 75 74 66 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20  utf-16be".  **. 
d5f0: 20 2a 2a 20 49 6e 20 69 74 73 20 66 69 72 73 74   ** In its first
d600: 20 66 6f 72 6d 2c 20 74 68 69 73 20 70 72 61 67   form, this prag
d610: 6d 61 20 72 65 74 75 72 6e 73 20 74 68 65 20 65  ma returns the e
d620: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 6d  ncoding of the m
d630: 61 69 6e 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  ain.  ** databas
d640: 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e. If the databa
d650: 73 65 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  se is not initia
d660: 6c 69 7a 65 64 2c 20 69 74 20 69 73 20 69 6e 69  lized, it is ini
d670: 74 69 61 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20  tialized now..  
d680: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
d690: 6e 64 20 66 6f 72 6d 20 6f 66 20 74 68 69 73 20  nd form of this 
d6a0: 70 72 61 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f  pragma is a no-o
d6b0: 70 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61  p if the main da
d6c0: 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
d6d0: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
d6e0: 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
d6f0: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
d700: 69 74 20 73 65 74 73 20 74 68 65 20 64 65 66 61  it sets the defa
d710: 75 6c 74 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e  ult.  ** encodin
d720: 67 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  g that will be u
d730: 73 65 64 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  sed for the main
d740: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
d750: 66 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  f a new file.  *
d760: 2a 20 69 73 20 63 72 65 61 74 65 64 2e 20 49 66  * is created. If
d770: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 61 69   an existing mai
d780: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
d790: 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20  is opened, then 
d7a0: 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74  the.  ** default
d7b0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 66   text encoding f
d7c0: 6f 72 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  or the existing 
d7d0: 64 61 74 61 62 61 73 65 20 69 73 20 75 73 65 64  database is used
d7e0: 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20  ..  ** .  ** In 
d7f0: 61 6c 6c 20 63 61 73 65 73 20 6e 65 77 20 64 61  all cases new da
d800: 74 61 62 61 73 65 73 20 63 72 65 61 74 65 64 20  tabases created 
d810: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
d820: 20 63 6f 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a   command are.  *
d830: 2a 20 63 72 65 61 74 65 64 20 74 6f 20 75 73 65  * created to use
d840: 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c   the same defaul
d850: 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  t text encoding 
d860: 61 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  as the main data
d870: 62 61 73 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68  base. If.  ** th
d880: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
d890: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69  has not been ini
d8a0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20  tialized and/or 
d8b0: 63 72 65 61 74 65 64 20 77 68 65 6e 20 41 54 54  created when ATT
d8c0: 41 43 48 0a 20 20 2a 2a 20 69 73 20 65 78 65 63  ACH.  ** is exec
d8d0: 75 74 65 64 2c 20 74 68 69 73 20 69 73 20 64 6f  uted, this is do
d8e0: 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 41 54  ne before the AT
d8f0: 54 41 43 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  TACH operation..
d900: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65    **.  ** In the
d910: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69   second form thi
d920: 73 20 70 72 61 67 6d 61 20 73 65 74 73 20 74 68  s pragma sets th
d930: 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
d940: 74 6f 20 62 65 20 75 73 65 64 20 69 6e 0a 20 20  to be used in.  
d950: 2a 2a 20 6e 65 77 20 64 61 74 61 62 61 73 65 20  ** new database 
d960: 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 75 73  files created us
d970: 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73  ing this databas
d980: 65 20 68 61 6e 64 6c 65 2e 20 49 74 20 69 73 20  e handle. It is 
d990: 6f 6e 6c 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c  only.  ** useful
d9a0: 20 69 66 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65   if invoked imme
d9b0: 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68  diately after th
d9c0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
d9d0: 69 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  i.  */.  case Pr
d9e0: 61 67 54 79 70 5f 45 4e 43 4f 44 49 4e 47 3a 20  agTyp_ENCODING: 
d9f0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
da00: 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d  st struct EncNam
da10: 65 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e {.      char *
da20: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75 38 20  zName;.      u8 
da30: 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61  enc;.    } encna
da40: 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  mes[] = {.      
da50: 7b 20 22 55 54 46 38 22 2c 20 20 20 20 20 53 51  { "UTF8",     SQ
da60: 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20 20 20  LITE_UTF8       
da70: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46   },.      { "UTF
da80: 2d 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55  -8",    SQLITE_U
da90: 54 46 38 20 20 20 20 20 20 20 20 7d 2c 20 20 2f  TF8        },  /
daa0: 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e  * Must be elemen
dab0: 74 20 5b 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b  t [1] */.      {
dac0: 20 22 55 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c   "UTF-16le", SQL
dad0: 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20  ITE_UTF16LE     
dae0: 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65  },  /* Must be e
daf0: 6c 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20  lement [2] */.  
db00: 20 20 20 20 7b 20 22 55 54 46 2d 31 36 62 65 22      { "UTF-16be"
db10: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
db20: 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74       },  /* Must
db30: 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20   be element [3] 
db40: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  */.      { "UTF1
db50: 36 6c 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54  6le",  SQLITE_UT
db60: 46 31 36 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20  F16LE     },.   
db70: 20 20 20 7b 20 22 55 54 46 31 36 62 65 22 2c 20     { "UTF16be", 
db80: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
db90: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
dba0: 55 54 46 2d 31 36 22 2c 20 20 20 30 20 20 20 20  UTF-16",   0    
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
dbc0: 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   /* SQLITE_UTF16
dbd0: 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20  NATIVE */.      
dbe0: 7b 20 22 55 54 46 31 36 22 2c 20 20 20 20 30 20  { "UTF16",    0 
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54   }, /* SQLITE_UT
dc10: 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20  F16NATIVE */.   
dc20: 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
dc30: 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72  };.    const str
dc40: 75 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e  uct EncName *pEn
dc50: 63 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67  c;.    if( !zRig
dc60: 68 74 20 29 7b 20 20 20 20 2f 2a 20 22 50 52 41  ht ){    /* "PRA
dc70: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f  GMA encoding" */
dc80: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
dc90: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
dca0: 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67  rse) ) goto prag
dcb0: 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 61 73  ma_out;.      as
dcc0: 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53  sert( encnames[S
dcd0: 51 4c 49 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d  QLITE_UTF8].enc=
dce0: 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a  =SQLITE_UTF8 );.
dcf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
dd00: 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54  cnames[SQLITE_UT
dd10: 46 31 36 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49  F16LE].enc==SQLI
dd20: 54 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20  TE_UTF16LE );.  
dd30: 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e      assert( encn
dd40: 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31  ames[SQLITE_UTF1
dd50: 36 42 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45  6BE].enc==SQLITE
dd60: 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 20 20  _UTF16BE );.    
dd70: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 54 65    returnSingleTe
dd80: 78 74 28 76 2c 20 22 65 6e 63 6f 64 69 6e 67 22  xt(v, "encoding"
dd90: 2c 20 65 6e 63 6e 61 6d 65 73 5b 45 4e 43 28 70  , encnames[ENC(p
dda0: 50 61 72 73 65 2d 3e 64 62 29 5d 2e 7a 4e 61 6d  Parse->db)].zNam
ddb0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20  e);.    }else{  
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41        /* "PRAGMA
dde0: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58 22   encoding = XXX"
ddf0: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c   */.      /* Onl
de00: 79 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  y change the val
de10: 75 65 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e 63  ue of sqlite.enc
de20: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
de30: 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a 20   handle is not. 
de40: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
de50: 7a 65 64 2e 20 49 66 20 74 68 65 20 6d 61 69 6e  zed. If the main
de60: 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73   database exists
de70: 2c 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65  , the new sqlite
de80: 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20 20 20 20  .enc value.     
de90: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65 72   ** will be over
dea0: 77 72 69 74 74 65 6e 20 77 68 65 6e 20 74 68 65  written when the
deb0: 20 73 63 68 65 6d 61 20 69 73 20 6e 65 78 74 20   schema is next 
dec0: 6c 6f 61 64 65 64 2e 20 49 66 20 69 74 20 64 6f  loaded. If it do
ded0: 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  es not.      ** 
dee0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20  already exists, 
def0: 69 74 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74  it will be creat
df00: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65  ed to use the ne
df10: 77 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75 65  w encoding value
df20: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
df30: 20 69 66 28 20 0a 20 20 20 20 20 20 20 20 21 28   if( .        !(
df40: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
df50: 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
df60: 61 64 65 64 29 29 20 7c 7c 20 0a 20 20 20 20 20  aded)) || .     
df70: 20 20 20 44 62 48 61 73 50 72 6f 70 65 72 74 79     DbHasProperty
df80: 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74 79  (db, 0, DB_Empty
df90: 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
dfa0: 20 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e      for(pEnc=&en
dfb0: 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d  cnames[0]; pEnc-
dfc0: 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b  >zName; pEnc++){
dfd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30  .          if( 0
dfe0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
dff0: 28 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a  (zRight, pEnc->z
e000: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
e010: 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28       SCHEMA_ENC(
e020: 64 62 29 20 3d 20 45 4e 43 28 64 62 29 20 3d 0a  db) = ENC(db) =.
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 70 45 6e 63 2d 3e 65 6e 63 20 3f 20 70 45 6e 63  pEnc->enc ? pEnc
e050: 2d 3e 65 6e 63 20 3a 20 53 51 4c 49 54 45 5f 55  ->enc : SQLITE_U
e060: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
e070: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e080: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
e0a0: 20 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b   !pEnc->zName ){
e0b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e0c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e0d0: 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20  e, "unsupported 
e0e0: 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a  encoding: %s", z
e0f0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
e100: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
e110: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
e120: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e130: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66  IT_UTF16 */..#if
e140: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e150: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 5f  _SCHEMA_VERSION_
e160: 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a  PRAGMAS.  /*.  *
e170: 2a 20 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  *   PRAGMA [data
e180: 62 61 73 65 2e 5d 73 63 68 65 6d 61 5f 76 65 72  base.]schema_ver
e190: 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47  sion.  **   PRAG
e1a0: 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 73 63  MA [database.]sc
e1b0: 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 3c  hema_version = <
e1c0: 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20  integer>.  **.  
e1d0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 64 61 74  **   PRAGMA [dat
e1e0: 61 62 61 73 65 2e 5d 75 73 65 72 5f 76 65 72 73  abase.]user_vers
e1f0: 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ion.  **   PRAGM
e200: 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 75 73 65  A [database.]use
e210: 72 5f 76 65 72 73 69 6f 6e 20 3d 20 3c 69 6e 74  r_version = <int
e220: 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger>.  **.  ** 
e230: 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
e240: 73 65 2e 5d 66 72 65 65 6c 69 73 74 5f 63 6f 75  se.]freelist_cou
e250: 6e 74 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20  nt = <integer>. 
e260: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
e270: 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 61 70 70  A [database.]app
e280: 6c 69 63 61 74 69 6f 6e 5f 69 64 0a 20 20 2a 2a  lication_id.  **
e290: 20 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62     PRAGMA [datab
e2a0: 61 73 65 2e 5d 61 70 70 6c 69 63 61 74 69 6f 6e  ase.]application
e2b0: 5f 69 64 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a  _id = <integer>.
e2c0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 72    **.  ** The pr
e2d0: 61 67 6d 61 27 73 20 73 63 68 65 6d 61 5f 76 65  agma's schema_ve
e2e0: 72 73 69 6f 6e 20 61 6e 64 20 75 73 65 72 5f 76  rsion and user_v
e2f0: 65 72 73 69 6f 6e 20 61 72 65 20 75 73 65 64 20  ersion are used 
e300: 74 6f 20 73 65 74 20 6f 72 20 67 65 74 0a 20 20  to set or get.  
e310: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
e320: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
e330: 6f 6e 20 61 6e 64 20 75 73 65 72 2d 76 65 72 73  on and user-vers
e340: 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ion, respectivel
e350: 79 2e 20 42 6f 74 68 0a 20 20 2a 2a 20 74 68 65  y. Both.  ** the
e360: 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20   schema-version 
e370: 61 6e 64 20 74 68 65 20 75 73 65 72 2d 76 65 72  and the user-ver
e380: 73 69 6f 6e 20 61 72 65 20 33 32 2d 62 69 74 20  sion are 32-bit 
e390: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 0a  signed integers.
e3a0: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74    ** stored in t
e3b0: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
e3c0: 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
e3d0: 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20  e schema-cookie 
e3e0: 69 73 20 75 73 75 61 6c 6c 79 20 6f 6e 6c 79 20  is usually only 
e3f0: 6d 61 6e 69 70 75 6c 61 74 65 64 20 69 6e 74 65  manipulated inte
e400: 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65  rnally by SQLite
e410: 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 69 6e 63  . It.  ** is inc
e420: 72 65 6d 65 6e 74 65 64 20 62 79 20 53 51 4c 69  remented by SQLi
e430: 74 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  te whenever the 
e440: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
e450: 69 73 20 6d 6f 64 69 66 69 65 64 20 28 62 79 0a  is modified (by.
e460: 20 20 2a 2a 20 63 72 65 61 74 69 6e 67 20 6f 72    ** creating or
e470: 20 64 72 6f 70 70 69 6e 67 20 61 20 74 61 62 6c   dropping a tabl
e480: 65 20 6f 72 20 69 6e 64 65 78 29 2e 20 54 68 65  e or index). The
e490: 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20   schema version 
e4a0: 69 73 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  is used by.  ** 
e4b0: 53 51 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65  SQLite each time
e4c0: 20 61 20 71 75 65 72 79 20 69 73 20 65 78 65 63   a query is exec
e4d0: 75 74 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  uted to ensure t
e4e0: 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
e4f0: 20 63 61 63 68 65 0a 20 20 2a 2a 20 6f 66 20 74   cache.  ** of t
e500: 68 65 20 73 63 68 65 6d 61 20 75 73 65 64 20 77  he schema used w
e510: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68  hen compiling th
e520: 65 20 53 51 4c 20 71 75 65 72 79 20 6d 61 74 63  e SQL query matc
e530: 68 65 73 20 74 68 65 20 73 63 68 65 6d 61 20 6f  hes the schema o
e540: 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
e550: 61 73 65 20 61 67 61 69 6e 73 74 20 77 68 69 63  ase against whic
e560: 68 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 71  h the compiled q
e570: 75 65 72 79 20 69 73 20 61 63 74 75 61 6c 6c 79  uery is actually
e580: 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20   executed..  ** 
e590: 53 75 62 76 65 72 74 69 6e 67 20 74 68 69 73 20  Subverting this 
e5a0: 6d 65 63 68 61 6e 69 73 6d 20 62 79 20 75 73 69  mechanism by usi
e5b0: 6e 67 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d  ng "PRAGMA schem
e5c0: 61 5f 76 65 72 73 69 6f 6e 22 20 74 6f 20 6d 6f  a_version" to mo
e5d0: 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63  dify.  ** the sc
e5e0: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 69 73 20  hema-version is 
e5f0: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64 61 6e 67  potentially dang
e600: 65 72 6f 75 73 20 61 6e 64 20 6d 61 79 20 6c 65  erous and may le
e610: 61 64 20 74 6f 20 70 72 6f 67 72 61 6d 0a 20 20  ad to program.  
e620: 2a 2a 20 63 72 61 73 68 65 73 20 6f 72 20 64 61  ** crashes or da
e630: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
e640: 6e 2e 20 55 73 65 20 77 69 74 68 20 63 61 75 74  n. Use with caut
e650: 69 6f 6e 21 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ion!.  **.  ** T
e660: 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20  he user-version 
e670: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
e680: 72 6e 61 6c 6c 79 20 62 79 20 53 51 4c 69 74 65  rnally by SQLite
e690: 2e 20 49 74 20 6d 61 79 20 62 65 20 75 73 65 64  . It may be used
e6a0: 20 62 79 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61   by.  ** applica
e6b0: 74 69 6f 6e 73 20 66 6f 72 20 61 6e 79 20 70 75  tions for any pu
e6c0: 72 70 6f 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  rpose..  */.  ca
e6d0: 73 65 20 50 72 61 67 54 79 70 5f 48 45 41 44 45  se PragTyp_HEADE
e6e0: 52 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69  R_VALUE: {.    i
e6f0: 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 70 50 72  nt iCookie = pPr
e700: 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 2f 2a 20  agma->iArg;  /* 
e710: 57 68 69 63 68 20 63 6f 6f 6b 69 65 20 74 6f 20  Which cookie to 
e720: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 2a 2f  read or write */
e730: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e740: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
e750: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
e760: 74 20 26 26 20 28 70 50 72 61 67 6d 61 2d 3e 6d  t && (pPragma->m
e770: 50 72 61 67 46 6c 61 67 20 26 20 50 72 61 67 46  PragFlag & PragF
e780: 6c 61 67 5f 52 65 61 64 4f 6e 6c 79 29 3d 3d 30  lag_ReadOnly)==0
e790: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72 69   ){.      /* Wri
e7a0: 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
e7b0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
e7c0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
e7d0: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73  nst VdbeOpList s
e7e0: 65 74 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20  etCookie[] = {. 
e7f0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e         { OP_Tran
e800: 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20  saction,    0,  
e810: 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20  1,  0},    /* 0 
e820: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  */.        { OP_
e830: 49 6e 74 65 67 65 72 2c 20 20 20 20 20 20 20 20  Integer,        
e840: 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f  0,  1,  0},    /
e850: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  * 1 */.        {
e860: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 20   OP_SetCookie,  
e870: 20 20 20 20 30 2c 20 20 30 2c 20 20 31 7d 2c 20      0,  0,  1}, 
e880: 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20     /* 2 */.     
e890: 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   };.      int ad
e8a0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
e8b0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
e8c0: 61 79 53 69 7a 65 28 73 65 74 43 6f 6f 6b 69 65  aySize(setCookie
e8d0: 29 2c 20 73 65 74 43 6f 6f 6b 69 65 2c 20 30 29  ), setCookie, 0)
e8e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e8f0: 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 61  dbeChangeP1(v, a
e900: 64 64 72 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  ddr, iDb);.     
e910: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e920: 67 65 50 31 28 76 2c 20 61 64 64 72 2b 31 2c 20  geP1(v, addr+1, 
e930: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
e940: 68 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ht));.      sqli
e950: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
e960: 76 2c 20 61 64 64 72 2b 32 2c 20 69 44 62 29 3b  v, addr+2, iDb);
e970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e980: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
e990: 64 72 2b 32 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a  dr+2, iCookie);.
e9a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e9b0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 70 65   /* Read the spe
e9c0: 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61  cified cookie va
e9d0: 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  lue */.      sta
e9e0: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
e9f0: 4c 69 73 74 20 72 65 61 64 43 6f 6f 6b 69 65 5b  List readCookie[
ea00: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
ea10: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
ea20: 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20      0,  0,  0}, 
ea30: 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20     /* 0 */.     
ea40: 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b     { OP_ReadCook
ea50: 69 65 2c 20 20 20 20 20 20 30 2c 20 20 31 2c 20  ie,      0,  1, 
ea60: 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a   0},    /* 1 */.
ea70: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73          { OP_Res
ea80: 75 6c 74 52 6f 77 2c 20 20 20 20 20 20 20 31 2c  ultRow,       1,
ea90: 20 20 31 2c 20 20 30 7d 0a 20 20 20 20 20 20 7d    1,  0}.      }
eaa0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
eab0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
eac0: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
ead0: 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69 65 29  Size(readCookie)
eae0: 2c 20 72 65 61 64 43 6f 6f 6b 69 65 2c 20 30 29  , readCookie, 0)
eaf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
eb00: 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 61  dbeChangeP1(v, a
eb10: 64 64 72 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  ddr, iDb);.     
eb20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
eb30: 67 65 50 31 28 76 2c 20 61 64 64 72 2b 31 2c 20  geP1(v, addr+1, 
eb40: 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
eb50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
eb60: 76 2c 20 61 64 64 72 2b 31 2c 20 69 43 6f 6f 6b  v, addr+1, iCook
eb70: 69 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ie);.      sqlit
eb80: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
eb90: 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  (v, 1);.      sq
eba0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
ebb0: 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d  ame(v, 0, COLNAM
ebc0: 45 5f 4e 41 4d 45 2c 20 7a 4c 65 66 74 2c 20 53  E_NAME, zLeft, S
ebd0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
ebe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
ebf0: 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  eak;.#endif /* S
ec00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
ec10: 41 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41  A_VERSION_PRAGMA
ec20: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
ec30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
ec40: 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 20 20  EOPTION_DIAGS.  
ec50: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
ec60: 20 63 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f 6e 73   compile_options
ec70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
ec80: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  n the names of a
ec90: 6c 6c 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ll compile-time 
eca0: 6f 70 74 69 6f 6e 73 20 75 73 65 64 20 69 6e 20  options used in 
ecb0: 74 68 69 73 20 62 75 69 6c 64 2c 0a 20 20 2a 2a  this build,.  **
ecc0: 20 6f 6e 65 20 6f 70 74 69 6f 6e 20 70 65 72 20   one option per 
ecd0: 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  row..  */.  case
ece0: 20 50 72 61 67 54 79 70 5f 43 4f 4d 50 49 4c 45   PragTyp_COMPILE
ecf0: 5f 4f 50 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  _OPTIONS: {.    
ed00: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 63  int i = 0;.    c
ed10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b  onst char *zOpt;
ed20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
ed30: 6d 20 3d 20 31 3b 0a 20 20 20 20 73 65 74 4f 6e  m = 1;.    setOn
ed40: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 28 76 2c 20 22  eColumnName(v, "
ed50: 63 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f 6e 22 29  compile_option")
ed60: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4f  ;.    while( (zO
ed70: 70 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  pt = sqlite3_com
ed80: 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69  pileoption_get(i
ed90: 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ++))!=0 ){.     
eda0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
edb0: 53 74 72 69 6e 67 28 76 2c 20 31 2c 20 7a 4f 70  String(v, 1, zOp
edc0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
edd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ede0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20  P_ResultRow, 1, 
edf0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
ee00: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a  break;.#endif /*
ee10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
ee20: 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
ee30: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
ee40: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f  ITE_OMIT_WAL.  /
ee50: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
ee60: 5b 64 61 74 61 62 61 73 65 2e 5d 77 61 6c 5f 63  [database.]wal_c
ee70: 68 65 63 6b 70 6f 69 6e 74 20 3d 20 70 61 73 73  heckpoint = pass
ee80: 69 76 65 7c 66 75 6c 6c 7c 72 65 73 74 61 72 74  ive|full|restart
ee90: 7c 74 72 75 6e 63 61 74 65 0a 20 20 2a 2a 0a 20  |truncate.  **. 
eea0: 20 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 74   ** Checkpoint t
eeb0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
eec0: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
eed0: 5f 57 41 4c 5f 43 48 45 43 4b 50 4f 49 4e 54 3a  _WAL_CHECKPOINT:
eee0: 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
eef0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 5b  nst char *azCol[
ef00: 5d 20 3d 20 7b 20 22 62 75 73 79 22 2c 20 22 6c  ] = { "busy", "l
ef10: 6f 67 22 2c 20 22 63 68 65 63 6b 70 6f 69 6e 74  og", "checkpoint
ef20: 65 64 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69  ed" };.    int i
ef30: 42 74 20 3d 20 28 70 49 64 32 2d 3e 7a 3f 69 44  Bt = (pId2->z?iD
ef40: 62 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b:SQLITE_MAX_ATT
ef50: 41 43 48 45 44 29 3b 0a 20 20 20 20 69 6e 74 20  ACHED);.    int 
ef60: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
ef70: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
ef80: 45 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  E;.    if( zRigh
ef90: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
efa0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
efb0: 69 67 68 74 2c 20 22 66 75 6c 6c 22 29 3d 3d 30  ight, "full")==0
efc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
efd0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  e = SQLITE_CHECK
efe0: 50 4f 49 4e 54 5f 46 55 4c 4c 3b 0a 20 20 20 20  POINT_FULL;.    
eff0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
f000: 74 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68  te3StrICmp(zRigh
f010: 74 2c 20 22 72 65 73 74 61 72 74 22 29 3d 3d 30  t, "restart")==0
f020: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
f030: 65 20 3d 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  e = SQLITE_CHECK
f040: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3b 0a 20  POINT_RESTART;. 
f050: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
f060: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 52  qlite3StrICmp(zR
f070: 69 67 68 74 2c 20 22 74 72 75 6e 63 61 74 65 22  ight, "truncate"
f080: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f090: 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43  eMode = SQLITE_C
f0a0: 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
f0b0: 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
f0c0: 7d 0a 20 20 20 20 73 65 74 41 6c 6c 43 6f 6c 75  }.    setAllColu
f0d0: 6d 6e 4e 61 6d 65 73 28 76 2c 20 33 2c 20 61 7a  mnNames(v, 3, az
f0e0: 43 6f 6c 29 3b 20 20 61 73 73 65 72 74 28 20 33  Col);  assert( 3
f0f0: 3d 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 43 6f  ==ArraySize(azCo
f100: 6c 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  l) );.    pParse
f110: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
f120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f130: 33 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69  3(v, OP_Checkpoi
f140: 6e 74 2c 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20  nt, iBt, eMode, 
f150: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
f160: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f170: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29  ResultRow, 1, 3)
f180: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  ;.  }.  break;..
f190: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
f1a0: 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  MA wal_autocheck
f1b0: 70 6f 69 6e 74 0a 20 20 2a 2a 20 20 20 50 52 41  point.  **   PRA
f1c0: 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  GMA wal_autochec
f1d0: 6b 70 6f 69 6e 74 20 3d 20 4e 0a 20 20 2a 2a 0a  kpoint = N.  **.
f1e0: 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61    ** Configure a
f1f0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f200: 74 69 6f 6e 20 74 6f 20 61 75 74 6f 6d 61 74 69  tion to automati
f210: 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
f220: 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a   a database.  **
f230: 20 61 66 74 65 72 20 61 63 63 75 6d 75 6c 61 74   after accumulat
f240: 69 6e 67 20 4e 20 66 72 61 6d 65 73 20 69 6e 20  ing N frames in 
f250: 74 68 65 20 6c 6f 67 2e 20 4f 72 20 71 75 65 72  the log. Or quer
f260: 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
f270: 74 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20  t value.  ** of 
f280: 4e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  N..  */.  case P
f290: 72 61 67 54 79 70 5f 57 41 4c 5f 41 55 54 4f 43  ragTyp_WAL_AUTOC
f2a0: 48 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20  HECKPOINT: {.   
f2b0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
f2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c       sqlite3_wal
f2d0: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
f2e0: 64 62 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28  db, sqlite3Atoi(
f2f0: 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a  zRight));.    }.
f300: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
f310: 49 6e 74 28 76 2c 20 22 77 61 6c 5f 61 75 74 6f  Int(v, "wal_auto
f320: 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 0a 20 20  checkpoint", .  
f330: 20 20 20 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c       db->xWalCal
f340: 6c 62 61 63 6b 3d 3d 73 71 6c 69 74 65 33 57 61  lback==sqlite3Wa
f350: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 20 3f 20 0a  lDefaultHook ? .
f360: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
f370: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 64 62 2d  E_PTR_TO_INT(db-
f380: 3e 70 57 61 6c 41 72 67 29 20 3a 20 30 29 3b 0a  >pWalArg) : 0);.
f390: 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65 6e    }.  break;.#en
f3a0: 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  dif..  /*.  **  
f3b0: 50 52 41 47 4d 41 20 73 68 72 69 6e 6b 5f 6d 65  PRAGMA shrink_me
f3c0: 6d 6f 72 79 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  mory.  **.  ** I
f3d0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
f3e0: 3a 20 52 2d 32 33 34 34 35 2d 34 36 31 30 39 20  : R-23445-46109 
f3f0: 54 68 69 73 20 70 72 61 67 6d 61 20 63 61 75 73  This pragma caus
f400: 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
f410: 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20    ** connection 
f420: 6f 6e 20 77 68 69 63 68 20 69 74 20 69 73 20 69  on which it is i
f430: 6e 76 6f 6b 65 64 20 74 6f 20 66 72 65 65 20 75  nvoked to free u
f440: 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  p as much memory
f450: 20 61 73 20 69 74 0a 20 20 2a 2a 20 63 61 6e 2c   as it.  ** can,
f460: 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
f470: 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
f480: 65 6d 6f 72 79 28 29 2e 0a 20 20 2a 2f 0a 20 20  emory()..  */.  
f490: 63 61 73 65 20 50 72 61 67 54 79 70 5f 53 48 52  case PragTyp_SHR
f4a0: 49 4e 4b 5f 4d 45 4d 4f 52 59 3a 20 7b 0a 20 20  INK_MEMORY: {.  
f4b0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c    sqlite3_db_rel
f4c0: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b  ease_memory(db);
f4d0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
f4e0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
f4f0: 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74  GMA busy_timeout
f500: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62  .  **   PRAGMA b
f510: 75 73 79 5f 74 69 6d 65 6f 75 74 20 3d 20 4e 0a  usy_timeout = N.
f520: 20 20 2a 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20 73    **.  ** Call s
f530: 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
f540: 6f 75 74 28 64 62 2c 20 4e 29 2e 20 20 52 65 74  out(db, N).  Ret
f550: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
f560: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 0a 20 20  timeout value.  
f570: 2a 2a 20 69 66 20 6f 6e 65 20 69 73 20 73 65 74  ** if one is set
f580: 2e 20 20 49 66 20 6e 6f 20 62 75 73 79 20 68 61  .  If no busy ha
f590: 6e 64 6c 65 72 20 6f 72 20 61 20 64 69 66 66 65  ndler or a diffe
f5a0: 72 65 6e 74 20 62 75 73 79 20 68 61 6e 64 6c 65  rent busy handle
f5b0: 72 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 74 68  r is set.  ** th
f5c0: 65 6e 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  en 0 is returned
f5d0: 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 62  .  Setting the b
f5e0: 75 73 79 5f 74 69 6d 65 6f 75 74 20 74 6f 20 30  usy_timeout to 0
f5f0: 20 6f 72 20 6e 65 67 61 74 69 76 65 0a 20 20 2a   or negative.  *
f600: 2a 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 74  * disables the t
f610: 69 6d 65 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 2f  imeout..  */.  /
f620: 2a 63 61 73 65 20 50 72 61 67 54 79 70 5f 42 55  *case PragTyp_BU
f630: 53 59 5f 54 49 4d 45 4f 55 54 2a 2f 20 64 65 66  SY_TIMEOUT*/ def
f640: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 61 73 73 65  ault: {.    asse
f650: 72 74 28 20 70 50 72 61 67 6d 61 2d 3e 65 50 72  rt( pPragma->ePr
f660: 61 67 54 79 70 3d 3d 50 72 61 67 54 79 70 5f 42  agTyp==PragTyp_B
f670: 55 53 59 5f 54 49 4d 45 4f 55 54 20 29 3b 0a 20  USY_TIMEOUT );. 
f680: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
f690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
f6a0: 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20  usy_timeout(db, 
f6b0: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
f6c0: 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ht));.    }.    
f6d0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
f6e0: 76 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 64  v, "timeout",  d
f6f0: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 29 3b  b->busyTimeout);
f700: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
f710: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
f720: 47 4d 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69  GMA soft_heap_li
f730: 6d 69 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  mit.  **   PRAGM
f740: 41 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  A soft_heap_limi
f750: 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t = N.  **.  ** 
f760: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
f770: 46 3a 20 52 2d 32 36 33 34 33 2d 34 35 39 33 30  F: R-26343-45930
f780: 20 54 68 69 73 20 70 72 61 67 6d 61 20 69 6e 76   This pragma inv
f790: 6f 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 71  okes the.  ** sq
f7a0: 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
f7b0: 6c 69 6d 69 74 36 34 28 29 20 69 6e 74 65 72 66  limit64() interf
f7c0: 61 63 65 20 77 69 74 68 20 74 68 65 20 61 72 67  ace with the arg
f7d0: 75 6d 65 6e 74 20 4e 2c 20 69 66 20 4e 20 69 73  ument N, if N is
f7e0: 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
f7f0: 61 6e 64 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67  and is a non-neg
f800: 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20  ative integer.. 
f810: 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
f820: 4f 4e 2d 4f 46 3a 20 52 2d 36 34 34 35 31 2d 30  ON-OF: R-64451-0
f830: 37 31 36 33 20 54 68 65 20 73 6f 66 74 5f 68 65  7163 The soft_he
f840: 61 70 5f 6c 69 6d 69 74 20 70 72 61 67 6d 61 20  ap_limit pragma 
f850: 61 6c 77 61 79 73 0a 20 20 2a 2a 20 72 65 74 75  always.  ** retu
f860: 72 6e 73 20 74 68 65 20 73 61 6d 65 20 69 6e 74  rns the same int
f870: 65 67 65 72 20 74 68 61 74 20 77 6f 75 6c 64 20  eger that would 
f880: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
f890: 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  he.  ** sqlite3_
f8a0: 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
f8b0: 34 28 2d 31 29 20 43 2d 6c 61 6e 67 75 61 67 65  4(-1) C-language
f8c0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
f8d0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 53    case PragTyp_S
f8e0: 4f 46 54 5f 48 45 41 50 5f 4c 49 4d 49 54 3a 20  OFT_HEAP_LIMIT: 
f8f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
f900: 74 36 34 20 4e 3b 0a 20 20 20 20 69 66 28 20 7a  t64 N;.    if( z
f910: 52 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 33  Right && sqlite3
f920: 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
f930: 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54  ight, &N)==SQLIT
f940: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
f950: 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
f960: 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20 20 20  limit64(N);.    
f970: 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67  }.    returnSing
f980: 6c 65 49 6e 74 28 76 2c 20 22 73 6f 66 74 5f 68  leInt(v, "soft_h
f990: 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 73 71 6c  eap_limit",  sql
f9a0: 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
f9b0: 69 6d 69 74 36 34 28 2d 31 29 29 3b 0a 20 20 20  imit64(-1));.   
f9c0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
f9d0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
f9e0: 74 68 72 65 61 64 73 0a 20 20 2a 2a 20 20 20 50  threads.  **   P
f9f0: 52 41 47 4d 41 20 74 68 72 65 61 64 73 20 3d 20  RAGMA threads = 
fa00: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66  N.  **.  ** Conf
fa10: 69 67 75 72 65 20 74 68 65 20 6d 61 78 69 6d 75  igure the maximu
fa20: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b  m number of work
fa30: 65 72 20 74 68 72 65 61 64 73 2e 20 20 52 65 74  er threads.  Ret
fa40: 75 72 6e 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  urn the new.  **
fa50: 20 6d 61 78 69 6d 75 6d 2c 20 77 68 69 63 68 20   maximum, which 
fa60: 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68  might be less th
fa70: 61 6e 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  an requested..  
fa80: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
fa90: 70 5f 54 48 52 45 41 44 53 3a 20 7b 0a 20 20 20  p_THREADS: {.   
faa0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e   sqlite3_int64 N
fab0: 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74  ;.    if( zRight
fac0: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
fad0: 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 52  DecOrHexToI64(zR
fae0: 69 67 68 74 2c 20 26 4e 29 3d 3d 53 51 4c 49 54  ight, &N)==SQLIT
faf0: 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 4e 3e 3d  E_OK.     && N>=
fb00: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  0.    ){.      s
fb10: 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c  qlite3_limit(db,
fb20: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
fb30: 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 28 69  RKER_THREADS, (i
fb40: 6e 74 29 28 4e 26 30 78 37 66 66 66 66 66 66 66  nt)(N&0x7fffffff
fb50: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ));.    }.    re
fb60: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c  turnSingleInt(v,
fb70: 20 22 74 68 72 65 61 64 73 22 2c 0a 20 20 20 20   "threads",.    
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb90: 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62  sqlite3_limit(db
fba0: 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  , SQLITE_LIMIT_W
fbb0: 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 20 2d  ORKER_THREADS, -
fbc0: 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  1));.    break;.
fbd0: 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
fbe0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
fbf0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
fc00: 5f 54 45 53 54 29 0a 20 20 2f 2a 0a 20 20 2a 2a  _TEST).  /*.  **
fc10: 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
fc20: 65 6e 74 20 73 74 61 74 65 20 6f 66 20 66 69 6c  ent state of fil
fc30: 65 20 6c 6f 67 73 20 66 6f 72 20 61 6c 6c 20 64  e logs for all d
fc40: 61 74 61 62 61 73 65 73 0a 20 20 2a 2f 0a 20 20  atabases.  */.  
fc50: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4c 4f 43  case PragTyp_LOC
fc60: 4b 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  K_STATUS: {.    
fc70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
fc80: 72 20 2a 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e  r *const azLockN
fc90: 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ame[] = {.      
fca0: 22 75 6e 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61  "unlocked", "sha
fcb0: 72 65 64 22 2c 20 22 72 65 73 65 72 76 65 64 22  red", "reserved"
fcc0: 2c 20 22 70 65 6e 64 69 6e 67 22 2c 20 22 65 78  , "pending", "ex
fcd0: 63 6c 75 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a  clusive".    };.
fce0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
fcf0: 20 63 68 61 72 20 2a 61 7a 43 6f 6c 5b 5d 20 3d   char *azCol[] =
fd00: 20 7b 20 22 64 61 74 61 62 61 73 65 22 2c 20 22   { "database", "
fd10: 73 74 61 74 75 73 22 20 7d 3b 0a 20 20 20 20 69  status" };.    i
fd20: 6e 74 20 69 3b 0a 20 20 20 20 73 65 74 41 6c 6c  nt i;.    setAll
fd30: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 32  ColumnNames(v, 2
fd40: 2c 20 61 7a 43 6f 6c 29 3b 20 61 73 73 65 72 74  , azCol); assert
fd50: 28 20 32 3d 3d 41 72 72 61 79 53 69 7a 65 28 61  ( 2==ArraySize(a
fd60: 7a 43 6f 6c 29 20 29 3b 0a 20 20 20 20 70 50 61  zCol) );.    pPa
fd70: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20  rse->nMem = 2;. 
fd80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
fd90: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
fda0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20     Btree *pBt;. 
fdb0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
fdc0: 2a 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e 6f  *zState = "unkno
fdd0: 77 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  wn";.      int j
fde0: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
fdf0: 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  aDb[i].zName==0 
fe00: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fe10: 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b    pBt = db->aDb[
fe20: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
fe30: 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  ( pBt==0 || sqli
fe40: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
fe50: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
fe60: 20 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f 73 65   zState = "close
fe70: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  d";.      }else 
fe80: 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  if( sqlite3_file
fe90: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f  _control(db, i ?
fea0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d   db->aDb[i].zNam
feb0: 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20 20 20  e : 0, .        
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
fee0: 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
fef0: 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54 45  ATE, &j)==SQLITE
ff00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
ff10: 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e  zState = azLockN
ff20: 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  ame[j];.      }.
ff30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff40: 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c 20 31 2c  eMultiLoad(v, 1,
ff50: 20 22 73 73 22 2c 20 64 62 2d 3e 61 44 62 5b 69   "ss", db->aDb[i
ff60: 5d 2e 7a 4e 61 6d 65 2c 20 7a 53 74 61 74 65 29  ].zName, zState)
ff70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ff80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ff90: 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 32 29  ResultRow, 1, 2)
ffa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
ffb0: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  k;.  }.#endif..#
ffc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
ffd0: 5f 43 4f 44 45 43 0a 20 20 63 61 73 65 20 50 72  _CODEC.  case Pr
ffe0: 61 67 54 79 70 5f 4b 45 59 3a 20 7b 0a 20 20 20  agTyp_KEY: {.   
fff0: 20 69 66 28 20 7a 52 69 67 68 74 20 29 20 73 71   if( zRight ) sq
10000 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
10010 20 7a 44 62 2c 20 7a 52 69 67 68 74 2c 20 73 71   zDb, zRight, sq
10020 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52  lite3Strlen30(zR
10030 69 67 68 74 29 29 3b 0a 20 20 20 20 62 72 65 61  ight));.    brea
10040 6b 3b 0a 20 20 7d 0a 20 20 63 61 73 65 20 50 72  k;.  }.  case Pr
10050 61 67 54 79 70 5f 52 45 4b 45 59 3a 20 7b 0a 20  agTyp_REKEY: {. 
10060 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 20     if( zRight ) 
10070 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32  sqlite3_rekey_v2
10080 28 64 62 2c 20 7a 44 62 2c 20 7a 52 69 67 68 74  (db, zDb, zRight
10090 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
100a0 30 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20  0(zRight));.    
100b0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 63 61 73  break;.  }.  cas
100c0 65 20 50 72 61 67 54 79 70 5f 48 45 58 4b 45 59  e PragTyp_HEXKEY
100d0 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
100e0 68 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 69  ht ){.      u8 i
100f0 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Byte;.      int 
10100 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4b  i;.      char zK
10110 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f  ey[40];.      fo
10120 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20  r(i=0, iByte=0; 
10130 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a 32  i<sizeof(zKey)*2
10140 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
10150 67 69 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 20  git(zRight[i]); 
10160 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 42  i++){.        iB
10170 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29  yte = (iByte<<4)
10180 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49   + sqlite3HexToI
10190 6e 74 28 7a 52 69 67 68 74 5b 69 5d 29 3b 0a 20  nt(zRight[i]);. 
101a0 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29         if( (i&1)
101b0 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20  !=0 ) zKey[i/2] 
101c0 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  = iByte;.      }
101d0 0a 20 20 20 20 20 20 69 66 28 20 28 7a 4c 65 66  .      if( (zLef
101e0 74 5b 33 5d 20 26 20 30 78 66 29 3d 3d 30 78 62  t[3] & 0xf)==0xb
101f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10200 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a  te3_key_v2(db, z
10210 44 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a  Db, zKey, i/2);.
10220 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10230 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6b       sqlite3_rek
10240 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
10250 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20  Key, i/2);.     
10260 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
10270 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ak;.  }.#endif.#
10280 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
10290 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20  E_HAS_CODEC) || 
102a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
102b0 4e 41 42 4c 45 5f 43 45 52 4f 44 29 0a 20 20 63  NABLE_CEROD).  c
102c0 61 73 65 20 50 72 61 67 54 79 70 5f 41 43 54 49  ase PragTyp_ACTI
102d0 56 41 54 45 5f 45 58 54 45 4e 53 49 4f 4e 53 3a  VATE_EXTENSIONS:
102e0 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 23   if( zRight ){.#
102f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
10300 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 73  _CODEC.    if( s
10310 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
10320 52 69 67 68 74 2c 20 22 73 65 65 2d 22 2c 20 34  Right, "see-", 4
10330 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
10340 6c 69 74 65 33 5f 61 63 74 69 76 61 74 65 5f 73  lite3_activate_s
10350 65 65 28 26 7a 52 69 67 68 74 5b 34 5d 29 3b 0a  ee(&zRight[4]);.
10360 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
10370 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10380 45 5f 43 45 52 4f 44 0a 20 20 20 20 69 66 28 20  E_CEROD.    if( 
10390 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
103a0 7a 52 69 67 68 74 2c 20 22 63 65 72 6f 64 2d 22  zRight, "cerod-"
103b0 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 6)==0 ){.     
103c0 20 73 71 6c 69 74 65 33 5f 61 63 74 69 76 61 74   sqlite3_activat
103d0 65 5f 63 65 72 6f 64 28 26 7a 52 69 67 68 74 5b  e_cerod(&zRight[
103e0 36 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  6]);.    }.#endi
103f0 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23  f.  }.  break;.#
10400 65 6e 64 69 66 0a 0a 20 20 7d 20 2f 2a 20 45 6e  endif..  } /* En
10410 64 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  d of the PRAGMA 
10420 73 77 69 74 63 68 20 2a 2f 0a 0a 70 72 61 67 6d  switch */..pragm
10430 61 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  a_out:.  sqlite3
10440 44 62 46 72 65 65 28 64 62 2c 20 7a 4c 65 66 74  DbFree(db, zLeft
10450 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
10460 65 65 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a  ee(db, zRight);.
10470 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
10480 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20  ITE_OMIT_PRAGMA 
10490 2a 2f 0a                                         */.