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

Artifact f66e2d2d2132373af398c452aac012347fb2adfb:


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 77 68  S_MASK );.    wh
1b50: 69 6c 65 28 20 28 6e 2d 2d 29 20 3e 20 30 20 29  ile( (n--) > 0 )
1b60: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
1b70: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
1b80: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1b90: 61 67 65 72 46 6c 61 67 73 28 70 44 62 2d 3e 70  agerFlags(pDb->p
1ba0: 42 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt,.            
1bb0: 20 20 20 20 20 28 70 44 62 2d 3e 73 61 66 65 74       (pDb->safet
1bc0: 79 5f 6c 65 76 65 6c 20 26 20 50 41 47 45 52 5f  y_level & PAGER_
1bd0: 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
1be0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1bf0: 20 20 20 20 20 7c 20 28 64 62 2d 3e 66 6c 61 67       | (db->flag
1c00: 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f  s & PAGER_FLAGS_
1c10: 4d 41 53 4b 29 20 29 3b 0a 20 20 20 20 20 20 7d  MASK) );.      }
1c20: 0a 20 20 20 20 20 20 70 44 62 2b 2b 3b 0a 20 20  .      pDb++;.  
1c30: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
1c40: 23 20 64 65 66 69 6e 65 20 73 65 74 41 6c 6c 50  # define setAllP
1c50: 61 67 65 72 46 6c 61 67 73 28 58 29 20 20 2f 2a  agerFlags(X)  /*
1c60: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   no-op */.#endif
1c70: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
1c80: 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
1c90: 20 6e 61 6d 65 20 66 6f 72 20 61 20 63 6f 6e 73   name for a cons
1ca0: 74 72 61 69 6e 74 20 72 65 73 6f 6c 75 74 69 6f  traint resolutio
1cb0: 6e 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  n action..*/.#if
1cc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cd0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 73 74 61  _FOREIGN_KEY.sta
1ce0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1cf0: 61 63 74 69 6f 6e 4e 61 6d 65 28 75 38 20 61 63  actionName(u8 ac
1d00: 74 69 6f 6e 29 7b 0a 20 20 63 6f 6e 73 74 20 63  tion){.  const c
1d10: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77  har *zName;.  sw
1d20: 69 74 63 68 28 20 61 63 74 69 6f 6e 20 29 7b 0a  itch( action ){.
1d30: 20 20 20 20 63 61 73 65 20 4f 45 5f 53 65 74 4e      case OE_SetN
1d40: 75 6c 6c 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ull:  zName = "S
1d50: 45 54 20 4e 55 4c 4c 22 3b 20 20 20 20 20 20 20  ET NULL";       
1d60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1d70: 20 4f 45 5f 53 65 74 44 66 6c 74 3a 20 20 7a 4e   OE_SetDflt:  zN
1d80: 61 6d 65 20 3d 20 22 53 45 54 20 44 45 46 41 55  ame = "SET DEFAU
1d90: 4c 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  LT";     break;.
1da0: 20 20 20 20 63 61 73 65 20 4f 45 5f 43 61 73 63      case OE_Casc
1db0: 61 64 65 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 43  ade:  zName = "C
1dc0: 41 53 43 41 44 45 22 3b 20 20 20 20 20 20 20 20  ASCADE";        
1dd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1de0: 20 4f 45 5f 52 65 73 74 72 69 63 74 3a 20 7a 4e   OE_Restrict: zN
1df0: 61 6d 65 20 3d 20 22 52 45 53 54 52 49 43 54 22  ame = "RESTRICT"
1e00: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
1e10: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
1e20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 4e        zName = "N
1e30: 4f 20 41 43 54 49 4f 4e 22 3b 20 20 0a 20 20 20  O ACTION";  .   
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 61 73 73 65 72 74 28 20 61 63 74 69 6f     assert( actio
1e60: 6e 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 20 62 72  n==OE_None ); br
1e70: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
1e80: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
1e90: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  f.../*.** Parame
1ea0: 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
1eb0: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 50 41 47  e one of the PAG
1ec0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58  ER_JOURNALMODE_X
1ed0: 58 58 20 63 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20  XX constants.** 
1ee0: 64 65 66 69 6e 65 64 20 69 6e 20 70 61 67 65 72  defined in pager
1ef0: 2e 68 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .h. This functio
1f00: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 61 73  n returns the as
1f10: 73 6f 63 69 61 74 65 64 20 6c 6f 77 65 72 63 61  sociated lowerca
1f20: 73 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  se.** journal-mo
1f30: 64 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73  de name..*/.cons
1f40: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4a  t char *sqlite3J
1f50: 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 69  ournalModename(i
1f60: 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 73 74 61  nt eMode){.  sta
1f70: 74 69 63 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  tic char * const
1f80: 20 61 7a 4d 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20   azModeName[] = 
1f90: 7b 0a 20 20 20 20 22 64 65 6c 65 74 65 22 2c 20  {.    "delete", 
1fa0: 22 70 65 72 73 69 73 74 22 2c 20 22 6f 66 66 22  "persist", "off"
1fb0: 2c 20 22 74 72 75 6e 63 61 74 65 22 2c 20 22 6d  , "truncate", "m
1fc0: 65 6d 6f 72 79 22 0a 23 69 66 6e 64 65 66 20 53  emory".#ifndef S
1fd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1fe0: 20 20 20 20 2c 20 22 77 61 6c 22 0a 23 65 6e 64      , "wal".#end
1ff0: 69 66 0a 20 20 7d 3b 0a 20 20 61 73 73 65 72 74  if.  };.  assert
2000: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2010: 4f 44 45 5f 44 45 4c 45 54 45 3d 3d 30 20 29 3b  ODE_DELETE==0 );
2020: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2030: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
2040: 53 49 53 54 3d 3d 31 20 29 3b 0a 20 20 61 73 73  SIST==1 );.  ass
2050: 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ert( PAGER_JOURN
2060: 41 4c 4d 4f 44 45 5f 4f 46 46 3d 3d 32 20 29 3b  ALMODE_OFF==2 );
2070: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2080: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
2090: 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 61 73  NCATE==3 );.  as
20a0: 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
20b0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d  NALMODE_MEMORY==
20c0: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  4 );.  assert( P
20d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20e0: 5f 57 41 4c 3d 3d 35 20 29 3b 0a 20 20 61 73 73  _WAL==5 );.  ass
20f0: 65 72 74 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26  ert( eMode>=0 &&
2100: 20 65 4d 6f 64 65 3c 3d 41 72 72 61 79 53 69 7a   eMode<=ArraySiz
2110: 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29 20 29 3b  e(azModeName) );
2120: 0a 0a 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 41  ..  if( eMode==A
2130: 72 72 61 79 53 69 7a 65 28 61 7a 4d 6f 64 65 4e  rraySize(azModeN
2140: 61 6d 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ame) ) return 0;
2150: 0a 20 20 72 65 74 75 72 6e 20 61 7a 4d 6f 64 65  .  return azMode
2160: 4e 61 6d 65 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a  Name[eMode];.}..
2170: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20  /*.** Process a 
2180: 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74  pragma statement
2190: 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61  .  .**.** Pragma
21a0: 73 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f  s are of this fo
21b0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50  rm:.**.**      P
21c0: 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
21d0: 5d 69 64 20 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a  ]id [= value].**
21e0: 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69  .** The identifi
21f0: 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  er might also be
2200: 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20   a string.  The 
2210: 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
2220: 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69  g, and.** identi
2230: 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65  fier, or a numbe
2240: 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67  r.  If minusFlag
2250: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2260: 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  he value is.** a
2270: 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73   number that was
2280: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
2290: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
22a0: 20 49 66 20 74 68 65 20 6c 65 66 74 20 73 69 64   If the left sid
22b0: 65 20 69 73 20 22 64 61 74 61 62 61 73 65 2e 69  e is "database.i
22c0: 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73 20  d" then pId1 is 
22d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
22e0: 65 0a 2a 2a 20 61 6e 64 20 70 49 64 32 20 69 73  e.** and pId2 is
22f0: 20 74 68 65 20 69 64 2e 20 20 49 66 20 74 68 65   the id.  If the
2300: 20 6c 65 66 74 20 73 69 64 65 20 69 73 20 6a 75   left side is ju
2310: 73 74 20 22 69 64 22 20 74 68 65 6e 20 70 49 64  st "id" then pId
2320: 31 20 69 73 20 74 68 65 0a 2a 2a 20 69 64 20 61  1 is the.** id a
2330: 6e 64 20 70 49 64 32 20 69 73 20 61 6e 79 20 65  nd pId2 is any e
2340: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  mpty string..*/.
2350: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 61 67  void sqlite3Prag
2360: 6d 61 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ma(.  Parse *pPa
2370: 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70  rse, .  Token *p
2380: 49 64 31 2c 20 20 20 20 20 20 20 20 2f 2a 20 46  Id1,        /* F
2390: 69 72 73 74 20 70 61 72 74 20 6f 66 20 5b 64 61  irst part of [da
23a0: 74 61 62 61 73 65 2e 5d 69 64 20 66 69 65 6c 64  tabase.]id field
23b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64   */.  Token *pId
23c0: 32 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63  2,        /* Sec
23d0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 5b 64 61 74  ond part of [dat
23e0: 61 62 61 73 65 2e 5d 69 64 20 66 69 65 6c 64 2c  abase.]id field,
23f0: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
2400: 6b 65 6e 20 2a 70 56 61 6c 75 65 2c 20 20 20 20  ken *pValue,    
2410: 20 20 2f 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 3c    /* Token for <
2420: 76 61 6c 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20  value>, or NULL 
2430: 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 75 73 46 6c  */.  int minusFl
2440: 61 67 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ag       /* True
2450: 20 69 66 20 61 20 27 2d 27 20 73 69 67 6e 20 70   if a '-' sign p
2460: 72 65 63 65 64 65 64 20 3c 76 61 6c 75 65 3e 20  receded <value> 
2470: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  */.){.  char *zL
2480: 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  eft = 0;       /
2490: 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
24a0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 3c 69   UTF-8 string <i
24b0: 64 3e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52  d> */.  char *zR
24c0: 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  ight = 0;      /
24d0: 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
24e0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 3c 76   UTF-8 string <v
24f0: 61 6c 75 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a  alue>, or NULL *
2500: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2510: 7a 44 62 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  zDb = 0;   /* Th
2520: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
2530: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 3b  */.  Token *pId;
2540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2550: 6f 69 6e 74 65 72 20 74 6f 20 3c 69 64 3e 20 74  ointer to <id> t
2560: 6f 6b 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  oken */.  char *
2570: 61 46 63 6e 74 6c 5b 34 5d 3b 20 20 20 20 20 20  aFcntl[4];      
2580: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
2590: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
25a0: 47 4d 41 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  GMA */.  int iDb
25b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25c0: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 64 65  /* Database inde
25d0: 78 20 66 6f 72 20 3c 64 61 74 61 62 61 73 65 3e  x for <database>
25e0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 77 72 2c 20 75   */.  int lwr, u
25f0: 70 72 2c 20 6d 69 64 20 3d 20 30 3b 20 20 20 20  pr, mid = 0;    
2600: 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 73 65 61     /* Binary sea
2610: 72 63 68 20 62 6f 75 6e 64 73 20 2a 2f 0a 20 20  rch bounds */.  
2620: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2640: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72  return value for
2650: 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  m SQLITE_FCNTL_P
2660: 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c 69 74  RAGMA */.  sqlit
2670: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2680: 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68 65 20 64  >db;    /* The d
2690: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
26a0: 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  on */.  Db *pDb;
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
26d0: 69 66 69 63 20 64 61 74 61 62 61 73 65 20 62 65  ific database be
26e0: 69 6e 67 20 70 72 61 67 6d 61 65 64 20 2a 2f 0a  ing pragmaed */.
26f0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
2700: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
2710: 65 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65 64  e);  /* Prepared
2720: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
2730: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 50 72  const struct sPr
2740: 61 67 6d 61 4e 61 6d 65 73 20 2a 70 50 72 61 67  agmaNames *pPrag
2750: 6d 61 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20  ma;..  if( v==0 
2760: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
2770: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e  te3VdbeRunOnlyOn
2780: 63 65 28 76 29 3b 0a 20 20 70 50 61 72 73 65 2d  ce(v);.  pParse-
2790: 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 0a 20 20 2f 2a  >nMem = 2;..  /*
27a0: 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 5b   Interpret the [
27b0: 64 61 74 61 62 61 73 65 2e 5d 20 70 61 72 74 20  database.] part 
27c0: 6f 66 20 74 68 65 20 70 72 61 67 6d 61 20 73 74  of the pragma st
27d0: 61 74 65 6d 65 6e 74 2e 20 69 44 62 20 69 73 20  atement. iDb is 
27e0: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  the.  ** index o
27f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
2800: 68 69 73 20 70 72 61 67 6d 61 20 69 73 20 62 65  his pragma is be
2810: 69 6e 67 20 61 70 70 6c 69 65 64 20 74 6f 20 69  ing applied to i
2820: 6e 20 64 62 2e 61 44 62 5b 5d 2e 20 2a 2f 0a 20  n db.aDb[]. */. 
2830: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
2840: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
2850: 2c 20 70 49 64 31 2c 20 70 49 64 32 2c 20 26 70  , pId1, pId2, &p
2860: 49 64 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  Id);.  if( iDb<0
2870: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 44 62   ) return;.  pDb
2880: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
2890: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  ;..  /* If the t
28a0: 65 6d 70 20 64 61 74 61 62 61 73 65 20 68 61 73  emp database has
28b0: 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79   been explicitly
28c0: 20 6e 61 6d 65 64 20 61 73 20 70 61 72 74 20 6f   named as part o
28d0: 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 72 61 67  f the .  ** prag
28e0: 6d 61 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74  ma, make sure it
28f0: 20 69 73 20 6f 70 65 6e 2e 20 0a 20 20 2a 2f 0a   is open. .  */.
2900: 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20    if( iDb==1 && 
2910: 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
2920: 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29 20  atabase(pParse) 
2930: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
2940: 20 7d 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71   }..  zLeft = sq
2950: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
2960: 65 6e 28 64 62 2c 20 70 49 64 29 3b 0a 20 20 69  en(db, pId);.  i
2970: 66 28 20 21 7a 4c 65 66 74 20 29 20 72 65 74 75  f( !zLeft ) retu
2980: 72 6e 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46  rn;.  if( minusF
2990: 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69 67 68  lag ){.    zRigh
29a0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
29b0: 74 66 28 64 62 2c 20 22 2d 25 54 22 2c 20 70 56  tf(db, "-%T", pV
29c0: 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  alue);.  }else{.
29d0: 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c      zRight = sql
29e0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
29f0: 6e 28 64 62 2c 20 70 56 61 6c 75 65 29 3b 0a 20  n(db, pValue);. 
2a00: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49   }..  assert( pI
2a10: 64 32 20 29 3b 0a 20 20 7a 44 62 20 3d 20 70 49  d2 );.  zDb = pI
2a20: 64 32 2d 3e 6e 3e 30 20 3f 20 70 44 62 2d 3e 7a  d2->n>0 ? pDb->z
2a30: 4e 61 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28 20  Name : 0;.  if( 
2a40: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
2a50: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
2a60: 50 52 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20 7a  PRAGMA, zLeft, z
2a70: 52 69 67 68 74 2c 20 7a 44 62 29 20 29 7b 0a 20  Right, zDb) ){. 
2a80: 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f     goto pragma_o
2a90: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ut;.  }..  /* Se
2aa0: 6e 64 20 61 6e 20 53 51 4c 49 54 45 5f 46 43 4e  nd an SQLITE_FCN
2ab0: 54 4c 5f 50 52 41 47 4d 41 20 66 69 6c 65 2d 63  TL_PRAGMA file-c
2ac0: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 6e  ontrol to the un
2ad0: 64 65 72 6c 79 69 6e 67 20 56 46 53 0a 20 20 2a  derlying VFS.  *
2ae0: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49  * connection.  I
2af0: 66 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  f it returns SQL
2b00: 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20 61 73 73  ITE_OK, then ass
2b10: 75 6d 65 20 74 68 61 74 20 74 68 65 20 56 46 53  ume that the VFS
2b20: 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 64 20 74 68  .  ** handled th
2b30: 65 20 70 72 61 67 6d 61 20 61 6e 64 20 67 65 6e  e pragma and gen
2b40: 65 72 61 74 65 20 61 20 6e 6f 2d 6f 70 20 70 72  erate a no-op pr
2b50: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
2b60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
2b70: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
2b80: 2d 31 32 32 33 38 2d 35 35 31 32 30 20 57 68 65  -12238-55120 Whe
2b90: 6e 65 76 65 72 20 61 20 50 52 41 47 4d 41 20 73  never a PRAGMA s
2ba0: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
2bb0: 65 64 2c 0a 20 20 2a 2a 20 61 6e 20 53 51 4c 49  ed,.  ** an SQLI
2bc0: 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20  TE_FCNTL_PRAGMA 
2bd0: 66 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20  file control is 
2be0: 73 65 6e 74 20 74 6f 20 74 68 65 20 6f 70 65 6e  sent to the open
2bf0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 20 20   sqlite3_file.  
2c00: 2a 2a 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ** object corres
2c10: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 64  ponding to the d
2c20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2c30: 77 68 69 63 68 20 74 68 65 20 70 72 61 67 6d 61  which the pragma
2c40: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
2c50: 72 65 66 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a  refers..  **.  *
2c60: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
2c70: 2d 4f 46 3a 20 52 2d 32 39 38 37 35 2d 33 31 36  -OF: R-29875-316
2c80: 37 38 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  78 The argument 
2c90: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  to the SQLITE_FC
2ca0: 4e 54 4c 5f 50 52 41 47 4d 41 0a 20 20 2a 2a 20  NTL_PRAGMA.  ** 
2cb0: 66 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20  file control is 
2cc0: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
2cd0: 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20  ters to strings 
2ce0: 28 63 68 61 72 2a 2a 29 20 69 6e 20 77 68 69 63  (char**) in whic
2cf0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 65 63 6f 6e  h the.  ** secon
2d00: 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  d element of the
2d10: 20 61 72 72 61 79 20 69 73 20 74 68 65 20 6e 61   array is the na
2d20: 6d 65 20 6f 66 20 74 68 65 20 70 72 61 67 6d 61  me of the pragma
2d30: 20 61 6e 64 20 74 68 65 20 74 68 69 72 64 0a 20   and the third. 
2d40: 20 2a 2a 20 65 6c 65 6d 65 6e 74 20 69 73 20 74   ** element is t
2d50: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
2d60: 68 65 20 70 72 61 67 6d 61 20 6f 72 20 4e 55 4c  he pragma or NUL
2d70: 4c 20 69 66 20 74 68 65 20 70 72 61 67 6d 61 20  L if the pragma 
2d80: 68 61 73 20 6e 6f 0a 20 20 2a 2a 20 61 72 67 75  has no.  ** argu
2d90: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 46 63  ment..  */.  aFc
2da0: 6e 74 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 46  ntl[0] = 0;.  aF
2db0: 63 6e 74 6c 5b 31 5d 20 3d 20 7a 4c 65 66 74 3b  cntl[1] = zLeft;
2dc0: 0a 20 20 61 46 63 6e 74 6c 5b 32 5d 20 3d 20 7a  .  aFcntl[2] = z
2dd0: 52 69 67 68 74 3b 0a 20 20 61 46 63 6e 74 6c 5b  Right;.  aFcntl[
2de0: 33 5d 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75  3] = 0;.  db->bu
2df0: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
2e00: 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
2e10: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2e20: 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45  (db, zDb, SQLITE
2e30: 5f 46 43 4e 54 4c 5f 50 52 41 47 4d 41 2c 20 28  _FCNTL_PRAGMA, (
2e40: 76 6f 69 64 2a 29 61 46 63 6e 74 6c 29 3b 0a 20  void*)aFcntl);. 
2e50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e60: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
2e70: 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 22 72  SingleText(v, "r
2e80: 65 73 75 6c 74 22 2c 20 61 46 63 6e 74 6c 5b 30  esult", aFcntl[0
2e90: 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
2ea0: 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b  free(aFcntl[0]);
2eb0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61  .    goto pragma
2ec0: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
2ed0: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc!=SQLITE_NOTFO
2ee0: 55 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 61  UND ){.    if( a
2ef0: 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20 20 20 20  Fcntl[0] ){.    
2f00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2f10: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
2f20: 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20  aFcntl[0]);.    
2f30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
2f40: 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d  Fcntl[0]);.    }
2f50: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
2f60: 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  r++;.    pParse-
2f70: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 67 6f  >rc = rc;.    go
2f80: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
2f90: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
2fa0: 74 68 65 20 70 72 61 67 6d 61 20 69 6e 20 74 68  the pragma in th
2fb0: 65 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 2a  e lookup table *
2fc0: 2f 0a 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 75  /.  lwr = 0;.  u
2fd0: 70 72 20 3d 20 41 72 72 61 79 53 69 7a 65 28 61  pr = ArraySize(a
2fe0: 50 72 61 67 6d 61 4e 61 6d 65 73 29 2d 31 3b 0a  PragmaNames)-1;.
2ff0: 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75 70    while( lwr<=up
3000: 72 20 29 7b 0a 20 20 20 20 6d 69 64 20 3d 20 28  r ){.    mid = (
3010: 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20  lwr+upr)/2;.    
3020: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72  rc = sqlite3_str
3030: 69 63 6d 70 28 7a 4c 65 66 74 2c 20 61 50 72 61  icmp(zLeft, aPra
3040: 67 6d 61 4e 61 6d 65 73 5b 6d 69 64 5d 2e 7a 4e  gmaNames[mid].zN
3050: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
3060: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
3070: 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
3080: 20 20 20 75 70 72 20 3d 20 6d 69 64 20 2d 20 31     upr = mid - 1
3090: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30a0: 20 20 20 6c 77 72 20 3d 20 6d 69 64 20 2b 20 31     lwr = mid + 1
30b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
30c0: 28 20 6c 77 72 3e 75 70 72 20 29 20 67 6f 74 6f  ( lwr>upr ) goto
30d0: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 70   pragma_out;.  p
30e0: 50 72 61 67 6d 61 20 3d 20 26 61 50 72 61 67 6d  Pragma = &aPragm
30f0: 61 4e 61 6d 65 73 5b 6d 69 64 5d 3b 0a 0a 20 20  aNames[mid];..  
3100: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
3110: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
3120: 20 69 73 20 6c 6f 61 64 65 64 20 69 66 20 74 68   is loaded if th
3130: 65 20 70 72 61 67 6d 61 20 72 65 71 75 69 72 65  e pragma require
3140: 73 20 74 68 61 74 20 2a 2f 0a 20 20 69 66 28 20  s that */.  if( 
3150: 28 70 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46  (pPragma->mPragF
3160: 6c 61 67 20 26 20 50 72 61 67 46 6c 61 67 5f 4e  lag & PragFlag_N
3170: 65 65 64 53 63 68 65 6d 61 29 21 3d 30 20 29 7b  eedSchema)!=0 ){
3180: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
3190: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
31a0: 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61  e) ) goto pragma
31b0: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
31c0: 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70 70 72  Jump to the appr
31d0: 6f 70 72 69 61 74 65 20 70 72 61 67 6d 61 20 68  opriate pragma h
31e0: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 73 77 69 74  andler */.  swit
31f0: 63 68 28 20 70 50 72 61 67 6d 61 2d 3e 65 50 72  ch( pPragma->ePr
3200: 61 67 54 79 70 20 29 7b 0a 20 20 0a 23 69 66 20  agTyp ){.  .#if 
3210: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3220: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
3230: 41 53 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AS) && !defined(
3240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
3250: 45 43 41 54 45 44 29 0a 20 20 2f 2a 0a 20 20 2a  ECATED).  /*.  *
3260: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
3270: 61 73 65 2e 5d 64 65 66 61 75 6c 74 5f 63 61 63  ase.]default_cac
3280: 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  he_size.  **  PR
3290: 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
32a0: 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69  default_cache_si
32b0: 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ze=N.  **.  ** T
32c0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
32d0: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
32e0: 74 20 70 65 72 73 69 73 74 65 6e 74 20 73 65 74  t persistent set
32f0: 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
3300: 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
3310: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65  e.  The value re
3320: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d 61  turned is the ma
3330: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a  ximum number of.
3340: 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68    ** pages in th
3350: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 54  e page cache.  T
3360: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73  he second form s
3370: 65 74 73 20 62 6f 74 68 20 74 68 65 20 63 75 72  ets both the cur
3380: 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 63  rent.  ** page c
3390: 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20  ache size value 
33a0: 61 6e 64 20 74 68 65 20 70 65 72 73 69 73 74 65  and the persiste
33b0: 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 73 69  nt page cache si
33c0: 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74  ze value.  ** st
33d0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
33e0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a  base file..  **.
33f0: 20 20 2a 2a 20 4f 6c 64 65 72 20 76 65 72 73 69    ** Older versi
3400: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 6f  ons of SQLite wo
3410: 75 6c 64 20 73 65 74 20 74 68 65 20 64 65 66 61  uld set the defa
3420: 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 20 74  ult cache size t
3430: 6f 20 61 0a 20 20 2a 2a 20 6e 65 67 61 74 69 76  o a.  ** negativ
3440: 65 20 6e 75 6d 62 65 72 20 74 6f 20 69 6e 64 69  e number to indi
3450: 63 61 74 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  cate synchronous
3460: 3d 4f 46 46 2e 20 20 54 68 65 73 65 20 64 61 79  =OFF.  These day
3470: 73 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  s, synchronous. 
3480: 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 6f 6e   ** is always on
3490: 20 62 79 20 64 65 66 61 75 6c 74 20 72 65 67 61   by default rega
34a0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73 69  rdless of the si
34b0: 67 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  gn of the defaul
34c0: 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69 7a  t cache.  ** siz
34d0: 65 2e 20 20 42 75 74 20 63 6f 6e 74 69 6e 75 65  e.  But continue
34e0: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 61 62 73   to take the abs
34f0: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74  olute value of t
3500: 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65  he default cache
3510: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 68 69  .  ** size of hi
3520: 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69  storical compati
3530: 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a 20 20 63  bility..  */.  c
3540: 61 73 65 20 50 72 61 67 54 79 70 5f 44 45 46 41  ase PragTyp_DEFA
3550: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20  ULT_CACHE_SIZE: 
3560: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
3570: 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42  st int iLn = VDB
3580: 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28  E_OFFSET_LINENO(
3590: 32 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  2);.    static c
35a0: 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20  onst VdbeOpList 
35b0: 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d  getCacheSize[] =
35c0: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 54 72   {.      { OP_Tr
35d0: 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 2c  ansaction, 0, 0,
35e0: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 20          0},     
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3600: 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20      /* 0 */.    
3610: 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69    { OP_ReadCooki
3620: 65 2c 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20  e,  0, 1,       
3630: 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43   BTREE_DEFAULT_C
3640: 41 43 48 45 5f 53 49 5a 45 7d 2c 20 20 2f 2a 20  ACHE_SIZE},  /* 
3650: 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
3660: 49 66 50 6f 73 2c 20 20 20 20 20 20 20 31 2c 20  IfPos,       1, 
3670: 38 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  8,        0},.  
3680: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
3690: 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20  ,     0, 2,     
36a0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
36b0: 50 5f 53 75 62 74 72 61 63 74 2c 20 20 20 20 31  P_Subtract,    1
36c0: 2c 20 32 2c 20 20 20 20 20 20 20 20 31 7d 2c 0a  , 2,        1},.
36d0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73        { OP_IfPos
36e0: 2c 20 20 20 20 20 20 20 31 2c 20 38 2c 20 20 20  ,       1, 8,   
36f0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
3700: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
3710: 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d   0, 1,        0}
3720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 20 2a            /* 6 *
3740: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 6f 6f  /.      { OP_Noo
3750: 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20  p,        0, 0, 
3760: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
3770: 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c   { OP_ResultRow,
3780: 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20     1, 1,        
3790: 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69  0},.    };.    i
37a0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
37b0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
37c0: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  e(v, iDb);.    i
37d0: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
37e0: 20 20 20 20 73 65 74 4f 6e 65 43 6f 6c 75 6d 6e      setOneColumn
37f0: 4e 61 6d 65 28 76 2c 20 22 63 61 63 68 65 5f 73  Name(v, "cache_s
3800: 69 7a 65 22 29 3b 0a 20 20 20 20 20 20 70 50 61  ize");.      pPa
3810: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a  rse->nMem += 2;.
3820: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
3830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3840: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67  t(v, ArraySize(g
3850: 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65  etCacheSize), ge
3860: 74 43 61 63 68 65 53 69 7a 65 2c 69 4c 6e 29 3b  tCacheSize,iLn);
3870: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3880: 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 61 64  beChangeP1(v, ad
3890: 64 72 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  dr, iDb);.      
38a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
38b0: 65 50 31 28 76 2c 20 61 64 64 72 2b 31 2c 20 69  eP1(v, addr+1, i
38c0: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
38d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
38e0: 2c 20 61 64 64 72 2b 36 2c 20 53 51 4c 49 54 45  , addr+6, SQLITE
38f0: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
3900: 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  IZE);.    }else{
3910: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
3920: 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
3930: 32 28 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  2(sqlite3Atoi(zR
3940: 69 67 68 74 29 29 3b 0a 20 20 20 20 20 20 73 71  ight));.      sq
3950: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
3960: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
3970: 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
3980: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3990: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
39a0: 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20 20 20 20   size, 1);.     
39b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
39c0: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
39d0: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 44  ie, iDb, BTREE_D
39e0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
39f0: 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  E, 1);.      ass
3a00: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3a10: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3a20: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
3a30: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
3a40: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
3a50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
3a60: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
3a70: 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d 3e  (pDb->pBt, pDb->
3a80: 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73  pSchema->cache_s
3a90: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
3aa0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
3ab0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
3ac0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20  T_PAGER_PRAGMAS 
3ad0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
3ae0: 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 23  DEPRECATED */..#
3af0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3b00: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
3b10: 41 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a 2a  AGMAS).  /*.  **
3b20: 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
3b30: 73 65 2e 5d 70 61 67 65 5f 73 69 7a 65 0a 20 20  se.]page_size.  
3b40: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
3b50: 62 61 73 65 2e 5d 70 61 67 65 5f 73 69 7a 65 3d  base.]page_size=
3b60: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
3b70: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
3b80: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
3b90: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
3ba0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
3bb0: 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2e  e size in bytes.
3bc0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
3bd0: 6d 20 73 65 74 73 20 74 68 65 0a 20 20 2a 2a 20  m sets the.  ** 
3be0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
3bf0: 7a 65 20 76 61 6c 75 65 2e 20 20 54 68 65 20 76  ze value.  The v
3c00: 61 6c 75 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65  alue can only be
3c10: 20 73 65 74 20 69 66 0a 20 20 2a 2a 20 74 68 65   set if.  ** the
3c20: 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f   database has no
3c30: 74 20 79 65 74 20 62 65 65 6e 20 63 72 65 61 74  t yet been creat
3c40: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
3c50: 50 72 61 67 54 79 70 5f 50 41 47 45 5f 53 49 5a  PragTyp_PAGE_SIZ
3c60: 45 3a 20 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  E: {.    Btree *
3c70: 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a  pBt = pDb->pBt;.
3c80: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 21      assert( pBt!
3c90: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  =0 );.    if( !z
3ca0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69  Right ){.      i
3cb0: 6e 74 20 73 69 7a 65 20 3d 20 41 4c 57 41 59 53  nt size = ALWAYS
3cc0: 28 70 42 74 29 20 3f 20 73 71 6c 69 74 65 33 42  (pBt) ? sqlite3B
3cd0: 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
3ce0: 70 42 74 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  pBt) : 0;.      
3cf0: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
3d00: 76 2c 20 22 70 61 67 65 5f 73 69 7a 65 22 2c 20  v, "page_size", 
3d10: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  size);.    }else
3d20: 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  {.      /* Mallo
3d30: 63 20 6d 61 79 20 66 61 69 6c 20 77 68 65 6e 20  c may fail when 
3d40: 73 65 74 74 69 6e 67 20 74 68 65 20 70 61 67 65  setting the page
3d50: 2d 73 69 7a 65 2c 20 61 73 20 74 68 65 72 65 20  -size, as there 
3d60: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20  is an internal. 
3d70: 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 74       ** buffer t
3d80: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 6f  hat the pager mo
3d90: 64 75 6c 65 20 72 65 73 69 7a 65 73 20 75 73 69  dule resizes usi
3da0: 6e 67 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  ng sqlite3_reall
3db0: 6f 63 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  oc()..      */. 
3dc0: 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 50 61 67       db->nextPag
3dd0: 65 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41  esize = sqlite3A
3de0: 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
3df0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f     if( SQLITE_NO
3e00: 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  MEM==sqlite3Btre
3e10: 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74  eSetPageSize(pBt
3e20: 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69  , db->nextPagesi
3e30: 7a 65 2c 2d 31 2c 30 29 20 29 7b 0a 20 20 20 20  ze,-1,0) ){.    
3e40: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
3e50: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
3e60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
3e70: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
3e80: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
3e90: 61 73 65 2e 5d 73 65 63 75 72 65 5f 64 65 6c 65  ase.]secure_dele
3ea0: 74 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  te.  **  PRAGMA 
3eb0: 5b 64 61 74 61 62 61 73 65 2e 5d 73 65 63 75 72  [database.]secur
3ec0: 65 5f 64 65 6c 65 74 65 3d 4f 4e 2f 4f 46 46 0a  e_delete=ON/OFF.
3ed0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
3ee0: 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73  rst form reports
3ef0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
3f00: 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
3f10: 2a 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  * secure_delete 
3f20: 66 6c 61 67 2e 20 20 54 68 65 20 73 65 63 6f 6e  flag.  The secon
3f30: 64 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74  d form changes t
3f40: 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
3f50: 0a 20 20 2a 2a 20 66 6c 61 67 20 73 65 74 74 69  .  ** flag setti
3f60: 6e 67 20 61 6e 64 20 72 65 70 6f 72 74 73 20 74  ng and reports t
3f70: 68 65 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 2a  henew value..  *
3f80: 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70  /.  case PragTyp
3f90: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3a 20  _SECURE_DELETE: 
3fa0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
3fb0: 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20 20   = pDb->pBt;.   
3fc0: 20 69 6e 74 20 62 20 3d 20 2d 31 3b 0a 20 20 20   int b = -1;.   
3fd0: 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20   assert( pBt!=0 
3fe0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68  );.    if( zRigh
3ff0: 74 20 29 7b 0a 20 20 20 20 20 20 62 20 3d 20 73  t ){.      b = s
4000: 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e  qlite3GetBoolean
4010: 28 7a 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  (zRight, 0);.   
4020: 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d   }.    if( pId2-
4030: 3e 6e 3d 3d 30 20 26 26 20 62 3e 3d 30 20 29 7b  >n==0 && b>=0 ){
4040: 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
4050: 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
4060: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29  i<db->nDb; ii++)
4070: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4080: 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
4090: 74 65 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  te(db->aDb[ii].p
40a0: 42 74 2c 20 62 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, b);.      }.
40b0: 20 20 20 20 7d 0a 20 20 20 20 62 20 3d 20 73 71      }.    b = sq
40c0: 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
40d0: 44 65 6c 65 74 65 28 70 42 74 2c 20 62 29 3b 0a  Delete(pBt, b);.
40e0: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
40f0: 49 6e 74 28 76 2c 20 22 73 65 63 75 72 65 5f 64  Int(v, "secure_d
4100: 65 6c 65 74 65 22 2c 20 62 29 3b 0a 20 20 20 20  elete", b);.    
4110: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
4120: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  .  **  PRAGMA [d
4130: 61 74 61 62 61 73 65 2e 5d 6d 61 78 5f 70 61 67  atabase.]max_pag
4140: 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 50 52  e_count.  **  PR
4150: 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
4160: 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d 4e  max_page_count=N
4170: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
4180: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
4190: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  s the current se
41a0: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
41b0: 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  ** maximum numbe
41c0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
41d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
41e0: 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63 6f    The .  ** seco
41f0: 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74 73  nd form attempts
4200: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20   to change this 
4210: 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a 20  setting.  Both. 
4220: 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72 6e   ** forms return
4230: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
4240: 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ting..  **.  ** 
4250: 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  The absolute val
4260: 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64 2e  ue of N is used.
4270: 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75    This is undocu
4280: 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68 74  mented and might
4290: 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20 54  .  ** change.  T
42a0: 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  he only purpose 
42b0: 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  is to provide an
42c0: 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65 73   easy way to tes
42d0: 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  t.  ** the sqlit
42e0: 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75 6e  e3AbsInt32() fun
42f0: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ction..  **.  **
4300: 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
4310: 73 65 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a 20  se.]page_count. 
4320: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
4330: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
4340: 67 65 73 20 69 6e 20 74 68 65 20 73 70 65 63 69  ges in the speci
4350: 66 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  fied database.. 
4360: 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54   */.  case PragT
4370: 79 70 5f 50 41 47 45 5f 43 4f 55 4e 54 3a 20 7b  yp_PAGE_COUNT: {
4380: 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 0a 20  .    int iReg;. 
4390: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
43a0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
43b0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 52 65  e, iDb);.    iRe
43c0: 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
43d0: 65 6d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  em;.    if( sqli
43e0: 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74  te3Tolower(zLeft
43f0: 5b 30 5d 29 3d 3d 27 70 27 20 29 7b 0a 20 20 20  [0])=='p' ){.   
4400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4410: 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 67 65 63  dOp2(v, OP_Pagec
4420: 6f 75 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 29  ount, iDb, iReg)
4430: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4440: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4450: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 78 50 67  dOp3(v, OP_MaxPg
4460: 63 6e 74 2c 20 69 44 62 2c 20 69 52 65 67 2c 20  cnt, iDb, iReg, 
4470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4480: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4490: 41 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65 33  AbsInt32(sqlite3
44a0: 41 74 6f 69 28 7a 52 69 67 68 74 29 29 29 3b 0a  Atoi(zRight)));.
44b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
44c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
44d0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 52 65  P_ResultRow, iRe
44e0: 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  g, 1);.    sqlit
44f0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
4500: 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  (v, 1);.    sqli
4510: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
4520: 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, 0, COLNAME_
4530: 4e 41 4d 45 2c 20 7a 4c 65 66 74 2c 20 53 51 4c  NAME, zLeft, SQL
4540: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
4550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
4560: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
4570: 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
4580: 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a 2a 20 20  king_mode.  **  
4590: 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
45a0: 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 20 3d  .]locking_mode =
45b0: 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c 75 73 69   (normal|exclusi
45c0: 76 65 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ve).  */.  case 
45d0: 50 72 61 67 54 79 70 5f 4c 4f 43 4b 49 4e 47 5f  PragTyp_LOCKING_
45e0: 4d 4f 44 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  MODE: {.    cons
45f0: 74 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 22  t char *zRet = "
4600: 6e 6f 72 6d 61 6c 22 3b 0a 20 20 20 20 69 6e 74  normal";.    int
4610: 20 65 4d 6f 64 65 20 3d 20 67 65 74 4c 6f 63 6b   eMode = getLock
4620: 69 6e 67 4d 6f 64 65 28 7a 52 69 67 68 74 29 3b  ingMode(zRight);
4630: 0a 0a 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e  ..    if( pId2->
4640: 6e 3d 3d 30 20 26 26 20 65 4d 6f 64 65 3d 3d 50  n==0 && eMode==P
4650: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
4660: 5f 51 55 45 52 59 20 29 7b 0a 20 20 20 20 20 20  _QUERY ){.      
4670: 2f 2a 20 53 69 6d 70 6c 65 20 22 50 52 41 47 4d  /* Simple "PRAGM
4680: 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3b 22  A locking_mode;"
4690: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
46a0: 20 69 73 20 61 20 71 75 65 72 79 20 66 6f 72 0a   is a query for.
46b0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
46c0: 72 65 6e 74 20 64 65 66 61 75 6c 74 20 6c 6f 63  rent default loc
46d0: 6b 69 6e 67 20 6d 6f 64 65 20 28 77 68 69 63 68  king mode (which
46e0: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
46f0: 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  t to.      ** th
4700: 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6f  e locking-mode o
4710: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
4720: 61 73 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ase)..      */. 
4730: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 64 62 2d       eMode = db-
4740: 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 3b 0a 20  >dfltLockMode;. 
4750: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4760: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
4770: 20 20 20 20 20 69 66 28 20 70 49 64 32 2d 3e 6e       if( pId2->n
4780: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
4790: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
47a0: 20 74 68 61 74 20 6e 6f 20 64 61 74 61 62 61 73   that no databas
47b0: 65 20 6e 61 6d 65 20 77 61 73 20 73 70 65 63 69  e name was speci
47c0: 66 69 65 64 20 61 73 20 70 61 72 74 0a 20 20 20  fied as part.   
47d0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 50       ** of the P
47e0: 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 2e 20 49  RAGMA command. I
47f0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
4800: 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 6d 75 73  locking-mode mus
4810: 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  t be.        ** 
4820: 73 65 74 20 6f 6e 20 61 6c 6c 20 61 74 74 61 63  set on all attac
4830: 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 20 61  hed databases, a
4840: 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d 61  s well as the ma
4850: 69 6e 20 64 62 20 66 69 6c 65 2e 0a 20 20 20 20  in db file..    
4860: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
4870: 2a 20 41 6c 73 6f 2c 20 74 68 65 20 73 71 6c 69  * Also, the sqli
4880: 74 65 33 2e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65  te3.dfltLockMode
4890: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
48a0: 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   so that.       
48b0: 20 2a 2a 20 61 6e 79 20 73 75 62 73 65 71 75 65   ** any subseque
48c0: 6e 74 6c 79 20 61 74 74 61 63 68 65 64 20 64 61  ntly attached da
48d0: 74 61 62 61 73 65 73 20 61 6c 73 6f 20 75 73 65  tabases also use
48e0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 20   the specified. 
48f0: 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e         ** lockin
4900: 67 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  g mode..        
4910: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4920: 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
4930: 74 28 70 44 62 3d 3d 26 64 62 2d 3e 61 44 62 5b  t(pDb==&db->aDb[
4940: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  0]);.        for
4950: 28 69 69 3d 32 3b 20 69 69 3c 64 62 2d 3e 6e 44  (ii=2; ii<db->nD
4960: 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  b; ii++){.      
4970: 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
4980: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
4990: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 29 3b  b->aDb[ii].pBt);
49a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
49b0: 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
49c0: 64 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64 65  de(pPager, eMode
49d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
49e0: 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63       db->dfltLoc
49f0: 6b 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  kMode = (u8)eMod
4a00: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
4a10: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
4a20: 33 42 74 72 65 65 50 61 67 65 72 28 70 44 62 2d  3BtreePager(pDb-
4a30: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 65 4d 6f  >pBt);.      eMo
4a40: 64 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  de = sqlite3Page
4a50: 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50 61  rLockingMode(pPa
4a60: 67 65 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ger, eMode);.   
4a70: 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
4a80: 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
4a90: 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
4ab0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
4ac0: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
4ad0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f  E );.    if( eMo
4ae0: 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
4af0: 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
4b00: 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20  ){.      zRet = 
4b10: 22 65 78 63 6c 75 73 69 76 65 22 3b 0a 20 20 20  "exclusive";.   
4b20: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
4b30: 67 6c 65 54 65 78 74 28 76 2c 20 22 6c 6f 63 6b  gleText(v, "lock
4b40: 69 6e 67 5f 6d 6f 64 65 22 2c 20 7a 52 65 74 29  ing_mode", zRet)
4b50: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
4b60: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41  ..  /*.  **  PRA
4b70: 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6a  GMA [database.]j
4b80: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 2a 2a  ournal_mode.  **
4b90: 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
4ba0: 73 65 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  se.]journal_mode
4bb0: 20 3d 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20   =.  **         
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64 65               (de
4bd0: 6c 65 74 65 7c 70 65 72 73 69 73 74 7c 6f 66 66  lete|persist|off
4be0: 7c 74 72 75 6e 63 61 74 65 7c 6d 65 6d 6f 72 79  |truncate|memory
4bf0: 7c 77 61 6c 7c 6f 66 66 29 0a 20 20 2a 2f 0a 20  |wal|off).  */. 
4c00: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f   case PragTyp_JO
4c10: 55 52 4e 41 4c 5f 4d 4f 44 45 3a 20 7b 0a 20 20  URNAL_MODE: {.  
4c20: 20 20 69 6e 74 20 65 4d 6f 64 65 3b 20 20 20 20    int eMode;    
4c30: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
4c40: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
4c50: 4f 44 45 5f 58 58 58 20 73 79 6d 62 6f 6c 73 20  ODE_XXX symbols 
4c60: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
4c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
4c80: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20   counter */..   
4c90: 20 73 65 74 4f 6e 65 43 6f 6c 75 6d 6e 4e 61 6d   setOneColumnNam
4ca0: 65 28 76 2c 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  e(v, "journal_mo
4cb0: 64 65 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  de");.    if( zR
4cc0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
4cd0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
4ce0: 6e 6f 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20  no "=MODE" part 
4cf0: 6f 66 20 74 68 65 20 70 72 61 67 6d 61 2c 20 64  of the pragma, d
4d00: 6f 20 61 20 71 75 65 72 79 20 66 6f 72 20 74 68  o a query for th
4d10: 65 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65  e.      ** curre
4d20: 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20  nt mode */.     
4d30: 20 65 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a   eMode = PAGER_J
4d40: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
4d50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4d60: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
4d70: 4d 6f 64 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Mode;.      int 
4d80: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
4d90: 6e 33 30 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  n30(zRight);.   
4da0: 20 20 20 66 6f 72 28 65 4d 6f 64 65 3d 30 3b 20     for(eMode=0; 
4db0: 28 7a 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  (zMode = sqlite3
4dc0: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28  JournalModename(
4dd0: 65 4d 6f 64 65 29 29 21 3d 30 3b 20 65 4d 6f 64  eMode))!=0; eMod
4de0: 65 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  e++){.        if
4df0: 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
4e00: 70 28 7a 52 69 67 68 74 2c 20 7a 4d 6f 64 65 2c  p(zRight, zMode,
4e10: 20 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a   n)==0 ) break;.
4e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4e30: 28 20 21 7a 4d 6f 64 65 20 29 7b 0a 20 20 20 20  ( !zMode ){.    
4e40: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 22 3d      /* If the "=
4e50: 4d 4f 44 45 22 20 70 61 72 74 20 64 6f 65 73 20  MODE" part does 
4e60: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 6b 6e  not match any kn
4e70: 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  own journal mode
4e80: 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
4e90: 6e 20 64 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a  n do a query */.
4ea0: 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
4eb0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
4ec0: 45 5f 51 55 45 52 59 3b 0a 20 20 20 20 20 20 7d  E_QUERY;.      }
4ed0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
4ee0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
4ef0: 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 26 26  NALMODE_QUERY &&
4f00: 20 70 49 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pId2->n==0 ){. 
4f10: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
4f20: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
4f30: 6d 6f 64 65 22 20 69 6e 74 6f 20 22 50 52 41 47  mode" into "PRAG
4f40: 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f  MA main.journal_
4f50: 6d 6f 64 65 22 20 2a 2f 0a 20 20 20 20 20 20 69  mode" */.      i
4f60: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49  Db = 0;.      pI
4f70: 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  d2->n = 1;.    }
4f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4f90: 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54  EFAULT_WAL_SAFET
4fa0: 59 4c 45 56 45 4c 0a 20 20 20 20 69 66 28 20 21  YLEVEL.    if( !
4fb0: 20 53 51 4c 49 54 45 5f 44 62 53 61 66 65 74 79   SQLITE_DbSafety
4fc0: 4c 65 76 65 6c 49 73 46 69 78 65 64 28 70 44 62  LevelIsFixed(pDb
4fd0: 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 20  ->safety_level) 
4fe0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4d 6f  ){.      if( eMo
4ff0: 64 65 20 3d 3d 20 50 41 47 45 52 5f 4a 4f 55 52  de == PAGER_JOUR
5000: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20  NALMODE_WAL ){. 
5010: 20 20 20 20 20 20 20 2f 2a 20 77 68 65 6e 20 65         /* when e
5020: 6e 74 65 72 69 6e 67 20 77 61 6c 20 6d 6f 64 65  ntering wal mode
5030: 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 73 77  , immediately sw
5040: 69 74 63 68 20 74 68 65 20 73 61 66 65 74 79 5f  itch the safety_
5050: 6c 65 76 65 6c 0a 20 20 20 20 20 20 20 20 2a 2a  level.        **
5060: 20 73 6f 20 74 68 61 74 20 61 20 71 75 65 72 79   so that a query
5070: 20 74 6f 20 70 72 61 67 6d 61 20 73 79 6e 63 68   to pragma synch
5080: 72 6f 6e 6f 75 73 20 72 65 74 75 72 6e 73 20 74  ronous returns t
5090: 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
50a0: 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20   */.      .     
50b0: 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
50c0: 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45  evel = SQLITE_DE
50d0: 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59  FAULT_WAL_SAFETY
50e0: 4c 45 56 45 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  LEVEL;.      }el
50f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
5100: 66 20 74 68 65 20 75 73 65 72 20 68 61 73 6e 27  f the user hasn'
5110: 74 20 6f 76 65 72 72 69 64 64 65 6e 20 74 68 65  t overridden the
5120: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74   synchronous set
5130: 74 69 6e 67 2c 20 75 73 65 20 74 68 65 20 0a 20  ting, use the . 
5140: 20 20 20 20 20 20 20 2a 2a 20 64 65 66 61 75 6c         ** defaul
5150: 74 20 66 6f 72 20 6e 6f 6e 2d 77 61 6c 20 64 61  t for non-wal da
5160: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
5170: 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
5180: 65 76 65 6c 20 3d 20 33 3b 0a 20 20 20 20 20 20  evel = 3;.      
5190: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  }.    }.#endif /
51a0: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
51b0: 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c  _WAL_SAFETYLEVEL
51c0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 64   */.    for(ii=d
51d0: 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30 3b  b->nDb-1; ii>=0;
51e0: 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66   ii--){.      if
51f0: 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42  ( db->aDb[ii].pB
5200: 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c  t && (ii==iDb ||
5210: 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a   pId2->n==0) ){.
5220: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5230: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
5240: 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ii);.        sql
5250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5260: 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  , OP_JournalMode
5270: 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29 3b  , ii, 1, eMode);
5280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
52a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
52b0: 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20  tRow, 1, 1);.   
52c0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
52d0: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
52e0: 64 61 74 61 62 61 73 65 2e 5d 6a 6f 75 72 6e 61  database.]journa
52f0: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 0a 20 20 2a  l_size_limit.  *
5300: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
5310: 61 73 65 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a  ase.]journal_siz
5320: 65 5f 6c 69 6d 69 74 3d 4e 0a 20 20 2a 2a 0a 20  e_limit=N.  **. 
5330: 20 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74   ** Get or set t
5340: 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 6f 6e  he size limit on
5350: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
5360: 6c 20 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  l files..  */.  
5370: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4a 4f 55  case PragTyp_JOU
5380: 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3a  RNAL_SIZE_LIMIT:
5390: 20 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50   {.    Pager *pP
53a0: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
53b0: 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e 70 42  reePager(pDb->pB
53c0: 74 29 3b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d  t);.    i64 iLim
53d0: 69 74 20 3d 20 2d 32 3b 0a 20 20 20 20 69 66 28  it = -2;.    if(
53e0: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
53f0: 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
5400: 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26 69  ToI64(zRight, &i
5410: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 69 66  Limit);.      if
5420: 28 20 69 4c 69 6d 69 74 3c 2d 31 20 29 20 69 4c  ( iLimit<-1 ) iL
5430: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  imit = -1;.    }
5440: 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71  .    iLimit = sq
5450: 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
5460: 6c 53 69 7a 65 4c 69 6d 69 74 28 70 50 61 67 65  lSizeLimit(pPage
5470: 72 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  r, iLimit);.    
5480: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
5490: 76 2c 20 22 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  v, "journal_size
54a0: 5f 6c 69 6d 69 74 22 2c 20 69 4c 69 6d 69 74 29  _limit", iLimit)
54b0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
54c0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
54d0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
54e0: 41 47 4d 41 53 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  AGMAS */..  /*. 
54f0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74   **  PRAGMA [dat
5500: 61 62 61 73 65 2e 5d 61 75 74 6f 5f 76 61 63 75  abase.]auto_vacu
5510: 75 6d 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  um.  **  PRAGMA 
5520: 5b 64 61 74 61 62 61 73 65 2e 5d 61 75 74 6f 5f  [database.]auto_
5530: 76 61 63 75 75 6d 3d 4e 0a 20 20 2a 2a 0a 20 20  vacuum=N.  **.  
5540: 2a 2a 20 47 65 74 20 6f 72 20 73 65 74 20 74 68  ** Get or set th
5550: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
5560: 61 74 61 62 61 73 65 20 27 61 75 74 6f 2d 76 61  atabase 'auto-va
5570: 63 75 75 6d 27 20 70 61 72 61 6d 65 74 65 72 2e  cuum' parameter.
5580: 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
5590: 69 73 20 6f 6e 65 20 6f 66 3a 20 20 30 20 4e 4f  is one of:  0 NO
55a0: 4e 45 20 31 20 46 55 4c 4c 20 32 20 49 4e 43 52  NE 1 FULL 2 INCR
55b0: 45 4d 45 4e 54 41 4c 0a 20 20 2a 2f 0a 23 69 66  EMENTAL.  */.#if
55c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
55d0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 63 61  _AUTOVACUUM.  ca
55e0: 73 65 20 50 72 61 67 54 79 70 5f 41 55 54 4f 5f  se PragTyp_AUTO_
55f0: 56 41 43 55 55 4d 3a 20 7b 0a 20 20 20 20 42 74  VACUUM: {.    Bt
5600: 72 65 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e  ree *pBt = pDb->
5610: 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
5620: 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69   pBt!=0 );.    i
5630: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
5640: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
5650: 49 6e 74 28 76 2c 20 22 61 75 74 6f 5f 76 61 63  Int(v, "auto_vac
5660: 75 75 6d 22 2c 20 73 71 6c 69 74 65 33 42 74 72  uum", sqlite3Btr
5670: 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
5680: 70 42 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pBt));.    }else
5690: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 41 75 74  {.      int eAut
56a0: 6f 20 3d 20 67 65 74 41 75 74 6f 56 61 63 75 75  o = getAutoVacuu
56b0: 6d 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  m(zRight);.     
56c0: 20 61 73 73 65 72 74 28 20 65 41 75 74 6f 3e 3d   assert( eAuto>=
56d0: 30 20 26 26 20 65 41 75 74 6f 3c 3d 32 20 29 3b  0 && eAuto<=2 );
56e0: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 41  .      db->nextA
56f0: 75 74 6f 76 61 63 20 3d 20 28 75 38 29 65 41 75  utovac = (u8)eAu
5700: 74 6f 3b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c  to;.      /* Cal
5710: 6c 20 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  l SetAutoVacuum(
5720: 29 20 74 6f 20 73 65 74 20 69 6e 69 74 69 61 6c  ) to set initial
5730: 69 7a 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ize the internal
5740: 20 61 75 74 6f 20 61 6e 64 0a 20 20 20 20 20 20   auto and.      
5750: 2a 2a 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 66  ** incr-vacuum f
5760: 6c 61 67 73 2e 20 54 68 69 73 20 69 73 20 72 65  lags. This is re
5770: 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74  quired in case t
5780: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  his connection. 
5790: 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 73 20       ** creates 
57a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
57b0: 65 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  e. It is importa
57c0: 6e 74 20 74 68 61 74 20 69 74 20 69 73 20 63 72  nt that it is cr
57d0: 65 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  eated.      ** a
57e0: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
57f0: 20 63 61 70 61 62 6c 65 20 64 62 2e 0a 20 20 20   capable db..   
5800: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
5810: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
5820: 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74 2c 20  AutoVacuum(pBt, 
5830: 65 41 75 74 6f 29 3b 0a 20 20 20 20 20 20 69 66  eAuto);.      if
5840: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5850: 26 26 20 28 65 41 75 74 6f 3d 3d 31 20 7c 7c 20  && (eAuto==1 || 
5860: 65 41 75 74 6f 3d 3d 32 29 20 29 7b 0a 20 20 20  eAuto==2) ){.   
5870: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 73 65 74       /* When set
5880: 74 69 6e 67 20 74 68 65 20 61 75 74 6f 5f 76 61  ting the auto_va
5890: 63 75 75 6d 20 6d 6f 64 65 20 74 6f 20 65 69 74  cuum mode to eit
58a0: 68 65 72 20 22 66 75 6c 6c 22 20 6f 72 20 0a 20  her "full" or . 
58b0: 20 20 20 20 20 20 20 2a 2a 20 22 69 6e 63 72 65         ** "incre
58c0: 6d 65 6e 74 61 6c 22 2c 20 77 72 69 74 65 20 74  mental", write t
58d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
58e0: 5b 36 5d 20 69 6e 20 74 68 65 20 64 61 74 61 62  [6] in the datab
58f0: 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ase.        ** f
5900: 69 6c 65 2e 20 42 65 66 6f 72 65 20 77 72 69 74  ile. Before writ
5910: 69 6e 67 20 74 6f 20 6d 65 74 61 5b 36 5d 2c 20  ing to meta[6], 
5920: 63 68 65 63 6b 20 74 68 61 74 20 6d 65 74 61 5b  check that meta[
5930: 33 5d 20 69 6e 64 69 63 61 74 65 73 0a 20 20 20  3] indicates.   
5940: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69       ** that thi
5950: 73 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 61  s really is an a
5960: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
5970: 6c 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  le database..   
5980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
5990: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
59a0: 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53   iLn = VDBE_OFFS
59b0: 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20  ET_LINENO(2);.  
59c0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
59d0: 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65  st VdbeOpList se
59e0: 74 4d 65 74 61 36 5b 5d 20 3d 20 7b 0a 20 20 20  tMeta6[] = {.   
59f0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e         { OP_Tran
5a00: 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20 20  saction,    0,  
5a10: 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20         1,       
5a20: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5a30: 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20   /* 0 */.       
5a40: 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b     { OP_ReadCook
5a50: 69 65 2c 20 20 20 20 20 30 2c 20 20 20 20 20 20  ie,     0,      
5a60: 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 42 54     1,         BT
5a70: 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54  REE_LARGEST_ROOT
5a80: 5f 50 41 47 45 7d 2c 0a 20 20 20 20 20 20 20 20  _PAGE},.        
5a90: 20 20 7b 20 4f 50 5f 49 66 2c 20 20 20 20 20 20    { OP_If,      
5aa0: 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20         1,       
5ab0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
5ac0: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 32       0},    /* 2
5ad0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 20   */.          { 
5ae0: 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 20  OP_Halt,        
5af0: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45     SQLITE_OK, OE
5b00: 5f 41 62 6f 72 74 2c 20 20 20 20 20 20 20 20 20  _Abort,         
5b10: 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a   0},    /* 3 */.
5b20: 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 49            { OP_I
5b30: 6e 74 65 67 65 72 2c 20 20 20 20 20 20 20 20 30  nteger,        0
5b40: 2c 20 20 20 20 20 20 20 20 20 31 2c 20 20 20 20  ,         1,    
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c               0},
5b60: 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20      /* 4 */.    
5b70: 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f        { OP_SetCo
5b80: 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 20  okie,      0,   
5b90: 20 20 20 20 20 20 42 54 52 45 45 5f 49 4e 43 52        BTREE_INCR
5ba0: 5f 56 41 43 55 55 4d 2c 20 31 7d 2c 20 20 20 20  _VACUUM, 1},    
5bb0: 2f 2a 20 35 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 5 */.        
5bc0: 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  };.        int i
5bd0: 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 41  Addr;.        iA
5be0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
5bf0: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
5c00: 72 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61 36  raySize(setMeta6
5c10: 29 2c 20 73 65 74 4d 65 74 61 36 2c 20 69 4c 6e  ), setMeta6, iLn
5c20: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5c30: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
5c40: 2c 20 69 41 64 64 72 2c 20 69 44 62 29 3b 0a 20  , iAddr, iDb);. 
5c50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5c60: 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 41  beChangeP1(v, iA
5c70: 64 64 72 2b 31 2c 20 69 44 62 29 3b 0a 20 20 20  ddr+1, iDb);.   
5c80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c90: 43 68 61 6e 67 65 50 32 28 76 2c 20 69 41 64 64  ChangeP2(v, iAdd
5ca0: 72 2b 32 2c 20 69 41 64 64 72 2b 34 29 3b 0a 20  r+2, iAddr+4);. 
5cb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5cc0: 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 41  beChangeP1(v, iA
5cd0: 64 64 72 2b 34 2c 20 65 41 75 74 6f 2d 31 29 3b  ddr+4, eAuto-1);
5ce0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5cf0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
5d00: 69 41 64 64 72 2b 35 2c 20 69 44 62 29 3b 0a 20  iAddr+5, iDb);. 
5d10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5d20: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
5d30: 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
5d40: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
5d50: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
5d60: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74   **  PRAGMA [dat
5d70: 61 62 61 73 65 2e 5d 69 6e 63 72 65 6d 65 6e 74  abase.]increment
5d80: 61 6c 5f 76 61 63 75 75 6d 28 4e 29 0a 20 20 2a  al_vacuum(N).  *
5d90: 2a 0a 20 20 2a 2a 20 44 6f 20 4e 20 73 74 65 70  *.  ** Do N step
5da0: 73 20 6f 66 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s of incremental
5db0: 20 76 61 63 75 75 6d 69 6e 67 20 6f 6e 20 61 20   vacuuming on a 
5dc0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
5dd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5de0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
5df0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e 43  case PragTyp_INC
5e00: 52 45 4d 45 4e 54 41 4c 5f 56 41 43 55 55 4d 3a  REMENTAL_VACUUM:
5e10: 20 7b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69   {.    int iLimi
5e20: 74 2c 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28  t, addr;.    if(
5e30: 20 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 21 73   zRight==0 || !s
5e40: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
5e50: 52 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 20  Right, &iLimit) 
5e60: 7c 7c 20 69 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a  || iLimit<=0 ){.
5e70: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 30        iLimit = 0
5e80: 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 7d  x7fffffff;.    }
5e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
5ea0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
5eb0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
5ec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5ed0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
5ee0: 65 67 65 72 2c 20 69 4c 69 6d 69 74 2c 20 31 29  eger, iLimit, 1)
5ef0: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
5f00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5f10: 2c 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 2c  , OP_IncrVacuum,
5f20: 20 69 44 62 29 3b 20 56 64 62 65 43 6f 76 65 72   iDb); VdbeCover
5f30: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
5f40: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5f50: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31   OP_ResultRow, 1
5f60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5f70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
5f80: 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20  ddImm, 1, -1);. 
5f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5fa0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
5fb0: 2c 20 31 2c 20 61 64 64 72 29 3b 20 56 64 62 65  , 1, addr); Vdbe
5fc0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
5fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
5fe0: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
5ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65     break;.  }.#e
6000: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
6010: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
6020: 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a  PRAGMAS.  /*.  *
6030: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
6040: 61 73 65 2e 5d 63 61 63 68 65 5f 73 69 7a 65 0a  ase.]cache_size.
6050: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61    **  PRAGMA [da
6060: 74 61 62 61 73 65 2e 5d 63 61 63 68 65 5f 73 69  tabase.]cache_si
6070: 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ze=N.  **.  ** T
6080: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65  he first form re
6090: 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e  ports the curren
60a0: 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  t local setting 
60b0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  for the.  ** pag
60c0: 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 54 68  e cache size. Th
60d0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
60e0: 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a  ts the local.  *
60f0: 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
6100: 65 20 76 61 6c 75 65 2e 20 20 49 66 20 4e 20 69  e value.  If N i
6110: 73 20 70 6f 73 69 74 69 76 65 20 74 68 65 6e 20  s positive then 
6120: 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 2a 2a  that is the.  **
6130: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
6140: 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 20 20   in the cache.  
6150: 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65  If N is negative
6160: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
6170: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6180: 69 73 20 61 64 6a 75 73 74 65 64 20 73 6f 20 74  is adjusted so t
6190: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 75 73  hat the cache us
61a0: 65 73 20 2d 4e 20 6b 69 62 69 62 79 74 65 73 0a  es -N kibibytes.
61b0: 20 20 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a    ** of memory..
61c0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
61d0: 54 79 70 5f 43 41 43 48 45 5f 53 49 5a 45 3a 20  Typ_CACHE_SIZE: 
61e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
61f0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
6200: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
6210: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69   );.    if( !zRi
6220: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ght ){.      if(
6230: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
6240: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
6250: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
6260: 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65      returnSingle
6270: 49 6e 74 28 76 2c 20 22 63 61 63 68 65 5f 73 69  Int(v, "cache_si
6280: 7a 65 22 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  ze", pDb->pSchem
6290: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  a->cache_size);.
62a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
62b0: 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69   int size = sqli
62c0: 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29 3b  te3Atoi(zRight);
62d0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68  .      pDb->pSch
62e0: 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20  ema->cache_size 
62f0: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  = size;.      sq
6300: 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
6310: 68 65 53 69 7a 65 28 70 44 62 2d 3e 70 42 74 2c  heSize(pDb->pBt,
6320: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63   pDb->pSchema->c
6330: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
6340: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
6350: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
6360: 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75  ) goto pragma_ou
6370: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  t;.    }.    bre
6380: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
6390: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
63a0: 62 61 73 65 2e 5d 6d 6d 61 70 5f 73 69 7a 65 28  base.]mmap_size(
63b0: 4e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  N).  **.  ** Use
63c0: 64 20 74 6f 20 73 65 74 20 6d 61 70 70 69 6e 67  d to set mapping
63d0: 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20 54 68 65   size limit. The
63e0: 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69   mapping size li
63f0: 6d 69 74 20 69 73 0a 20 20 2a 2a 20 75 73 65 64  mit is.  ** used
6400: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 61 67   to limit the ag
6410: 67 72 65 67 61 74 65 20 73 69 7a 65 20 6f 66 20  gregate size of 
6420: 61 6c 6c 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  all memory mappe
6430: 64 20 72 65 67 69 6f 6e 73 20 6f 66 20 74 68 65  d regions of the
6440: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
6450: 69 6c 65 2e 20 49 66 20 74 68 69 73 20 70 61 72  ile. If this par
6460: 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
6470: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6d 65 6d 6f   zero, then memo
6480: 72 79 20 6d 61 70 70 69 6e 67 0a 20 20 2a 2a 20  ry mapping.  ** 
6490: 69 73 20 6e 6f 74 20 75 73 65 64 20 61 74 20 61  is not used at a
64a0: 6c 6c 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67  ll.  If N is neg
64b0: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
64c0: 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 6d  default memory m
64d0: 61 70 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 64 65  ap.  ** limit de
64e0: 74 65 72 6d 69 6e 65 64 20 62 79 20 73 71 6c 69  termined by sqli
64f0: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
6500: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
6510: 5a 45 29 20 69 73 20 73 65 74 2e 0a 20 20 2a 2a  ZE) is set..  **
6520: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 4e   The parameter N
6530: 20 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20   is measured in 
6540: 62 79 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  bytes..  **.  **
6550: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 61   This value is a
6560: 64 76 69 73 6f 72 79 2e 20 20 54 68 65 20 75 6e  dvisory.  The un
6570: 64 65 72 6c 79 69 6e 67 20 56 46 53 20 69 73 20  derlying VFS is 
6580: 66 72 65 65 20 74 6f 20 6d 65 6d 6f 72 79 20 6d  free to memory m
6590: 61 70 0a 20 20 2a 2a 20 61 73 20 6c 69 74 74 6c  ap.  ** as littl
65a0: 65 20 6f 72 20 61 73 20 6d 75 63 68 20 61 73 20  e or as much as 
65b0: 69 74 20 77 61 6e 74 73 2e 20 20 45 78 63 65 70  it wants.  Excep
65c0: 74 2c 20 69 66 20 4e 20 69 73 20 73 65 74 20 74  t, if N is set t
65d0: 6f 20 30 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  o 0 then the.  *
65e0: 2a 20 75 70 70 65 72 20 6c 61 79 65 72 73 20 77  * upper layers w
65f0: 69 6c 6c 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65  ill never invoke
6600: 20 74 68 65 20 78 46 65 74 63 68 20 69 6e 74 65   the xFetch inte
6610: 72 66 61 63 65 73 20 74 6f 20 74 68 65 20 56 46  rfaces to the VF
6620: 53 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50  S..  */.  case P
6630: 72 61 67 54 79 70 5f 4d 4d 41 50 5f 53 49 5a 45  ragTyp_MMAP_SIZE
6640: 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
6650: 69 6e 74 36 34 20 73 7a 3b 0a 23 69 66 20 53 51  int64 sz;.#if SQ
6660: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
6670: 5a 45 3e 30 0a 20 20 20 20 61 73 73 65 72 74 28  ZE>0.    assert(
6680: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
6690: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
66a0: 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a   0) );.    if( z
66b0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69  Right ){.      i
66c0: 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 73 71 6c  nt ii;.      sql
66d0: 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
66e0: 34 28 7a 52 69 67 68 74 2c 20 26 73 7a 29 3b 0a  4(zRight, &sz);.
66f0: 20 20 20 20 20 20 69 66 28 20 73 7a 3c 30 20 29        if( sz<0 )
6700: 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f   sz = sqlite3Glo
6710: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
6720: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 32  ;.      if( pId2
6730: 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e 73 7a 4d  ->n==0 ) db->szM
6740: 6d 61 70 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  map = sz;.      
6750: 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44 62 2d 31  for(ii=db->nDb-1
6760: 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a  ; ii>=0; ii--){.
6770: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
6780: 61 44 62 5b 69 69 5d 2e 70 42 74 20 26 26 20 28  aDb[ii].pBt && (
6790: 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49 64 32 2d  ii==iDb || pId2-
67a0: 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  >n==0) ){.      
67b0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
67c0: 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 64 62 2d  SetMmapLimit(db-
67d0: 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c 20 73 7a  >aDb[ii].pBt, sz
67e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
67f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
6800: 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 72 63 20 3d  z = -1;.    rc =
6810: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
6820: 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53  ntrol(db, zDb, S
6830: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
6840: 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 23 65 6c  _SIZE, &sz);.#el
6850: 73 65 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20  se.    sz = 0;. 
6860: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6870: 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  K;.#endif.    if
6880: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6890: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53  ){.      returnS
68a0: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 22 6d 6d 61  ingleInt(v, "mma
68b0: 70 5f 73 69 7a 65 22 2c 20 73 7a 29 3b 0a 20 20  p_size", sz);.  
68c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
68d0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
68e0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
68f0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70  >nErr++;.      p
6900: 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
6910: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
6920: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
6930: 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74    PRAGMA temp_st
6940: 6f 72 65 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d  ore.  **   PRAGM
6950: 41 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 22  A temp_store = "
6960: 64 65 66 61 75 6c 74 22 7c 22 6d 65 6d 6f 72 79  default"|"memory
6970: 22 7c 22 66 69 6c 65 22 0a 20 20 2a 2a 0a 20 20  "|"file".  **.  
6980: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
6990: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
69a0: 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f   of the temp_sto
69b0: 72 65 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69  re flag.  Changi
69c0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61  ng.  ** the loca
69d0: 6c 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74  l value does not
69e0: 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f   make changes to
69f0: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
6a00: 6e 64 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20  nd the default. 
6a10: 20 2a 2a 20 76 61 6c 75 65 20 77 69 6c 6c 20 62   ** value will b
6a20: 65 20 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e  e restored the n
6a30: 65 78 74 20 74 69 6d 65 20 74 68 65 20 64 61 74  ext time the dat
6a40: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2e  abase is opened.
6a50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
6a60: 74 68 61 74 20 69 74 20 69 73 20 70 6f 73 73 69  that it is possi
6a70: 62 6c 65 20 66 6f 72 20 74 68 65 20 6c 69 62 72  ble for the libr
6a80: 61 72 79 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ary compile-time
6a90: 20 6f 70 74 69 6f 6e 73 20 74 6f 0a 20 20 2a 2a   options to.  **
6aa0: 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 73   override this s
6ab0: 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 63 61  etting.  */.  ca
6ac0: 73 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f  se PragTyp_TEMP_
6ad0: 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 69 66 28  STORE: {.    if(
6ae0: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
6af0: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
6b00: 74 28 76 2c 20 22 74 65 6d 70 5f 73 74 6f 72 65  t(v, "temp_store
6b10: 22 2c 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  ", db->temp_stor
6b20: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
6b30: 20 20 20 20 20 63 68 61 6e 67 65 54 65 6d 70 53       changeTempS
6b40: 74 6f 72 61 67 65 28 70 50 61 72 73 65 2c 20 7a  torage(pParse, z
6b50: 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Right);.    }.  
6b60: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
6b70: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
6b80: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
6b90: 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20 50 52 41  ctory.  **   PRA
6ba0: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
6bb0: 69 72 65 63 74 6f 72 79 20 3d 20 22 22 7c 22 64  irectory = ""|"d
6bc0: 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65 22 0a 20  irectory_name". 
6bd0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
6be0: 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c  or set the local
6bf0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 65   value of the te
6c00: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
6c10: 72 79 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69  ry flag.  Changi
6c20: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  ng.  ** the valu
6c30: 65 20 73 65 74 73 20 61 20 73 70 65 63 69 66 69  e sets a specifi
6c40: 63 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 62  c directory to b
6c50: 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f  e used for tempo
6c60: 72 61 72 79 20 66 69 6c 65 73 2e 0a 20 20 2a 2a  rary files..  **
6c70: 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75   Setting to a nu
6c80: 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74  ll string revert
6c90: 73 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  s to the default
6ca0: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
6cb0: 74 6f 72 79 20 73 65 61 72 63 68 2e 0a 20 20 2a  tory search..  *
6cc0: 2a 20 49 66 20 74 65 6d 70 6f 72 61 72 79 20 64  * If temporary d
6cd0: 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e  irectory is chan
6ce0: 67 65 64 2c 20 74 68 65 6e 20 69 6e 76 61 6c 69  ged, then invali
6cf0: 64 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 2e  dateTempStorage.
6d00: 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73  .  **.  */.  cas
6d10: 65 20 50 72 61 67 54 79 70 5f 54 45 4d 50 5f 53  e PragTyp_TEMP_S
6d20: 54 4f 52 45 5f 44 49 52 45 43 54 4f 52 59 3a 20  TORE_DIRECTORY: 
6d30: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
6d40: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
6d50: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 22  nSingleText(v, "
6d60: 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
6d70: 74 6f 72 79 22 2c 20 73 71 6c 69 74 65 33 5f 74  tory", sqlite3_t
6d80: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
6d90: 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64      }else{.#ifnd
6da0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
6db0: 53 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  SD.      if( zRi
6dc0: 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ght[0] ){.      
6dd0: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
6de0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6df0: 73 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73  sAccess(db->pVfs
6e00: 2c 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45  , zRight, SQLITE
6e10: 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
6e20: 45 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  E, &res);.      
6e30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6e40: 5f 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b  _OK || res==0 ){
6e50: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6e60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6e70: 65 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62  e, "not a writab
6e80: 6c 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a  le directory");.
6e90: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
6ea0: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20  ragma_out;.     
6eb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6ec0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 45     if( SQLITE_TE
6ed0: 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20  MP_STORE==0.    
6ee0: 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45     || (SQLITE_TE
6ef0: 4d 50 5f 53 54 4f 52 45 3d 3d 31 20 26 26 20 64  MP_STORE==1 && d
6f00: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3c 3d 31  b->temp_store<=1
6f10: 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 53 51 4c  ).       || (SQL
6f20: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
6f30: 32 20 26 26 20 64 62 2d 3e 74 65 6d 70 5f 73 74  2 && db->temp_st
6f40: 6f 72 65 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b  ore==1).      ){
6f50: 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
6f60: 61 74 65 54 65 6d 70 53 74 6f 72 61 67 65 28 70  ateTempStorage(p
6f70: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
6f80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6f90: 65 65 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ee(sqlite3_temp_
6fa0: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
6fb0: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
6fc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6fd0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
6fe0: 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
6ff0: 6e 74 66 28 22 25 73 22 2c 20 7a 52 69 67 68 74  ntf("%s", zRight
7000: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7010: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7020: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
7030: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
7040: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7050: 54 5f 57 53 44 20 2a 2f 0a 20 20 20 20 7d 0a 20  T_WSD */.    }. 
7060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23     break;.  }..#
7070: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7080: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
7090: 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  GMA data_store_d
70a0: 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 20 20  irectory.  **   
70b0: 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72  PRAGMA data_stor
70c0: 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22 22  e_directory = ""
70d0: 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61 6d 65  |"directory_name
70e0: 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  ".  **.  ** Retu
70f0: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
7100: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
7110: 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
7120: 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43 68 61  ctory flag.  Cha
7130: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 76  nging.  ** the v
7140: 61 6c 75 65 20 73 65 74 73 20 61 20 73 70 65 63  alue sets a spec
7150: 69 66 69 63 20 64 69 72 65 63 74 6f 72 79 20 74  ific directory t
7160: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61  o be used for da
7170: 74 61 62 61 73 65 20 66 69 6c 65 73 20 74 68 61  tabase files tha
7180: 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70 65 63  t.  ** were spec
7190: 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c  ified with a rel
71a0: 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20  ative pathname. 
71b0: 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20 6e 75   Setting to a nu
71c0: 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65 72 74  ll string revert
71d0: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 65  s.  ** to the de
71e0: 66 61 75 6c 74 20 64 61 74 61 62 61 73 65 20 64  fault database d
71f0: 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63 68 20  irectory, which 
7200: 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  for database fil
7210: 65 73 20 73 70 65 63 69 66 69 65 64 20 77 69 74  es specified wit
7220: 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74 69 76  h.  ** a relativ
7230: 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72 6f 62  e path will prob
7240: 61 62 6c 79 20 62 65 20 62 61 73 65 64 20 6f 6e  ably be based on
7250: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72   the current dir
7260: 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 20  ectory for the. 
7270: 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20 44 61   ** process.  Da
7280: 74 61 62 61 73 65 20 66 69 6c 65 20 73 70 65 63  tabase file spec
7290: 69 66 69 65 64 20 77 69 74 68 20 61 6e 20 61 62  ified with an ab
72a0: 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72 65 20  solute path are 
72b0: 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20 20 2a  not impacted.  *
72c0: 2a 20 62 79 20 74 68 69 73 20 73 65 74 74 69 6e  * by this settin
72d0: 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  g, regardless of
72e0: 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20 2a 2a   its value..  **
72f0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61  .  */.  case Pra
7300: 67 54 79 70 5f 44 41 54 41 5f 53 54 4f 52 45 5f  gTyp_DATA_STORE_
7310: 44 49 52 45 43 54 4f 52 59 3a 20 7b 0a 20 20 20  DIRECTORY: {.   
7320: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
7330: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
7340: 6c 65 54 65 78 74 28 76 2c 20 22 64 61 74 61 5f  leText(v, "data_
7350: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22  store_directory"
7360: 2c 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  , sqlite3_data_d
7370: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d  irectory);.    }
7380: 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51  else{.#ifndef SQ
7390: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
73a0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
73b0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ] ){.        int
73c0: 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
73d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
73e0: 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69  ss(db->pVfs, zRi
73f0: 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ght, SQLITE_ACCE
7400: 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72  SS_READWRITE, &r
7410: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
7420: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
7430: 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  | res==0 ){.    
7440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7450: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
7460: 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20 64 69  ot a writable di
7470: 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20  rectory");.     
7480: 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61       goto pragma
7490: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
74a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
74b0: 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69 74  lite3_free(sqlit
74c0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
74d0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  y);.      if( zR
74e0: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
74f0: 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
7500: 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c 69  directory = sqli
7510: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
7520: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , zRight);.     
7530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7540: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
7550: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20  ectory = 0;.    
7560: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
7570: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a 2f  LITE_OMIT_WSD */
7580: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
7590: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
75a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
75b0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
75c0: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
75d0: 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
75e0: 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 20 20 2a 2a  _proxy_file.  **
75f0: 20 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62     PRAGMA [datab
7600: 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
7610: 66 69 6c 65 20 3d 20 22 3a 61 75 74 6f 3a 22 7c  file = ":auto:"|
7620: 22 6c 6f 63 6b 5f 66 69 6c 65 5f 70 61 74 68 22  "lock_file_path"
7630: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
7640: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 76 61 6c  n or set the val
7650: 75 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 5f 70  ue of the lock_p
7660: 72 6f 78 79 5f 66 69 6c 65 20 66 6c 61 67 2e 20  roxy_file flag. 
7670: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
7680: 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20  he value sets a 
7690: 73 70 65 63 69 66 69 63 20 66 69 6c 65 20 74 6f  specific file to
76a0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61 74   be used for dat
76b0: 61 62 61 73 65 20 61 63 63 65 73 73 20 6c 6f 63  abase access loc
76c0: 6b 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20  ks..  **.  */.  
76d0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 4c 4f 43  case PragTyp_LOC
76e0: 4b 5f 50 52 4f 58 59 5f 46 49 4c 45 3a 20 7b 0a  K_PROXY_FILE: {.
76f0: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
7700: 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  ){.      Pager *
7710: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
7720: 42 74 72 65 65 50 61 67 65 72 28 70 44 62 2d 3e  BtreePager(pDb->
7730: 70 42 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72  pBt);.      char
7740: 20 2a 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74   *proxy_file_pat
7750: 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  h = NULL;.      
7760: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
7770: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
7780: 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
7790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
77a0: 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
77b0: 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 47 45 54  File, SQLITE_GET
77c0: 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
77d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 72 6f              &pro
77f0: 78 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20  xy_file_path);. 
7800: 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c       returnSingl
7810: 65 54 65 78 74 28 76 2c 20 22 6c 6f 63 6b 5f 70  eText(v, "lock_p
7820: 72 6f 78 79 5f 66 69 6c 65 22 2c 20 70 72 6f 78  roxy_file", prox
7830: 79 5f 66 69 6c 65 5f 70 61 74 68 29 3b 0a 20 20  y_file_path);.  
7840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
7850: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
7860: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
7870: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
7880: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7890: 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
78a0: 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29  agerFile(pPager)
78b0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b  ;.      int res;
78c0: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68  .      if( zRigh
78d0: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  t[0] ){.        
78e0: 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c  res=sqlite3OsFil
78f0: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
7900: 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
7910: 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20  ROXYFILE, .     
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7940: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  zRight);.      }
7950: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
7960: 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 46 69 6c  res=sqlite3OsFil
7970: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
7980: 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
7990: 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20 20 20 20  ROXYFILE, .     
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79c0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
79d0: 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 53 51       if( res!=SQ
79e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
79f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7a00: 73 67 28 70 50 61 72 73 65 2c 20 22 66 61 69 6c  sg(pParse, "fail
7a10: 65 64 20 74 6f 20 73 65 74 20 6c 6f 63 6b 20 70  ed to set lock p
7a20: 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a 20 20 20  roxy file");.   
7a30: 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61       goto pragma
7a40: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
7a50: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
7a60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
7a70: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
7a80: 4e 47 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20 20  NG_STYLE */     
7a90: 20 0a 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   .    .  /*.  **
7aa0: 20 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62     PRAGMA [datab
7ab0: 61 73 65 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73  ase.]synchronous
7ac0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
7ad0: 64 61 74 61 62 61 73 65 2e 5d 73 79 6e 63 68 72  database.]synchr
7ae0: 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52  onous=OFF|ON|NOR
7af0: 4d 41 4c 7c 46 55 4c 4c 0a 20 20 2a 2a 0a 20 20  MAL|FULL.  **.  
7b00: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
7b10: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
7b20: 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72 6f 6e   of the synchron
7b30: 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61 6e 67  ous flag.  Chang
7b40: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63  ing.  ** the loc
7b50: 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f  al value does no
7b60: 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74  t make changes t
7b70: 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  o the disk file 
7b80: 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64 65 66  and the.  ** def
7b90: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
7ba0: 62 65 20 72 65 73 74 6f 72 65 64 20 74 68 65 20  be restored the 
7bb0: 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 64 61  next time the da
7bc0: 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f  tabase is.  ** o
7bd0: 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  pened..  */.  ca
7be0: 73 65 20 50 72 61 67 54 79 70 5f 53 59 4e 43 48  se PragTyp_SYNCH
7bf0: 52 4f 4e 4f 55 53 3a 20 7b 0a 20 20 20 20 69 66  RONOUS: {.    if
7c00: 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  ( !zRight ){.   
7c10: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
7c20: 6e 74 28 76 2c 20 22 73 79 6e 63 68 72 6f 6e 6f  nt(v, "synchrono
7c30: 75 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  us", .          
7c40: 20 20 53 51 4c 49 54 45 5f 44 62 53 61 66 65 74    SQLITE_DbSafet
7c50: 79 4c 65 76 65 6c 56 61 6c 75 65 28 70 44 62 2d  yLevelValue(pDb-
7c60: 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 2d 31  >safety_level)-1
7c70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7c80: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74      if( !db->aut
7c90: 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  oCommit ){.     
7ca0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7cb0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
7cc0: 20 20 20 20 20 20 20 20 22 53 61 66 65 74 79 20          "Safety 
7cd0: 6c 65 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65  level may not be
7ce0: 20 63 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20   changed inside 
7cf0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b  a transaction");
7d00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7d10: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 76 65 6c        int iLevel
7d20: 20 3d 20 28 67 65 74 53 61 66 65 74 79 4c 65 76   = (getSafetyLev
7d30: 65 6c 28 7a 52 69 67 68 74 2c 30 2c 31 29 2b 31  el(zRight,0,1)+1
7d40: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7d70: 5f 53 41 46 45 54 59 4c 45 56 45 4c 5f 46 49 58  _SAFETYLEVEL_FIX
7d80: 45 44 3b 0a 20 20 20 20 20 20 20 20 69 4c 65 76  ED;.        iLev
7d90: 65 6c 20 26 3d 20 50 41 47 45 52 5f 53 59 4e 43  el &= PAGER_SYNC
7da0: 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20  HRONOUS_MASK;.  
7db0: 20 20 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c        if( iLevel
7dc0: 3d 3d 30 20 29 20 69 4c 65 76 65 6c 20 3d 20 31  ==0 ) iLevel = 1
7dd0: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  ;.        pDb->s
7de0: 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 69 4c  afety_level = iL
7df0: 65 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 73 65  evel;.        se
7e00: 74 41 6c 6c 50 61 67 65 72 46 6c 61 67 73 28 64  tAllPagerFlags(d
7e10: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
7e20: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
7e30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7e40: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
7e50: 47 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GMAS */..#ifndef
7e60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41   SQLITE_OMIT_FLA
7e70: 47 5f 50 52 41 47 4d 41 53 0a 20 20 63 61 73 65  G_PRAGMAS.  case
7e80: 20 50 72 61 67 54 79 70 5f 46 4c 41 47 3a 20 7b   PragTyp_FLAG: {
7e90: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 3d  .    if( zRight=
7ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
7eb0: 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20 70  rnSingleInt(v, p
7ec0: 50 72 61 67 6d 61 2d 3e 7a 4e 61 6d 65 2c 20 28  Pragma->zName, (
7ed0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 70 50 72 61  db->flags & pPra
7ee0: 67 6d 61 2d 3e 69 41 72 67 29 21 3d 30 20 29 3b  gma->iArg)!=0 );
7ef0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7f00: 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 70 50 72    int mask = pPr
7f10: 61 67 6d 61 2d 3e 69 41 72 67 3b 20 20 20 20 2f  agma->iArg;    /
7f20: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
7f30: 6f 20 73 65 74 20 6f 72 20 63 6c 65 61 72 2e 20  o set or clear. 
7f40: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  */.      if( db-
7f50: 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
7f60: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
7f70: 65 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74  eign key support
7f80: 20 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62   may not be enab
7f90: 6c 65 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20  led or disabled 
7fa0: 77 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20  while not.      
7fb0: 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d 63 6f 6d    ** in auto-com
7fc0: 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20  mit mode.  */.  
7fd0: 20 20 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28        mask &= ~(
7fe0: 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
7ff0: 79 73 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ys);.      }.#if
8000: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
8010: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
8020: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
8030: 75 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f  uthLevel==UAUTH_
8040: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  User ){.        
8050: 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
8060: 6e 6f 6e 2d 61 64 6d 69 6e 20 75 73 65 72 73 20  non-admin users 
8070: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63  to modify the sc
8080: 68 65 6d 61 20 61 72 62 69 74 72 61 72 69 6c 79  hema arbitrarily
8090: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 73 6b   */.        mask
80a0: 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 57 72 69   &= ~(SQLITE_Wri
80b0: 74 65 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  teSchema);.     
80c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
80d0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 42   if( sqlite3GetB
80e0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c 20 30  oolean(zRight, 0
80f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d  ) ){.        db-
8100: 3e 66 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  >flags |= mask;.
8110: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8120: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
8130: 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  = ~mask;.       
8140: 20 69 66 28 20 6d 61 73 6b 3d 3d 53 51 4c 49 54   if( mask==SQLIT
8150: 45 5f 44 65 66 65 72 46 4b 73 20 29 20 64 62 2d  E_DeferFKs ) db-
8160: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
8170: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  s = 0;.      }..
8180: 20 20 20 20 20 20 2f 2a 20 4d 61 6e 79 20 6f 66        /* Many of
8190: 20 74 68 65 20 66 6c 61 67 2d 70 72 61 67 6d 61   the flag-pragma
81a0: 73 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 64  s modify the cod
81b0: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
81c0: 68 65 20 53 51 4c 20 0a 20 20 20 20 20 20 2a 2a  he SQL .      **
81d0: 20 63 6f 6d 70 69 6c 65 72 20 28 65 67 2e 20 63   compiler (eg. c
81e0: 6f 75 6e 74 5f 63 68 61 6e 67 65 73 29 2e 20 53  ount_changes). S
81f0: 6f 20 61 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  o add an opcode 
8200: 74 6f 20 65 78 70 69 72 65 20 61 6c 6c 0a 20 20  to expire all.  
8210: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
8220: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  SQL statements a
8230: 66 74 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  fter modifying a
8240: 20 70 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20   pragma value.. 
8250: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
8260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8270: 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c  v, OP_Expire, 0,
8280: 20 30 29 3b 0a 20 20 20 20 20 20 73 65 74 41 6c   0);.      setAl
8290: 6c 50 61 67 65 72 46 6c 61 67 73 28 64 62 29 3b  lPagerFlags(db);
82a0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
82b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
82c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47  SQLITE_OMIT_FLAG
82d0: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
82e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
82f0: 5f 53 43 48 45 4d 41 5f 50 52 41 47 4d 41 53 0a  _SCHEMA_PRAGMAS.
8300: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
8310: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 3c 74  MA table_info(<t
8320: 61 62 6c 65 3e 29 0a 20 20 2a 2a 0a 20 20 2a 2a  able>).  **.  **
8330: 20 52 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   Return a single
8340: 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20 63 6f   row for each co
8350: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65  lumn of the name
8360: 64 20 74 61 62 6c 65 2e 20 54 68 65 20 63 6f 6c  d table. The col
8370: 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  umns of.  ** the
8380: 20 72 65 74 75 72 6e 65 64 20 64 61 74 61 20 73   returned data s
8390: 65 74 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  et are:.  **.  *
83a0: 2a 20 63 69 64 3a 20 20 20 20 20 20 20 20 43 6f  * cid:        Co
83b0: 6c 75 6d 6e 20 69 64 20 28 6e 75 6d 62 65 72 65  lumn id (numbere
83c0: 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  d from left to r
83d0: 69 67 68 74 2c 20 73 74 61 72 74 69 6e 67 20 61  ight, starting a
83e0: 74 20 30 29 0a 20 20 2a 2a 20 6e 61 6d 65 3a 20  t 0).  ** name: 
83f0: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d        Column nam
8400: 65 0a 20 20 2a 2a 20 74 79 70 65 3a 20 20 20 20  e.  ** type:    
8410: 20 20 20 43 6f 6c 75 6d 6e 20 64 65 63 6c 61 72     Column declar
8420: 61 74 69 6f 6e 20 74 79 70 65 2e 0a 20 20 2a 2a  ation type..  **
8430: 20 6e 6f 74 6e 75 6c 6c 3a 20 20 20 20 54 72 75   notnull:    Tru
8440: 65 20 69 66 20 27 4e 4f 54 20 4e 55 4c 4c 27 20  e if 'NOT NULL' 
8450: 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6c 75 6d  is part of colum
8460: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 20 20  n declaration.  
8470: 2a 2a 20 64 66 6c 74 5f 76 61 6c 75 65 3a 20 54  ** dflt_value: T
8480: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
8490: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c   for the column,
84a0: 20 69 66 20 61 6e 79 2e 0a 20 20 2a 2f 0a 20 20   if any..  */.  
84b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 54 41 42  case PragTyp_TAB
84c0: 4c 45 5f 49 4e 46 4f 3a 20 69 66 28 20 7a 52 69  LE_INFO: if( zRi
84d0: 67 68 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ght ){.    Table
84e0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 54 61 62   *pTab;.    pTab
84f0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
8500: 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20  ble(db, zRight, 
8510: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
8520: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74  ab ){.      stat
8530: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
8540: 7a 43 6f 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  zCol[] = {.     
8550: 20 20 20 20 22 63 69 64 22 2c 20 22 6e 61 6d 65      "cid", "name
8560: 22 2c 20 22 74 79 70 65 22 2c 20 22 6e 6f 74 6e  ", "type", "notn
8570: 75 6c 6c 22 2c 20 22 64 66 6c 74 5f 76 61 6c 75  ull", "dflt_valu
8580: 65 22 2c 20 22 70 6b 22 0a 20 20 20 20 20 20 7d  e", "pk".      }
8590: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b  ;.      int i, k
85a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64  ;.      int nHid
85b0: 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43  den = 0;.      C
85c0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20  olumn *pCol;.   
85d0: 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
85e0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
85f0: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
8600: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8610: 20 3d 20 36 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 6;.      sqli
8620: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
8630: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
8640: 3b 0a 20 20 20 20 20 20 73 65 74 41 6c 6c 43 6f  ;.      setAllCo
8650: 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 36 2c 20  lumnNames(v, 6, 
8660: 61 7a 43 6f 6c 29 3b 20 61 73 73 65 72 74 28 20  azCol); assert( 
8670: 36 3d 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 43  6==ArraySize(azC
8680: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ol) );.      sql
8690: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
86a0: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
86b0: 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Tab);.      for(
86c0: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
86d0: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
86e0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
86f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
8700: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f  HiddenColumn(pCo
8710: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
8720: 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20  nHidden++;.     
8730: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8740: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8750: 20 69 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46   if( (pCol->colF
8760: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
8770: 52 49 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20  RIMKEY)==0 ){.  
8780: 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20          k = 0;. 
8790: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
87a0: 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPk==0 ){.     
87b0: 20 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20       k = 1;.    
87c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
87d0: 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
87e0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 70  =pTab->nCol && p
87f0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 2d 31  Pk->aiColumn[k-1
8800: 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20  ]!=i; k++){}.   
8810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
8820: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
8830: 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 73 69 73  oad(v, 1, "issis
8840: 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i",.            
8850: 20 20 20 69 2d 6e 48 69 64 64 65 6e 2c 0a 20 20     i-nHidden,.  
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
8870: 6c 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  l->zName,.      
8880: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
8890: 54 79 70 65 20 3f 20 70 43 6f 6c 2d 3e 7a 54 79  Type ? pCol->zTy
88a0: 70 65 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20  pe : "",.       
88b0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 6e 6f          pCol->no
88c0: 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30 2c 0a 20  tNull ? 1 : 0,. 
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
88e0: 6f 6c 2d 3e 7a 44 66 6c 74 2c 0a 20 20 20 20 20  ol->zDflt,.     
88f0: 20 20 20 20 20 20 20 20 20 20 6b 29 3b 0a 20 20            k);.  
8900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8910: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
8920: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 36 29 3b 0a  sultRow, 1, 6);.
8930: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8940: 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20 20 63 61  }.  break;..  ca
8950: 73 65 20 50 72 61 67 54 79 70 5f 53 54 41 54 53  se PragTyp_STATS
8960: 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  : {.    static c
8970: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c  onst char *azCol
8980: 5b 5d 20 3d 20 7b 20 22 74 61 62 6c 65 22 2c 20  [] = { "table", 
8990: 22 69 6e 64 65 78 22 2c 20 22 77 69 64 74 68 22  "index", "width"
89a0: 2c 20 22 68 65 69 67 68 74 22 20 7d 3b 0a 20 20  , "height" };.  
89b0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
89c0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a     HashElem *i;.
89d0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
89e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
89f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8a00: 20 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 4;.    sqlite
8a10: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
8a20: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
8a30: 20 20 20 20 73 65 74 41 6c 6c 43 6f 6c 75 6d 6e      setAllColumn
8a40: 4e 61 6d 65 73 28 76 2c 20 34 2c 20 61 7a 43 6f  Names(v, 4, azCo
8a50: 6c 29 3b 20 20 61 73 73 65 72 74 28 20 34 3d 3d  l);  assert( 4==
8a60: 41 72 72 61 79 53 69 7a 65 28 61 7a 43 6f 6c 29  ArraySize(azCol)
8a70: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 71   );.    for(i=sq
8a80: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
8a90: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
8aa0: 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Hash); i; i=sqli
8ab0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
8ac0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
8ad0: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
8ae0: 74 61 28 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ta(i);.      sql
8af0: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
8b00: 64 28 76 2c 20 31 2c 20 22 73 73 69 69 22 2c 0a  d(v, 1, "ssii",.
8b10: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
8b20: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
8b30: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
8b40: 20 28 69 6e 74 29 73 71 6c 69 74 65 33 4c 6f 67   (int)sqlite3Log
8b50: 45 73 74 54 6f 49 6e 74 28 70 54 61 62 2d 3e 73  EstToInt(pTab->s
8b60: 7a 54 61 62 52 6f 77 29 2c 0a 20 20 20 20 20 20  zTabRow),.      
8b70: 20 20 20 20 20 28 69 6e 74 29 73 71 6c 69 74 65       (int)sqlite
8b80: 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 54 61  3LogEstToInt(pTa
8b90: 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 29 29 3b  b->nRowLogEst));
8ba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8bb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
8bc0: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 34 29 3b  esultRow, 1, 4);
8bd0: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
8be0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
8bf0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
8c00: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73  Next){.        s
8c10: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
8c20: 6f 61 64 28 76 2c 20 32 2c 20 22 73 69 69 22 2c  oad(v, 2, "sii",
8c30: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
8c40: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
8c50: 20 20 20 20 28 69 6e 74 29 73 71 6c 69 74 65 33      (int)sqlite3
8c60: 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49 64 78  LogEstToInt(pIdx
8c70: 2d 3e 73 7a 49 64 78 52 6f 77 29 2c 0a 20 20 20  ->szIdxRow),.   
8c80: 20 20 20 20 20 20 20 20 28 69 6e 74 29 73 71 6c          (int)sql
8c90: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
8ca0: 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
8cb0: 74 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  t[0]));.        
8cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8cd0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
8ce0: 77 2c 20 31 2c 20 34 29 3b 0a 20 20 20 20 20 20  w, 1, 4);.      
8cf0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  }.    }.  }.  br
8d00: 65 61 6b 3b 0a 0a 20 20 63 61 73 65 20 50 72 61  eak;..  case Pra
8d10: 67 54 79 70 5f 49 4e 44 45 58 5f 49 4e 46 4f 3a  gTyp_INDEX_INFO:
8d20: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
8d30: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
8d40: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8d50: 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69  .    pIdx = sqli
8d60: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
8d70: 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20   zRight, zDb);. 
8d80: 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20     if( pIdx ){. 
8d90: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
8da0: 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 5b 5d 20  t char *azCol[] 
8db0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 22 73 65  = {.         "se
8dc0: 71 6e 6f 22 2c 20 22 63 69 64 22 2c 20 22 6e 61  qno", "cid", "na
8dd0: 6d 65 22 2c 20 22 64 65 73 63 22 2c 20 22 63 6f  me", "desc", "co
8de0: 6c 6c 22 2c 20 22 6b 65 79 22 0a 20 20 20 20 20  ll", "key".     
8df0: 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   };.      int i;
8e00: 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 3b 0a 20  .      int mx;. 
8e10: 20 20 20 20 20 69 66 28 20 70 50 72 61 67 6d 61       if( pPragma
8e20: 2d 3e 69 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->iArg ){.      
8e30: 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65    /* PRAGMA inde
8e40: 78 5f 78 69 6e 66 6f 20 28 6e 65 77 65 72 20 76  x_xinfo (newer v
8e50: 65 72 73 69 6f 6e 20 77 69 74 68 20 6d 6f 72 65  ersion with more
8e60: 20 72 6f 77 73 20 61 6e 64 20 63 6f 6c 75 6d 6e   rows and column
8e70: 73 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 78  s) */.        mx
8e80: 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
8e90: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8ea0: 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a 20 20 20 20  ->nMem = 6;.    
8eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8ec0: 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78   /* PRAGMA index
8ed0: 5f 69 6e 66 6f 20 28 6c 65 67 61 63 79 20 76 65  _info (legacy ve
8ee0: 72 73 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 20 20  rsion) */.      
8ef0: 20 20 6d 78 20 3d 20 70 49 64 78 2d 3e 6e 4b 65    mx = pIdx->nKe
8f00: 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 50  yCol;.        pP
8f10: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a  arse->nMem = 3;.
8f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
8f30: 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
8f40: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
8f50: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
8f60: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
8f70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
8f80: 72 73 65 2d 3e 6e 4d 65 6d 3c 3d 41 72 72 61 79  rse->nMem<=Array
8f90: 53 69 7a 65 28 61 7a 43 6f 6c 29 20 29 3b 0a 20  Size(azCol) );. 
8fa0: 20 20 20 20 20 73 65 74 41 6c 6c 43 6f 6c 75 6d       setAllColum
8fb0: 6e 4e 61 6d 65 73 28 76 2c 20 70 50 61 72 73 65  nNames(v, pParse
8fc0: 2d 3e 6e 4d 65 6d 2c 20 61 7a 43 6f 6c 29 3b 0a  ->nMem, azCol);.
8fd0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8fe0: 3c 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <mx; i++){.     
8ff0: 20 20 20 69 31 36 20 63 6e 75 6d 20 3d 20 70 49     i16 cnum = pI
9000: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
9010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9020: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
9030: 20 31 2c 20 22 69 69 73 22 2c 20 69 2c 20 63 6e   1, "iis", i, cn
9040: 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9060: 20 63 6e 75 6d 3c 30 20 3f 20 30 20 3a 20 70 54   cnum<0 ? 0 : pT
9070: 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a  ab->aCol[cnum].z
9080: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
9090: 66 28 20 70 50 72 61 67 6d 61 2d 3e 69 41 72 67  f( pPragma->iArg
90a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
90b0: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
90c0: 61 64 28 76 2c 20 34 2c 20 22 69 73 69 22 2c 0a  ad(v, 4, "isi",.
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
90e0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 2c  ->aSortOrder[i],
90f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
9100: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 0a 20 20  x->azColl[i],.  
9110: 20 20 20 20 20 20 20 20 20 20 69 3c 70 49 64 78            i<pIdx
9120: 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20  ->nKeyCol);.    
9130: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
9140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9150: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
9160: 20 31 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d   1, pParse->nMem
9170: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9180: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
9190: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 49 4e   case PragTyp_IN
91a0: 44 45 58 5f 4c 49 53 54 3a 20 69 66 28 20 7a 52  DEX_LIST: if( zR
91b0: 69 67 68 74 20 29 7b 0a 20 20 20 20 49 6e 64 65  ight ){.    Inde
91c0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62  x *pIdx;.    Tab
91d0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 6e  le *pTab;.    in
91e0: 74 20 69 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  t i;.    pTab = 
91f0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
9200: 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  (db, zRight, zDb
9210: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
9220: 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  ){.      static 
9230: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f  const char *azCo
9240: 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  l[] = {.        
9250: 22 73 65 71 22 2c 20 22 6e 61 6d 65 22 2c 20 22  "seq", "name", "
9260: 75 6e 69 71 75 65 22 2c 20 22 6f 72 69 67 69 6e  unique", "origin
9270: 22 2c 20 22 70 61 72 74 69 61 6c 22 0a 20 20 20  ", "partial".   
9280: 20 20 20 7d 3b 0a 20 20 20 20 20 20 76 20 3d 20     };.      v = 
9290: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
92a0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 50  Parse);.      pP
92b0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 35 3b 0a  arse->nMem = 5;.
92c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
92d0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
92e0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
92f0: 20 20 73 65 74 41 6c 6c 43 6f 6c 75 6d 6e 4e 61    setAllColumnNa
9300: 6d 65 73 28 76 2c 20 35 2c 20 61 7a 43 6f 6c 29  mes(v, 5, azCol)
9310: 3b 20 20 61 73 73 65 72 74 28 20 35 3d 3d 41 72  ;  assert( 5==Ar
9320: 72 61 79 53 69 7a 65 28 61 7a 43 6f 6c 29 20 29  raySize(azCol) )
9330: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  ;.      for(pIdx
9340: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 69  =pTab->pIndex, i
9350: 3d 30 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  =0; pIdx; pIdx=p
9360: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29  Idx->pNext, i++)
9370: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
9380: 63 68 61 72 20 2a 61 7a 4f 72 69 67 69 6e 5b 5d  char *azOrigin[]
9390: 20 3d 20 7b 20 22 63 22 2c 20 22 75 22 2c 20 22   = { "c", "u", "
93a0: 70 6b 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 73  pk" };.        s
93b0: 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
93c0: 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 69 73 69  oad(v, 1, "isisi
93d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 69 2c  ",.           i,
93e0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78  .           pIdx
93f0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
9400: 20 20 20 20 49 73 55 6e 69 71 75 65 49 6e 64 65      IsUniqueInde
9410: 78 28 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20  x(pIdx),.       
9420: 20 20 20 20 61 7a 4f 72 69 67 69 6e 5b 70 49 64      azOrigin[pId
9430: 78 2d 3e 69 64 78 54 79 70 65 5d 2c 0a 20 20 20  x->idxType],.   
9440: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 50          pIdx->pP
9450: 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 29 3b  artIdxWhere!=0);
9460: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9470: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9480: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 35  _ResultRow, 1, 5
9490: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
94a0: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 20  .  }.  break;.. 
94b0: 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 44 41   case PragTyp_DA
94c0: 54 41 42 41 53 45 5f 4c 49 53 54 3a 20 7b 0a 20  TABASE_LIST: {. 
94d0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
94e0: 63 68 61 72 20 2a 61 7a 43 6f 6c 5b 5d 20 3d 20  char *azCol[] = 
94f0: 7b 20 22 73 65 71 22 2c 20 22 6e 61 6d 65 22 2c  { "seq", "name",
9500: 20 22 66 69 6c 65 22 20 7d 3b 0a 20 20 20 20 69   "file" };.    i
9510: 6e 74 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65  nt i;.    pParse
9520: 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20  ->nMem = 3;.    
9530: 73 65 74 41 6c 6c 43 6f 6c 75 6d 6e 4e 61 6d 65  setAllColumnName
9540: 73 28 76 2c 20 33 2c 20 61 7a 43 6f 6c 29 3b 20  s(v, 3, azCol); 
9550: 61 73 73 65 72 74 28 20 33 3d 3d 41 72 72 61 79  assert( 3==Array
9560: 53 69 7a 65 28 61 7a 43 6f 6c 29 20 29 3b 0a 20  Size(azCol) );. 
9570: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
9580: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
9590: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
95a0: 5d 2e 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69  ].pBt==0 ) conti
95b0: 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
95c0: 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  t( db->aDb[i].zN
95d0: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ame!=0 );.      
95e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
95f0: 4c 6f 61 64 28 76 2c 20 31 2c 20 22 69 73 73 22  Load(v, 1, "iss"
9600: 2c 0a 20 20 20 20 20 20 20 20 20 69 2c 0a 20 20  ,.         i,.  
9610: 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
9620: 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ].zName,.       
9630: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
9640: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
9650: 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20  b[i].pBt));.    
9660: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9670: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9680: 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 20 20  Row, 1, 3);.    
9690: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
96a0: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 43    case PragTyp_C
96b0: 4f 4c 4c 41 54 49 4f 4e 5f 4c 49 53 54 3a 20 7b  OLLATION_LIST: {
96c0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
96d0: 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 5b 5d 20  t char *azCol[] 
96e0: 3d 20 7b 20 22 73 65 71 22 2c 20 22 6e 61 6d 65  = { "seq", "name
96f0: 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d  " };.    int i =
9700: 20 30 3b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d   0;.    HashElem
9710: 20 2a 70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   *p;.    pParse-
9720: 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20 20 20 73  >nMem = 2;.    s
9730: 65 74 41 6c 6c 43 6f 6c 75 6d 6e 4e 61 6d 65 73  etAllColumnNames
9740: 28 76 2c 20 32 2c 20 61 7a 43 6f 6c 29 3b 20 61  (v, 2, azCol); a
9750: 73 73 65 72 74 28 20 32 3d 3d 41 72 72 61 79 53  ssert( 2==ArrayS
9760: 69 7a 65 28 61 7a 43 6f 6c 29 20 29 3b 0a 20 20  ize(azCol) );.  
9770: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61    for(p=sqliteHa
9780: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
9790: 6c 6c 53 65 71 29 3b 20 70 3b 20 70 3d 73 71 6c  llSeq); p; p=sql
97a0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
97b0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
97c0: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
97d0: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
97e0: 61 28 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  a(p);.      sqli
97f0: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
9800: 28 76 2c 20 31 2c 20 22 69 73 22 2c 20 69 2b 2b  (v, 1, "is", i++
9810: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
9820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9830: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
9840: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 32 29 3b  esultRow, 1, 2);
9850: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
9860: 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ak;.#endif /* SQ
9870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41  LITE_OMIT_SCHEMA
9880: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
9890: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
98a0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 63  _FOREIGN_KEY.  c
98b0: 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45  ase PragTyp_FORE
98c0: 49 47 4e 5f 4b 45 59 5f 4c 49 53 54 3a 20 69 66  IGN_KEY_LIST: if
98d0: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
98e0: 46 4b 65 79 20 2a 70 46 4b 3b 0a 20 20 20 20 54  FKey *pFK;.    T
98f0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
9900: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
9910: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67  ndTable(db, zRig
9920: 68 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  ht, zDb);.    if
9930: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
9940: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
9950: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
9960: 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e 70 46    pFK = pTab->pF
9970: 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Key;.      if( p
9980: 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  FK ){.        st
9990: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
99a0: 2a 61 7a 43 6f 6c 5b 5d 20 3d 20 7b 0a 20 20 20  *azCol[] = {.   
99b0: 20 20 20 20 20 20 20 20 22 69 64 22 2c 20 22 73          "id", "s
99c0: 65 71 22 2c 20 22 74 61 62 6c 65 22 2c 20 22 66  eq", "table", "f
99d0: 72 6f 6d 22 2c 20 22 74 6f 22 2c 20 22 6f 6e 5f  rom", "to", "on_
99e0: 75 70 64 61 74 65 22 2c 20 22 6f 6e 5f 64 65 6c  update", "on_del
99f0: 65 74 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ete",.          
9a00: 20 22 6d 61 74 63 68 22 0a 20 20 20 20 20 20 20   "match".       
9a10: 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   };.        int 
9a20: 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 20 20  i = 0; .        
9a30: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 38  pParse->nMem = 8
9a40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9a50: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
9a60: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
9a70: 20 20 20 20 20 20 20 20 73 65 74 41 6c 6c 43 6f          setAllCo
9a80: 6c 75 6d 6e 4e 61 6d 65 73 28 76 2c 20 38 2c 20  lumnNames(v, 8, 
9a90: 61 7a 43 6f 6c 29 3b 20 61 73 73 65 72 74 28 20  azCol); assert( 
9aa0: 38 3d 3d 41 72 72 61 79 53 69 7a 65 28 61 7a 43  8==ArraySize(azC
9ab0: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 77  ol) );.        w
9ac0: 68 69 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20  hile(pFK){.     
9ad0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
9ae0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
9af0: 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  <pFK->nCol; j++)
9b00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
9b10: 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f  lite3VdbeMultiLo
9b20: 61 64 28 76 2c 20 31 2c 20 22 69 69 73 73 73 73  ad(v, 1, "iissss
9b30: 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ss",.           
9b40: 20 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20          i,.     
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c                j,
9b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9b70: 20 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c 0a 20 20      pFK->zTo,.  
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d   pTab->aCol[pFK-
9ba0: 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e  >aCol[j].iFrom].
9bb0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
9bc0: 20 20 20 20 20 20 20 20 20 20 70 46 4b 2d 3e 61            pFK->a
9bd0: 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 0a 20 20 20  Col[j].zCol,.   
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d 3e  actionName(pFK->
9c00: 61 41 63 74 69 6f 6e 5b 31 5d 29 2c 20 20 2f 2a  aAction[1]),  /*
9c10: 20 4f 4e 20 55 50 44 41 54 45 20 2a 2f 0a 20 20   ON UPDATE */.  
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c30: 20 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b 2d   actionName(pFK-
9c40: 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 2c 20 20 2f  >aAction[0]),  /
9c50: 2a 20 4f 4e 20 44 45 4c 45 54 45 20 2a 2f 0a 20  * ON DELETE */. 
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 20 20 22 4e 4f 4e 45 22 29 3b 0a 20 20 20 20 20    "NONE");.     
9c80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9c90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
9ca0: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 38 29 3b  esultRow, 1, 8);
9cb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9cc0: 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20         ++i;.    
9cd0: 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d        pFK = pFK-
9ce0: 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20  >pNextFrom;.    
9cf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9d00: 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b    }.  }.  break;
9d10: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
9d20: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9d30: 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
9d40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9d50: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
9d60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9d70: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 63  OMIT_TRIGGER.  c
9d80: 61 73 65 20 50 72 61 67 54 79 70 5f 46 4f 52 45  ase PragTyp_FORE
9d90: 49 47 4e 5f 4b 45 59 5f 43 48 45 43 4b 3a 20 7b  IGN_KEY_CHECK: {
9da0: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 20  .    FKey *pFK; 
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9dc0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
9dd0: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 54  straint */.    T
9de0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
9df0: 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 74        /* Child t
9e00: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52 45  able contain "RE
9e10: 46 45 52 45 4e 43 45 53 22 20 6b 65 79 77 6f 72  FERENCES" keywor
9e20: 64 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  d */.    Table *
9e30: 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
9e40: 2f 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20  /* Parent table 
9e50: 74 68 61 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  that child point
9e60: 73 20 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64 65  s to */.    Inde
9e70: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
9e80: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 74     /* Index in t
9e90: 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
9ea0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  */.    int i;   
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ec0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20   Loop counter:  
9ed0: 46 6f 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d 62  Foreign key numb
9ee0: 65 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  er for pTab */. 
9ef0: 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
9f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9f10: 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 69 65 6c  p counter:  Fiel
9f20: 64 20 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e  d of the foreign
9f30: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 48 61 73 68   key */.    Hash
9f40: 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
9f50: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9f60: 65 72 3a 20 20 4e 65 78 74 20 74 61 62 6c 65 20  er:  Next table 
9f70: 69 6e 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  in schema */.   
9f80: 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20   int x;         
9f90: 20 20 20 20 20 20 20 20 2f 2a 20 72 65 73 75 6c          /* resul
9fa0: 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  t variable */.  
9fb0: 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b    int regResult;
9fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 72 65           /* 3 re
9fd0: 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
9fe0: 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
9ff0: 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79 3b 20      int regKey; 
a000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a010: 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6b  gister to hold k
a020: 65 79 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 20  ey for checking 
a030: 74 68 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69 6e  the FK */.    in
a040: 74 20 72 65 67 52 6f 77 3b 20 20 20 20 20 20 20  t regRow;       
a050: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
a060: 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77 20  s to hold a row 
a070: 66 72 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20 20  from pTab */.   
a080: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
a090: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
a0a0: 66 20 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69 6e  f a loop checkin
a0b0: 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 2a  g foreign keys *
a0c0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f 6b  /.    int addrOk
a0d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a0e0: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
a0f0: 20 6b 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20 20   key is OK */.  
a100: 20 20 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20 20    int *aiCols;  
a110: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 69 6c           /* chil
a120: 64 20 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c 75  d to parent colu
a130: 6d 6e 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  mn mapping */.  
a140: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
a150: 68 61 72 20 2a 61 7a 43 6f 6c 5b 5d 20 3d 20 7b  har *azCol[] = {
a160: 20 22 74 61 62 6c 65 22 2c 20 22 72 6f 77 69 64   "table", "rowid
a170: 22 2c 20 22 70 61 72 65 6e 74 22 2c 20 22 66 6b  ", "parent", "fk
a180: 69 64 22 20 7d 3b 0a 0a 20 20 20 20 72 65 67 52  id" };..    regR
a190: 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e  esult = pParse->
a1a0: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
a1b0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 34 3b 0a 20  se->nMem += 4;. 
a1c0: 20 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50     regKey = ++pP
a1d0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
a1e0: 72 65 67 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  regRow = ++pPars
a1f0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
a200: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
a210: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 65 74  pParse);.    set
a220: 41 6c 6c 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 76  AllColumnNames(v
a230: 2c 20 34 2c 20 61 7a 43 6f 6c 29 3b 20 61 73 73  , 4, azCol); ass
a240: 65 72 74 28 20 34 3d 3d 41 72 72 61 79 53 69 7a  ert( 4==ArraySiz
a250: 65 28 61 7a 43 6f 6c 29 20 29 3b 0a 20 20 20 20  e(azCol) );.    
a260: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
a270: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
a280: 69 44 62 29 3b 0a 20 20 20 20 6b 20 3d 20 73 71  iDb);.    k = sq
a290: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
a2a0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
a2b0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 0a 20  ema->tblHash);. 
a2c0: 20 20 20 77 68 69 6c 65 28 20 6b 20 29 7b 0a 20     while( k ){. 
a2d0: 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20       if( zRight 
a2e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  ){.        pTab 
a2f0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
a300: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
a310: 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a 20 20  zRight, zDb);.  
a320: 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20        k = 0;.   
a330: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a340: 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
a350: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
a360: 6b 29 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  k);.        k = 
a370: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
a380: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a390: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
a3a0: 70 54 61 62 2d 3e 70 46 4b 65 79 3d 3d 30 20 29  pTab->pFKey==0 )
a3b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a3c0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
a3d0: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
a3e0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
a3f0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
a400: 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c    if( pTab->nCol
a410: 2b 72 65 67 52 6f 77 3e 70 50 61 72 73 65 2d 3e  +regRow>pParse->
a420: 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e  nMem ) pParse->n
a430: 4d 65 6d 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Mem = pTab->nCol
a440: 20 2b 20 72 65 67 52 6f 77 3b 0a 20 20 20 20 20   + regRow;.     
a450: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
a460: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  e(pParse, 0, iDb
a470: 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
a480: 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ead);.      sqli
a490: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
a4a0: 67 28 76 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  g(v, regResult, 
a4b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
a4c0: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46 4b      for(i=1, pFK
a4d0: 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46  =pTab->pFKey; pF
a4e0: 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d  K; i++, pFK=pFK-
a4f0: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
a500: 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73       pParent = s
a510: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
a520: 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44  db, pFK->zTo, zD
a530: 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  b);.        if( 
a540: 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 63 6f 6e  pParent==0 ) con
a550: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
a560: 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
a570: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
a580: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
a590: 50 61 72 65 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c  Parent->tnum, 0,
a5a0: 20 70 50 61 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29   pParent->zName)
a5b0: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 73 71  ;.        x = sq
a5c0: 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64  lite3FkLocateInd
a5d0: 65 78 28 70 50 61 72 73 65 2c 20 70 50 61 72 65  ex(pParse, pPare
a5e0: 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64 78 2c 20  nt, pFK, &pIdx, 
a5f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
a600: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
a610: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
a620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a630: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
a640: 61 72 73 65 2c 20 69 2c 20 69 44 62 2c 20 70 50  arse, i, iDb, pP
a650: 61 72 65 6e 74 2c 20 4f 50 5f 4f 70 65 6e 52 65  arent, OP_OpenRe
a660: 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ad);.          }
a670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a690: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
a6a0: 61 64 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75  ad, i, pIdx->tnu
a6b0: 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
a6c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a6d0: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
a6e0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
a6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a710: 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   k = 0;.        
a720: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a730: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a740: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
a750: 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 46 4b 3d 3d  >nErr>0 || pFK==
a760: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
a770: 46 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  FK ) break;.    
a780: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
a790: 61 62 3c 69 20 29 20 70 50 61 72 73 65 2d 3e 6e  ab<i ) pParse->n
a7a0: 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 61  Tab = i;.      a
a7b0: 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
a7c0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
a7d0: 5f 52 65 77 69 6e 64 2c 20 30 29 3b 20 56 64 62  _Rewind, 0); Vdb
a7e0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a7f0: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 46 4b      for(i=1, pFK
a800: 3d 70 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46  =pTab->pFKey; pF
a810: 4b 3b 20 69 2b 2b 2c 20 70 46 4b 3d 70 46 4b 2d  K; i++, pFK=pFK-
a820: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
a830: 20 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73       pParent = s
a840: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
a850: 64 62 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44  db, pFK->zTo, zD
a860: 62 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  b);.        pIdx
a870: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 69   = 0;.        ai
a880: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cols = 0;.      
a890: 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
a8a0: 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73  .          x = s
a8b0: 71 6c 69 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e  qlite3FkLocateIn
a8c0: 64 65 78 28 70 50 61 72 73 65 2c 20 70 50 61 72  dex(pParse, pPar
a8d0: 65 6e 74 2c 20 70 46 4b 2c 20 26 70 49 64 78 2c  ent, pFK, &pIdx,
a8e0: 20 26 61 69 43 6f 6c 73 29 3b 0a 20 20 20 20 20   &aiCols);.     
a8f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3d 3d       assert( x==
a900: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  0 );.        }. 
a910: 20 20 20 20 20 20 20 61 64 64 72 4f 6b 20 3d 20         addrOk = 
a920: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
a930: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
a940: 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20   if( pParent && 
a950: 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
a960: 20 20 20 20 20 69 6e 74 20 69 4b 65 79 20 3d 20       int iKey = 
a970: 70 46 4b 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  pFK->aCol[0].iFr
a980: 6f 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  om;.          as
a990: 73 65 72 74 28 20 69 4b 65 79 3e 3d 30 20 26 26  sert( iKey>=0 &&
a9a0: 20 69 4b 65 79 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iKey<pTab->nCol
a9b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
a9c0: 28 20 69 4b 65 79 21 3d 70 54 61 62 2d 3e 69 50  ( iKey!=pTab->iP
a9d0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
a9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a9f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
aa00: 6e 2c 20 30 2c 20 69 4b 65 79 2c 20 72 65 67 52  n, 0, iKey, regR
aa10: 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ow);.           
aa20: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
aa30: 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
aa40: 4b 65 79 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  Key, regRow);.  
aa50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aa60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
aa70: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77  P_IsNull, regRow
aa80: 2c 20 61 64 64 72 4f 6b 29 3b 20 56 64 62 65 43  , addrOk); VdbeC
aa90: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
aaa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
aab0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
aac0: 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 52 6f  MustBeInt, regRo
aad0: 77 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  w, .            
aae0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
aaf0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
ab00: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ab10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
ab20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
ab30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ab40: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c  (v, OP_Rowid, 0,
ab50: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20   regRow);.      
ab60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ab70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ab80: 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
ab90: 73 2c 20 69 2c 20 30 2c 20 72 65 67 52 6f 77 29  s, i, 0, regRow)
aba0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
abb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
abc0: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
abd0: 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20  addrOk);.       
abe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
abf0: 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65  mpHere(v, sqlite
ac00: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
ac10: 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 20 20  (v)-2);.        
ac20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ac30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d   for(j=0; j<pFK-
ac40: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
ac50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ac60: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
ac70: 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
ac80: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aca0: 20 61 69 43 6f 6c 73 20 3f 20 61 69 43 6f 6c 73   aiCols ? aiCols
acb0: 5b 6a 5d 20 3a 20 70 46 4b 2d 3e 61 43 6f 6c 5b  [j] : pFK->aCol[
acc0: 6a 5d 2e 69 46 72 6f 6d 2c 20 72 65 67 52 6f 77  j].iFrom, regRow
acd0: 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +j);.           
ace0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
acf0: 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
ad00: 20 72 65 67 52 6f 77 2b 6a 2c 20 61 64 64 72 4f   regRow+j, addrO
ad10: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
ad20: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
ad30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
ad40: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
ad50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ad60: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
ad70: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
ad80: 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67  , pFK->nCol, reg
ad90: 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41     sqlite3IndexA
adc0: 66 66 69 6e 69 74 79 53 74 72 28 64 62 2c 70 49  ffinityStr(db,pI
add0: 64 78 29 2c 20 70 46 4b 2d 3e 6e 43 6f 6c 29 3b  dx), pFK->nCol);
ade0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
adf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
ae00: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
ae10: 2c 20 61 64 64 72 4f 6b 2c 20 72 65 67 4b 65 79  , addrOk, regKey
ae20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
ae30: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
ae40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
ae50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ae60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ae70: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
ae80: 30 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b  0, regResult+1);
ae90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
aea0: 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 76 2c  VdbeMultiLoad(v,
aeb0: 20 72 65 67 52 65 73 75 6c 74 2b 32 2c 20 22 73   regResult+2, "s
aec0: 69 22 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 69 2d  i", pFK->zTo, i-
aed0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
aee0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
aef0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
af00: 65 67 52 65 73 75 6c 74 2c 20 34 29 3b 0a 20 20  egResult, 4);.  
af10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
af20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
af30: 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20   addrOk);.      
af40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
af50: 64 62 2c 20 61 69 43 6f 6c 73 29 3b 0a 20 20 20  db, aiCols);.   
af60: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
af70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
af80: 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72  OP_Next, 0, addr
af90: 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  Top+1); VdbeCove
afa0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
afb0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
afc0: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
afd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
afe0: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  k;.#endif /* !de
aff0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b000: 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 23 65  T_TRIGGER) */.#e
b010: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
b020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
b030: 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69  EIGN_KEY) */..#i
b040: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 63  fndef NDEBUG.  c
b050: 61 73 65 20 50 72 61 67 54 79 70 5f 50 41 52 53  ase PragTyp_PARS
b060: 45 52 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20  ER_TRACE: {.    
b070: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
b080: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
b090: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
b0a0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
b0b0: 73 71 6c 69 74 65 33 50 61 72 73 65 72 54 72 61  sqlite3ParserTra
b0c0: 63 65 28 73 74 64 65 72 72 2c 20 22 70 61 72 73  ce(stderr, "pars
b0d0: 65 72 3a 20 22 29 3b 0a 20 20 20 20 20 20 7d 65  er: ");.      }e
b0e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
b0f0: 69 74 65 33 50 61 72 73 65 72 54 72 61 63 65 28  ite3ParserTrace(
b100: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
b110: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
b120: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
b130: 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b  einstall the LIK
b140: 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74  E and GLOB funct
b150: 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61  ions.  The varia
b160: 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20  nt of LIKE.  ** 
b170: 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73  used will be cas
b180: 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e  e sensitive or n
b190: 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ot depending on 
b1a0: 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
b1b0: 63 61 73 65 20 50 72 61 67 54 79 70 5f 43 41 53  case PragTyp_CAS
b1c0: 45 5f 53 45 4e 53 49 54 49 56 45 5f 4c 49 4b 45  E_SENSITIVE_LIKE
b1d0: 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  : {.    if( zRig
b1e0: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
b1f0: 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65 46  te3RegisterLikeF
b200: 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71 6c  unctions(db, sql
b210: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
b220: 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20 20  Right, 0));.    
b230: 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a  }.  }.  break;..
b240: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49  #ifndef SQLITE_I
b250: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45  NTEGRITY_CHECK_E
b260: 52 52 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e  RROR_MAX.# defin
b270: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49  e SQLITE_INTEGRI
b280: 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d  TY_CHECK_ERROR_M
b290: 41 58 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23  AX 100.#endif..#
b2a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b2b0: 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
b2c0: 43 4b 0a 20 20 2f 2a 20 50 72 61 67 6d 61 20 22  CK.  /* Pragma "
b2d0: 71 75 69 63 6b 5f 63 68 65 63 6b 22 20 69 73 20  quick_check" is 
b2e0: 72 65 64 75 63 65 64 20 76 65 72 73 69 6f 6e 20  reduced version 
b2f0: 6f 66 20 0a 20 20 2a 2a 20 69 6e 74 65 67 72 69  of .  ** integri
b300: 74 79 5f 63 68 65 63 6b 20 64 65 73 69 67 6e 65  ty_check designe
b310: 64 20 74 6f 20 64 65 74 65 63 74 20 6d 6f 73 74  d to detect most
b320: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
b330: 74 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75  tion.  ** withou
b340: 74 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 6f 76  t most of the ov
b350: 65 72 68 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  erhead of a full
b360: 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
b370: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
b380: 61 67 54 79 70 5f 49 4e 54 45 47 52 49 54 59 5f  agTyp_INTEGRITY_
b390: 43 48 45 43 4b 3a 20 7b 0a 20 20 20 20 69 6e 74  CHECK: {.    int
b3a0: 20 69 2c 20 6a 2c 20 61 64 64 72 2c 20 6d 78 45   i, j, addr, mxE
b3b0: 72 72 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65  rr;..    /* Code
b3c0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
b3d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
b3e0: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 2e  integrity check.
b3f0: 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 0a 20 20    If no error.  
b400: 20 20 2a 2a 20 6d 65 73 73 61 67 65 73 20 68 61    ** messages ha
b410: 76 65 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  ve been generate
b420: 64 2c 20 6f 75 74 70 75 74 20 4f 4b 2e 20 20 4f  d, output OK.  O
b430: 74 68 65 72 77 69 73 65 20 6f 75 74 70 75 74 20  therwise output 
b440: 74 68 65 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  the.    ** error
b450: 20 6d 65 73 73 61 67 65 0a 20 20 20 20 2a 2f 0a   message.    */.
b460: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
b470: 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f   int iLn = VDBE_
b480: 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29  OFFSET_LINENO(2)
b490: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
b4a0: 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 65 6e  st VdbeOpList en
b4b0: 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  dCode[] = {.    
b4c0: 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20    { OP_AddImm,  
b4d0: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
b4e0: 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a   0},    /* 0 */.
b4f0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20 20        { OP_If,  
b500: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20          1, 0,   
b510: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31       0},    /* 1
b520: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
b530: 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33  tring8,     0, 3
b540: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
b550: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 2 */.      { 
b560: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20  OP_ResultRow,   
b570: 33 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  3, 1,        0},
b580: 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 69 6e 74  .    };..    int
b590: 20 69 73 51 75 69 63 6b 20 3d 20 28 73 71 6c 69   isQuick = (sqli
b5a0: 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74  te3Tolower(zLeft
b5b0: 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20 20 20  [0])=='q');..   
b5c0: 20 2f 2a 20 49 66 20 74 68 65 20 50 52 41 47 4d   /* If the PRAGM
b5d0: 41 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 6f 66  A command was of
b5e0: 20 74 68 65 20 66 6f 72 6d 20 22 50 52 41 47 4d   the form "PRAGM
b5f0: 41 20 3c 64 62 3e 2e 69 6e 74 65 67 72 69 74 79  A <db>.integrity
b600: 5f 63 68 65 63 6b 22 2c 0a 20 20 20 20 2a 2a 20  _check",.    ** 
b610: 74 68 65 6e 20 69 44 62 20 69 73 20 73 65 74 20  then iDb is set 
b620: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
b630: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 64 65  the database ide
b640: 6e 74 69 66 69 65 64 20 62 79 20 3c 64 62 3e 2e  ntified by <db>.
b650: 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
b660: 63 61 73 65 2c 20 74 68 65 20 69 6e 74 65 67 72  case, the integr
b670: 69 74 79 20 6f 66 20 64 61 74 61 62 61 73 65 20  ity of database 
b680: 69 44 62 20 6f 6e 6c 79 20 69 73 20 76 65 72 69  iDb only is veri
b690: 66 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74  fied by.    ** t
b6a0: 68 65 20 56 44 42 45 20 63 72 65 61 74 65 64 20  he VDBE created 
b6b0: 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  below..    **.  
b6c0: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
b6d0: 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 77  if the command w
b6e0: 61 73 20 73 69 6d 70 6c 79 20 22 50 52 41 47 4d  as simply "PRAGM
b6f0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
b700: 6b 22 20 28 6f 72 0a 20 20 20 20 2a 2a 20 22 50  k" (or.    ** "P
b710: 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63  RAGMA quick_chec
b720: 6b 22 29 2c 20 74 68 65 6e 20 69 44 62 20 69 73  k"), then iDb is
b730: 20 73 65 74 20 74 6f 20 30 2e 20 49 6e 20 74 68   set to 0. In th
b740: 69 73 20 63 61 73 65 2c 20 73 65 74 20 69 44 62  is case, set iDb
b750: 0a 20 20 20 20 2a 2a 20 74 6f 20 2d 31 20 68 65  .    ** to -1 he
b760: 72 65 2c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  re, to indicate 
b770: 74 68 61 74 20 74 68 65 20 56 44 42 45 20 73 68  that the VDBE sh
b780: 6f 75 6c 64 20 76 65 72 69 66 79 20 74 68 65 20  ould verify the 
b790: 69 6e 74 65 67 72 69 74 79 0a 20 20 20 20 2a 2a  integrity.    **
b7a0: 20 6f 66 20 61 6c 6c 20 61 74 74 61 63 68 65 64   of all attached
b7b0: 20 64 61 74 61 62 61 73 65 73 2e 20 20 2a 2f 0a   databases.  */.
b7c0: 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e      assert( iDb>
b7d0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
b7e0: 28 20 69 44 62 3d 3d 30 20 7c 7c 20 70 49 64 32  ( iDb==0 || pId2
b7f0: 2d 3e 7a 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ->z );.    if( p
b800: 49 64 32 2d 3e 7a 3d 3d 30 20 29 20 69 44 62 20  Id2->z==0 ) iDb 
b810: 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  = -1;..    /* In
b820: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 56 44 42  itialize the VDB
b830: 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 20  E program */.   
b840: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
b850: 36 3b 0a 20 20 20 20 73 65 74 4f 6e 65 43 6f 6c  6;.    setOneCol
b860: 75 6d 6e 4e 61 6d 65 28 76 2c 20 22 69 6e 74 65  umnName(v, "inte
b870: 67 72 69 74 79 5f 63 68 65 63 6b 22 29 3b 0a 0a  grity_check");..
b880: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d      /* Set the m
b890: 61 78 69 6d 75 6d 20 65 72 72 6f 72 20 63 6f 75  aximum error cou
b8a0: 6e 74 20 2a 2f 0a 20 20 20 20 6d 78 45 72 72 20  nt */.    mxErr 
b8b0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49  = SQLITE_INTEGRI
b8c0: 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d  TY_CHECK_ERROR_M
b8d0: 41 58 3b 0a 20 20 20 20 69 66 28 20 7a 52 69 67  AX;.    if( zRig
b8e0: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
b8f0: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52 69 67  te3GetInt32(zRig
b900: 68 74 2c 20 26 6d 78 45 72 72 29 3b 0a 20 20 20  ht, &mxErr);.   
b910: 20 20 20 69 66 28 20 6d 78 45 72 72 3c 3d 30 20     if( mxErr<=0 
b920: 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 45 72 72  ){.        mxErr
b930: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 52   = SQLITE_INTEGR
b940: 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f  ITY_CHECK_ERROR_
b950: 4d 41 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MAX;.      }.   
b960: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
b970: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b980: 6e 74 65 67 65 72 2c 20 6d 78 45 72 72 2c 20 31  nteger, mxErr, 1
b990: 29 3b 20 20 2f 2a 20 72 65 67 5b 31 5d 20 68 6f  );  /* reg[1] ho
b9a0: 6c 64 73 20 65 72 72 6f 72 73 20 6c 65 66 74 20  lds errors left 
b9b0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e  */..    /* Do an
b9c0: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
b9d0: 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73   on each databas
b9e0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 66 6f  e file */.    fo
b9f0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
ba00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 48 61  ; i++){.      Ha
ba10: 73 68 45 6c 65 6d 20 2a 78 3b 0a 20 20 20 20 20  shElem *x;.     
ba20: 20 48 61 73 68 20 2a 70 54 62 6c 73 3b 0a 20 20   Hash *pTbls;.  
ba30: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
ba40: 0a 0a 20 20 20 20 20 20 69 66 28 20 4f 4d 49 54  ..      if( OMIT
ba50: 5f 54 45 4d 50 44 42 20 26 26 20 69 3d 3d 31 20  _TEMPDB && i==1 
ba60: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
ba70: 20 20 69 66 28 20 69 44 62 3e 3d 30 20 26 26 20    if( iDb>=0 && 
ba80: 69 21 3d 69 44 62 20 29 20 63 6f 6e 74 69 6e 75  i!=iDb ) continu
ba90: 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e;..      sqlite
baa0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
bab0: 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  a(pParse, i);.  
bac0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
bad0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
bae0: 4f 50 5f 49 66 50 6f 73 2c 20 31 29 3b 20 2f 2a  OP_IfPos, 1); /*
baf0: 20 48 61 6c 74 20 69 66 20 6f 75 74 20 6f 66 20   Halt if out of 
bb00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  errors */.      
bb10: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
bb20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bb30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48  beAddOp2(v, OP_H
bb40: 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  alt, 0, 0);.    
bb50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
bb60: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
bb70: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20  .      /* Do an 
bb80: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  integrity check 
bb90: 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20 20  of the B-Tree.  
bba0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
bbb0: 42 65 67 69 6e 20 62 79 20 66 69 6c 6c 69 6e 67  Begin by filling
bbc0: 20 72 65 67 69 73 74 65 72 73 20 32 2c 20 33 2c   registers 2, 3,
bbd0: 20 2e 2e 2e 20 77 69 74 68 20 74 68 65 20 72 6f   ... with the ro
bbe0: 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  ot pages numbers
bbf0: 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c  .      ** for al
bc00: 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64  l tables and ind
bc10: 69 63 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ices in the data
bc20: 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
bc30: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
bc40: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
bc50: 65 6c 64 28 64 62 2c 20 69 2c 20 30 29 20 29 3b  eld(db, i, 0) );
bc60: 0a 20 20 20 20 20 20 70 54 62 6c 73 20 3d 20 26  .      pTbls = &
bc70: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65  db->aDb[i].pSche
bc80: 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20  ma->tblHash;.   
bc90: 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74 65 48     for(x=sqliteH
bca0: 61 73 68 46 69 72 73 74 28 70 54 62 6c 73 29 3b  ashFirst(pTbls);
bcb0: 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61 73 68   x; x=sqliteHash
bcc0: 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20 20 20  Next(x)){.      
bcd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
bce0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 78  sqliteHashData(x
bcf0: 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  );.        Index
bd00: 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20   *pIdx;.        
bd10: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
bd20: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
bd30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bd40: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
bd50: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 32 2b 63   pTab->tnum, 2+c
bd60: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  nt);.          V
bd70: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
bd80: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
bd90: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e  ));.          cn
bda0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
bdb0: 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
bdc0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
bdd0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
bde0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
bdf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
be00: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
be10: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 32 2b  , pIdx->tnum, 2+
be20: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  cnt);.          
be30: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
be40: 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
be50: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  e));.          c
be60: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
be70: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
be80: 2a 20 4d 61 6b 65 20 73 75 72 65 20 73 75 66 66  * Make sure suff
be90: 69 63 69 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  icient number of
bea0: 20 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20   registers have 
beb0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
bec0: 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  /.      pParse->
bed0: 6e 4d 65 6d 20 3d 20 4d 41 58 28 20 70 50 61 72  nMem = MAX( pPar
bee0: 73 65 2d 3e 6e 4d 65 6d 2c 20 63 6e 74 2b 38 20  se->nMem, cnt+8 
bef0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  );..      /* Do 
bf00: 74 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65 67  the b-tree integ
bf10: 72 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20  rity checks */. 
bf20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bf30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74  AddOp3(v, OP_Int
bf40: 65 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74  egrityCk, 2, cnt
bf50: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
bf60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
bf70: 76 2c 20 28 75 38 29 69 29 3b 0a 20 20 20 20 20  v, (u8)i);.     
bf80: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
bf90: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
bfa0: 49 73 4e 75 6c 6c 2c 20 32 29 3b 20 56 64 62 65  IsNull, 2); Vdbe
bfb0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
bfc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bfd0: 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
bfe0: 67 38 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20  g8, 0, 3, 0,.   
bff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
c000: 69 6e 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e  intf(db, "*** in
c010: 20 64 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a   database %s ***
c020: 5c 6e 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  \n", db->aDb[i].
c030: 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
c040: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
c050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c060: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65  ddOp3(v, OP_Move
c070: 2c 20 32 2c 20 34 2c 20 31 29 3b 0a 20 20 20 20  , 2, 4, 1);.    
c080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c090: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
c0a0: 2c 20 34 2c 20 33 2c 20 32 29 3b 0a 20 20 20 20  , 4, 3, 2);.    
c0b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c0c0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
c0d0: 52 6f 77 2c 20 32 2c 20 31 29 3b 0a 20 20 20 20  Row, 2, 1);.    
c0e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c0f0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
c100: 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  .      /* Make s
c110: 75 72 65 20 61 6c 6c 20 74 68 65 20 69 6e 64 69  ure all the indi
c120: 63 65 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63  ces are construc
c130: 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ted correctly.. 
c140: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f       */.      fo
c150: 72 28 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(x=sqliteHashFi
c160: 72 73 74 28 70 54 62 6c 73 29 3b 20 78 20 26 26  rst(pTbls); x &&
c170: 20 21 69 73 51 75 69 63 6b 3b 20 78 3d 73 71 6c   !isQuick; x=sql
c180: 69 74 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b  iteHashNext(x)){
c190: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
c1a0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
c1b0: 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20  hData(x);.      
c1c0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 2a    Index *pIdx, *
c1d0: 70 50 6b 3b 0a 20 20 20 20 20 20 20 20 49 6e 64  pPk;.        Ind
c1e0: 65 78 20 2a 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ex *pPrior = 0;.
c1f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 6f 6f 70          int loop
c200: 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Top;.        int
c210: 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43   iDataCur, iIdxC
c220: 75 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ur;.        int 
c230: 72 31 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 20 20  r1 = -1;..      
c240: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e 64    if( pTab->pInd
c250: 65 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ex==0 ) continue
c260: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 20 3d 20  ;.        pPk = 
c270: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 3f  HasRowid(pTab) ?
c280: 20 30 20 3a 20 73 71 6c 69 74 65 33 50 72 69 6d   0 : sqlite3Prim
c290: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
c2a0: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
c2b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c2c0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
c2d0: 20 31 29 3b 20 20 2f 2a 20 53 74 6f 70 20 69 66   1);  /* Stop if
c2e0: 20 6f 75 74 20 6f 66 20 65 72 72 6f 72 73 20 2a   out of errors *
c2f0: 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  /.        VdbeCo
c300: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
c310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c320: 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp2(v, OP_Halt,
c330: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
c340: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c350: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
c360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c370: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
c380: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
c390: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64  ite3OpenTableAnd
c3a0: 49 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c 20  Indices(pParse, 
c3b0: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
c3c0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 20 20 20 20 20 20 31 2c 20 30 2c 20 26 69 44 61        1, 0, &iDa
c3f0: 74 61 43 75 72 2c 20 26 69 49 64 78 43 75 72 29  taCur, &iIdxCur)
c400: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c410: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c420: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 37 29  P_Integer, 0, 7)
c430: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
c440: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
c450: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
c460: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
c470: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
c480: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c490: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
c4a0: 2c 20 38 2b 6a 29 3b 20 2f 2a 20 69 6e 64 65 78  , 8+j); /* index
c4b0: 20 65 6e 74 72 69 65 73 20 63 6f 75 6e 74 65 72   entries counter
c4c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
c4d0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
c4e0: 65 6d 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d  em = MAX(pParse-
c4f0: 3e 6e 4d 65 6d 2c 20 38 2b 6a 29 3b 0a 20 20 20  >nMem, 8+j);.   
c500: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c510: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
c520: 69 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20 30  ind, iDataCur, 0
c530: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
c540: 76 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70  v);.        loop
c550: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
c560: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
c570: 64 49 6d 6d 2c 20 37 2c 20 31 29 3b 0a 20 20 20  dImm, 7, 1);.   
c580: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
c590: 68 61 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c  hat all NOT NULL
c5a0: 20 63 6f 6c 75 6d 6e 73 20 72 65 61 6c 6c 79 20   columns really 
c5b0: 61 72 65 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a  are NOT NULL */.
c5c0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
c5d0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
c5e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
c5f0: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20  har *zErr;.     
c600: 20 20 20 20 20 69 6e 74 20 6a 6d 70 32 2c 20 6a       int jmp2, j
c610: 6d 70 33 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp3;.          i
c620: 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( j==pTab->iPKe
c630: 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
c640: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
c650: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c  ->aCol[j].notNul
c660: 6c 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  l==0 ) continue;
c670: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c680: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
c690: 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
c6a0: 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 6a 2c  ab, iDataCur, j,
c6b0: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   3);.          s
c6c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
c6d0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50  P5(v, OPFLAG_TYP
c6e0: 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20  EOFARG);.       
c6f0: 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65     jmp2 = sqlite
c700: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c710: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 33 29 3b 20 56  P_NotNull, 3); V
c720: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c730: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c740: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c750: 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d 31 29  P_AddImm, 1, -1)
c760: 3b 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 65  ; /* Decrement e
c770: 72 72 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a 20 20  rror limit */.  
c780: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73          zErr = s
c790: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
c7a0: 2c 20 22 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e  , "NULL value in
c7b0: 20 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a   %s.%s", pTab->z
c7c0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a      pTab->aCol[j
c7f0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
c800: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c810: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
c820: 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20 7a 45  ng8, 0, 3, 0, zE
c830: 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  rr, P4_DYNAMIC);
c840: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c850: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c860: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 33 2c  OP_ResultRow, 3,
c870: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a   1);.          j
c880: 6d 70 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mp3 = sqlite3Vdb
c890: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
c8a0: 50 6f 73 2c 20 31 29 3b 20 56 64 62 65 43 6f 76  Pos, 1); VdbeCov
c8b0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
c8c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c8d0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp0(v, OP_Halt
c8e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c8f0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c900: 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20  (v, jmp2);.     
c910: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c920: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 33  JumpHere(v, jmp3
c930: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c940: 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65       /* Validate
c950: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66   index entries f
c960: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
c970: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  ow */.        fo
c980: 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  r(j=0, pIdx=pTab
c990: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
c9a0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
c9b0: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , j++){.        
c9c0: 20 20 69 6e 74 20 6a 6d 70 32 2c 20 6a 6d 70 33    int jmp2, jmp3
c9d0: 2c 20 6a 6d 70 34 2c 20 6a 6d 70 35 3b 0a 20 20  , jmp4, jmp5;.  
c9e0: 20 20 20 20 20 20 20 20 69 6e 74 20 63 6b 55 6e          int ckUn
c9f0: 69 71 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  iq = sqlite3Vdbe
ca00: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ca10: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6b 3d          if( pPk=
ca20: 3d 70 49 64 78 20 29 20 63 6f 6e 74 69 6e 75 65  =pIdx ) continue
ca30: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  ;.          r1 =
ca40: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
ca50: 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
ca60: 20 70 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c   pIdx, iDataCur,
ca70: 20 30 2c 20 30 2c 20 26 6a 6d 70 33 2c 0a 20 20   0, 0, &jmp3,.  
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 20 20 20 20 70 50 72 69 6f 72 2c 20 72 31 29       pPrior, r1)
cab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 69  ;.          pPri
cac0: 6f 72 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  or = pIdx;.     
cad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cae0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
caf0: 49 6d 6d 2c 20 38 2b 6a 2c 20 31 29 3b 20 20 2f  Imm, 8+j, 1);  /
cb00: 2a 20 69 6e 63 72 65 6d 65 6e 74 20 65 6e 74 72  * increment entr
cb10: 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  y count */.     
cb20: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
cb30: 68 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74  hat an index ent
cb40: 72 79 20 65 78 69 73 74 73 20 66 6f 72 20 74 68  ry exists for th
cb50: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
cb60: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  row */.         
cb70: 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 56   jmp2 = sqlite3V
cb80: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
cb90: 4f 50 5f 46 6f 75 6e 64 2c 20 69 49 64 78 43 75  OP_Found, iIdxCu
cba0: 72 2b 6a 2c 20 63 6b 55 6e 69 71 2c 20 72 31 2c  r+j, ckUniq, r1,
cbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f         pIdx->nCo
cbe0: 6c 75 6d 6e 29 3b 20 56 64 62 65 43 6f 76 65 72  lumn); VdbeCover
cbf0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
cc00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cc10: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
cc20: 2c 20 31 2c 20 2d 31 29 3b 20 2f 2a 20 44 65 63  , 1, -1); /* Dec
cc30: 72 65 6d 65 6e 74 20 65 72 72 6f 72 20 6c 69 6d  rement error lim
cc40: 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  it */.          
cc50: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
cc60: 74 72 69 6e 67 28 76 2c 20 33 2c 20 22 72 6f 77  tring(v, 3, "row
cc70: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   ");.          s
cc80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cc90: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 37  (v, OP_Concat, 7
cca0: 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  , 3, 3);.       
ccb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
ccc0: 61 64 53 74 72 69 6e 67 28 76 2c 20 34 2c 20 22  adString(v, 4, "
ccd0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e   missing from in
cce0: 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20  dex ");.        
ccf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cd00: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
cd10: 2c 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20  , 4, 3, 3);.    
cd20: 20 20 20 20 20 20 6a 6d 70 35 20 3d 20 73 71 6c        jmp5 = sql
cd30: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
cd40: 6e 67 28 76 2c 20 34 2c 20 70 49 64 78 2d 3e 7a  ng(v, 4, pIdx->z
cd50: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
cd60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cd70: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
cd80: 20 34 2c 20 33 2c 20 33 29 3b 0a 20 20 20 20 20   4, 3, 3);.     
cd90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cda0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
cdb0: 75 6c 74 52 6f 77 2c 20 33 2c 20 31 29 3b 0a 20  ultRow, 3, 1);. 
cdc0: 20 20 20 20 20 20 20 20 20 6a 6d 70 34 20 3d 20           jmp4 = 
cdd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cde0: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 31  1(v, OP_IfPos, 1
cdf0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
ce00: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
ce10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
ce20: 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 20 20 20  v, OP_Halt);.   
ce30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ce40: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
ce50: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  p2);.          /
ce60: 2a 20 46 6f 72 20 55 4e 49 51 55 45 20 69 6e 64  * For UNIQUE ind
ce70: 65 78 65 73 2c 20 76 65 72 69 66 79 20 74 68 61  exes, verify tha
ce80: 74 20 6f 6e 6c 79 20 6f 6e 65 20 65 6e 74 72 79  t only one entry
ce90: 20 65 78 69 73 74 73 20 77 69 74 68 20 74 68 65   exists with the
cea0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75  .          ** cu
ceb0: 72 72 65 6e 74 20 6b 65 79 2e 20 20 54 68 65 20  rrent key.  The 
cec0: 65 6e 74 72 79 20 69 73 20 75 6e 69 71 75 65 20  entry is unique 
ced0: 69 66 20 28 31 29 20 61 6e 79 20 63 6f 6c 75 6d  if (1) any colum
cee0: 6e 20 69 73 20 4e 55 4c 4c 0a 20 20 20 20 20 20  n is NULL.      
cef0: 20 20 20 20 2a 2a 20 6f 72 20 28 32 29 20 74 68      ** or (2) th
cf00: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 68 61 73  e next entry has
cf10: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 65 79   a different key
cf20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
cf30: 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
cf40: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
cf50: 20 20 20 20 20 69 6e 74 20 75 6e 69 71 4f 6b 20       int uniqOk 
cf60: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
cf70: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
cf80: 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70 36 3b         int jmp6;
cf90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
cfa0: 20 6b 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20   kk;.           
cfb0: 20 66 6f 72 28 6b 6b 3d 30 3b 20 6b 6b 3c 70 49   for(kk=0; kk<pI
cfc0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 6b 2b  dx->nKeyCol; kk+
cfd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
cfe0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64    int iCol = pId
cff0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 6b 5d 3b  x->aiColumn[kk];
d000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
d010: 73 73 65 72 74 28 20 69 43 6f 6c 21 3d 58 4e 5f  ssert( iCol!=XN_
d020: 52 4f 57 49 44 20 26 26 20 69 43 6f 6c 3c 70 54  ROWID && iCol<pT
d030: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
d040: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
d050: 6f 6c 3e 3d 30 20 26 26 20 70 54 61 62 2d 3e 61  ol>=0 && pTab->a
d060: 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c  Col[iCol].notNul
d070: 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
d080: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d090: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d0a0: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 6b   OP_IsNull, r1+k
d0b0: 6b 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20 20  k, uniqOk);.    
d0c0: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
d0d0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
d0e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d0f0: 20 20 20 20 20 6a 6d 70 36 20 3d 20 73 71 6c 69       jmp6 = sqli
d100: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d110: 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75   OP_Next, iIdxCu
d120: 72 2b 6a 29 3b 20 56 64 62 65 43 6f 76 65 72 61  r+j); VdbeCovera
d130: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
d140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
d150: 74 6f 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20  to(v, uniqOk);. 
d160: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d170: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d180: 2c 20 6a 6d 70 36 29 3b 0a 20 20 20 20 20 20 20  , jmp6);.       
d190: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d1a0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
d1b0: 49 64 78 47 54 2c 20 69 49 64 78 43 75 72 2b 6a  IdxGT, iIdxCur+j
d1c0: 2c 20 75 6e 69 71 4f 6b 2c 20 72 31 2c 0a 20 20  , uniqOk, r1,.  
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d1f0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  Idx->nKeyCol); V
d200: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d210: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d220: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d230: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d   OP_AddImm, 1, -
d240: 31 29 3b 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74  1); /* Decrement
d250: 20 65 72 72 6f 72 20 6c 69 6d 69 74 20 2a 2f 0a   error limit */.
d260: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d270: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
d280: 67 28 76 2c 20 33 2c 20 22 6e 6f 6e 2d 75 6e 69  g(v, 3, "non-uni
d290: 71 75 65 20 65 6e 74 72 79 20 69 6e 20 69 6e 64  que entry in ind
d2a0: 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ex ");.         
d2b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
d2c0: 74 6f 28 76 2c 20 6a 6d 70 35 29 3b 0a 20 20 20  to(v, jmp5);.   
d2d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d2e0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d2f0: 28 76 2c 20 75 6e 69 71 4f 6b 29 3b 0a 20 20 20  (v, uniqOk);.   
d300: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d320: 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 34 29 3b  mpHere(v, jmp4);
d330: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d340: 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78  e3ResolvePartIdx
d350: 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 6a 6d  Label(pParse, jm
d360: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  p3);.        }. 
d370: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d380: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
d390: 65 78 74 2c 20 69 44 61 74 61 43 75 72 2c 20 6c  ext, iDataCur, l
d3a0: 6f 6f 70 54 6f 70 29 3b 20 56 64 62 65 43 6f 76  oopTop); VdbeCov
d3b0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
d3c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d3d0: 70 48 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70  pHere(v, loopTop
d3e0: 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  -1);.#ifndef SQL
d3f0: 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
d400: 55 4e 54 0a 20 20 20 20 20 20 20 20 73 71 6c 69  UNT.        sqli
d410: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
d420: 67 28 76 2c 20 32 2c 20 22 77 72 6f 6e 67 20 23  g(v, 2, "wrong #
d430: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 69   of entries in i
d440: 6e 64 65 78 20 22 29 3b 0a 20 20 20 20 20 20 20  ndex ");.       
d450: 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70   for(j=0, pIdx=p
d460: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
d470: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
d480: 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ext, j++){.     
d490: 20 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49       if( pPk==pI
d4a0: 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  dx ) continue;. 
d4b0: 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
d4c0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d4d0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
d4e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d4f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
d500: 6f 73 2c 20 31 2c 20 61 64 64 72 2b 32 29 3b 20  os, 1, addr+2); 
d510: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d520: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d530: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d540: 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a  OP_Halt, 0, 0);.
d550: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d560: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d570: 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72  P_Count, iIdxCur
d580: 2b 6a 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  +j, 3);.        
d590: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d5a0: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 38 2b  Op3(v, OP_Eq, 8+
d5b0: 6a 2c 20 61 64 64 72 2b 38 2c 20 33 29 3b 20 56  j, addr+8, 3); V
d5c0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d5d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d5e0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
d5f0: 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29   SQLITE_NOTNULL)
d600: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d610: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d620: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 2d   OP_AddImm, 1, -
d630: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
d640: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
d650: 69 6e 67 28 76 2c 20 33 2c 20 70 49 64 78 2d 3e  ing(v, 3, pIdx->
d660: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
d670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d680: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  Op3(v, OP_Concat
d690: 2c 20 33 2c 20 32 2c 20 37 29 3b 0a 20 20 20 20  , 3, 2, 7);.    
d6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d6b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
d6c0: 73 75 6c 74 52 6f 77 2c 20 37 2c 20 31 29 3b 0a  sultRow, 7, 1);.
d6d0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
d6e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
d6f0: 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20  BTREECOUNT */.  
d700: 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20      } .    }.   
d710: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
d720: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
d730: 41 72 72 61 79 53 69 7a 65 28 65 6e 64 43 6f 64  ArraySize(endCod
d740: 65 29 2c 20 65 6e 64 43 6f 64 65 2c 20 69 4c 6e  e), endCode, iLn
d750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d760: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
d770: 64 72 2c 20 2d 6d 78 45 72 72 29 3b 0a 20 20 20  dr, -mxErr);.   
d780: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d790: 48 65 72 65 28 76 2c 20 61 64 64 72 2b 31 29 3b  Here(v, addr+1);
d7a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d7b0: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
d7c0: 2b 32 2c 20 22 6f 6b 22 2c 20 50 34 5f 53 54 41  +2, "ok", P4_STA
d7d0: 54 49 43 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  TIC);.  }.  brea
d7e0: 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  k;.#endif /* SQL
d7f0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
d800: 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
d810: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d820: 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20 2a 2a  _UTF16.  /*.  **
d830: 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69     PRAGMA encodi
d840: 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  ng.  **   PRAGMA
d850: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74 66   encoding = "utf
d860: 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22 75 74  -8"|"utf-16"|"ut
d870: 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31 36 62  f-16le"|"utf-16b
d880: 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  e".  **.  ** In 
d890: 69 74 73 20 66 69 72 73 74 20 66 6f 72 6d 2c 20  its first form, 
d8a0: 74 68 69 73 20 70 72 61 67 6d 61 20 72 65 74 75  this pragma retu
d8b0: 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  rns the encoding
d8c0: 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a   of the main.  *
d8d0: 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  * database. If t
d8e0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
d8f0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  ot initialized, 
d900: 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
d910: 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  d now..  **.  **
d920: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
d930: 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d 61 20   of this pragma 
d940: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
d950: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
d960: 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6e 6f  file.  ** has no
d970: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  t already been i
d980: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e 20 74  nitialized. In t
d990: 68 69 73 20 63 61 73 65 20 69 74 20 73 65 74 73  his case it sets
d9a0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a   the default.  *
d9b0: 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61 74 20  * encoding that 
d9c0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
d9d0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
d9e0: 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e 65 77  se file if a new
d9f0: 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 63 72   file.  ** is cr
da00: 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65 78 69  eated. If an exi
da10: 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74 61 62  sting main datab
da20: 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
da30: 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ed, then the.  *
da40: 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74 20 65  * default text e
da50: 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20  ncoding for the 
da60: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
da70: 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2a 20  e is used..  ** 
da80: 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73  .  ** In all cas
da90: 65 73 20 6e 65 77 20 64 61 74 61 62 61 73 65 73  es new databases
daa0: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
dab0: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
dac0: 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65 61 74  d are.  ** creat
dad0: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 73 61  ed to use the sa
dae0: 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78 74 20  me default text 
daf0: 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68 65 20  encoding as the 
db00: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 49  main database. I
db10: 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20  f.  ** the main 
db20: 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74  database has not
db30: 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
db40: 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74 65 64  d and/or created
db50: 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20 20 2a   when ATTACH.  *
db60: 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c 20 74  * is executed, t
db70: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
db80: 72 65 20 74 68 65 20 41 54 54 41 43 48 20 6f 70  re the ATTACH op
db90: 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20  eration..  **.  
dba0: 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64  ** In the second
dbb0: 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61 67 6d   form this pragm
dbc0: 61 20 73 65 74 73 20 74 68 65 20 74 65 78 74 20  a sets the text 
dbd0: 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65 20 75  encoding to be u
dbe0: 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65 77 20  sed in.  ** new 
dbf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63  database files c
dc00: 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 69  reated using thi
dc10: 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
dc20: 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 20 20  e. It is only.  
dc30: 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69 6e 76  ** useful if inv
dc40: 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  oked immediately
dc50: 20 61 66 74 65 72 20 74 68 65 20 6d 61 69 6e 20   after the main 
dc60: 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a 2f 0a  database i.  */.
dc70: 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 45    case PragTyp_E
dc80: 4e 43 4f 44 49 4e 47 3a 20 7b 0a 20 20 20 20 73  NCODING: {.    s
dc90: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
dca0: 63 74 20 45 6e 63 4e 61 6d 65 20 7b 0a 20 20 20  ct EncName {.   
dcb0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
dcc0: 20 20 20 20 20 20 75 38 20 65 6e 63 3b 0a 20 20        u8 enc;.  
dcd0: 20 20 7d 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d    } encnames[] =
dce0: 20 7b 0a 20 20 20 20 20 20 7b 20 22 55 54 46 38   {.      { "UTF8
dcf0: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  ",     SQLITE_UT
dd00: 46 38 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  F8        },.   
dd10: 20 20 20 7b 20 22 55 54 46 2d 38 22 2c 20 20 20     { "UTF-8",   
dd20: 20 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20   SQLITE_UTF8    
dd30: 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20      },  /* Must 
dd40: 62 65 20 65 6c 65 6d 65 6e 74 20 5b 31 5d 20 2a  be element [1] *
dd50: 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31  /.      { "UTF-1
dd60: 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  6le", SQLITE_UTF
dd70: 31 36 4c 45 20 20 20 20 20 7d 2c 20 20 2f 2a 20  16LE     },  /* 
dd80: 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20  Must be element 
dd90: 5b 32 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22  [2] */.      { "
dda0: 55 54 46 2d 31 36 62 65 22 2c 20 53 51 4c 49 54  UTF-16be", SQLIT
ddb0: 45 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c  E_UTF16BE     },
ddc0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65    /* Must be ele
ddd0: 6d 65 6e 74 20 5b 33 5d 20 2a 2f 0a 20 20 20 20  ment [3] */.    
dde0: 20 20 7b 20 22 55 54 46 31 36 6c 65 22 2c 20 20    { "UTF16le",  
ddf0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20  SQLITE_UTF16LE  
de00: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55     },.      { "U
de10: 54 46 31 36 62 65 22 2c 20 20 53 51 4c 49 54 45  TF16be",  SQLITE
de20: 5f 55 54 46 31 36 42 45 20 20 20 20 20 7d 2c 0a  _UTF16BE     },.
de30: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 22        { "UTF-16"
de40: 2c 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  ,   0           
de50: 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 53 51 4c         }, /* SQL
de60: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
de70: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  */.      { "UTF1
de80: 36 22 2c 20 20 20 20 30 20 20 20 20 20 20 20 20  6",    0        
de90: 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20            }, /* 
dea0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
deb0: 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20 30 2c  VE */.      { 0,
dec0: 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0 }.    };.    
ded0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 45 6e 63  const struct Enc
dee0: 4e 61 6d 65 20 2a 70 45 6e 63 3b 0a 20 20 20 20  Name *pEnc;.    
def0: 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 20 20  if( !zRight ){  
df00: 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63    /* "PRAGMA enc
df10: 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20 20 20  oding" */.      
df20: 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53  if( sqlite3ReadS
df30: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
df40: 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b  goto pragma_out;
df50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
df60: 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45 5f 55  ncnames[SQLITE_U
df70: 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45  TF8].enc==SQLITE
df80: 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 61  _UTF8 );.      a
df90: 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b  ssert( encnames[
dfa0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 5d 2e  SQLITE_UTF16LE].
dfb0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
dfc0: 36 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  6LE );.      ass
dfd0: 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51  ert( encnames[SQ
dfe0: 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2e 65 6e  LITE_UTF16BE].en
dff0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c==SQLITE_UTF16B
e000: 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E );.      retur
e010: 6e 53 69 6e 67 6c 65 54 65 78 74 28 76 2c 20 22  nSingleText(v, "
e020: 65 6e 63 6f 64 69 6e 67 22 2c 20 65 6e 63 6e 61  encoding", encna
e030: 6d 65 73 5b 45 4e 43 28 70 50 61 72 73 65 2d 3e  mes[ENC(pParse->
e040: 64 62 29 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  db)].zName);.   
e050: 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e070: 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69  * "PRAGMA encodi
e080: 6e 67 20 3d 20 58 58 58 22 20 2a 2f 0a 20 20 20  ng = XXX" */.   
e090: 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 68 61 6e 67     /* Only chang
e0a0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 73  e the value of s
e0b0: 71 6c 69 74 65 2e 65 6e 63 20 69 66 20 74 68 65  qlite.enc if the
e0c0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e0d0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   is not.      **
e0e0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 66   initialized. If
e0f0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e100: 73 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 6e  se exists, the n
e110: 65 77 20 73 71 6c 69 74 65 2e 65 6e 63 20 76 61  ew sqlite.enc va
e120: 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  lue.      ** wil
e130: 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
e140: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
e150: 20 69 73 20 6e 65 78 74 20 6c 6f 61 64 65 64 2e   is next loaded.
e160: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a   If it does not.
e170: 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
e180: 20 65 78 69 73 74 73 2c 20 69 74 20 77 69 6c 6c   exists, it will
e190: 20 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 75   be created to u
e1a0: 73 65 20 74 68 65 20 6e 65 77 20 65 6e 63 6f 64  se the new encod
e1b0: 69 6e 67 20 76 61 6c 75 65 2e 0a 20 20 20 20 20  ing value..     
e1c0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 0a 20   */.      if( . 
e1d0: 20 20 20 20 20 20 20 21 28 44 62 48 61 73 50 72         !(DbHasPr
e1e0: 6f 70 65 72 74 79 28 64 62 2c 20 30 2c 20 44 42  operty(db, 0, DB
e1f0: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 29 20  _SchemaLoaded)) 
e200: 7c 7c 20 0a 20 20 20 20 20 20 20 20 44 62 48 61  || .        DbHa
e210: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 30 2c  sProperty(db, 0,
e220: 20 44 42 5f 45 6d 70 74 79 29 20 0a 20 20 20 20   DB_Empty) .    
e230: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72    ){.        for
e240: 28 70 45 6e 63 3d 26 65 6e 63 6e 61 6d 65 73 5b  (pEnc=&encnames[
e250: 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b  0]; pEnc->zName;
e260: 20 70 45 6e 63 2b 2b 29 7b 0a 20 20 20 20 20 20   pEnc++){.      
e270: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
e280: 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74  e3StrICmp(zRight
e290: 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20 29  , pEnc->zName) )
e2a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 43  {.            SC
e2b0: 48 45 4d 41 5f 45 4e 43 28 64 62 29 20 3d 20 45  HEMA_ENC(db) = E
e2c0: 4e 43 28 64 62 29 20 3d 0a 20 20 20 20 20 20 20  NC(db) =.       
e2d0: 20 20 20 20 20 20 20 20 20 70 45 6e 63 2d 3e 65           pEnc->e
e2e0: 6e 63 20 3f 20 70 45 6e 63 2d 3e 65 6e 63 20 3a  nc ? pEnc->enc :
e2f0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
e300: 49 56 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IVE;.           
e310: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e320: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
e330: 20 20 20 20 20 20 69 66 28 20 21 70 45 6e 63 2d        if( !pEnc-
e340: 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
e350: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e360: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73  Msg(pParse, "uns
e370: 75 70 70 6f 72 74 65 64 20 65 6e 63 6f 64 69 6e  upported encodin
e380: 67 3a 20 25 73 22 2c 20 7a 52 69 67 68 74 29 3b  g: %s", zRight);
e390: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e3a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62   }.    }.  }.  b
e3b0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  reak;.#endif /* 
e3c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
e3d0: 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  6 */..#ifndef SQ
e3e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41  LITE_OMIT_SCHEMA
e3f0: 5f 56 45 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53  _VERSION_PRAGMAS
e400: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
e410: 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 73  GMA [database.]s
e420: 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 0a 20 20  chema_version.  
e430: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 64 61 74  **   PRAGMA [dat
e440: 61 62 61 73 65 2e 5d 73 63 68 65 6d 61 5f 76 65  abase.]schema_ve
e450: 72 73 69 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72  rsion = <integer
e460: 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52  >.  **.  **   PR
e470: 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
e480: 75 73 65 72 5f 76 65 72 73 69 6f 6e 0a 20 20 2a  user_version.  *
e490: 2a 20 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  *   PRAGMA [data
e4a0: 62 61 73 65 2e 5d 75 73 65 72 5f 76 65 72 73 69  base.]user_versi
e4b0: 6f 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20  on = <integer>. 
e4c0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d   **.  **   PRAGM
e4d0: 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 66 72 65  A [database.]fre
e4e0: 65 6c 69 73 74 5f 63 6f 75 6e 74 20 3d 20 3c 69  elist_count = <i
e4f0: 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20 2a  nteger>.  **.  *
e500: 2a 20 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  *   PRAGMA [data
e510: 62 61 73 65 2e 5d 61 70 70 6c 69 63 61 74 69 6f  base.]applicatio
e520: 6e 5f 69 64 0a 20 20 2a 2a 20 20 20 50 52 41 47  n_id.  **   PRAG
e530: 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 61 70  MA [database.]ap
e540: 70 6c 69 63 61 74 69 6f 6e 5f 69 64 20 3d 20 3c  plication_id = <
e550: 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20  integer>.  **.  
e560: 2a 2a 20 54 68 65 20 70 72 61 67 6d 61 27 73 20  ** The pragma's 
e570: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 61  schema_version a
e580: 6e 64 20 75 73 65 72 5f 76 65 72 73 69 6f 6e 20  nd user_version 
e590: 61 72 65 20 75 73 65 64 20 74 6f 20 73 65 74 20  are used to set 
e5a0: 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74 68 65 20  or get.  ** the 
e5b0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63 68  value of the sch
e5c0: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20  ema-version and 
e5d0: 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c 20 72 65  user-version, re
e5e0: 73 70 65 63 74 69 76 65 6c 79 2e 20 42 6f 74 68  spectively. Both
e5f0: 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
e600: 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 74 68 65  -version and the
e610: 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 61 72   user-version ar
e620: 65 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20  e 32-bit signed 
e630: 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 73 74  integers.  ** st
e640: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
e650: 62 61 73 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  base header..  *
e660: 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63 68 65 6d  *.  ** The schem
e670: 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75 73 75 61  a-cookie is usua
e680: 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  lly only manipul
e690: 61 74 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ated internally 
e6a0: 62 79 20 53 51 4c 69 74 65 2e 20 49 74 0a 20 20  by SQLite. It.  
e6b0: 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ** is incremente
e6c0: 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
e6d0: 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73  ever the databas
e6e0: 65 20 73 63 68 65 6d 61 20 69 73 20 6d 6f 64 69  e schema is modi
e6f0: 66 69 65 64 20 28 62 79 0a 20 20 2a 2a 20 63 72  fied (by.  ** cr
e700: 65 61 74 69 6e 67 20 6f 72 20 64 72 6f 70 70 69  eating or droppi
e710: 6e 67 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  ng a table or in
e720: 64 65 78 29 2e 20 54 68 65 20 73 63 68 65 6d 61  dex). The schema
e730: 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65 64   version is used
e740: 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20   by.  ** SQLite 
e750: 65 61 63 68 20 74 69 6d 65 20 61 20 71 75 65 72  each time a quer
e760: 79 20 69 73 20 65 78 65 63 75 74 65 64 20 74 6f  y is executed to
e770: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
e780: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 0a   internal cache.
e790: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 68 65    ** of the sche
e7a0: 6d 61 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6d  ma used when com
e7b0: 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 71  piling the SQL q
e7c0: 75 65 72 79 20 6d 61 74 63 68 65 73 20 74 68 65  uery matches the
e7d0: 20 73 63 68 65 6d 61 20 6f 66 0a 20 20 2a 2a 20   schema of.  ** 
e7e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 67 61  the database aga
e7f0: 69 6e 73 74 20 77 68 69 63 68 20 74 68 65 20 63  inst which the c
e800: 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20 69 73  ompiled query is
e810: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
e820: 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76 65 72 74  ed..  ** Subvert
e830: 69 6e 67 20 74 68 69 73 20 6d 65 63 68 61 6e 69  ing this mechani
e840: 73 6d 20 62 79 20 75 73 69 6e 67 20 22 50 52 41  sm by using "PRA
e850: 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69  GMA schema_versi
e860: 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79 0a 20 20  on" to modify.  
e870: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  ** the schema-ve
e880: 72 73 69 6f 6e 20 69 73 20 70 6f 74 65 6e 74 69  rsion is potenti
e890: 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75 73 20 61  ally dangerous a
e8a0: 6e 64 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 70  nd may lead to p
e8b0: 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63 72 61 73  rogram.  ** cras
e8c0: 68 65 73 20 6f 72 20 64 61 74 61 62 61 73 65 20  hes or database 
e8d0: 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55 73 65 20  corruption. Use 
e8e0: 77 69 74 68 20 63 61 75 74 69 6f 6e 21 0a 20 20  with caution!.  
e8f0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75 73 65 72  **.  ** The user
e900: 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e 6f 74 20  -version is not 
e910: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
e920: 62 79 20 53 51 4c 69 74 65 2e 20 49 74 20 6d 61  by SQLite. It ma
e930: 79 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  y be used by.  *
e940: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 66  * applications f
e950: 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e 0a  or any purpose..
e960: 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67    */.  case Prag
e970: 54 79 70 5f 48 45 41 44 45 52 5f 56 41 4c 55 45  Typ_HEADER_VALUE
e980: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f  : {.    int iCoo
e990: 6b 69 65 20 3d 20 70 50 72 61 67 6d 61 2d 3e 69  kie = pPragma->i
e9a0: 41 72 67 3b 20 20 2f 2a 20 57 68 69 63 68 20 63  Arg;  /* Which c
e9b0: 6f 6f 6b 69 65 20 74 6f 20 72 65 61 64 20 6f 72  ookie to read or
e9c0: 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 73 71   write */.    sq
e9d0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
e9e0: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
e9f0: 69 66 28 20 7a 52 69 67 68 74 20 26 26 20 28 70  if( zRight && (p
ea00: 50 72 61 67 6d 61 2d 3e 6d 50 72 61 67 46 6c 61  Pragma->mPragFla
ea10: 67 20 26 20 50 72 61 67 46 6c 61 67 5f 52 65 61  g & PragFlag_Rea
ea20: 64 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a 20 20 20  dOnly)==0 ){.   
ea30: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
ea40: 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65  specified cookie
ea50: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20   value */.      
ea60: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62  static const Vdb
ea70: 65 4f 70 4c 69 73 74 20 73 65 74 43 6f 6f 6b 69  eOpList setCooki
ea80: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
ea90: 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  { OP_Transaction
eaa0: 2c 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c  ,    0,  1,  0},
eab0: 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20      /* 0 */.    
eac0: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
ead0: 2c 20 20 20 20 20 20 20 20 30 2c 20 20 31 2c 20  ,        0,  1, 
eae0: 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a   0},    /* 1 */.
eaf0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74          { OP_Set
eb00: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20  Cookie,      0, 
eb10: 20 30 2c 20 20 31 7d 2c 20 20 20 20 2f 2a 20 32   0,  1},    /* 2
eb20: 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20   */.      };.   
eb30: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
eb40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
eb50: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
eb60: 73 65 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43  setCookie), setC
eb70: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20  ookie, 0);.     
eb80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
eb90: 67 65 50 31 28 76 2c 20 61 64 64 72 2c 20 69 44  geP1(v, addr, iD
eba0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
ebb0: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
ebc0: 20 61 64 64 72 2b 31 2c 20 73 71 6c 69 74 65 33   addr+1, sqlite3
ebd0: 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20  Atoi(zRight));. 
ebe0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ebf0: 43 68 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72  ChangeP1(v, addr
ec00: 2b 32 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  +2, iDb);.      
ec10: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ec20: 65 50 32 28 76 2c 20 61 64 64 72 2b 32 2c 20 69  eP2(v, addr+2, i
ec30: 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 65 6c  Cookie);.    }el
ec40: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 61  se{.      /* Rea
ec50: 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
ec60: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a  cookie value */.
ec70: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
ec80: 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 72 65  st VdbeOpList re
ec90: 61 64 43 6f 6f 6b 69 65 5b 5d 20 3d 20 7b 0a 20  adCookie[] = {. 
eca0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61 6e         { OP_Tran
ecb0: 73 61 63 74 69 6f 6e 2c 20 20 20 20 20 30 2c 20  saction,     0, 
ecc0: 20 30 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 30   0,  0},    /* 0
ecd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
ece0: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 20 20  _ReadCookie,    
ecf0: 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20    0,  1,  0},   
ed00: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20   /* 1 */.       
ed10: 20 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c   { OP_ResultRow,
ed20: 20 20 20 20 20 20 20 31 2c 20 20 31 2c 20 20 30         1,  1,  0
ed30: 7d 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  }.      };.     
ed40: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
ed50: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
ed60: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 72 65  (v, ArraySize(re
ed70: 61 64 43 6f 6f 6b 69 65 29 2c 20 72 65 61 64 43  adCookie), readC
ed80: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 20  ookie, 0);.     
ed90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
eda0: 67 65 50 31 28 76 2c 20 61 64 64 72 2c 20 69 44  geP1(v, addr, iD
edb0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
edc0: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
edd0: 20 61 64 64 72 2b 31 2c 20 69 44 62 29 3b 0a 20   addr+1, iDb);. 
ede0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
edf0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
ee00: 2b 31 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20  +1, iCookie);.  
ee10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
ee20: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
ee30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ee40: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
ee50: 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  0, COLNAME_NAME,
ee60: 20 7a 4c 65 66 74 2c 20 53 51 4c 49 54 45 5f 54   zLeft, SQLITE_T
ee70: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
ee80: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 23 65  .  }.  break;.#e
ee90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
eea0: 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  MIT_SCHEMA_VERSI
eeb0: 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23  ON_PRAGMAS */..#
eec0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
eed0: 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
eee0: 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20 20 2a 2a  _DIAGS.  /*.  **
eef0: 20 20 20 50 52 41 47 4d 41 20 63 6f 6d 70 69 6c     PRAGMA compil
ef00: 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a 20  e_options.  **. 
ef10: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
ef20: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6d 70  ames of all comp
ef30: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
ef40: 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 62 75   used in this bu
ef50: 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f 70  ild,.  ** one op
ef60: 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e 0a 20 20  tion per row..  
ef70: 2a 2f 0a 20 20 63 61 73 65 20 50 72 61 67 54 79  */.  case PragTy
ef80: 70 5f 43 4f 4d 50 49 4c 45 5f 4f 50 54 49 4f 4e  p_COMPILE_OPTION
ef90: 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  S: {.    int i =
efa0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
efb0: 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 70 50  ar *zOpt;.    pP
efc0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 31 3b 0a  arse->nMem = 1;.
efd0: 20 20 20 20 73 65 74 4f 6e 65 43 6f 6c 75 6d 6e      setOneColumn
efe0: 4e 61 6d 65 28 76 2c 20 22 63 6f 6d 70 69 6c 65  Name(v, "compile
eff0: 5f 6f 70 74 69 6f 6e 22 29 3b 0a 20 20 20 20 77  _option");.    w
f000: 68 69 6c 65 28 20 28 7a 4f 70 74 20 3d 20 73 71  hile( (zOpt = sq
f010: 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
f020: 69 6f 6e 5f 67 65 74 28 69 2b 2b 29 29 21 3d 30  ion_get(i++))!=0
f030: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f040: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
f050: 76 2c 20 31 2c 20 7a 4f 70 74 29 3b 0a 20 20 20  v, 1, zOpt);.   
f060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f070: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
f080: 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20  tRow, 1, 1);.   
f090: 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
f0a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f0b0: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
f0c0: 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a 0a 23 69  ION_DIAGS */..#i
f0d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f0e0: 54 5f 57 41 4c 0a 20 20 2f 2a 0a 20 20 2a 2a 20  T_WAL.  /*.  ** 
f0f0: 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
f100: 73 65 2e 5d 77 61 6c 5f 63 68 65 63 6b 70 6f 69  se.]wal_checkpoi
f110: 6e 74 20 3d 20 70 61 73 73 69 76 65 7c 66 75 6c  nt = passive|ful
f120: 6c 7c 72 65 73 74 61 72 74 7c 74 72 75 6e 63 61  l|restart|trunca
f130: 74 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65  te.  **.  ** Che
f140: 63 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61  ckpoint the data
f150: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
f160: 65 20 50 72 61 67 54 79 70 5f 57 41 4c 5f 43 48  e PragTyp_WAL_CH
f170: 45 43 4b 50 4f 49 4e 54 3a 20 7b 0a 20 20 20 20  ECKPOINT: {.    
f180: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
f190: 72 20 2a 61 7a 43 6f 6c 5b 5d 20 3d 20 7b 20 22  r *azCol[] = { "
f1a0: 62 75 73 79 22 2c 20 22 6c 6f 67 22 2c 20 22 63  busy", "log", "c
f1b0: 68 65 63 6b 70 6f 69 6e 74 65 64 22 20 7d 3b 0a  heckpointed" };.
f1c0: 20 20 20 20 69 6e 74 20 69 42 74 20 3d 20 28 70      int iBt = (p
f1d0: 49 64 32 2d 3e 7a 3f 69 44 62 3a 53 51 4c 49 54  Id2->z?iDb:SQLIT
f1e0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 29 3b  E_MAX_ATTACHED);
f1f0: 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d  .    int eMode =
f200: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
f210: 4e 54 5f 50 41 53 53 49 56 45 3b 0a 20 20 20 20  NT_PASSIVE;.    
f220: 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20  if( zRight ){.  
f230: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
f240: 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  trICmp(zRight, "
f250: 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  full")==0 ){.   
f260: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c       eMode = SQL
f270: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
f280: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULL;.      }else
f290: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f2a0: 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 72 65 73  Cmp(zRight, "res
f2b0: 74 61 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tart")==0 ){.   
f2c0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c       eMode = SQL
f2d0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
f2e0: 45 53 54 41 52 54 3b 0a 20 20 20 20 20 20 7d 65  ESTART;.      }e
f2f0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
f300: 74 72 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  trICmp(zRight, "
f310: 74 72 75 6e 63 61 74 65 22 29 3d 3d 30 20 29 7b  truncate")==0 ){
f320: 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
f330: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
f340: 4e 54 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 20  NT_TRUNCATE;.   
f350: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
f360: 65 74 41 6c 6c 43 6f 6c 75 6d 6e 4e 61 6d 65 73  etAllColumnNames
f370: 28 76 2c 20 33 2c 20 61 7a 43 6f 6c 29 3b 20 20  (v, 3, azCol);  
f380: 61 73 73 65 72 74 28 20 33 3d 3d 41 72 72 61 79  assert( 3==Array
f390: 53 69 7a 65 28 61 7a 43 6f 6c 29 20 29 3b 0a 20  Size(azCol) );. 
f3a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
f3b0: 3d 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 3;.    sqlite3
f3c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f3d0: 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 42 74  _Checkpoint, iBt
f3e0: 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a 20 20 20  , eMode, 1);.   
f3f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f400: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
f410: 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 7d 0a 20  ow, 1, 3);.  }. 
f420: 20 62 72 65 61 6b 3b 0a 0a 20 20 2f 2a 0a 20 20   break;..  /*.  
f430: 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  **   PRAGMA wal_
f440: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 0a 20  autocheckpoint. 
f450: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c   **   PRAGMA wal
f460: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20  _autocheckpoint 
f470: 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  = N.  **.  ** Co
f480: 6e 66 69 67 75 72 65 20 61 20 64 61 74 61 62 61  nfigure a databa
f490: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
f4a0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
f4b0: 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61 74 61  heckpoint a data
f4c0: 62 61 73 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  base.  ** after 
f4d0: 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 4e 20 66  accumulating N f
f4e0: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
f4f0: 2e 20 4f 72 20 71 75 65 72 79 20 66 6f 72 20 74  . Or query for t
f500: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
f510: 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20 2a 2f  .  ** of N..  */
f520: 0a 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f  .  case PragTyp_
f530: 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
f540: 4e 54 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  NT: {.    if( zR
f550: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
f560: 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
f570: 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 73 71 6c  eckpoint(db, sql
f580: 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74 29  ite3Atoi(zRight)
f590: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
f5a0: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76 2c 20  urnSingleInt(v, 
f5b0: 22 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  "wal_autocheckpo
f5c0: 69 6e 74 22 2c 20 0a 20 20 20 20 20 20 20 64 62  int", .       db
f5d0: 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 3d 3d  ->xWalCallback==
f5e0: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
f5f0: 74 48 6f 6f 6b 20 3f 20 0a 20 20 20 20 20 20 20  tHook ? .       
f600: 20 20 20 20 53 51 4c 49 54 45 5f 50 54 52 5f 54      SQLITE_PTR_T
f610: 4f 5f 49 4e 54 28 64 62 2d 3e 70 57 61 6c 41 72  O_INT(db->pWalAr
f620: 67 29 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 62  g) : 0);.  }.  b
f630: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  reak;.#endif..  
f640: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
f650: 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20 20  shrink_memory.  
f660: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
f670: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 33 34  TATION-OF: R-234
f680: 34 35 2d 34 36 31 30 39 20 54 68 69 73 20 70 72  45-46109 This pr
f690: 61 67 6d 61 20 63 61 75 73 65 73 20 74 68 65 20  agma causes the 
f6a0: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f  database.  ** co
f6b0: 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 77 68 69 63  nnection on whic
f6c0: 68 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  h it is invoked 
f6d0: 74 6f 20 66 72 65 65 20 75 70 20 61 73 20 6d 75  to free up as mu
f6e0: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 69 74 0a  ch memory as it.
f6f0: 20 20 2a 2a 20 63 61 6e 2c 20 62 79 20 63 61 6c    ** can, by cal
f700: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 62 5f  ling sqlite3_db_
f710: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
f720: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  ..  */.  case Pr
f730: 61 67 54 79 70 5f 53 48 52 49 4e 4b 5f 4d 45 4d  agTyp_SHRINK_MEM
f740: 4f 52 59 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  ORY: {.    sqlit
f750: 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
f760: 6d 6f 72 79 28 64 62 29 3b 0a 20 20 20 20 62 72  mory(db);.    br
f770: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
f780: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75 73   **   PRAGMA bus
f790: 79 5f 74 69 6d 65 6f 75 74 0a 20 20 2a 2a 20 20  y_timeout.  **  
f7a0: 20 50 52 41 47 4d 41 20 62 75 73 79 5f 74 69 6d   PRAGMA busy_tim
f7b0: 65 6f 75 74 20 3d 20 4e 0a 20 20 2a 2a 0a 20 20  eout = N.  **.  
f7c0: 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ** Call sqlite3_
f7d0: 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
f7e0: 20 4e 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65   N).  Return the
f7f0: 20 63 75 72 72 65 6e 74 20 74 69 6d 65 6f 75 74   current timeout
f800: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 66 20 6f   value.  ** if o
f810: 6e 65 20 69 73 20 73 65 74 2e 20 20 49 66 20 6e  ne is set.  If n
f820: 6f 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 6f  o busy handler o
f830: 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 62 75  r a different bu
f840: 73 79 20 68 61 6e 64 6c 65 72 20 69 73 20 73 65  sy handler is se
f850: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 30 20 69 73  t.  ** then 0 is
f860: 20 72 65 74 75 72 6e 65 64 2e 20 20 53 65 74 74   returned.  Sett
f870: 69 6e 67 20 74 68 65 20 62 75 73 79 5f 74 69 6d  ing the busy_tim
f880: 65 6f 75 74 20 74 6f 20 30 20 6f 72 20 6e 65 67  eout to 0 or neg
f890: 61 74 69 76 65 0a 20 20 2a 2a 20 64 69 73 61 62  ative.  ** disab
f8a0: 6c 65 73 20 74 68 65 20 74 69 6d 65 6f 75 74 2e  les the timeout.
f8b0: 0a 20 20 2a 2f 0a 20 20 2f 2a 63 61 73 65 20 50  .  */.  /*case P
f8c0: 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d 45  ragTyp_BUSY_TIME
f8d0: 4f 55 54 2a 2f 20 64 65 66 61 75 6c 74 3a 20 7b  OUT*/ default: {
f8e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
f8f0: 61 67 6d 61 2d 3e 65 50 72 61 67 54 79 70 3d 3d  agma->ePragTyp==
f900: 50 72 61 67 54 79 70 5f 42 55 53 59 5f 54 49 4d  PragTyp_BUSY_TIM
f910: 45 4f 55 54 20 29 3b 0a 20 20 20 20 69 66 28 20  EOUT );.    if( 
f920: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
f930: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
f940: 65 6f 75 74 28 64 62 2c 20 73 71 6c 69 74 65 33  eout(db, sqlite3
f950: 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a 20  Atoi(zRight));. 
f960: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53     }.    returnS
f970: 69 6e 67 6c 65 49 6e 74 28 76 2c 20 22 74 69 6d  ingleInt(v, "tim
f980: 65 6f 75 74 22 2c 20 20 64 62 2d 3e 62 75 73 79  eout",  db->busy
f990: 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20 62 72  Timeout);.    br
f9a0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
f9b0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66   **   PRAGMA sof
f9c0: 74 5f 68 65 61 70 5f 6c 69 6d 69 74 0a 20 20 2a  t_heap_limit.  *
f9d0: 2a 20 20 20 50 52 41 47 4d 41 20 73 6f 66 74 5f  *   PRAGMA soft_
f9e0: 68 65 61 70 5f 6c 69 6d 69 74 20 3d 20 4e 0a 20  heap_limit = N. 
f9f0: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
fa00: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 36  NTATION-OF: R-26
fa10: 33 34 33 2d 34 35 39 33 30 20 54 68 69 73 20 70  343-45930 This p
fa20: 72 61 67 6d 61 20 69 6e 76 6f 6b 65 73 20 74 68  ragma invokes th
fa30: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 73  e.  ** sqlite3_s
fa40: 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34  oft_heap_limit64
fa50: 28 29 20 69 6e 74 65 72 66 61 63 65 20 77 69 74  () interface wit
fa60: 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 4e  h the argument N
fa70: 2c 20 69 66 20 4e 20 69 73 0a 20 20 2a 2a 20 73  , if N is.  ** s
fa80: 70 65 63 69 66 69 65 64 20 61 6e 64 20 69 73 20  pecified and is 
fa90: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
faa0: 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 20 49 4d 50  nteger..  ** IMP
fab0: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
fac0: 52 2d 36 34 34 35 31 2d 30 37 31 36 33 20 54 68  R-64451-07163 Th
fad0: 65 20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  e soft_heap_limi
fae0: 74 20 70 72 61 67 6d 61 20 61 6c 77 61 79 73 0a  t pragma always.
faf0: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
fb00: 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20 74 68   same integer th
fb10: 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65 74 75  at would be retu
fb20: 72 6e 65 64 20 62 79 20 74 68 65 0a 20 20 2a 2a  rned by the.  **
fb30: 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
fb40: 61 70 5f 6c 69 6d 69 74 36 34 28 2d 31 29 20 43  ap_limit64(-1) C
fb50: 2d 6c 61 6e 67 75 61 67 65 20 66 75 6e 63 74 69  -language functi
fb60: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
fb70: 50 72 61 67 54 79 70 5f 53 4f 46 54 5f 48 45 41  PragTyp_SOFT_HEA
fb80: 50 5f 4c 49 4d 49 54 3a 20 7b 0a 20 20 20 20 73  P_LIMIT: {.    s
fb90: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 4e 3b 0a  qlite3_int64 N;.
fba0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 26      if( zRight &
fbb0: 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  & sqlite3DecOrHe
fbc0: 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26  xToI64(zRight, &
fbd0: 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  N)==SQLITE_OK ){
fbe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
fbf0: 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34  oft_heap_limit64
fc00: 28 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  (N);.    }.    r
fc10: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 76  eturnSingleInt(v
fc20: 2c 20 22 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  , "soft_heap_lim
fc30: 69 74 22 2c 20 20 73 71 6c 69 74 65 33 5f 73 6f  it",  sqlite3_so
fc40: 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
fc50: 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  -1));.    break;
fc60: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
fc70: 20 20 50 52 41 47 4d 41 20 74 68 72 65 61 64 73    PRAGMA threads
fc80: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
fc90: 68 72 65 61 64 73 20 3d 20 4e 0a 20 20 2a 2a 0a  hreads = N.  **.
fca0: 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74    ** Configure t
fcb0: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
fcc0: 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65  r of worker thre
fcd0: 61 64 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ads.  Return the
fce0: 20 6e 65 77 0a 20 20 2a 2a 20 6d 61 78 69 6d 75   new.  ** maximu
fcf0: 6d 2c 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  m, which might b
fd00: 65 20 6c 65 73 73 20 74 68 61 6e 20 72 65 71 75  e less than requ
fd10: 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  ested..  */.  ca
fd20: 73 65 20 50 72 61 67 54 79 70 5f 54 48 52 45 41  se PragTyp_THREA
fd30: 44 53 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  DS: {.    sqlite
fd40: 33 5f 69 6e 74 36 34 20 4e 3b 0a 20 20 20 20 69  3_int64 N;.    i
fd50: 66 28 20 7a 52 69 67 68 74 0a 20 20 20 20 20 26  f( zRight.     &
fd60: 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  & sqlite3DecOrHe
fd70: 78 54 6f 49 36 34 28 7a 52 69 67 68 74 2c 20 26  xToI64(zRight, &
fd80: 4e 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  N)==SQLITE_OK.  
fd90: 20 20 20 26 26 20 4e 3e 3d 30 0a 20 20 20 20 29     && N>=0.    )
fda0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
fdb0: 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54 45  limit(db, SQLITE
fdc0: 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
fdd0: 52 45 41 44 53 2c 20 28 69 6e 74 29 28 4e 26 30  READS, (int)(N&0
fde0: 78 37 66 66 66 66 66 66 66 29 29 3b 0a 20 20 20  x7fffffff));.   
fdf0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e   }.    returnSin
fe00: 67 6c 65 49 6e 74 28 76 2c 20 22 74 68 72 65 61  gleInt(v, "threa
fe10: 64 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ds",.           
fe20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fe30: 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c 49 54  _limit(db, SQLIT
fe40: 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
fe50: 48 52 45 41 44 53 2c 20 2d 31 29 29 3b 0a 20 20  HREADS, -1));.  
fe60: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 23 69    break;.  }..#i
fe70: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
fe80: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
fe90: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
fea0: 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72 74    /*.  ** Report
feb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
fec0: 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73 20  te of file logs 
fed0: 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
fee0: 73 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 50 72  s.  */.  case Pr
fef0: 61 67 54 79 70 5f 4c 4f 43 4b 5f 53 54 41 54 55  agTyp_LOCK_STATU
ff00: 53 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  S: {.    static 
ff10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
ff20: 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20 3d  t azLockName[] =
ff30: 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b   {.      "unlock
ff40: 65 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20 22  ed", "shared", "
ff50: 72 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e 64  reserved", "pend
ff60: 69 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76 65  ing", "exclusive
ff70: 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61  ".    };.    sta
ff80: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
ff90: 61 7a 43 6f 6c 5b 5d 20 3d 20 7b 20 22 64 61 74  azCol[] = { "dat
ffa0: 61 62 61 73 65 22 2c 20 22 73 74 61 74 75 73 22  abase", "status"
ffb0: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   };.    int i;. 
ffc0: 20 20 20 73 65 74 41 6c 6c 43 6f 6c 75 6d 6e 4e     setAllColumnN
ffd0: 61 6d 65 73 28 76 2c 20 32 2c 20 61 7a 43 6f 6c  ames(v, 2, azCol
ffe0: 29 3b 20 61 73 73 65 72 74 28 20 32 3d 3d 41 72  ); assert( 2==Ar
fff0: 72 61 79 53 69 7a 65 28 61 7a 43 6f 6c 29 20 29  raySize(azCol) )
10000 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
10010 65 6d 20 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28  em = 2;.    for(
10020 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
10030 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
10040 65 20 2a 70 42 74 3b 0a 20 20 20 20 20 20 63 6f  e *pBt;.      co
10050 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65  nst char *zState
10060 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
10070 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
10080 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
10090 7a 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69  zName==0 ) conti
100a0 6e 75 65 3b 0a 20 20 20 20 20 20 70 42 74 20 3d  nue;.      pBt =
100b0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
100c0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 3d 3d  .      if( pBt==
100d0 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
100e0 65 50 61 67 65 72 28 70 42 74 29 3d 3d 30 20 29  ePager(pBt)==0 )
100f0 7b 0a 20 20 20 20 20 20 20 20 7a 53 74 61 74 65  {.        zState
10100 20 3d 20 22 63 6c 6f 73 65 64 22 3b 0a 20 20 20   = "closed";.   
10110 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
10120 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
10130 6c 28 64 62 2c 20 69 20 3f 20 64 62 2d 3e 61 44  l(db, i ? db->aD
10140 62 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 30 2c 20  b[i].zName : 0, 
10150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 43 4e        SQLITE_FCN
10180 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 6a  TL_LOCKSTATE, &j
10190 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
101a0 20 20 20 20 20 20 20 20 20 7a 53 74 61 74 65 20           zState 
101b0 3d 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 3b  = azLockName[j];
101c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
101d0 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c  qlite3VdbeMultiL
101e0 6f 61 64 28 76 2c 20 31 2c 20 22 73 73 22 2c 20  oad(v, 1, "ss", 
101f0 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
10200 2c 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 20  , zState);.     
10210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10220 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
10230 6f 77 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d  ow, 1, 2);.    }
10240 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10250 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
10260 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
10270 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 4b    case PragTyp_K
10280 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 7a 52  EY: {.    if( zR
10290 69 67 68 74 20 29 20 73 71 6c 69 74 65 33 5f 6b  ight ) sqlite3_k
102a0 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
102b0 52 69 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74  Right, sqlite3St
102c0 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b  rlen30(zRight));
102d0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
102e0 20 20 63 61 73 65 20 50 72 61 67 54 79 70 5f 52    case PragTyp_R
102f0 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 66 28 20  EKEY: {.    if( 
10300 7a 52 69 67 68 74 20 29 20 73 71 6c 69 74 65 33  zRight ) sqlite3
10310 5f 72 65 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  _rekey_v2(db, zD
10320 62 2c 20 7a 52 69 67 68 74 2c 20 73 71 6c 69 74  b, zRight, sqlit
10330 65 33 53 74 72 6c 65 6e 33 30 28 7a 52 69 67 68  e3Strlen30(zRigh
10340 74 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  t));.    break;.
10350 20 20 7d 0a 20 20 63 61 73 65 20 50 72 61 67 54    }.  case PragT
10360 79 70 5f 48 45 58 4b 45 59 3a 20 7b 0a 20 20 20  yp_HEXKEY: {.   
10370 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
10380 20 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20       u8 iByte;. 
10390 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
103a0 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b    char zKey[40];
103b0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
103c0 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f  iByte=0; i<sizeo
103d0 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c  f(zKey)*2 && sql
103e0 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 52 69  ite3Isxdigit(zRi
103f0 67 68 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ght[i]); i++){. 
10400 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28         iByte = (
10410 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69  iByte<<4) + sqli
10420 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 52 69 67  te3HexToInt(zRig
10430 68 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ht[i]);.        
10440 69 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a  if( (i&1)!=0 ) z
10450 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65  Key[i/2] = iByte
10460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10470 69 66 28 20 28 7a 4c 65 66 74 5b 33 5d 20 26 20  if( (zLeft[3] & 
10480 30 78 66 29 3d 3d 30 78 62 20 29 7b 0a 20 20 20  0xf)==0xb ){.   
10490 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79       sqlite3_key
104a0 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65  _v2(db, zDb, zKe
104b0 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 20 20 7d  y, i/2);.      }
104c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
104d0 6c 69 74 65 33 5f 72 65 6b 65 79 5f 76 32 28 64  lite3_rekey_v2(d
104e0 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 69 2f  b, zDb, zKey, i/
104f0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
10500 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
10510 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
10520 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
10530 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64  ODEC) || defined
10540 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
10550 45 52 4f 44 29 0a 20 20 63 61 73 65 20 50 72 61  EROD).  case Pra
10560 67 54 79 70 5f 41 43 54 49 56 41 54 45 5f 45 58  gTyp_ACTIVATE_EX
10570 54 45 4e 53 49 4f 4e 53 3a 20 69 66 28 20 7a 52  TENSIONS: if( zR
10580 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53  ight ){.#ifdef S
10590 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
105a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
105b0 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  trNICmp(zRight, 
105c0 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b  "see-", 4)==0 ){
105d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61  .      sqlite3_a
105e0 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69  ctivate_see(&zRi
105f0 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23  ght[4]);.    }.#
10600 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
10610 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44  ITE_ENABLE_CEROD
10620 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10630 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c  StrNICmp(zRight,
10640 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30   "cerod-", 6)==0
10650 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10660 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64  3_activate_cerod
10670 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20  (&zRight[6]);.  
10680 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
10690 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a   break;.#endif..
106a0 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68    } /* End of th
106b0 65 20 50 52 41 47 4d 41 20 73 77 69 74 63 68 20  e PRAGMA switch 
106c0 2a 2f 0a 0a 70 72 61 67 6d 61 5f 6f 75 74 3a 0a  */..pragma_out:.
106d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
106e0 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20 73 71  db, zLeft);.  sq
106f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10700 7a 52 69 67 68 74 29 3b 0a 7d 0a 0a 23 65 6e 64  zRight);.}..#end
10710 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10720 54 5f 50 52 41 47 4d 41 20 2a 2f 0a              T_PRAGMA */.