/ Hex Artifact Content
Login

Artifact 86c8088ac6a12d3f3be5f7394542651f03fa9a38:


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 2f 2a  sqliteInt.h"../*
01d0: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
01e0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
01f0: 73 20 61 20 73 61 66 65 74 79 20 6c 65 76 65 6c  s a safety level
0200: 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20  .  Return 0 for 
0210: 4f 46 46 2c 0a 2a 2a 20 31 20 66 6f 72 20 4f 4e  OFF,.** 1 for ON
0220: 20 6f 72 20 4e 4f 52 4d 41 4c 20 61 6e 64 20 32   or NORMAL and 2
0230: 20 66 6f 72 20 46 55 4c 4c 2e 20 20 52 65 74 75   for FULL.  Retu
0240: 72 6e 20 31 20 66 6f 72 20 61 6e 20 65 6d 70 74  rn 1 for an empt
0250: 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65 63 6f 67  y or .** unrecog
0260: 6e 69 7a 65 64 20 73 74 72 69 6e 67 20 61 72 67  nized string arg
0270: 75 6d 65 6e 74 2e 20 20 54 68 65 20 46 55 4c 4c  ument.  The FULL
0280: 20 6f 70 74 69 6f 6e 20 69 73 20 64 69 73 61 6c   option is disal
0290: 6c 6f 77 65 64 0a 2a 2a 20 69 66 20 74 68 65 20  lowed.** if the 
02a0: 6f 6d 69 74 46 75 6c 6c 20 70 61 72 61 6d 65 74  omitFull paramet
02b0: 65 72 20 69 74 20 31 2e 0a 2a 2a 0a 2a 2a 20 4e  er it 1..**.** N
02c0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 61 6c  ote that the val
02d0: 75 65 73 20 72 65 74 75 72 6e 65 64 20 61 72 65  ues returned are
02e0: 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 74 20 74   one less that t
02f0: 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 0a 2a  he values that.*
0300: 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  * should be pass
0310: 65 64 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 42  ed into sqlite3B
0320: 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
0330: 65 6c 28 29 2e 20 20 54 68 65 20 69 73 20 64 6f  el().  The is do
0340: 6e 65 0a 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74  ne.** to support
0350: 20 6c 65 67 61 63 79 20 53 51 4c 20 63 6f 64 65   legacy SQL code
0360: 2e 20 20 54 68 65 20 73 61 66 65 74 79 20 6c 65  .  The safety le
0370: 76 65 6c 20 75 73 65 64 20 74 6f 20 62 65 20 62  vel used to be b
0380: 6f 6f 6c 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c  oolean.** and ol
0390: 64 65 72 20 73 63 72 69 70 74 73 20 6d 61 79 20  der scripts may 
03a0: 68 61 76 65 20 75 73 65 64 20 6e 75 6d 62 65 72  have used number
03b0: 73 20 30 20 66 6f 72 20 4f 46 46 20 61 6e 64 20  s 0 for OFF and 
03c0: 31 20 66 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61  1 for ON..*/.sta
03d0: 74 69 63 20 75 38 20 67 65 74 53 61 66 65 74 79  tic u8 getSafety
03e0: 4c 65 76 65 6c 28 63 6f 6e 73 74 20 63 68 61 72  Level(const char
03f0: 20 2a 7a 2c 20 69 6e 74 20 6f 6d 69 74 46 75 6c   *z, int omitFul
0400: 6c 2c 20 69 6e 74 20 64 66 6c 74 29 7b 0a 20 20  l, int dflt){.  
0410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 32             /* 12
0430: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
0440: 39 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  9 */.  static co
0450: 6e 73 74 20 63 68 61 72 20 7a 54 65 78 74 5b 5d  nst char zText[]
0460: 20 3d 20 22 6f 6e 6f 66 66 61 6c 73 65 79 65 73   = "onoffalseyes
0470: 74 72 75 65 66 75 6c 6c 22 3b 0a 20 20 73 74 61  truefull";.  sta
0480: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 69 4f 66  tic const u8 iOf
0490: 66 73 65 74 5b 5d 20 3d 20 7b 30 2c 20 31 2c 20  fset[] = {0, 1, 
04a0: 32 2c 20 34 2c 20 39 2c 20 31 32 2c 20 31 36 7d  2, 4, 9, 12, 16}
04b0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
04c0: 20 75 38 20 69 4c 65 6e 67 74 68 5b 5d 20 3d 20   u8 iLength[] = 
04d0: 7b 32 2c 20 32 2c 20 33 2c 20 35 2c 20 33 2c 20  {2, 2, 3, 5, 3, 
04e0: 34 2c 20 34 7d 3b 0a 20 20 73 74 61 74 69 63 20  4, 4};.  static 
04f0: 63 6f 6e 73 74 20 75 38 20 69 56 61 6c 75 65 5b  const u8 iValue[
0500: 5d 20 3d 20 20 7b 31 2c 20 30 2c 20 30 2c 20 30  ] =  {1, 0, 0, 0
0510: 2c 20 31 2c 20 31 2c 20 32 7d 3b 0a 20 20 69 6e  , 1, 1, 2};.  in
0520: 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 73 71  t i, n;.  if( sq
0530: 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a 7a 29  lite3Isdigit(*z)
0540: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
0550: 75 38 29 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  u8)sqlite3Atoi(z
0560: 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c  );.  }.  n = sql
0570: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
0580: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
0590: 72 61 79 53 69 7a 65 28 69 4c 65 6e 67 74 68 29  raySize(iLength)
05a0: 2d 6f 6d 69 74 46 75 6c 6c 3b 20 69 2b 2b 29 7b  -omitFull; i++){
05b0: 0a 20 20 20 20 69 66 28 20 69 4c 65 6e 67 74 68  .    if( iLength
05c0: 5b 69 5d 3d 3d 6e 20 26 26 20 73 71 6c 69 74 65  [i]==n && sqlite
05d0: 33 53 74 72 4e 49 43 6d 70 28 26 7a 54 65 78 74  3StrNICmp(&zText
05e0: 5b 69 4f 66 66 73 65 74 5b 69 5d 5d 2c 7a 2c 6e  [iOffset[i]],z,n
05f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
0600: 74 75 72 6e 20 69 56 61 6c 75 65 5b 69 5d 3b 0a  turn iValue[i];.
0610: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
0620: 72 6e 20 64 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn dflt;.}../*.*
0630: 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20  * Interpret the 
0640: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
0650: 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
0660: 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 47 65  .*/.u8 sqlite3Ge
0670: 74 42 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63  tBoolean(const c
0680: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 66 6c 74  har *z, int dflt
0690: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 53  ){.  return getS
06a0: 61 66 65 74 79 4c 65 76 65 6c 28 7a 2c 31 2c 64  afetyLevel(z,1,d
06b0: 66 6c 74 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 20 54  flt)!=0;.}../* T
06c0: 68 65 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f  he sqlite3GetBoo
06d0: 6c 65 61 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  lean() function 
06e0: 69 73 20 75 73 65 64 20 62 79 20 6f 74 68 65 72  is used by other
06f0: 20 6d 6f 64 75 6c 65 73 20 62 75 74 20 74 68 65   modules but the
0700: 0a 2a 2a 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  .** remainder of
0710: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 70   this file is sp
0720: 65 63 69 66 69 63 20 74 6f 20 50 52 41 47 4d 41  ecific to PRAGMA
0730: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f   processing.  So
0740: 20 6f 6d 69 74 0a 2a 2a 20 74 68 65 20 72 65 73   omit.** the res
0750: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  t of the file if
0760: 20 50 52 41 47 4d 41 73 20 61 72 65 20 6f 6d 69   PRAGMAs are omi
0770: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  tted from the bu
0780: 69 6c 64 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ild..*/.#if !def
0790: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
07a0: 5f 50 52 41 47 4d 41 29 0a 0a 2f 2a 0a 2a 2a 20  _PRAGMA)../*.** 
07b0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67 69  Interpret the gi
07c0: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
07d0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 76 61 6c  locking mode val
07e0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
07f0: 74 20 67 65 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65  t getLockingMode
0800: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
0810: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
0820: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0830: 72 49 43 6d 70 28 7a 2c 20 22 65 78 63 6c 75 73  rICmp(z, "exclus
0840: 69 76 65 22 29 20 29 20 72 65 74 75 72 6e 20 50  ive") ) return P
0850: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
0860: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
0870: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0880: 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 72 6d 61 6c  rICmp(z, "normal
0890: 22 29 20 29 20 72 65 74 75 72 6e 20 50 41 47 45  ") ) return PAGE
08a0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
08b0: 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RMAL;.  }.  retu
08c0: 72 6e 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  rn PAGER_LOCKING
08d0: 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 7d 0a 0a 23  MODE_QUERY;.}..#
08e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
08f0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
0900: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68  .** Interpret th
0910: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
0920: 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
0930: 20 6d 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   mode value..**.
0940: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0950: 20 73 74 72 69 6e 67 73 2c 20 22 6e 6f 6e 65 22   strings, "none"
0960: 2c 20 22 66 75 6c 6c 22 20 61 6e 64 20 22 69 6e  , "full" and "in
0970: 63 72 65 6d 65 6e 74 61 6c 22 20 61 72 65 20 0a  cremental" are .
0980: 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2c 20 61  ** acceptable, a
0990: 73 20 61 72 65 20 74 68 65 69 72 20 6e 75 6d 65  s are their nume
09a0: 72 69 63 20 65 71 75 69 76 61 6c 65 6e 74 73 3a  ric equivalents:
09b0: 20 30 2c 20 31 20 61 6e 64 20 32 20 72 65 73 70   0, 1 and 2 resp
09c0: 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
09d0: 74 69 63 20 69 6e 74 20 67 65 74 41 75 74 6f 56  tic int getAutoV
09e0: 61 63 75 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  acuum(const char
09f0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
0a00: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
0a10: 74 72 49 43 6d 70 28 7a 2c 20 22 6e 6f 6e 65 22  trICmp(z, "none"
0a20: 29 20 29 20 72 65 74 75 72 6e 20 42 54 52 45 45  ) ) return BTREE
0a30: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
0a40: 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ;.  if( 0==sqlit
0a50: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 66 75  e3StrICmp(z, "fu
0a60: 6c 6c 22 29 20 29 20 72 65 74 75 72 6e 20 42 54  ll") ) return BT
0a70: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
0a80: 55 4c 4c 3b 0a 20 20 69 66 28 20 30 3d 3d 73 71  ULL;.  if( 0==sq
0a90: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
0aa0: 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 29 20 29  "incremental") )
0ab0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
0ac0: 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 3b 0a 20  TOVACUUM_INCR;. 
0ad0: 20 69 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69   i = sqlite3Atoi
0ae0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  (z);.  return (u
0af0: 38 29 28 28 69 3e 3d 30 26 26 69 3c 3d 32 29 3f  8)((i>=0&&i<=2)?
0b00: 69 3a 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  i:0);.}.#endif /
0b10: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
0b20: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
0b30: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
0b40: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
0b50: 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  AGMAS./*.** Inte
0b60: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
0b70: 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70  string as a temp
0b80: 20 64 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65   db location. Re
0b90: 74 75 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a  turn 1 for file.
0ba0: 2a 2a 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72  ** backed tempor
0bb0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 32  ary databases, 2
0bc0: 20 66 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61   for the Red-Bla
0bd0: 63 6b 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72  ck tree in memor
0be0: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  y database.** an
0bf0: 64 20 30 20 74 6f 20 75 73 65 20 74 68 65 20 63  d 0 to use the c
0c00: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
0c10: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
0c20: 6e 74 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28  nt getTempStore(
0c30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0c40: 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20    if( z[0]>='0' 
0c50: 26 26 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a  && z[0]<='2' ){.
0c60: 20 20 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20      return z[0] 
0c70: 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69  - '0';.  }else i
0c80: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0c90: 70 28 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20  p(z, "file")==0 
0ca0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
0cb0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
0cc0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
0cd0: 6d 65 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20  memory")==0 ){. 
0ce0: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
0cf0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
0d00: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
0d10: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 52   /* SQLITE_PAGER
0d20: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69 66  _PRAGMAS */..#if
0d30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0d40: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
0d50: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
0d60: 74 65 6d 70 20 73 74 6f 72 61 67 65 2c 20 65 69  temp storage, ei
0d70: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 74 65  ther when the te
0d80: 6d 70 20 73 74 6f 72 61 67 65 20 69 73 20 63 68  mp storage is ch
0d90: 61 6e 67 65 64 0a 2a 2a 20 66 72 6f 6d 20 64 65  anged.** from de
0da0: 66 61 75 6c 74 2c 20 6f 72 20 77 68 65 6e 20 27  fault, or when '
0db0: 66 69 6c 65 27 20 61 6e 64 20 74 68 65 20 74 65  file' and the te
0dc0: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
0dd0: 72 79 20 68 61 73 20 63 68 61 6e 67 65 64 0a 2a  ry has changed.*
0de0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 76  /.static int inv
0df0: 61 6c 69 64 61 74 65 54 65 6d 70 53 74 6f 72 61  alidateTempStora
0e00: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
0e10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
0e20: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0e30: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
0e40: 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pBt!=0 ){.    if
0e50: 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  ( !db->autoCommi
0e60: 74 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  t || sqlite3Btre
0e70: 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 64  eIsInReadTrans(d
0e80: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
0e90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
0ea0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
0eb0: 22 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61  "temporary stora
0ec0: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 68 61  ge cannot be cha
0ed0: 6e 67 65 64 20 22 0a 20 20 20 20 20 20 20 20 22  nged ".        "
0ee0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
0ef0: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
0f00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
0f10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
0f20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
0f30: 6f 73 65 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ose(db->aDb[1].p
0f40: 42 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Bt);.    db->aDb
0f50: 5b 31 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  [1].pBt = 0;.   
0f60: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
0f70: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
0f80: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ion(db);.  }.  r
0f90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0fa0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
0fb0: 49 54 45 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  ITE_PAGER_PRAGMA
0fc0: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
0fd0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
0fe0: 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 49 66  PRAGMAS./*.** If
0ff0: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1000: 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f 73  se is open, clos
1010: 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74 68  e it and mark th
1020: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1030: 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67 20  a.** as needing 
1040: 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69 73  reloading.  This
1050: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
1060: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
1070: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 0a 2a  ITE_TEMP_STORE.*
1080: 2a 20 6f 72 20 44 45 46 41 55 4c 54 5f 54 45 4d  * or DEFAULT_TEM
1090: 50 5f 53 54 4f 52 45 20 70 72 61 67 6d 61 73 2e  P_STORE pragmas.
10a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
10b0: 68 61 6e 67 65 54 65 6d 70 53 74 6f 72 61 67 65  hangeTempStorage
10c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6f  const char *zSto
10e0: 72 61 67 65 54 79 70 65 29 7b 0a 20 20 69 6e 74  rageType){.  int
10f0: 20 74 73 20 3d 20 67 65 74 54 65 6d 70 53 74 6f   ts = getTempSto
1100: 72 65 28 7a 53 74 6f 72 61 67 65 54 79 70 65 29  re(zStorageType)
1110: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1120: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1130: 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  if( db->temp_sto
1140: 72 65 3d 3d 74 73 20 29 20 72 65 74 75 72 6e 20  re==ts ) return 
1150: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1160: 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70 53   invalidateTempS
1170: 74 6f 72 61 67 65 28 20 70 50 61 72 73 65 20 29  torage( pParse )
1180: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
1190: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11a0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
11b0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 3d  db->temp_store =
11c0: 20 28 75 38 29 74 73 3b 0a 20 20 72 65 74 75 72   (u8)ts;.  retur
11d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
11e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11f0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f  PAGER_PRAGMAS */
1200: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1210: 20 63 6f 64 65 20 74 6f 20 72 65 74 75 72 6e 20   code to return 
1220: 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
1230: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
1240: 63 20 76 6f 69 64 20 72 65 74 75 72 6e 53 69 6e  c void returnSin
1250: 67 6c 65 49 6e 74 28 50 61 72 73 65 20 2a 70 50  gleInt(Parse *pP
1260: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
1270: 20 2a 7a 4c 61 62 65 6c 2c 20 69 36 34 20 76 61   *zLabel, i64 va
1280: 6c 75 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  lue){.  Vdbe *v 
1290: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
12a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
12b0: 6d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mem = ++pParse->
12c0: 6e 4d 65 6d 3b 0a 20 20 69 36 34 20 2a 70 49 36  nMem;.  i64 *pI6
12d0: 34 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  4 = sqlite3DbMal
12e0: 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
12f0: 62 2c 20 73 69 7a 65 6f 66 28 76 61 6c 75 65 29  b, sizeof(value)
1300: 29 3b 0a 20 20 69 66 28 20 70 49 36 34 20 29 7b  );.  if( pI64 ){
1310: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 49 36 34  .    memcpy(pI64
1320: 2c 20 26 76 61 6c 75 65 2c 20 73 69 7a 65 6f 66  , &value, sizeof
1330: 28 76 61 6c 75 65 29 29 3b 0a 20 20 7d 0a 20 20  (value));.  }.  
1340: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1350: 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
1360: 2c 20 6d 65 6d 2c 20 30 2c 20 28 63 68 61 72 2a  , mem, 0, (char*
1370: 29 70 49 36 34 2c 20 50 34 5f 49 4e 54 36 34 29  )pI64, P4_INT64)
1380: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
1390: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
13a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
13b0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43  tColName(v, 0, C
13c0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4c 61  OLNAME_NAME, zLa
13d0: 62 65 6c 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  bel, SQLITE_STAT
13e0: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  IC);.  sqlite3Vd
13f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1400: 65 73 75 6c 74 52 6f 77 2c 20 6d 65 6d 2c 20 31  esultRow, mem, 1
1410: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
1420: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50  LITE_OMIT_FLAG_P
1430: 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 43 68 65  RAGMAS./*.** Che
1440: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 7a 52 69  ck to see if zRi
1450: 67 68 74 20 61 6e 64 20 7a 4c 65 66 74 20 72 65  ght and zLeft re
1460: 66 65 72 20 74 6f 20 61 20 70 72 61 67 6d 61 20  fer to a pragma 
1470: 74 68 61 74 20 71 75 65 72 69 65 73 0a 2a 2a 20  that queries.** 
1480: 6f 72 20 63 68 61 6e 67 65 73 20 6f 6e 65 20 6f  or changes one o
1490: 66 20 74 68 65 20 66 6c 61 67 73 20 69 6e 20 64  f the flags in d
14a0: 62 2d 3e 66 6c 61 67 73 2e 20 20 52 65 74 75 72  b->flags.  Retur
14b0: 6e 20 31 20 69 66 20 73 6f 20 61 6e 64 20 30 20  n 1 if so and 0 
14c0: 69 66 20 6e 6f 74 2e 0a 2a 2a 20 41 6c 73 6f 2c  if not..** Also,
14d0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 70   implement the p
14e0: 72 61 67 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63  ragma..*/.static
14f0: 20 69 6e 74 20 66 6c 61 67 50 72 61 67 6d 61 28   int flagPragma(
1500: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1510: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74  onst char *zLeft
1520: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52  , const char *zR
1530: 69 67 68 74 29 7b 0a 20 20 73 74 61 74 69 63 20  ight){.  static 
1540: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 50 72  const struct sPr
1550: 61 67 6d 61 54 79 70 65 20 7b 0a 20 20 20 20 63  agmaType {.    c
1560: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1570: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
1580: 65 20 70 72 61 67 6d 61 20 2a 2f 0a 20 20 20 20  e pragma */.    
1590: 69 6e 74 20 6d 61 73 6b 3b 20 20 20 20 20 20 20  int mask;       
15a0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20      /* Mask for 
15b0: 74 68 65 20 64 62 2d 3e 66 6c 61 67 73 20 76 61  the db->flags va
15c0: 6c 75 65 20 2a 2f 0a 20 20 7d 20 61 50 72 61 67  lue */.  } aPrag
15d0: 6d 61 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ma[] = {.    { "
15e0: 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  full_column_name
15f0: 73 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  s",        SQLIT
1600: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 20 20  E_FullColNames  
1610: 7d 2c 0a 20 20 20 20 7b 20 22 73 68 6f 72 74 5f  },.    { "short_
1620: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 22 2c 20 20  column_names",  
1630: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 68 6f 72       SQLITE_Shor
1640: 74 43 6f 6c 4e 61 6d 65 73 20 7d 2c 0a 20 20 20  tColNames },.   
1650: 20 7b 20 22 63 6f 75 6e 74 5f 63 68 61 6e 67 65   { "count_change
1660: 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  s",            S
1670: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
1680: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 6d      },.    { "em
1690: 70 74 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c 62  pty_result_callb
16a0: 61 63 6b 73 22 2c 20 20 20 53 51 4c 49 54 45 5f  acks",   SQLITE_
16b0: 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 20 20 7d 2c  NullCallback  },
16c0: 0a 20 20 20 20 7b 20 22 6c 65 67 61 63 79 5f 66  .    { "legacy_f
16d0: 69 6c 65 5f 66 6f 72 6d 61 74 22 2c 20 20 20 20  ile_format",    
16e0: 20 20 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79     SQLITE_Legacy
16f0: 46 69 6c 65 46 6d 74 20 7d 2c 0a 20 20 20 20 7b  FileFmt },.    {
1700: 20 22 66 75 6c 6c 66 73 79 6e 63 22 2c 20 20 20   "fullfsync",   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1720: 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63 20 20 20  ITE_FullFSync   
1730: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 68 65 63    },.    { "chec
1740: 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63  kpoint_fullfsync
1750: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6b  ",     SQLITE_Ck
1760: 70 74 46 75 6c 6c 46 53 79 6e 63 20 7d 2c 0a 20  ptFullFSync },. 
1770: 20 20 20 7b 20 22 72 65 76 65 72 73 65 5f 75 6e     { "reverse_un
1780: 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 22  ordered_selects"
1790: 2c 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  , SQLITE_Reverse
17a0: 4f 72 64 65 72 20 20 7d 2c 0a 23 69 66 6e 64 65  Order  },.#ifnde
17b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17c0: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
17d0: 20 20 7b 20 22 61 75 74 6f 6d 61 74 69 63 5f 69    { "automatic_i
17e0: 6e 64 65 78 22 2c 20 20 20 20 20 20 20 20 20 20  ndex",          
17f0: 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
1800: 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23       },.#endif.#
1810: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1820: 55 47 0a 20 20 20 20 7b 20 22 73 71 6c 5f 74 72  UG.    { "sql_tr
1830: 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ace",           
1840: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 71 6c 54       SQLITE_SqlT
1850: 72 61 63 65 20 20 20 20 20 20 7d 2c 0a 20 20 20  race      },.   
1860: 20 7b 20 22 76 64 62 65 5f 6c 69 73 74 69 6e 67   { "vdbe_listing
1870: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ",             S
1880: 51 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e  QLITE_VdbeListin
1890: 67 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 64  g   },.    { "vd
18a0: 62 65 5f 74 72 61 63 65 22 2c 20 20 20 20 20 20  be_trace",      
18b0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18c0: 56 64 62 65 54 72 61 63 65 20 20 20 20 20 7d 2c  VdbeTrace     },
18d0: 0a 20 20 20 20 7b 20 22 76 64 62 65 5f 61 64 64  .    { "vdbe_add
18e0: 6f 70 74 72 61 63 65 22 2c 20 20 20 20 20 20 20  optrace",       
18f0: 20 20 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64     SQLITE_VdbeAd
1900: 64 6f 70 54 72 61 63 65 7d 2c 0a 20 20 20 20 7b  dopTrace},.    {
1910: 20 22 76 64 62 65 5f 64 65 62 75 67 22 2c 20 20   "vdbe_debug",  
1920: 20 20 53 51 4c 49 54 45 5f 53 71 6c 54 72 61 63    SQLITE_SqlTrac
1930: 65 20 7c 20 53 51 4c 49 54 45 5f 56 64 62 65 4c  e | SQLITE_VdbeL
1940: 69 73 74 69 6e 67 0a 20 20 20 20 20 20 20 20 20  isting.         
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 56        | SQLITE_V
1970: 64 62 65 54 72 61 63 65 20 20 20 20 20 20 7d 2c  dbeTrace      },
1980: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
1990: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
19a0: 4b 0a 20 20 20 20 7b 20 22 69 67 6e 6f 72 65 5f  K.    { "ignore_
19b0: 63 68 65 63 6b 5f 63 6f 6e 73 74 72 61 69 6e 74  check_constraint
19c0: 73 22 2c 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72  s", SQLITE_Ignor
19d0: 65 43 68 65 63 6b 73 20 20 7d 2c 0a 23 65 6e 64  eChecks  },.#end
19e0: 69 66 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  if.    /* The fo
19f0: 6c 6c 6f 77 69 6e 67 20 69 73 20 56 45 52 59 20  llowing is VERY 
1a00: 65 78 70 65 72 69 6d 65 6e 74 61 6c 20 2a 2f 0a  experimental */.
1a10: 20 20 20 20 7b 20 22 77 72 69 74 61 62 6c 65 5f      { "writable_
1a20: 73 63 68 65 6d 61 22 2c 20 20 20 20 20 20 20 20  schema",        
1a30: 20 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63    SQLITE_WriteSc
1a40: 68 65 6d 61 7c 53 51 4c 49 54 45 5f 52 65 63 6f  hema|SQLITE_Reco
1a50: 76 65 72 79 4d 6f 64 65 20 7d 2c 0a 0a 20 20 20  veryMode },..   
1a60: 20 2f 2a 20 54 4f 44 4f 3a 20 4d 61 79 62 65 20   /* TODO: Maybe 
1a70: 69 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  it shouldn't be 
1a80: 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 68 61 6e  possible to chan
1a90: 67 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  ge the ReadUncom
1aa0: 6d 69 74 74 65 64 0a 20 20 20 20 2a 2a 20 66 6c  mitted.    ** fl
1ab0: 61 67 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ag if there are 
1ac0: 61 6e 79 20 61 63 74 69 76 65 20 73 74 61 74 65  any active state
1ad0: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 7b 20  ments. */.    { 
1ae0: 22 72 65 61 64 5f 75 6e 63 6f 6d 6d 69 74 74 65  "read_uncommitte
1af0: 64 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49  d",         SQLI
1b00: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
1b10: 65 64 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 63  ed },.    { "rec
1b20: 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 22  ursive_triggers"
1b30: 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 52  ,       SQLITE_R
1b40: 65 63 54 72 69 67 67 65 72 73 20 7d 2c 0a 0a 20  ecTriggers },.. 
1b50: 20 20 20 2f 2a 20 54 68 69 73 20 66 6c 61 67 20     /* This flag 
1b60: 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  may only be set 
1b70: 69 66 20 62 6f 74 68 20 66 6f 72 65 69 67 6e 2d  if both foreign-
1b80: 6b 65 79 20 61 6e 64 20 74 72 69 67 67 65 72 20  key and trigger 
1b90: 73 75 70 70 6f 72 74 0a 20 20 20 20 2a 2a 20 61  support.    ** a
1ba0: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
1bb0: 65 20 62 75 69 6c 64 2e 20 20 2a 2f 0a 23 69 66  e build.  */.#if
1bc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1bd0: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
1be0: 59 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  Y) && !defined(S
1bf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
1c00: 45 52 29 0a 20 20 20 20 7b 20 22 66 6f 72 65 69  ER).    { "forei
1c10: 67 6e 5f 6b 65 79 73 22 2c 20 20 20 20 20 20 20  gn_keys",       
1c20: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72        SQLITE_For
1c30: 65 69 67 6e 4b 65 79 73 20 7d 2c 0a 23 65 6e 64  eignKeys },.#end
1c40: 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  if.  };.  int i;
1c50: 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
1c60: 73 50 72 61 67 6d 61 54 79 70 65 20 2a 70 3b 0a  sPragmaType *p;.
1c70: 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 61 50 72    for(i=0, p=aPr
1c80: 61 67 6d 61 3b 20 69 3c 41 72 72 61 79 53 69 7a  agma; i<ArraySiz
1c90: 65 28 61 50 72 61 67 6d 61 29 3b 20 69 2b 2b 2c  e(aPragma); i++,
1ca0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   p++){.    if( s
1cb0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c  qlite3StrICmp(zL
1cc0: 65 66 74 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3d 3d  eft, p->zName)==
1cd0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1ce0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1cf0: 3e 64 62 3b 0a 20 20 20 20 20 20 56 64 62 65 20  >db;.      Vdbe 
1d00: 2a 76 3b 0a 20 20 20 20 20 20 76 20 3d 20 73 71  *v;.      v = sq
1d10: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1d20: 72 73 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  rse);.      asse
1d30: 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
1d40: 41 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  Already allocate
1d50: 64 20 62 79 20 73 71 6c 69 74 65 33 50 72 61 67  d by sqlite3Prag
1d60: 6d 61 28 29 20 2a 2f 0a 20 20 20 20 20 20 69 66  ma() */.      if
1d70: 28 20 41 4c 57 41 59 53 28 76 29 20 29 7b 0a 20  ( ALWAYS(v) ){. 
1d80: 20 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68         if( zRigh
1d90: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1da0: 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e    returnSingleIn
1db0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 7a 4e 61  t(pParse, p->zNa
1dc0: 6d 65 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  me, (db->flags &
1dd0: 20 70 2d 3e 6d 61 73 6b 29 21 3d 30 20 29 3b 0a   p->mask)!=0 );.
1de0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1df0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73           int mas
1e00: 6b 20 3d 20 70 2d 3e 6d 61 73 6b 3b 20 20 20 20  k = p->mask;    
1e10: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1e20: 20 62 69 74 73 20 74 6f 20 73 65 74 20 6f 72 20   bits to set or 
1e30: 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 20 20 20 20  clear. */.      
1e40: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f      if( db->auto
1e50: 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65           /* Fore
1e70: 69 67 6e 20 6b 65 79 20 73 75 70 70 6f 72 74 20  ign key support 
1e80: 6d 61 79 20 6e 6f 74 20 62 65 20 65 6e 61 62 6c  may not be enabl
1e90: 65 64 20 6f 72 20 64 69 73 61 62 6c 65 64 20 77  ed or disabled w
1ea0: 68 69 6c 65 20 6e 6f 74 0a 20 20 20 20 20 20 20  hile not.       
1eb0: 20 20 20 20 20 2a 2a 20 69 6e 20 61 75 74 6f 2d       ** in auto-
1ec0: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 20 20 2a 2f  commit mode.  */
1ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 73  .            mas
1ee0: 6b 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 46 6f  k &= ~(SQLITE_Fo
1ef0: 72 65 69 67 6e 4b 65 79 73 29 3b 0a 20 20 20 20  reignKeys);.    
1f00: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1f10: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
1f20: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 2c  tBoolean(zRight,
1f30: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
1f40: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
1f50: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
1f60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f70: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
1f80: 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  ~mask;.         
1f90: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
1fa0: 20 4d 61 6e 79 20 6f 66 20 74 68 65 20 66 6c 61   Many of the fla
1fb0: 67 2d 70 72 61 67 6d 61 73 20 6d 6f 64 69 66 79  g-pragmas modify
1fc0: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1fd0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 0a  ted by the SQL .
1fe0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d            ** com
1ff0: 70 69 6c 65 72 20 28 65 67 2e 20 63 6f 75 6e 74  piler (eg. count
2000: 5f 63 68 61 6e 67 65 73 29 2e 20 53 6f 20 61 64  _changes). So ad
2010: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 6f 20 65  d an opcode to e
2020: 78 70 69 72 65 20 61 6c 6c 0a 20 20 20 20 20 20  xpire all.      
2030: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
2040: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  SQL statements a
2050: 66 74 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  fter modifying a
2060: 20 70 72 61 67 6d 61 20 76 61 6c 75 65 2e 0a 20   pragma value.. 
2070: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2090: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 78  eAddOp2(v, OP_Ex
20a0: 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pire, 0, 0);.   
20b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
20c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
20d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20e0: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
20f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  * SQLITE_OMIT_FL
2100: 41 47 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 2f  AG_PRAGMAS */../
2110: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 68 75  *.** Return a hu
2120: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 6e 61 6d  man-readable nam
2130: 65 20 66 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  e for a constrai
2140: 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 63  nt resolution ac
2150: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
2160: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
2170: 45 49 47 4e 5f 4b 45 59 0a 73 74 61 74 69 63 20  EIGN_KEY.static 
2180: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 63 74 69  const char *acti
2190: 6f 6e 4e 61 6d 65 28 75 38 20 61 63 74 69 6f 6e  onName(u8 action
21a0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
21b0: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
21c0: 28 20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  ( action ){.    
21d0: 63 61 73 65 20 4f 45 5f 53 65 74 4e 75 6c 6c 3a  case OE_SetNull:
21e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 45 54 20 4e    zName = "SET N
21f0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65  ULL";        bre
2200: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
2210: 53 65 74 44 66 6c 74 3a 20 20 7a 4e 61 6d 65 20  SetDflt:  zName 
2220: 3d 20 22 53 45 54 20 44 45 46 41 55 4c 54 22 3b  = "SET DEFAULT";
2230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2240: 63 61 73 65 20 4f 45 5f 43 61 73 63 61 64 65 3a  case OE_Cascade:
2250: 20 20 7a 4e 61 6d 65 20 3d 20 22 43 41 53 43 41    zName = "CASCA
2260: 44 45 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  DE";         bre
2270: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  ak;.    case OE_
2280: 52 65 73 74 72 69 63 74 3a 20 7a 4e 61 6d 65 20  Restrict: zName 
2290: 3d 20 22 52 45 53 54 52 49 43 54 22 3b 20 20 20  = "RESTRICT";   
22a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22b0: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
22c0: 20 20 7a 4e 61 6d 65 20 3d 20 22 4e 4f 20 41 43    zName = "NO AC
22d0: 54 49 4f 4e 22 3b 20 20 0a 20 20 20 20 20 20 20  TION";  .       
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
22f0: 73 73 65 72 74 28 20 61 63 74 69 6f 6e 3d 3d 4f  ssert( action==O
2300: 45 5f 4e 6f 6e 65 20 29 3b 20 62 72 65 61 6b 3b  E_None ); break;
2310: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
2320: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
2330: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
2340: 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
2350: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
2360: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 63  OURNALMODE_XXX c
2370: 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 64 65 66 69  onstants.** defi
2380: 6e 65 64 20 69 6e 20 70 61 67 65 72 2e 68 2e 20  ned in pager.h. 
2390: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
23a0: 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63 69  turns the associ
23b0: 61 74 65 64 20 6c 6f 77 65 72 63 61 73 65 0a 2a  ated lowercase.*
23c0: 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6e  * journal-mode n
23d0: 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ame..*/.const ch
23e0: 61 72 20 2a 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ar *sqlite3Journ
23f0: 61 6c 4d 6f 64 65 6e 61 6d 65 28 69 6e 74 20 65  alModename(int e
2400: 4d 6f 64 65 29 7b 0a 20 20 73 74 61 74 69 63 20  Mode){.  static 
2410: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 4d  char * const azM
2420: 6f 64 65 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  odeName[] = {.  
2430: 20 20 22 64 65 6c 65 74 65 22 2c 20 22 70 65 72    "delete", "per
2440: 73 69 73 74 22 2c 20 22 6f 66 66 22 2c 20 22 74  sist", "off", "t
2450: 72 75 6e 63 61 74 65 22 2c 20 22 6d 65 6d 6f 72  runcate", "memor
2460: 79 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  y".#ifndef SQLIT
2470: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2480: 2c 20 22 77 61 6c 22 0a 23 65 6e 64 69 66 0a 20  , "wal".#endif. 
2490: 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   };.  assert( PA
24a0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
24b0: 44 45 4c 45 54 45 3d 3d 30 20 29 3b 0a 20 20 61  DELETE==0 );.  a
24c0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
24d0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
24e0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
24f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2500: 44 45 5f 4f 46 46 3d 3d 32 20 29 3b 0a 20 20 61  DE_OFF==2 );.  a
2510: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
2520: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
2530: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
2540: 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2550: 4f 44 45 5f 4d 45 4d 4f 52 59 3d 3d 34 20 29 3b  ODE_MEMORY==4 );
2560: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2570: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2580: 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
2590: 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 65 4d 6f   eMode>=0 && eMo
25a0: 64 65 3c 3d 41 72 72 61 79 53 69 7a 65 28 61 7a  de<=ArraySize(az
25b0: 4d 6f 64 65 4e 61 6d 65 29 20 29 3b 0a 0a 20 20  ModeName) );..  
25c0: 69 66 28 20 65 4d 6f 64 65 3d 3d 41 72 72 61 79  if( eMode==Array
25d0: 53 69 7a 65 28 61 7a 4d 6f 64 65 4e 61 6d 65 29  Size(azModeName)
25e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
25f0: 65 74 75 72 6e 20 61 7a 4d 6f 64 65 4e 61 6d 65  eturn azModeName
2600: 5b 65 4d 6f 64 65 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  [eMode];.}../*.*
2610: 2a 20 50 72 6f 63 65 73 73 20 61 20 70 72 61 67  * Process a prag
2620: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  ma statement.  .
2630: 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61 72  **.** Pragmas ar
2640: 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a  e of this form:.
2650: 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47 4d  **.**      PRAGM
2660: 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 69 64 20  A [database.]id 
2670: 5b 3d 20 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a 20  [= value].**.** 
2680: 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d  The identifier m
2690: 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73  ight also be a s
26a0: 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75  tring.  The valu
26b0: 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61  e is a string, a
26c0: 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  nd.** identifier
26d0: 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20  , or a number.  
26e0: 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20  If minusFlag is 
26f0: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76  true, then the v
2700: 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d  alue is.** a num
2710: 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72 65  ber that was pre
2720: 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73  ceded by a minus
2730: 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   sign..**.** If 
2740: 74 68 65 20 6c 65 66 74 20 73 69 64 65 20 69 73  the left side is
2750: 20 22 64 61 74 61 62 61 73 65 2e 69 64 22 20 74   "database.id" t
2760: 68 65 6e 20 70 49 64 31 20 69 73 20 74 68 65 20  hen pId1 is the 
2770: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a  database name.**
2780: 20 61 6e 64 20 70 49 64 32 20 69 73 20 74 68 65   and pId2 is the
2790: 20 69 64 2e 20 20 49 66 20 74 68 65 20 6c 65 66   id.  If the lef
27a0: 74 20 73 69 64 65 20 69 73 20 6a 75 73 74 20 22  t side is just "
27b0: 69 64 22 20 74 68 65 6e 20 70 49 64 31 20 69 73  id" then pId1 is
27c0: 20 74 68 65 0a 2a 2a 20 69 64 20 61 6e 64 20 70   the.** id and p
27d0: 49 64 32 20 69 73 20 61 6e 79 20 65 6d 70 74 79  Id2 is any empty
27e0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64   string..*/.void
27f0: 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 0a   sqlite3Pragma(.
2800: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2810: 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 49 64 31 2c   .  Token *pId1,
2820: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2830: 20 70 61 72 74 20 6f 66 20 5b 64 61 74 61 62 61   part of [databa
2840: 73 65 2e 5d 69 64 20 66 69 65 6c 64 20 2a 2f 0a  se.]id field */.
2850: 20 20 54 6f 6b 65 6e 20 2a 70 49 64 32 2c 20 20    Token *pId2,  
2860: 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
2870: 70 61 72 74 20 6f 66 20 5b 64 61 74 61 62 61 73  part of [databas
2880: 65 2e 5d 69 64 20 66 69 65 6c 64 2c 20 6f 72 20  e.]id field, or 
2890: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
28a0: 2a 70 56 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a  *pValue,      /*
28b0: 20 54 6f 6b 65 6e 20 66 6f 72 20 3c 76 61 6c 75   Token for <valu
28c0: 65 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  e>, or NULL */. 
28d0: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 20 20   int minusFlag  
28e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
28f0: 61 20 27 2d 27 20 73 69 67 6e 20 70 72 65 63 65  a '-' sign prece
2900: 64 65 64 20 3c 76 61 6c 75 65 3e 20 2a 2f 0a 29  ded <value> */.)
2910: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20  {.  char *zLeft 
2920: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2930: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
2940: 2d 38 20 73 74 72 69 6e 67 20 3c 69 64 3e 20 2a  -8 string <id> *
2950: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74  /.  char *zRight
2960: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
2970: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
2980: 2d 38 20 73 74 72 69 6e 67 20 3c 76 61 6c 75 65  -8 string <value
2990: 3e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  >, or NULL */.  
29a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
29b0: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  = 0;   /* The da
29c0: 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20  tabase name */. 
29d0: 20 54 6f 6b 65 6e 20 2a 70 49 64 3b 20 20 20 20   Token *pId;    
29e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
29f0: 65 72 20 74 6f 20 3c 69 64 3e 20 74 6f 6b 65 6e  er to <id> token
2a00: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a20: 44 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 66  Database index f
2a30: 6f 72 20 3c 64 61 74 61 62 61 73 65 3e 20 2a 2f  or <database> */
2a40: 0a 20 20 63 68 61 72 20 2a 61 46 63 6e 74 6c 5b  .  char *aFcntl[
2a50: 34 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 67  4];       /* Arg
2a60: 75 6d 65 6e 74 20 74 6f 20 53 51 4c 49 54 45 5f  ument to SQLITE_
2a70: 46 43 4e 54 4c 5f 50 52 41 47 4d 41 20 2a 2f 0a  FCNTL_PRAGMA */.
2a80: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * return value f
2ab0: 6f 72 6d 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  orm SQLITE_FCNTL
2ac0: 5f 50 52 41 47 4d 41 20 2a 2f 0a 20 20 73 71 6c  _PRAGMA */.  sql
2ad0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2ae0: 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 54 68 65  e->db;    /* The
2af0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2b00: 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44  tion */.  Db *pD
2b10: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2b20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
2b30: 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20  ecific database 
2b40: 62 65 69 6e 67 20 70 72 61 67 6d 61 65 64 20 2a  being pragmaed *
2b50: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
2b60: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
2b70: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
2b80: 64 62 29 3b 20 20 2f 2a 20 50 72 65 70 61 72 65  db);  /* Prepare
2b90: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  d statement */..
2ba0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
2bb0: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  urn;.  sqlite3Vd
2bc0: 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 76 29  beRunOnlyOnce(v)
2bd0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
2be0: 20 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   = 2;..  /* Inte
2bf0: 72 70 72 65 74 20 74 68 65 20 5b 64 61 74 61 62  rpret the [datab
2c00: 61 73 65 2e 5d 20 70 61 72 74 20 6f 66 20 74 68  ase.] part of th
2c10: 65 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  e pragma stateme
2c20: 6e 74 2e 20 69 44 62 20 69 73 20 74 68 65 0a 20  nt. iDb is the. 
2c30: 20 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65   ** index of the
2c40: 20 64 61 74 61 62 61 73 65 20 74 68 69 73 20 70   database this p
2c50: 72 61 67 6d 61 20 69 73 20 62 65 69 6e 67 20 61  ragma is being a
2c60: 70 70 6c 69 65 64 20 74 6f 20 69 6e 20 64 62 2e  pplied to in db.
2c70: 61 44 62 5b 5d 2e 20 2a 2f 0a 20 20 69 44 62 20  aDb[]. */.  iDb 
2c80: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
2c90: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 49 64  Name(pParse, pId
2ca0: 31 2c 20 70 49 64 32 2c 20 26 70 49 64 29 3b 0a  1, pId2, &pId);.
2cb0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
2cc0: 74 75 72 6e 3b 0a 20 20 70 44 62 20 3d 20 26 64  turn;.  pDb = &d
2cd0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
2ce0: 2f 2a 20 49 66 20 74 68 65 20 74 65 6d 70 20 64  /* If the temp d
2cf0: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
2d00: 20 65 78 70 6c 69 63 69 74 6c 79 20 6e 61 6d 65   explicitly name
2d10: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2d20: 20 0a 20 20 2a 2a 20 70 72 61 67 6d 61 2c 20 6d   .  ** pragma, m
2d30: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6f  ake sure it is o
2d40: 70 65 6e 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  pen. .  */.  if(
2d50: 20 69 44 62 3d 3d 31 20 26 26 20 73 71 6c 69 74   iDb==1 && sqlit
2d60: 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
2d70: 73 65 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  se(pParse) ){.  
2d80: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2d90: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   zLeft = sqlite3
2da0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
2db0: 2c 20 70 49 64 29 3b 0a 20 20 69 66 28 20 21 7a  , pId);.  if( !z
2dc0: 4c 65 66 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Left ) return;. 
2dd0: 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29   if( minusFlag )
2de0: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
2df0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2e00: 2c 20 22 2d 25 54 22 2c 20 70 56 61 6c 75 65 29  , "-%T", pValue)
2e10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2e20: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 4e  Right = sqlite3N
2e30: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
2e40: 20 70 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 0a 20   pValue);.  }.. 
2e50: 20 61 73 73 65 72 74 28 20 70 49 64 32 20 29 3b   assert( pId2 );
2e60: 0a 20 20 7a 44 62 20 3d 20 70 49 64 32 2d 3e 6e  .  zDb = pId2->n
2e70: 3e 30 20 3f 20 70 44 62 2d 3e 7a 4e 61 6d 65 20  >0 ? pDb->zName 
2e80: 3a 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  : 0;.  if( sqlit
2e90: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
2ea0: 73 65 2c 20 53 51 4c 49 54 45 5f 50 52 41 47 4d  se, SQLITE_PRAGM
2eb0: 41 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74  A, zLeft, zRight
2ec0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f  , zDb) ){.    go
2ed0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
2ee0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 61 6e   }..  /* Send an
2ef0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
2f00: 41 47 4d 41 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  AGMA file-contro
2f10: 6c 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79  l to the underly
2f20: 69 6e 67 20 56 46 53 0a 20 20 2a 2a 20 63 6f 6e  ing VFS.  ** con
2f30: 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20 69 74 20  nection.  If it 
2f40: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2f50: 4b 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20 74  K, then assume t
2f60: 68 61 74 20 74 68 65 20 56 46 53 0a 20 20 2a 2a  hat the VFS.  **
2f70: 20 68 61 6e 64 6c 65 64 20 74 68 65 20 70 72 61   handled the pra
2f80: 67 6d 61 20 61 6e 64 20 67 65 6e 65 72 61 74 65  gma and generate
2f90: 20 61 20 6e 6f 2d 6f 70 20 70 72 65 70 61 72 65   a no-op prepare
2fa0: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
2fb0: 2f 0a 20 20 61 46 63 6e 74 6c 5b 30 5d 20 3d 20  /.  aFcntl[0] = 
2fc0: 30 3b 0a 20 20 61 46 63 6e 74 6c 5b 31 5d 20 3d  0;.  aFcntl[1] =
2fd0: 20 7a 4c 65 66 74 3b 0a 20 20 61 46 63 6e 74 6c   zLeft;.  aFcntl
2fe0: 5b 32 5d 20 3d 20 7a 52 69 67 68 74 3b 0a 20 20  [2] = zRight;.  
2ff0: 61 46 63 6e 74 6c 5b 33 5d 20 3d 20 30 3b 0a 20  aFcntl[3] = 0;. 
3000: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
3010: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 72 63  .nBusy = 0;.  rc
3020: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
3030: 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c  control(db, zDb,
3040: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52   SQLITE_FCNTL_PR
3050: 41 47 4d 41 2c 20 28 76 6f 69 64 2a 29 61 46 63  AGMA, (void*)aFc
3060: 6e 74 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ntl);.  if( rc==
3070: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3080: 20 69 66 28 20 61 46 63 6e 74 6c 5b 30 5d 20 29   if( aFcntl[0] )
3090: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6d 65 6d 20  {.      int mem 
30a0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
30b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30c0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
30d0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 6d 65 6d 2c  String8, 0, mem,
30e0: 20 30 2c 20 61 46 63 6e 74 6c 5b 30 5d 2c 20 30   0, aFcntl[0], 0
30f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3100: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
3110: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
3120: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
3130: 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, 0, COLNAME_
3140: 4e 41 4d 45 2c 20 22 72 65 73 75 6c 74 22 2c 20  NAME, "result", 
3150: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
3160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3170: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
3180: 73 75 6c 74 52 6f 77 2c 20 6d 65 6d 2c 20 31 29  sultRow, mem, 1)
3190: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
31a0: 66 72 65 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b  free(aFcntl[0]);
31b0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
31c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc!=SQLITE_NO
31d0: 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 69 66  TFOUND ){.    if
31e0: 28 20 61 46 63 6e 74 6c 5b 30 5d 20 29 7b 0a 20  ( aFcntl[0] ){. 
31f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3200: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
3210: 22 2c 20 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20  ", aFcntl[0]);. 
3220: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
3230: 65 28 61 46 63 6e 74 6c 5b 30 5d 29 3b 0a 20 20  e(aFcntl[0]);.  
3240: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
3250: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 70 50 61 72  nErr++;.    pPar
3260: 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d  se->rc = rc;.  }
3270: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  else.           
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 0a 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64   . .#if !defined
32a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
32b0: 45 52 5f 50 52 41 47 4d 41 53 29 20 26 26 20 21  ER_PRAGMAS) && !
32c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
32d0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a  MIT_DEPRECATED).
32e0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d    /*.  **  PRAGM
32f0: 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 64 65 66  A [database.]def
3300: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a  ault_cache_size.
3310: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61    **  PRAGMA [da
3320: 74 61 62 61 73 65 2e 5d 64 65 66 61 75 6c 74 5f  tabase.]default_
3330: 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a  cache_size=N.  *
3340: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
3350: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
3360: 65 20 63 75 72 72 65 6e 74 20 70 65 72 73 69 73  e current persis
3370: 74 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72  tent setting for
3380: 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63   the.  ** page c
3390: 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20  ache size.  The 
33a0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
33b0: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  s the maximum nu
33c0: 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67  mber of.  ** pag
33d0: 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
33e0: 61 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e  ache.  The secon
33f0: 64 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68  d form sets both
3400: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
3410: 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
3420: 65 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  e value and the 
3430: 70 65 72 73 69 73 74 65 6e 74 20 70 61 67 65 20  persistent page 
3440: 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65  cache size value
3450: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
3460: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3470: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6c 64  e..  **.  ** Old
3480: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
3490: 51 4c 69 74 65 20 77 6f 75 6c 64 20 73 65 74 20  QLite would set 
34a0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68  the default cach
34b0: 65 20 73 69 7a 65 20 74 6f 20 61 0a 20 20 2a 2a  e size to a.  **
34c0: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
34d0: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 73 79 6e   to indicate syn
34e0: 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 2e 20 20 54  chronous=OFF.  T
34f0: 68 65 73 65 20 64 61 79 73 2c 20 73 79 6e 63 68  hese days, synch
3500: 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 61  ronous.  ** is a
3510: 6c 77 61 79 73 20 6f 6e 20 62 79 20 64 65 66 61  lways on by defa
3520: 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ult regardless o
3530: 66 20 74 68 65 20 73 69 67 6e 20 6f 66 20 74 68  f the sign of th
3540: 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65 0a  e default cache.
3550: 20 20 2a 2a 20 73 69 7a 65 2e 20 20 42 75 74 20    ** size.  But 
3560: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74 61 6b 65  continue to take
3570: 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   the absolute va
3580: 6c 75 65 20 6f 66 20 74 68 65 20 64 65 66 61 75  lue of the defau
3590: 6c 74 20 63 61 63 68 65 0a 20 20 2a 2a 20 73 69  lt cache.  ** si
35a0: 7a 65 20 6f 66 20 68 69 73 74 6f 72 69 63 61 6c  ze of historical
35b0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a   compatibility..
35c0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
35d0: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
35e0: 22 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73  "default_cache_s
35f0: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
3600: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62  static const Vdb
3610: 65 4f 70 4c 69 73 74 20 67 65 74 43 61 63 68 65  eOpList getCache
3620: 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Size[] = {.     
3630: 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f   { OP_Transactio
3640: 6e 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  n, 0, 0,        
3650: 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  0},             
3660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
3670: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52   */.      { OP_R
3680: 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 31  eadCookie,  0, 1
3690: 2c 20 20 20 20 20 20 20 20 42 54 52 45 45 5f 44  ,        BTREE_D
36a0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
36b0: 45 7d 2c 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20  E},  /* 1 */.   
36c0: 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20     { OP_IfPos,  
36d0: 20 20 20 20 20 31 2c 20 37 2c 20 20 20 20 20 20       1, 7,      
36e0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
36f0: 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c  _Integer,     0,
3700: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
3710: 20 20 20 20 20 7b 20 4f 50 5f 53 75 62 74 72 61       { OP_Subtra
3720: 63 74 2c 20 20 20 20 31 2c 20 32 2c 20 20 20 20  ct,    1, 2,    
3730: 20 20 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20      1},.      { 
3740: 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20 20 20 20  OP_IfPos,       
3750: 31 2c 20 37 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 7,        0},
3760: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
3770: 67 65 72 2c 20 20 20 20 20 30 2c 20 31 2c 20 20  ger,     0, 1,  
3780: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 20 20 20        0},       
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a0: 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20    /* 6 */.      
37b0: 7b 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  { OP_ResultRow, 
37c0: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30    1, 1,        0
37d0: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
37e0: 74 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28 20  t addr;.    if( 
37f0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
3800: 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
3810: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
3820: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3830: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
3840: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
3850: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
3860: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
3870: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
3880: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
3890: 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, 0, COLNAME_N
38a0: 41 4d 45 2c 20 22 63 61 63 68 65 5f 73 69 7a 65  AME, "cache_size
38b0: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ", SQLITE_STATIC
38c0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
38d0: 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20  >nMem += 2;.    
38e0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
38f0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
3900: 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 43 61   ArraySize(getCa
3910: 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61 63  cheSize), getCac
3920: 68 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 73  heSize);.      s
3930: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3940: 50 31 28 76 2c 20 61 64 64 72 2c 20 69 44 62 29  P1(v, addr, iDb)
3950: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3960: 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 61  dbeChangeP1(v, a
3970: 64 64 72 2b 31 2c 20 69 44 62 29 3b 0a 20 20 20  ddr+1, iDb);.   
3980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
3990: 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72 2b 36  angeP1(v, addr+6
39a0: 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
39b0: 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20  _CACHE_SIZE);.  
39c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
39d0: 6e 74 20 73 69 7a 65 20 3d 20 73 71 6c 69 74 65  nt size = sqlite
39e0: 33 41 62 73 49 6e 74 33 32 28 73 71 6c 69 74 65  3AbsInt32(sqlite
39f0: 33 41 74 6f 69 28 7a 52 69 67 68 74 29 29 3b 0a  3Atoi(zRight));.
3a00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
3a10: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
3a20: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
3a30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3a40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3a50: 49 6e 74 65 67 65 72 2c 20 73 69 7a 65 2c 20 31  Integer, size, 1
3a60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3a70: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3a80: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
3a90: 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43   BTREE_DEFAULT_C
3aa0: 41 43 48 45 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ACHE_SIZE, 1);. 
3ab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
3ac0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
3ad0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
3ae0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 53  );.      pDb->pS
3af0: 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f 73 69 7a  chema->cache_siz
3b00: 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e = size;.      
3b10: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
3b20: 61 63 68 65 53 69 7a 65 28 70 44 62 2d 3e 70 42  acheSize(pDb->pB
3b30: 74 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t, pDb->pSchema-
3b40: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
3b50: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
3b60: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
3b70: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
3b80: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
3b90: 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a  _DEPRECATED */..
3ba0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
3bb0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
3bc0: 52 41 47 4d 41 53 29 0a 20 20 2f 2a 0a 20 20 2a  RAGMAS).  /*.  *
3bd0: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
3be0: 61 73 65 2e 5d 70 61 67 65 5f 73 69 7a 65 0a 20  ase.]page_size. 
3bf0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74   **  PRAGMA [dat
3c00: 61 62 61 73 65 2e 5d 70 61 67 65 5f 73 69 7a 65  abase.]page_size
3c10: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  =N.  **.  ** The
3c20: 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f   first form repo
3c30: 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rts the current 
3c40: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
3c50: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
3c60: 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ge size in bytes
3c70: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  .  The second fo
3c80: 72 6d 20 73 65 74 73 20 74 68 65 0a 20 20 2a 2a  rm sets the.  **
3c90: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73   database page s
3ca0: 69 7a 65 20 76 61 6c 75 65 2e 20 20 54 68 65 20  ize value.  The 
3cb0: 76 61 6c 75 65 20 63 61 6e 20 6f 6e 6c 79 20 62  value can only b
3cc0: 65 20 73 65 74 20 69 66 0a 20 20 2a 2a 20 74 68  e set if.  ** th
3cd0: 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  e database has n
3ce0: 6f 74 20 79 65 74 20 62 65 65 6e 20 63 72 65 61  ot yet been crea
3cf0: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
3d00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
3d10: 4c 65 66 74 2c 22 70 61 67 65 5f 73 69 7a 65 22  Left,"page_size"
3d20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 42 74 72 65  )==0 ){.    Btre
3d30: 65 20 2a 70 42 74 20 3d 20 70 44 62 2d 3e 70 42  e *pBt = pDb->pB
3d40: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
3d50: 42 74 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  Bt!=0 );.    if(
3d60: 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20   !zRight ){.    
3d70: 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 41 4c 57    int size = ALW
3d80: 41 59 53 28 70 42 74 29 20 3f 20 73 71 6c 69 74  AYS(pBt) ? sqlit
3d90: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
3da0: 7a 65 28 70 42 74 29 20 3a 20 30 3b 0a 20 20 20  ze(pBt) : 0;.   
3db0: 20 20 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49     returnSingleI
3dc0: 6e 74 28 70 50 61 72 73 65 2c 20 22 70 61 67 65  nt(pParse, "page
3dd0: 5f 73 69 7a 65 22 2c 20 73 69 7a 65 29 3b 0a 20  _size", size);. 
3de0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3df0: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 61 79 20 66 61  /* Malloc may fa
3e00: 69 6c 20 77 68 65 6e 20 73 65 74 74 69 6e 67 20  il when setting 
3e10: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  the page-size, a
3e20: 73 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  s there is an in
3e30: 74 65 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ternal.      ** 
3e40: 62 75 66 66 65 72 20 74 68 61 74 20 74 68 65 20  buffer that the 
3e50: 70 61 67 65 72 20 6d 6f 64 75 6c 65 20 72 65 73  pager module res
3e60: 69 7a 65 73 20 75 73 69 6e 67 20 73 71 6c 69 74  izes using sqlit
3e70: 65 33 5f 72 65 61 6c 6c 6f 63 28 29 2e 0a 20 20  e3_realloc()..  
3e80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d      */.      db-
3e90: 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20  >nextPagesize = 
3ea0: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
3eb0: 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  ht);.      if( S
3ec0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c  QLITE_NOMEM==sql
3ed0: 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
3ee0: 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65  Size(pBt, db->ne
3ef0: 78 74 50 61 67 65 73 69 7a 65 2c 2d 31 2c 30 29  xtPagesize,-1,0)
3f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   ){.        db->
3f10: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
3f20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3f30: 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20    }else..  /*.  
3f40: 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
3f50: 62 61 73 65 2e 5d 73 65 63 75 72 65 5f 64 65 6c  base.]secure_del
3f60: 65 74 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ete.  **  PRAGMA
3f70: 20 5b 64 61 74 61 62 61 73 65 2e 5d 73 65 63 75   [database.]secu
3f80: 72 65 5f 64 65 6c 65 74 65 3d 4f 4e 2f 4f 46 46  re_delete=ON/OFF
3f90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
3fa0: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
3fb0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  s the current se
3fc0: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
3fd0: 2a 2a 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  ** secure_delete
3fe0: 20 66 6c 61 67 2e 20 20 54 68 65 20 73 65 63 6f   flag.  The seco
3ff0: 6e 64 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20  nd form changes 
4000: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
4010: 65 0a 20 20 2a 2a 20 66 6c 61 67 20 73 65 74 74  e.  ** flag sett
4020: 69 6e 67 20 61 6e 64 20 72 65 70 6f 72 74 73 20  ing and reports 
4030: 74 68 65 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20  thenew value..  
4040: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
4050: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 73  StrICmp(zLeft,"s
4060: 65 63 75 72 65 5f 64 65 6c 65 74 65 22 29 3d 3d  ecure_delete")==
4070: 30 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  0 ){.    Btree *
4080: 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a  pBt = pDb->pBt;.
4090: 20 20 20 20 69 6e 74 20 62 20 3d 20 2d 31 3b 0a      int b = -1;.
40a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 21      assert( pBt!
40b0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  =0 );.    if( zR
40c0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 62 20  ight ){.      b 
40d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  = sqlite3GetBool
40e0: 65 61 6e 28 7a 52 69 67 68 74 2c 20 30 29 3b 0a  ean(zRight, 0);.
40f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
4100: 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 62 3e 3d 30  d2->n==0 && b>=0
4110: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
4120: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
4130: 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69  ; ii<db->nDb; ii
4140: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
4150: 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
4160: 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b 69 69  elete(db->aDb[ii
4170: 5d 2e 70 42 74 2c 20 62 29 3b 0a 20 20 20 20 20  ].pBt, b);.     
4180: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 20 3d   }.    }.    b =
4190: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
41a0: 75 72 65 44 65 6c 65 74 65 28 70 42 74 2c 20 62  ureDelete(pBt, b
41b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 53 69 6e  );.    returnSin
41c0: 67 6c 65 49 6e 74 28 70 50 61 72 73 65 2c 20 22  gleInt(pParse, "
41d0: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 22 2c 20  secure_delete", 
41e0: 62 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f  b);.  }else..  /
41f0: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b  *.  **  PRAGMA [
4200: 64 61 74 61 62 61 73 65 2e 5d 6d 61 78 5f 70 61  database.]max_pa
4210: 67 65 5f 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 50  ge_count.  **  P
4220: 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
4230: 5d 6d 61 78 5f 70 61 67 65 5f 63 6f 75 6e 74 3d  ]max_page_count=
4240: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
4250: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
4260: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ts the current s
4270: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
4280: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62   ** maximum numb
4290: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
42a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
42b0: 2e 20 20 54 68 65 20 0a 20 20 2a 2a 20 73 65 63  .  The .  ** sec
42c0: 6f 6e 64 20 66 6f 72 6d 20 61 74 74 65 6d 70 74  ond form attempt
42d0: 73 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73  s to change this
42e0: 20 73 65 74 74 69 6e 67 2e 20 20 42 6f 74 68 0a   setting.  Both.
42f0: 20 20 2a 2a 20 66 6f 72 6d 73 20 72 65 74 75 72    ** forms retur
4300: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  n the current se
4310: 74 74 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tting..  **.  **
4320: 20 54 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   The absolute va
4330: 6c 75 65 20 6f 66 20 4e 20 69 73 20 75 73 65 64  lue of N is used
4340: 2e 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63  .  This is undoc
4350: 75 6d 65 6e 74 65 64 20 61 6e 64 20 6d 69 67 68  umented and migh
4360: 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 2e 20 20  t.  ** change.  
4370: 54 68 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65  The only purpose
4380: 20 69 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61   is to provide a
4390: 6e 20 65 61 73 79 20 77 61 79 20 74 6f 20 74 65  n easy way to te
43a0: 73 74 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  st.  ** the sqli
43b0: 74 65 33 41 62 73 49 6e 74 33 32 28 29 20 66 75  te3AbsInt32() fu
43c0: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  nction..  **.  *
43d0: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
43e0: 61 73 65 2e 5d 70 61 67 65 5f 63 6f 75 6e 74 0a  ase.]page_count.
43f0: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
4400: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
4410: 61 67 65 73 20 69 6e 20 74 68 65 20 73 70 65 63  ages in the spec
4420: 69 66 69 65 64 20 64 61 74 61 62 61 73 65 2e 0a  ified database..
4430: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
4440: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
4450: 22 70 61 67 65 5f 63 6f 75 6e 74 22 29 3d 3d 30  "page_count")==0
4460: 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  .   || sqlite3St
4470: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 6d 61 78  rICmp(zLeft,"max
4480: 5f 70 61 67 65 5f 63 6f 75 6e 74 22 29 3d 3d 30  _page_count")==0
4490: 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 52  .  ){.    int iR
44a0: 65 67 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  eg;.    if( sqli
44b0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
44c0: 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61  arse) ) goto pra
44d0: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 73 71 6c  gma_out;.    sql
44e0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
44f0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
4500: 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 2b 2b  );.    iReg = ++
4510: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
4520: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 6f 6c    if( sqlite3Tol
4530: 6f 77 65 72 28 7a 4c 65 66 74 5b 30 5d 29 3d 3d  ower(zLeft[0])==
4540: 27 70 27 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  'p' ){.      sql
4550: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4560: 2c 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 2c 20  , OP_Pagecount, 
4570: 69 44 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  iDb, iReg);.    
4580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
4590: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
45a0: 2c 20 4f 50 5f 4d 61 78 50 67 63 6e 74 2c 20 69  , OP_MaxPgcnt, i
45b0: 44 62 2c 20 69 52 65 67 2c 20 0a 20 20 20 20 20  Db, iReg, .     
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74     sqlite3AbsInt
45e0: 33 32 28 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  32(sqlite3Atoi(z
45f0: 52 69 67 68 74 29 29 29 3b 0a 20 20 20 20 7d 0a  Right)));.    }.
4600: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4610: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
4620: 6c 74 52 6f 77 2c 20 69 52 65 67 2c 20 31 29 3b  ltRow, iReg, 1);
4630: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4640: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29  SetNumCols(v, 1)
4650: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4660: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30  eSetColName(v, 0
4670: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
4680: 7a 4c 65 66 74 2c 20 53 51 4c 49 54 45 5f 54 52  zLeft, SQLITE_TR
4690: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73  ANSIENT);.  }els
46a0: 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  e..  /*.  **  PR
46b0: 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
46c0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 0a 20 20 2a  locking_mode.  *
46d0: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
46e0: 61 73 65 2e 5d 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ase.]locking_mod
46f0: 65 20 3d 20 28 6e 6f 72 6d 61 6c 7c 65 78 63 6c  e = (normal|excl
4700: 75 73 69 76 65 29 0a 20 20 2a 2f 0a 20 20 69 66  usive).  */.  if
4710: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
4720: 28 7a 4c 65 66 74 2c 22 6c 6f 63 6b 69 6e 67 5f  (zLeft,"locking_
4730: 6d 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  mode")==0 ){.   
4740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
4750: 74 20 3d 20 22 6e 6f 72 6d 61 6c 22 3b 0a 20 20  t = "normal";.  
4760: 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d 20 67 65    int eMode = ge
4770: 74 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 7a 52 69  tLockingMode(zRi
4780: 67 68 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ght);..    if( p
4790: 49 64 32 2d 3e 6e 3d 3d 30 20 26 26 20 65 4d 6f  Id2->n==0 && eMo
47a0: 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
47b0: 47 4d 4f 44 45 5f 51 55 45 52 59 20 29 7b 0a 20  GMODE_QUERY ){. 
47c0: 20 20 20 20 20 2f 2a 20 53 69 6d 70 6c 65 20 22       /* Simple "
47d0: 50 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d  PRAGMA locking_m
47e0: 6f 64 65 3b 22 20 73 74 61 74 65 6d 65 6e 74 2e  ode;" statement.
47f0: 20 54 68 69 73 20 69 73 20 61 20 71 75 65 72 79   This is a query
4800: 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
4810: 65 20 63 75 72 72 65 6e 74 20 64 65 66 61 75 6c  e current defaul
4820: 74 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 28  t locking mode (
4830: 77 68 69 63 68 20 6d 61 79 20 62 65 20 64 69 66  which may be dif
4840: 66 65 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20  ferent to.      
4850: 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
4860: 6f 64 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ode of the main 
4870: 64 61 74 61 62 61 73 65 29 2e 0a 20 20 20 20 20  database)..     
4880: 20 2a 2f 0a 20 20 20 20 20 20 65 4d 6f 64 65 20   */.      eMode 
4890: 3d 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f  = db->dfltLockMo
48a0: 64 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  de;.    }else{. 
48b0: 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
48c0: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  er;.      if( pI
48d0: 64 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  d2->n==0 ){.    
48e0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 69      /* This indi
48f0: 63 61 74 65 73 20 74 68 61 74 20 6e 6f 20 64 61  cates that no da
4900: 74 61 62 61 73 65 20 6e 61 6d 65 20 77 61 73 20  tabase name was 
4910: 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72  specified as par
4920: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  t.        ** of 
4930: 74 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  the PRAGMA comma
4940: 6e 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  nd. In this case
4950: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
4960: 65 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20  e must be.      
4970: 20 20 2a 2a 20 73 65 74 20 6f 6e 20 61 6c 6c 20    ** set on all 
4980: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
4990: 65 73 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74  es, as well as t
49a0: 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e  he main db file.
49b0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
49c0: 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65      ** Also, the
49d0: 20 73 71 6c 69 74 65 33 2e 64 66 6c 74 4c 6f 63   sqlite3.dfltLoc
49e0: 6b 4d 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  kMode variable i
49f0: 73 20 73 65 74 20 73 6f 20 74 68 61 74 0a 20 20  s set so that.  
4a00: 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 62        ** any sub
4a10: 73 65 71 75 65 6e 74 6c 79 20 61 74 74 61 63 68  sequently attach
4a20: 65 64 20 64 61 74 61 62 61 73 65 73 20 61 6c 73  ed databases als
4a30: 6f 20 75 73 65 20 74 68 65 20 73 70 65 63 69 66  o use the specif
4a40: 69 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ied.        ** l
4a50: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 20  ocking mode..   
4a60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
4a70: 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
4a80: 61 73 73 65 72 74 28 70 44 62 3d 3d 26 64 62 2d  assert(pDb==&db-
4a90: 3e 61 44 62 5b 30 5d 29 3b 0a 20 20 20 20 20 20  >aDb[0]);.      
4aa0: 20 20 66 6f 72 28 69 69 3d 32 3b 20 69 69 3c 64    for(ii=2; ii<d
4ab0: 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20  b->nDb; ii++){. 
4ac0: 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 20           pPager 
4ad0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
4ae0: 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  ger(db->aDb[ii].
4af0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pBt);.          
4b00: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
4b10: 69 6e 67 4d 6f 64 65 28 70 50 61 67 65 72 2c 20  ingMode(pPager, 
4b20: 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
4b30: 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 64 66  }.        db->df
4b40: 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 28 75 38  ltLockMode = (u8
4b50: 29 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  )eMode;.      }.
4b60: 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
4b70: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4b80: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
4b90: 20 20 65 4d 6f 64 65 20 3d 20 73 71 6c 69 74 65    eMode = sqlite
4ba0: 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
4bb0: 65 28 70 50 61 67 65 72 2c 20 65 4d 6f 64 65 29  e(pPager, eMode)
4bc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
4bd0: 65 72 74 28 65 4d 6f 64 65 3d 3d 50 41 47 45 52  ert(eMode==PAGER
4be0: 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
4bf0: 4d 41 4c 7c 7c 65 4d 6f 64 65 3d 3d 50 41 47 45  MAL||eMode==PAGE
4c00: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
4c10: 43 4c 55 53 49 56 45 29 3b 0a 20 20 20 20 69 66  CLUSIVE);.    if
4c20: 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
4c30: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
4c40: 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 7a 52  SIVE ){.      zR
4c50: 65 74 20 3d 20 22 65 78 63 6c 75 73 69 76 65 22  et = "exclusive"
4c60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4c70: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
4c80: 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  s(v, 1);.    sql
4c90: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
4ca0: 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45  me(v, 0, COLNAME
4cb0: 5f 4e 41 4d 45 2c 20 22 6c 6f 63 6b 69 6e 67 5f  _NAME, "locking_
4cc0: 6d 6f 64 65 22 2c 20 53 51 4c 49 54 45 5f 53 54  mode", SQLITE_ST
4cd0: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
4ce0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
4cf0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 31  OP_String8, 0, 1
4d00: 2c 20 30 2c 20 7a 52 65 74 2c 20 30 29 3b 0a 20  , 0, zRet, 0);. 
4d10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4d20: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
4d30: 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  tRow, 1, 1);.  }
4d40: 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  else..  /*.  ** 
4d50: 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
4d60: 65 2e 5d 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a  e.]journal_mode.
4d70: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61    **  PRAGMA [da
4d80: 74 61 62 61 73 65 2e 5d 6a 6f 75 72 6e 61 6c 5f  tabase.]journal_
4d90: 6d 6f 64 65 20 3d 0a 20 20 2a 2a 20 20 20 20 20  mode =.  **     
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 20 28 64 65 6c 65 74 65 7c 70 65 72 73 69 73 74   (delete|persist
4dc0: 7c 6f 66 66 7c 74 72 75 6e 63 61 74 65 7c 6d 65  |off|truncate|me
4dd0: 6d 6f 72 79 7c 77 61 6c 7c 6f 66 66 29 0a 20 20  mory|wal|off).  
4de0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
4df0: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 6a  StrICmp(zLeft,"j
4e00: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22 29 3d 3d 30  ournal_mode")==0
4e10: 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 4d 6f 64   ){.    int eMod
4e20: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  e;        /* One
4e30: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
4e40: 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 73 79  URNALMODE_XXX sy
4e50: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  mbols */.    int
4e60: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f   ii;           /
4e70: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
4e80: 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20  /..    /* Force 
4e90: 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65  the schema to be
4ea0: 20 6c 6f 61 64 65 64 20 6f 6e 20 61 6c 6c 20 64   loaded on all d
4eb0: 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20  atabases.  This 
4ec0: 63 61 75 73 65 73 20 61 6c 6c 0a 20 20 20 20 2a  causes all.    *
4ed0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  * database files
4ee0: 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 61 6e   to be opened an
4ef0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  d the journal_mo
4f00: 64 65 73 20 73 65 74 2e 20 20 54 68 69 73 20 69  des set.  This i
4f10: 73 0a 20 20 20 20 2a 2a 20 6e 65 63 65 73 73 61  s.    ** necessa
4f20: 72 79 20 62 65 63 61 75 73 65 20 73 75 62 73 65  ry because subse
4f30: 71 75 65 6e 74 20 70 72 6f 63 65 73 73 69 6e 67  quent processing
4f40: 20 6d 75 73 74 20 6b 6e 6f 77 20 69 66 20 74 68   must know if th
4f50: 65 20 64 61 74 61 62 61 73 65 73 0a 20 20 20 20  e databases.    
4f60: 2a 2a 20 61 72 65 20 69 6e 20 57 41 4c 20 6d 6f  ** are in WAL mo
4f70: 64 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  de. */.    if( s
4f80: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
4f90: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
4fa0: 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75    goto pragma_ou
4fb0: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  t;.    }..    sq
4fc0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
4fd0: 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73  ols(v, 1);.    s
4fe0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
4ff0: 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41  Name(v, 0, COLNA
5000: 4d 45 5f 4e 41 4d 45 2c 20 22 6a 6f 75 72 6e 61  ME_NAME, "journa
5010: 6c 5f 6d 6f 64 65 22 2c 20 53 51 4c 49 54 45 5f  l_mode", SQLITE_
5020: 53 54 41 54 49 43 29 3b 0a 0a 20 20 20 20 69 66  STATIC);..    if
5030: 28 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( zRight==0 ){. 
5040: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
5050: 20 69 73 20 6e 6f 20 22 3d 4d 4f 44 45 22 20 70   is no "=MODE" p
5060: 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67 6d  art of the pragm
5070: 61 2c 20 64 6f 20 61 20 71 75 65 72 79 20 66 6f  a, do a query fo
5080: 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  r the.      ** c
5090: 75 72 72 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 20  urrent mode */. 
50a0: 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 50 41 47       eMode = PAG
50b0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
50c0: 55 45 52 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  UERY;.    }else{
50d0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
50e0: 72 20 2a 7a 4d 6f 64 65 3b 0a 20 20 20 20 20 20  r *zMode;.      
50f0: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
5100: 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 3b  trlen30(zRight);
5110: 0a 20 20 20 20 20 20 66 6f 72 28 65 4d 6f 64 65  .      for(eMode
5120: 3d 30 3b 20 28 7a 4d 6f 64 65 20 3d 20 73 71 6c  =0; (zMode = sql
5130: 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e  ite3JournalModen
5140: 61 6d 65 28 65 4d 6f 64 65 29 29 21 3d 30 3b 20  ame(eMode))!=0; 
5150: 65 4d 6f 64 65 2b 2b 29 7b 0a 20 20 20 20 20 20  eMode++){.      
5160: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5170: 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 7a 4d  NICmp(zRight, zM
5180: 6f 64 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65  ode, n)==0 ) bre
5190: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
51a0: 20 20 69 66 28 20 21 7a 4d 6f 64 65 20 29 7b 0a    if( !zMode ){.
51b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
51c0: 65 20 22 3d 4d 4f 44 45 22 20 70 61 72 74 20 64  e "=MODE" part d
51d0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
51e0: 79 20 6b 6e 6f 77 6e 20 6a 6f 75 72 6e 61 6c 20  y known journal 
51f0: 6d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  mode,.        **
5200: 20 74 68 65 6e 20 64 6f 20 61 20 71 75 65 72 79   then do a query
5210: 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   */.        eMod
5220: 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
5230: 4c 4d 4f 44 45 5f 51 55 45 52 59 3b 0a 20 20 20  LMODE_QUERY;.   
5240: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5250: 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  f( eMode==PAGER_
5260: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
5270: 59 20 26 26 20 70 49 64 32 2d 3e 6e 3d 3d 30 20  Y && pId2->n==0 
5280: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ){.      /* Conv
5290: 65 72 74 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  ert "PRAGMA jour
52a0: 6e 61 6c 5f 6d 6f 64 65 22 20 69 6e 74 6f 20 22  nal_mode" into "
52b0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
52c0: 6e 61 6c 5f 6d 6f 64 65 22 20 2a 2f 0a 20 20 20  nal_mode" */.   
52d0: 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 20 20     iDb = 0;.    
52e0: 20 20 70 49 64 32 2d 3e 6e 20 3d 20 31 3b 0a 20    pId2->n = 1;. 
52f0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
5300: 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 69 3e 3d 30  db->nDb-1; ii>=0
5310: 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  ; ii--){.      i
5320: 66 28 20 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70  f( db->aDb[ii].p
5330: 42 74 20 26 26 20 28 69 69 3d 3d 69 44 62 20 7c  Bt && (ii==iDb |
5340: 7c 20 70 49 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b  | pId2->n==0) ){
5350: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5360: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
5370: 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71   ii);.        sq
5380: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5390: 76 2c 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  v, OP_JournalMod
53a0: 65 2c 20 69 69 2c 20 31 2c 20 65 4d 6f 64 65 29  e, ii, 1, eMode)
53b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
53c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
53d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
53e0: 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20  ltRow, 1, 1);.  
53f0: 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }else..  /*.  **
5400: 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
5410: 73 65 2e 5d 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  se.]journal_size
5420: 5f 6c 69 6d 69 74 0a 20 20 2a 2a 20 20 50 52 41  _limit.  **  PRA
5430: 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6a  GMA [database.]j
5440: 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69  ournal_size_limi
5450: 74 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65  t=N.  **.  ** Ge
5460: 74 20 6f 72 20 73 65 74 20 74 68 65 20 73 69 7a  t or set the siz
5470: 65 20 6c 69 6d 69 74 20 6f 6e 20 72 6f 6c 6c 62  e limit on rollb
5480: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
5490: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  s..  */.  if( sq
54a0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65  lite3StrICmp(zLe
54b0: 66 74 2c 22 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  ft,"journal_size
54c0: 5f 6c 69 6d 69 74 22 29 3d 3d 30 20 29 7b 0a 20  _limit")==0 ){. 
54d0: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
54e0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
54f0: 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  ager(pDb->pBt);.
5500: 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d      i64 iLimit =
5510: 20 2d 32 3b 0a 20 20 20 20 69 66 28 20 7a 52 69   -2;.    if( zRi
5520: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
5530: 69 74 65 33 41 74 6f 69 36 34 28 7a 52 69 67 68  ite3Atoi64(zRigh
5540: 74 2c 20 26 69 4c 69 6d 69 74 2c 20 31 30 30 30  t, &iLimit, 1000
5550: 30 30 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  000, SQLITE_UTF8
5560: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4c 69  );.      if( iLi
5570: 6d 69 74 3c 2d 31 20 29 20 69 4c 69 6d 69 74 20  mit<-1 ) iLimit 
5580: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
5590: 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  iLimit = sqlite3
55a0: 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65  PagerJournalSize
55b0: 4c 69 6d 69 74 28 70 50 61 67 65 72 2c 20 69 4c  Limit(pPager, iL
55c0: 69 6d 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72  imit);.    retur
55d0: 6e 53 69 6e 67 6c 65 49 6e 74 28 70 50 61 72 73  nSingleInt(pPars
55e0: 65 2c 20 22 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65  e, "journal_size
55f0: 5f 6c 69 6d 69 74 22 2c 20 69 4c 69 6d 69 74 29  _limit", iLimit)
5600: 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 65 6e 64 69  ;.  }else..#endi
5610: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5620: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a  _PAGER_PRAGMAS *
5630: 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  /..  /*.  **  PR
5640: 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
5650: 61 75 74 6f 5f 76 61 63 75 75 6d 0a 20 20 2a 2a  auto_vacuum.  **
5660: 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
5670: 73 65 2e 5d 61 75 74 6f 5f 76 61 63 75 75 6d 3d  se.]auto_vacuum=
5680: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 47 65 74 20  N.  **.  ** Get 
5690: 6f 72 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  or set the value
56a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
56b0: 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
56c0: 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a 2a 20 54  arameter..  ** T
56d0: 68 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20  he value is one 
56e0: 6f 66 3a 20 20 30 20 4e 4f 4e 45 20 31 20 46 55  of:  0 NONE 1 FU
56f0: 4c 4c 20 32 20 49 4e 43 52 45 4d 45 4e 54 41 4c  LL 2 INCREMENTAL
5700: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
5710: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
5720: 43 55 55 4d 0a 20 20 69 66 28 20 73 71 6c 69 74  CUUM.  if( sqlit
5730: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
5740: 22 61 75 74 6f 5f 76 61 63 75 75 6d 22 29 3d 3d  "auto_vacuum")==
5750: 30 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  0 ){.    Btree *
5760: 70 42 74 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a  pBt = pDb->pBt;.
5770: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 21      assert( pBt!
5780: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  =0 );.    if( sq
5790: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
57a0: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
57b0: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
57c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
57d0: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
57e0: 20 69 6e 74 20 61 75 74 6f 5f 76 61 63 75 75 6d   int auto_vacuum
57f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
5800: 59 53 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  YS(pBt) ){.     
5810: 20 20 20 20 61 75 74 6f 5f 76 61 63 75 75 6d 20      auto_vacuum 
5820: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
5830: 74 41 75 74 6f 56 61 63 75 75 6d 28 70 42 74 29  tAutoVacuum(pBt)
5840: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5850: 20 20 20 20 20 20 20 20 61 75 74 6f 5f 76 61 63          auto_vac
5860: 75 75 6d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  uum = SQLITE_DEF
5870: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3b  AULT_AUTOVACUUM;
5880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
5890: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 70  eturnSingleInt(p
58a0: 50 61 72 73 65 2c 20 22 61 75 74 6f 5f 76 61 63  Parse, "auto_vac
58b0: 75 75 6d 22 2c 20 61 75 74 6f 5f 76 61 63 75 75  uum", auto_vacuu
58c0: 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
58d0: 20 20 20 20 20 69 6e 74 20 65 41 75 74 6f 20 3d       int eAuto =
58e0: 20 67 65 74 41 75 74 6f 56 61 63 75 75 6d 28 7a   getAutoVacuum(z
58f0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
5900: 73 65 72 74 28 20 65 41 75 74 6f 3e 3d 30 20 26  sert( eAuto>=0 &
5910: 26 20 65 41 75 74 6f 3c 3d 32 20 29 3b 0a 20 20  & eAuto<=2 );.  
5920: 20 20 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f      db->nextAuto
5930: 76 61 63 20 3d 20 28 75 38 29 65 41 75 74 6f 3b  vac = (u8)eAuto;
5940: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
5950: 53 28 65 41 75 74 6f 3e 3d 30 29 20 29 7b 0a 20  S(eAuto>=0) ){. 
5960: 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 53         /* Call S
5970: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 29 20 74  etAutoVacuum() t
5980: 6f 20 73 65 74 20 69 6e 69 74 69 61 6c 69 7a 65  o set initialize
5990: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 75   the internal au
59a0: 74 6f 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  to and.        *
59b0: 2a 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 66 6c  * incr-vacuum fl
59c0: 61 67 73 2e 20 54 68 69 73 20 69 73 20 72 65 71  ags. This is req
59d0: 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68  uired in case th
59e0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  is connection.  
59f0: 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 73        ** creates
5a00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5a10: 6c 65 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74  le. It is import
5a20: 61 6e 74 20 74 68 61 74 20 69 74 20 69 73 20 63  ant that it is c
5a30: 72 65 61 74 65 64 0a 20 20 20 20 20 20 20 20 2a  reated.        *
5a40: 2a 20 61 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  * as an auto-vac
5a50: 75 75 6d 20 63 61 70 61 62 6c 65 20 64 62 2e 0a  uum capable db..
5a60: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
5a70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5a80: 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
5a90: 6d 28 70 42 74 2c 20 65 41 75 74 6f 29 3b 0a 20  m(pBt, eAuto);. 
5aa0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
5ab0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 41 75  QLITE_OK && (eAu
5ac0: 74 6f 3d 3d 31 20 7c 7c 20 65 41 75 74 6f 3d 3d  to==1 || eAuto==
5ad0: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
5ae0: 2f 2a 20 57 68 65 6e 20 73 65 74 74 69 6e 67 20  /* When setting 
5af0: 74 68 65 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  the auto_vacuum 
5b00: 6d 6f 64 65 20 74 6f 20 65 69 74 68 65 72 20 22  mode to either "
5b10: 66 75 6c 6c 22 20 6f 72 20 0a 20 20 20 20 20 20  full" or .      
5b20: 20 20 20 20 2a 2a 20 22 69 6e 63 72 65 6d 65 6e      ** "incremen
5b30: 74 61 6c 22 2c 20 77 72 69 74 65 20 74 68 65 20  tal", write the 
5b40: 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 36 5d  value of meta[6]
5b50: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5b60: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
5b70: 6c 65 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  le. Before writi
5b80: 6e 67 20 74 6f 20 6d 65 74 61 5b 36 5d 2c 20 63  ng to meta[6], c
5b90: 68 65 63 6b 20 74 68 61 74 20 6d 65 74 61 5b 33  heck that meta[3
5ba0: 5d 20 69 6e 64 69 63 61 74 65 73 0a 20 20 20 20  ] indicates.    
5bb0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
5bc0: 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  is really is an 
5bd0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
5be0: 62 6c 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ble database..  
5bf0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
5c00: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
5c10: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 73 65 74  t VdbeOpList set
5c20: 4d 65 74 61 36 5b 5d 20 3d 20 7b 0a 20 20 20 20  Meta6[] = {.    
5c30: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 54 72 61          { OP_Tra
5c40: 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20 30 2c 20  nsaction,    0, 
5c50: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 20 20          1,      
5c60: 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20             0},  
5c70: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
5c80: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
5c90: 6f 6f 6b 69 65 2c 20 20 20 20 20 30 2c 20 20 20  ookie,     0,   
5ca0: 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 20 20        1,        
5cb0: 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52   BTREE_LARGEST_R
5cc0: 4f 4f 54 5f 50 41 47 45 7d 2c 0a 20 20 20 20 20  OOT_PAGE},.     
5cd0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c 20         { OP_If, 
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20              1,  
5cf0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
5d00: 20 20 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20            0},   
5d10: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 20   /* 2 */.       
5d20: 20 20 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20       { OP_Halt, 
5d30: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
5d40: 5f 4f 4b 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 20  _OK, OE_Abort,  
5d50: 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
5d60: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  * 3 */.         
5d70: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
5d80: 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20          0,      
5d90: 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20     1,           
5da0: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
5db0: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
5dc0: 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c   { OP_SetCookie,
5dd0: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
5de0: 20 42 54 52 45 45 5f 49 4e 43 52 5f 56 41 43 55   BTREE_INCR_VACU
5df0: 55 4d 2c 20 31 7d 2c 20 20 20 20 2f 2a 20 35 20  UM, 1},    /* 5 
5e00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a  */.          };.
5e10: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41            int iA
5e20: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ddr;.          i
5e30: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
5e40: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
5e50: 72 72 61 79 53 69 7a 65 28 73 65 74 4d 65 74 61  rraySize(setMeta
5e60: 36 29 2c 20 73 65 74 4d 65 74 61 36 29 3b 0a 20  6), setMeta6);. 
5e70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5e80: 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
5e90: 69 41 64 64 72 2c 20 69 44 62 29 3b 0a 20 20 20  iAddr, iDb);.   
5ea0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5eb0: 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 41  beChangeP1(v, iA
5ec0: 64 64 72 2b 31 2c 20 69 44 62 29 3b 0a 20 20 20  ddr+1, iDb);.   
5ed0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5ee0: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 69 41  beChangeP2(v, iA
5ef0: 64 64 72 2b 32 2c 20 69 41 64 64 72 2b 34 29 3b  ddr+2, iAddr+4);
5f00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
5f10: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
5f20: 2c 20 69 41 64 64 72 2b 34 2c 20 65 41 75 74 6f  , iAddr+4, eAuto
5f30: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  -1);.          s
5f40: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5f50: 50 31 28 76 2c 20 69 41 64 64 72 2b 35 2c 20 69  P1(v, iAddr+5, i
5f60: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Db);.          s
5f70: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
5f80: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
5f90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5fa0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
5fb0: 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  dif..  /*.  **  
5fc0: 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
5fd0: 2e 5d 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61  .]incremental_va
5fe0: 63 75 75 6d 28 4e 29 0a 20 20 2a 2a 0a 20 20 2a  cuum(N).  **.  *
5ff0: 2a 20 44 6f 20 4e 20 73 74 65 70 73 20 6f 66 20  * Do N steps of 
6000: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
6010: 75 6d 69 6e 67 20 6f 6e 20 61 20 64 61 74 61 62  uming on a datab
6020: 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ase..  */.#ifnde
6030: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
6040: 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 73  TOVACUUM.  if( s
6050: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c  qlite3StrICmp(zL
6060: 65 66 74 2c 22 69 6e 63 72 65 6d 65 6e 74 61 6c  eft,"incremental
6070: 5f 76 61 63 75 75 6d 22 29 3d 3d 30 20 29 7b 0a  _vacuum")==0 ){.
6080: 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c 20      int iLimit, 
6090: 61 64 64 72 3b 0a 20 20 20 20 69 66 28 20 73 71  addr;.    if( sq
60a0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
60b0: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
60c0: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
60d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
60e0: 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 21 73 71  zRight==0 || !sq
60f0: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 52  lite3GetInt32(zR
6100: 69 67 68 74 2c 20 26 69 4c 69 6d 69 74 29 20 7c  ight, &iLimit) |
6110: 7c 20 69 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a 20  | iLimit<=0 ){. 
6120: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 30 78       iLimit = 0x
6130: 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 7d 0a  7fffffff;.    }.
6140: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
6150: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
6160: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
6170: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6180: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6190: 67 65 72 2c 20 69 4c 69 6d 69 74 2c 20 31 29 3b  ger, iLimit, 1);
61a0: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
61b0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
61c0: 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 2c 20   OP_IncrVacuum, 
61d0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
61e0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
61f0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 29 3b  P_ResultRow, 1);
6200: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6210: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
6220: 49 6d 6d 2c 20 31 2c 20 2d 31 29 3b 0a 20 20 20  Imm, 1, -1);.   
6230: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6240: 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
6250: 31 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71  1, addr);.    sq
6260: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
6270: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 65  e(v, addr);.  }e
6280: 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  lse.#endif..#ifn
6290: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
62a0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20  PAGER_PRAGMAS.  
62b0: 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  /*.  **  PRAGMA 
62c0: 5b 64 61 74 61 62 61 73 65 2e 5d 63 61 63 68 65  [database.]cache
62d0: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
62e0: 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 63 61  MA [database.]ca
62f0: 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a  che_size=N.  **.
6300: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
6310: 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20  orm reports the 
6320: 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65  current local se
6330: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
6340: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
6350: 7a 65 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 66  ze. The second f
6360: 6f 72 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63  orm sets the loc
6370: 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  al.  ** page cac
6380: 68 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20  he size value.  
6390: 49 66 20 4e 20 69 73 20 70 6f 73 69 74 69 76 65  If N is positive
63a0: 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 74 68   then that is th
63b0: 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  e.  ** number of
63c0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
63d0: 63 68 65 2e 20 20 49 66 20 4e 20 69 73 20 6e 65  che.  If N is ne
63e0: 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65  gative, then the
63f0: 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
6400: 70 61 67 65 73 20 69 73 20 61 64 6a 75 73 74 65  pages is adjuste
6410: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  d so that the ca
6420: 63 68 65 20 75 73 65 73 20 2d 4e 20 6b 69 62 69  che uses -N kibi
6430: 62 79 74 65 73 0a 20 20 2a 2a 20 6f 66 20 6d 65  bytes.  ** of me
6440: 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mory..  */.  if(
6450: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6460: 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f 73 69 7a  zLeft,"cache_siz
6470: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  e")==0 ){.    if
6480: 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
6490: 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
64a0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
64b0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
64c0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
64d0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
64e0: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
64f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6500: 53 69 6e 67 6c 65 49 6e 74 28 70 50 61 72 73 65  SingleInt(pParse
6510: 2c 20 22 63 61 63 68 65 5f 73 69 7a 65 22 2c 20  , "cache_size", 
6520: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 63 61  pDb->pSchema->ca
6530: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
6540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
6550: 73 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 41 74  size = sqlite3At
6560: 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
6570: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
6580: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
6590: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
65a0: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
65b0: 65 28 70 44 62 2d 3e 70 42 74 2c 20 70 44 62 2d  e(pDb->pBt, pDb-
65c0: 3e 70 53 63 68 65 6d 61 2d 3e 63 61 63 68 65 5f  >pSchema->cache_
65d0: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  size);.    }.  }
65e0: 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  else..  /*.  ** 
65f0: 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
6600: 65 2e 5d 6d 6d 61 70 5f 73 69 7a 65 0a 20 20 2a  e.]mmap_size.  *
6610: 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
6620: 61 73 65 2e 5d 6d 6d 61 70 5f 73 69 7a 65 3d 4e  ase.]mmap_size=N
6630: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  **.  ** Used 
6640: 74 6f 20 73 65 74 20 6f 72 20 71 75 65 72 79 20  to set or query 
6650: 74 68 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  the mapping size
6660: 20 6c 69 6d 69 74 2e 20 54 68 65 20 6d 61 70 70   limit. The mapp
6670: 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69 74 20 69  ing size limit i
6680: 73 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 6c  s.  ** used to l
6690: 69 6d 69 74 20 74 68 65 20 61 67 67 72 65 67 61  imit the aggrega
66a0: 74 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 6d  te size of all m
66b0: 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65 67  emory mapped reg
66c0: 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ions of the.  **
66d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
66e0: 49 66 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  If this paramete
66f0: 72 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  r is set to zero
6700: 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
6710: 70 70 69 6e 67 0a 20 20 2a 2a 20 69 73 20 6e 6f  pping.  ** is no
6720: 74 20 75 73 65 64 20 61 74 20 61 6c 6c 2e 20 49  t used at all. I
6730: 66 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  f it is set to a
6740: 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
6750: 20 74 68 65 6e 20 69 74 20 69 73 0a 20 20 2a 2a   then it is.  **
6760: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
6770: 61 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 69  a maximum size i
6780: 6e 20 70 61 67 65 73 2e 20 49 66 20 73 65 74 20  n pages. If set 
6790: 74 6f 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  to less than zer
67a0: 6f 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  o, then.  ** the
67b0: 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20   absolute value 
67c0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
67d0: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 69  s a size limit i
67e0: 6e 20 4b 42 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  n KB..  **.  ** 
67f0: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
6800: 65 20 69 73 20 7a 65 72 6f 20 28 64 6f 20 6e 6f  e is zero (do no
6810: 74 20 75 73 65 20 6d 65 6d 6f 72 79 20 6d 61 70  t use memory map
6820: 70 65 64 20 49 4f 29 2e 0a 20 20 2a 2f 0a 20 20  ped IO)..  */.  
6830: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
6840: 6d 70 28 7a 4c 65 66 74 2c 22 6d 6d 61 70 5f 73  mp(zLeft,"mmap_s
6850: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
6860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
6870: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
6880: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
6890: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
68a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e  .      returnSin
68b0: 67 6c 65 49 6e 74 28 70 50 61 72 73 65 2c 20 22  gleInt(pParse, "
68c0: 6d 6d 61 70 5f 73 69 7a 65 22 2c 20 70 44 62 2d  mmap_size", pDb-
68d0: 3e 70 53 63 68 65 6d 61 2d 3e 6d 6d 61 70 5f 73  >pSchema->mmap_s
68e0: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
68f0: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
6900: 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  = sqlite3Atoi(zR
6910: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 44 62  ight);.      pDb
6920: 2d 3e 70 53 63 68 65 6d 61 2d 3e 6d 6d 61 70 5f  ->pSchema->mmap_
6930: 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20  size = size;.   
6940: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
6950: 65 74 4d 6d 61 70 53 69 7a 65 28 70 44 62 2d 3e  etMmapSize(pDb->
6960: 70 42 74 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  pBt, pDb->pSchem
6970: 61 2d 3e 6d 6d 61 70 5f 73 69 7a 65 29 3b 0a 20  a->mmap_size);. 
6980: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
6990: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
69a0: 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a   temp_store.  **
69b0: 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73     PRAGMA temp_s
69c0: 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22  tore = "default"
69d0: 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22  |"memory"|"file"
69e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
69f0: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63  n or set the loc
6a00: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
6a10: 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e  temp_store flag.
6a20: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
6a30: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
6a40: 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68  does not make ch
6a50: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73  anges to the dis
6a60: 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  k file and the d
6a70: 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75  efault.  ** valu
6a80: 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72  e will be restor
6a90: 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
6aa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
6ab0: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20   opened..  **.  
6ac0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
6ad0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
6ae0: 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70  the library comp
6af0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
6b00: 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64   to.  ** overrid
6b10: 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20  e this setting. 
6b20: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
6b30: 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  3StrICmp(zLeft, 
6b40: 22 74 65 6d 70 5f 73 74 6f 72 65 22 29 3d 3d 30  "temp_store")==0
6b50: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69   ){.    if( !zRi
6b60: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ght ){.      ret
6b70: 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 70 50 61  urnSingleInt(pPa
6b80: 72 73 65 2c 20 22 74 65 6d 70 5f 73 74 6f 72 65  rse, "temp_store
6b90: 22 2c 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  ", db->temp_stor
6ba0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
6bb0: 20 20 20 20 20 63 68 61 6e 67 65 54 65 6d 70 53       changeTempS
6bc0: 74 6f 72 61 67 65 28 70 50 61 72 73 65 2c 20 7a  torage(pParse, z
6bd0: 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Right);.    }.  
6be0: 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }else..  /*.  **
6bf0: 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73     PRAGMA temp_s
6c00: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20  tore_directory. 
6c10: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d   **   PRAGMA tem
6c20: 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
6c30: 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72  y = ""|"director
6c40: 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a  y_name".  **.  *
6c50: 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
6c60: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
6c70: 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74 6f 72  of the temp_stor
6c80: 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67  e_directory flag
6c90: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
6ca0: 20 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20   the value sets 
6cb0: 61 20 73 70 65 63 69 66 69 63 20 64 69 72 65 63  a specific direc
6cc0: 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65 64 20  tory to be used 
6cd0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
6ce0: 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74 69 6e  les..  ** Settin
6cf0: 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74 72 69  g to a null stri
6d00: 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20 74 68  ng reverts to th
6d10: 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70 6f 72  e default tempor
6d20: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 65  ary directory se
6d30: 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20 74 65  arch..  ** If te
6d40: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
6d50: 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  y is changed, th
6d60: 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d  en invalidateTem
6d70: 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a 0a 20  pStorage..  **. 
6d80: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
6d90: 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  3StrICmp(zLeft, 
6da0: 22 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65  "temp_store_dire
6db0: 63 74 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20 20  ctory")==0 ){.  
6dc0: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
6dd0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6de0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
6df0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  y ){.        sql
6e00: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
6e10: 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  ls(v, 1);.      
6e20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
6e30: 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f  ColName(v, 0, CO
6e40: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
6e50: 20 20 20 20 20 20 20 20 20 22 74 65 6d 70 5f 73           "temp_s
6e60: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 2c  tore_directory",
6e70: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
6e80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6e90: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
6ea0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 31 2c 20  _String8, 0, 1, 
6eb0: 30 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  0, sqlite3_temp_
6ec0: 64 69 72 65 63 74 6f 72 79 2c 20 30 29 3b 0a 20  directory, 0);. 
6ed0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6ee0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
6ef0: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31 29 3b  esultRow, 1, 1);
6f00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6f10: 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se{.#ifndef SQLI
6f20: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20  TE_OMIT_WSD.    
6f30: 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30 5d 20    if( zRight[0] 
6f40: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6f50: 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
6f60: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
6f70: 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69 67 68  (db->pVfs, zRigh
6f80: 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  t, SQLITE_ACCESS
6f90: 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72 65 73  _READWRITE, &res
6fa0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
6fb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
6fc0: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
6fd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6fe0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74  Msg(pParse, "not
6ff0: 20 61 20 77 72 69 74 61 62 6c 65 20 64 69 72 65   a writable dire
7000: 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20  ctory");.       
7010: 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f     goto pragma_o
7020: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
7030: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7040: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7050: 45 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  E==0.       || (
7060: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
7070: 45 3d 3d 31 20 26 26 20 64 62 2d 3e 74 65 6d 70  E==1 && db->temp
7080: 5f 73 74 6f 72 65 3c 3d 31 29 0a 20 20 20 20 20  _store<=1).     
7090: 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54 45 4d    || (SQLITE_TEM
70a0: 50 5f 53 54 4f 52 45 3d 3d 32 20 26 26 20 64 62  P_STORE==2 && db
70b0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 31 29  ->temp_store==1)
70c0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
70d0: 20 20 69 6e 76 61 6c 69 64 61 74 65 54 65 6d 70    invalidateTemp
70e0: 53 74 6f 72 61 67 65 28 70 50 61 72 73 65 29 3b  Storage(pParse);
70f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7100: 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c 69  qlite3_free(sqli
7110: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
7120: 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ry);.      if( z
7130: 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20  Right[0] ){.    
7140: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70      sqlite3_temp
7150: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71 6c  _directory = sql
7160: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
7170: 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  ", zRight);.    
7180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7190: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
71a0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20  rectory = 0;.   
71b0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
71c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20 2a  QLITE_OMIT_WSD *
71d0: 2f 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  /.    }.  }else.
71e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
71f0: 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  IN.  /*.  **   P
7200: 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f 72 65  RAGMA data_store
7210: 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20  _directory.  ** 
7220: 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74    PRAGMA data_st
7230: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
7240: 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f 6e 61  ""|"directory_na
7250: 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  me".  **.  ** Re
7260: 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
7270: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
7280: 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  he data_store_di
7290: 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20 20 43  rectory flag.  C
72a0: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
72b0: 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73 70   value sets a sp
72c0: 65 63 69 66 69 63 20 64 69 72 65 63 74 6f 72 79  ecific directory
72d0: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
72e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 74  database files t
72f0: 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20 73 70  hat.  ** were sp
7300: 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72  ecified with a r
7310: 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
7320: 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20 61 20  .  Setting to a 
7330: 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65 76 65  null string reve
7340: 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  rts.  ** to the 
7350: 64 65 66 61 75 6c 74 20 64 61 74 61 62 61 73 65  default database
7360: 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69 63   directory, whic
7370: 68 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  h for database f
7380: 69 6c 65 73 20 73 70 65 63 69 66 69 65 64 20 77  iles specified w
7390: 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c 61 74  ith.  ** a relat
73a0: 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20 70 72  ive path will pr
73b0: 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65 64 20  obably be based 
73c0: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  on the current d
73d0: 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
73e0: 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 20  .  ** process.  
73f0: 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 70  Database file sp
7400: 65 63 69 66 69 65 64 20 77 69 74 68 20 61 6e 20  ecified with an 
7410: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 61 72  absolute path ar
7420: 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64 0a 20  e not impacted. 
7430: 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65 74 74   ** by this sett
7440: 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ing, regardless 
7450: 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a 20 20  of its value..  
7460: 2a 2a 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  **.  */.  if( sq
7470: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65  lite3StrICmp(zLe
7480: 66 74 2c 20 22 64 61 74 61 5f 73 74 6f 72 65 5f  ft, "data_store_
7490: 64 69 72 65 63 74 6f 72 79 22 29 3d 3d 30 20 29  directory")==0 )
74a0: 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68  {.    if( !zRigh
74b0: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  t ){.      if( s
74c0: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
74d0: 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20  ctory ){.       
74e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
74f0: 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20  umCols(v, 1);.  
7500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7510: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30  eSetColName(v, 0
7520: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
7530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 64 61  .            "da
7540: 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  ta_store_directo
7550: 72 79 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ry", SQLITE_STAT
7560: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
7570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
7580: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
7590: 20 31 2c 20 30 2c 20 73 71 6c 69 74 65 33 5f 64   1, 0, sqlite3_d
75a0: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 30  ata_directory, 0
75b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
75c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
75d0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
75e0: 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
75f0: 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20   }else{.#ifndef 
7600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
7610: 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68 74        if( zRight
7620: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  [0] ){.        i
7630: 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20  nt res;.        
7640: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
7650: 63 65 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a  cess(db->pVfs, z
7660: 52 69 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43  Right, SQLITE_AC
7670: 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20  CESS_READWRITE, 
7680: 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
7690: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
76a0: 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20   || res==0 ){.  
76b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
76c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
76d0: 22 6e 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20  "not a writable 
76e0: 64 69 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20  directory");.   
76f0: 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67         goto prag
7700: 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ma_out;.        
7710: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7720: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71 6c  sqlite3_free(sql
7730: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
7740: 6f 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ory);.      if( 
7750: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
7760: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
7770: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 73 71  a_directory = sq
7780: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
7790: 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20  s", zRight);.   
77a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
77b0: 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
77c0: 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20  irectory = 0;.  
77d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
77e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 20  SQLITE_OMIT_WSD 
77f0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  */.    }.  }else
7800: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
7810: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
7820: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
7830: 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64  E).#  if defined
7840: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20  (__APPLE__).#   
7850: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45   define SQLITE_E
7860: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
7870: 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20  YLE 1.#  else.# 
7880: 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
7890: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
78a0: 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66  STYLE 0.#  endif
78b0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
78c0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
78d0: 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20 20 20  G_STYLE.  /*.   
78e0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 64 61 74  **   PRAGMA [dat
78f0: 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
7900: 79 5f 66 69 6c 65 0a 20 20 20 2a 2a 20 20 20 50  y_file.   **   P
7910: 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
7920: 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
7930: 20 3d 20 22 3a 61 75 74 6f 3a 22 7c 22 6c 6f 63   = ":auto:"|"loc
7940: 6b 5f 66 69 6c 65 5f 70 61 74 68 22 0a 20 20 20  k_file_path".   
7950: 2a 2a 0a 20 20 20 2a 2a 20 52 65 74 75 72 6e 20  **.   ** Return 
7960: 6f 72 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  or set the value
7970: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 5f 70 72 6f   of the lock_pro
7980: 78 79 5f 66 69 6c 65 20 66 6c 61 67 2e 20 20 43  xy_file flag.  C
7990: 68 61 6e 67 69 6e 67 0a 20 20 20 2a 2a 20 74 68  hanging.   ** th
79a0: 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20 73  e value sets a s
79b0: 70 65 63 69 66 69 63 20 66 69 6c 65 20 74 6f 20  pecific file to 
79c0: 62 65 20 75 73 65 64 20 66 6f 72 20 64 61 74 61  be used for data
79d0: 62 61 73 65 20 61 63 63 65 73 73 20 6c 6f 63 6b  base access lock
79e0: 73 2e 0a 20 20 20 2a 2a 0a 20 20 20 2a 2f 0a 20  s..   **.   */. 
79f0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
7a00: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 6c 6f 63 6b  Cmp(zLeft, "lock
7a10: 5f 70 72 6f 78 79 5f 66 69 6c 65 22 29 3d 3d 30  _proxy_file")==0
7a20: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69   ){.    if( !zRi
7a30: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67  ght ){.      Pag
7a40: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
7a50: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
7a60: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
7a70: 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69 6c 65  char *proxy_file
7a80: 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _path = NULL;.  
7a90: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
7aa0: 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *pFile = sqlite
7ab0: 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
7ac0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7ad0: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
7ae0: 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  nt(pFile, SQLITE
7af0: 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
7b00: 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  LE, .           
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74 68  &proxy_file_path
7b30: 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
7b40: 69 66 28 20 70 72 6f 78 79 5f 66 69 6c 65 5f 70  if( proxy_file_p
7b50: 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ath ){.        s
7b60: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
7b70: 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20  Cols(v, 1);.    
7b80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7b90: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
7ba0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20  COLNAME_NAME, . 
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6c 6f               "lo
7bd0: 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 22 2c 20  ck_proxy_file", 
7be0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
7bf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7c00: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
7c10: 53 74 72 69 6e 67 38 2c 20 30 2c 20 31 2c 20 30  String8, 0, 1, 0
7c20: 2c 20 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61 74  , proxy_file_pat
7c30: 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  h, 0);.        s
7c40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7c50: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
7c60: 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  , 1, 1);.      }
7c70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7c80: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
7c90: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
7ca0: 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ger(pDb->pBt);. 
7cb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
7cc0: 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  e *pFile = sqlit
7cd0: 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
7ce0: 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  er);.      int r
7cf0: 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  es;.      if( zR
7d00: 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  ight[0] ){.     
7d10: 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73     res=sqlite3Os
7d20: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
7d30: 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
7d40: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
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 20 20 20 20 20 20 20 20                  
7d70: 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20     zRight);.    
7d80: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
7d90: 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33 4f 73     res=sqlite3Os
7da0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
7db0: 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  e, SQLITE_SET_LO
7dc0: 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a 20 20  CKPROXYFILE, .  
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7df0: 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20     NULL);.      
7e00: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 21  }.      if( res!
7e10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7e30: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
7e40: 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c 6f 63  ailed to set loc
7e50: 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29 3b 0a  k proxy file");.
7e60: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72 61          goto pra
7e70: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  gma_out;.      }
7e80: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
7e90: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7ea0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
7eb0: 54 59 4c 45 20 2a 2f 20 20 20 20 20 20 0a 20 20  TYLE */      .  
7ec0: 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50    .  /*.  **   P
7ed0: 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
7ee0: 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a  ]synchronous.  *
7ef0: 2a 20 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  *   PRAGMA [data
7f00: 62 61 73 65 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75  base.]synchronou
7f10: 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41 4c 7c  s=OFF|ON|NORMAL|
7f20: 46 55 4c 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  FULL.  **.  ** R
7f30: 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65  eturn or set the
7f40: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20   local value of 
7f50: 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  the synchronous 
7f60: 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a  flag.  Changing.
7f70: 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76    ** the local v
7f80: 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  alue does not ma
7f90: 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ke changes to th
7fa0: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20  e disk file and 
7fb0: 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74  the.  ** default
7fc0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72   value will be r
7fd0: 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74  estored the next
7fe0: 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
7ff0: 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65  se is.  ** opene
8000: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  d..  */.  if( sq
8010: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65  lite3StrICmp(zLe
8020: 66 74 2c 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22  ft,"synchronous"
8030: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
8040: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
8050: 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
8060: 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20   pragma_out;.   
8070: 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a   if( !zRight ){.
8080: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
8090: 6c 65 49 6e 74 28 70 50 61 72 73 65 2c 20 22 73  leInt(pParse, "s
80a0: 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 70 44 62  ynchronous", pDb
80b0: 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 2d 31  ->safety_level-1
80c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
80d0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74      if( !db->aut
80e0: 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  oCommit ){.     
80f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8100: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
8110: 20 20 20 20 20 20 20 20 22 53 61 66 65 74 79 20          "Safety 
8120: 6c 65 76 65 6c 20 6d 61 79 20 6e 6f 74 20 62 65  level may not be
8130: 20 63 68 61 6e 67 65 64 20 69 6e 73 69 64 65 20   changed inside 
8140: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b  a transaction");
8150: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8160: 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74        pDb->safet
8170: 79 5f 6c 65 76 65 6c 20 3d 20 67 65 74 53 61 66  y_level = getSaf
8180: 65 74 79 4c 65 76 65 6c 28 7a 52 69 67 68 74 2c  etyLevel(zRight,
8190: 30 2c 31 29 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  0,1)+1;.      }.
81a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
81b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
81c0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
81d0: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
81e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50  LITE_OMIT_FLAG_P
81f0: 52 41 47 4d 41 53 0a 20 20 69 66 28 20 66 6c 61  RAGMAS.  if( fla
8200: 67 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 20  gPragma(pParse, 
8210: 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 29 20 29  zLeft, zRight) )
8220: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61  {.    /* The fla
8230: 67 50 72 61 67 6d 61 28 29 20 73 75 62 72 6f 75  gPragma() subrou
8240: 74 69 6e 65 20 61 6c 73 6f 20 67 65 6e 65 72 61  tine also genera
8250: 74 65 73 20 61 6e 79 20 6e 65 63 65 73 73 61 72  tes any necessar
8260: 79 20 63 6f 64 65 0a 20 20 20 20 2a 2a 20 74 68  y code.    ** th
8270: 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 6d  ere is nothing m
8280: 6f 72 65 20 74 6f 20 64 6f 20 68 65 72 65 20 2a  ore to do here *
8290: 2f 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  /.  }else.#endif
82a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
82b0: 46 4c 41 47 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  FLAG_PRAGMAS */.
82c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
82d0: 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52 41 47  OMIT_SCHEMA_PRAG
82e0: 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  MAS.  /*.  **   
82f0: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
8300: 6f 28 3c 74 61 62 6c 65 3e 29 0a 20 20 2a 2a 0a  o(<table>).  **.
8310: 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69    ** Return a si
8320: 6e 67 6c 65 20 72 6f 77 20 66 6f 72 20 65 61 63  ngle row for eac
8330: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
8340: 6e 61 6d 65 64 20 74 61 62 6c 65 2e 20 54 68 65  named table. The
8350: 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a   columns of.  **
8360: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 64 61   the returned da
8370: 74 61 20 73 65 74 20 61 72 65 3a 0a 20 20 2a 2a  ta set are:.  **
8380: 0a 20 20 2a 2a 20 63 69 64 3a 20 20 20 20 20 20  .  ** cid:      
8390: 20 20 43 6f 6c 75 6d 6e 20 69 64 20 28 6e 75 6d    Column id (num
83a0: 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20  bered from left 
83b0: 74 6f 20 72 69 67 68 74 2c 20 73 74 61 72 74 69  to right, starti
83c0: 6e 67 20 61 74 20 30 29 0a 20 20 2a 2a 20 6e 61  ng at 0).  ** na
83d0: 6d 65 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  me:       Column
83e0: 20 6e 61 6d 65 0a 20 20 2a 2a 20 74 79 70 65 3a   name.  ** type:
83f0: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 64 65         Column de
8400: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 2e 0a  claration type..
8410: 20 20 2a 2a 20 6e 6f 74 6e 75 6c 6c 3a 20 20 20    ** notnull:   
8420: 20 54 72 75 65 20 69 66 20 27 4e 4f 54 20 4e 55   True if 'NOT NU
8430: 4c 4c 27 20 69 73 20 70 61 72 74 20 6f 66 20 63  LL' is part of c
8440: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
8450: 6e 0a 20 20 2a 2a 20 64 66 6c 74 5f 76 61 6c 75  n.  ** dflt_valu
8460: 65 3a 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  e: The default v
8470: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  alue for the col
8480: 75 6d 6e 2c 20 69 66 20 61 6e 79 2e 0a 20 20 2a  umn, if any..  *
8490: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  /.  if( sqlite3S
84a0: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74  trICmp(zLeft, "t
84b0: 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30 20 26  able_info")==0 &
84c0: 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  & zRight ){.    
84d0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
84e0: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
84f0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
8500: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
8510: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
8520: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
8530: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a  , zRight, zDb);.
8540: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
8550: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b 0a        int i, k;.
8560: 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64 64 65        int nHidde
8570: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43 6f 6c  n = 0;.      Col
8580: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  umn *pCol;.     
8590: 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 20   Index *pPk;.   
85a0: 20 20 20 66 6f 72 28 70 50 6b 3d 70 54 61 62 2d     for(pPk=pTab-
85b0: 3e 70 49 6e 64 65 78 3b 20 70 50 6b 20 26 26 20  >pIndex; pPk && 
85c0: 70 50 6b 2d 3e 61 75 74 6f 49 6e 64 65 78 21 3d  pPk->autoIndex!=
85d0: 32 3b 20 70 50 6b 3d 70 50 6b 2d 3e 70 4e 65 78  2; pPk=pPk->pNex
85e0: 74 29 7b 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  t){}.      sqlit
85f0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
8600: 28 76 2c 20 36 29 3b 0a 20 20 20 20 20 20 70 50  (v, 6);.      pP
8610: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36 3b 0a  arse->nMem = 6;.
8620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
8630: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
8640: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
8650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8660: 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f  ColName(v, 0, CO
8670: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 63 69 64  LNAME_NAME, "cid
8680: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ", SQLITE_STATIC
8690: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
86a0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
86b0: 2c 20 31 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 1, COLNAME_NAM
86c0: 45 2c 20 22 6e 61 6d 65 22 2c 20 53 51 4c 49 54  E, "name", SQLIT
86d0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
86e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
86f0: 6f 6c 4e 61 6d 65 28 76 2c 20 32 2c 20 43 4f 4c  olName(v, 2, COL
8700: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 74 79 70 65  NAME_NAME, "type
8710: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ", SQLITE_STATIC
8720: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8730: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8740: 2c 20 33 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 3, COLNAME_NAM
8750: 45 2c 20 22 6e 6f 74 6e 75 6c 6c 22 2c 20 53 51  E, "notnull", SQ
8760: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
8770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8780: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 34 2c 20  etColName(v, 4, 
8790: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 64  COLNAME_NAME, "d
87a0: 66 6c 74 5f 76 61 6c 75 65 22 2c 20 53 51 4c 49  flt_value", SQLI
87b0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
87c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
87d0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 35 2c 20 43 4f  ColName(v, 5, CO
87e0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 70 6b 22  LNAME_NAME, "pk"
87f0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
8800: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8810: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
8820: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  s(pParse, pTab);
8830: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
8840: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
8850: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
8860: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
8870: 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65       if( IsHidde
8880: 6e 43 6f 6c 75 6d 6e 28 70 43 6f 6c 29 20 29 7b  nColumn(pCol) ){
8890: 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69 64 64  .          nHidd
88a0: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  en++;.          
88b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
88c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
88d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
88e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2d 6e   OP_Integer, i-n
88f0: 48 69 64 64 65 6e 2c 20 31 29 3b 0a 20 20 20 20  Hidden, 1);.    
8900: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8910: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
8920: 6e 67 38 2c 20 30 2c 20 32 2c 20 30 2c 20 70 43  ng8, 0, 2, 0, pC
8930: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ol->zName, 0);. 
8940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8950: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
8960: 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c  tring8, 0, 3, 0,
8970: 0a 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  .           pCol
8980: 2d 3e 7a 54 79 70 65 20 3f 20 70 43 6f 6c 2d 3e  ->zType ? pCol->
8990: 7a 54 79 70 65 20 3a 20 22 22 2c 20 30 29 3b 0a  zType : "", 0);.
89a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
89b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
89c0: 49 6e 74 65 67 65 72 2c 20 28 70 43 6f 6c 2d 3e  Integer, (pCol->
89d0: 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a 20 30 29  notNull ? 1 : 0)
89e0: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 4);.        if
89f0: 28 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 29 7b  ( pCol->zDflt ){
8a00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8a10: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
8a20: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 35  OP_String8, 0, 5
8a30: 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 43 6f 6c  , 0, (char*)pCol
8a40: 2d 3e 7a 44 66 6c 74 2c 20 30 29 3b 0a 20 20 20  ->zDflt, 0);.   
8a50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8a60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8a70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
8a80: 6c 6c 2c 20 30 2c 20 35 29 3b 0a 20 20 20 20 20  ll, 0, 5);.     
8a90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8aa0: 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73   (pCol->colFlags
8ab0: 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
8ac0: 45 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  EY)==0 ){.      
8ad0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
8ae0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b     }else if( pPk
8af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8b00: 20 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   k = 1;.        
8b10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8b20: 20 66 6f 72 28 6b 3d 31 3b 20 41 4c 57 41 59 53   for(k=1; ALWAYS
8b30: 28 6b 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  (k<=pTab->nCol) 
8b40: 26 26 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  && pPk->aiColumn
8b50: 5b 6b 2d 31 5d 21 3d 69 3b 20 6b 2b 2b 29 7b 7d  [k-1]!=i; k++){}
8b60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8b70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8b80: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8b90: 65 72 2c 20 6b 2c 20 36 29 3b 0a 20 20 20 20 20  er, k, 6);.     
8ba0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8bb0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
8bc0: 74 52 6f 77 2c 20 31 2c 20 36 29 3b 0a 20 20 20  tRow, 1, 6);.   
8bd0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
8be0: 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
8bf0: 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  3StrICmp(zLeft, 
8c00: 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d 30  "index_info")==0
8c10: 20 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20   && zRight ){.  
8c20: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
8c30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8c40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
8c50: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
8c60: 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f  ) ) goto pragma_
8c70: 6f 75 74 3b 0a 20 20 20 20 70 49 64 78 20 3d 20  out;.    pIdx = 
8c80: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
8c90: 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  (db, zRight, zDb
8ca0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
8cb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
8cc0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 64        pTab = pId
8cd0: 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 20  x->pTable;.     
8ce0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
8cf0: 75 6d 43 6f 6c 73 28 76 2c 20 33 29 3b 0a 20 20  umCols(v, 3);.  
8d00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8d10: 20 3d 20 33 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 3;.      sqli
8d20: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
8d30: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
8d40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8d50: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8d60: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
8d70: 2c 20 22 73 65 71 6e 6f 22 2c 20 53 51 4c 49 54  , "seqno", SQLIT
8d80: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
8d90: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8da0: 6f 6c 4e 61 6d 65 28 76 2c 20 31 2c 20 43 4f 4c  olName(v, 1, COL
8db0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 63 69 64 22  NAME_NAME, "cid"
8dc0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
8dd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8de0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8df0: 20 32 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   2, COLNAME_NAME
8e00: 2c 20 22 6e 61 6d 65 22 2c 20 53 51 4c 49 54 45  , "name", SQLITE
8e10: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
8e20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
8e30: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
8e40: 20 20 20 20 20 20 20 20 69 6e 74 20 63 6e 75 6d          int cnum
8e50: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
8e60: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  n[i];.        sq
8e70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8e80: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
8e90: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
8ea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8eb0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 63  v, OP_Integer, c
8ec0: 6e 75 6d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  num, 2);.       
8ed0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
8ee0: 43 6f 6c 3e 63 6e 75 6d 20 29 3b 0a 20 20 20 20  Col>cnum );.    
8ef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8f00: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
8f10: 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20 70 54  ng8, 0, 3, 0, pT
8f20: 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a  ab->aCol[cnum].z
8f30: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
8f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8f50: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
8f60: 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20 20 20  Row, 1, 3);.    
8f70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
8f80: 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e..  if( sqlite3
8f90: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
8fa0: 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20  index_list")==0 
8fb0: 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  && zRight ){.   
8fc0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
8fd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
8fe0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
8ff0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
9000: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
9010: 75 74 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  ut;.    pTab = s
9020: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
9030: 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29  db, zRight, zDb)
9040: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
9050: 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69  {.      v = sqli
9060: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
9070: 65 29 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d  e);.      pIdx =
9080: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
9090: 20 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b       if( pIdx ){
90a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
90b0: 20 30 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c   0; .        sql
90c0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
90d0: 6c 73 28 76 2c 20 33 29 3b 0a 20 20 20 20 20 20  ls(v, 3);.      
90e0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
90f0: 20 33 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   3;.        sqli
9100: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
9110: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
9120: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9130: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
9140: 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, 0, COLNAME_NA
9150: 4d 45 2c 20 22 73 65 71 22 2c 20 53 51 4c 49 54  ME, "seq", SQLIT
9160: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
9170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9180: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 31 2c 20 43  tColName(v, 1, C
9190: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 6e 61  OLNAME_NAME, "na
91a0: 6d 65 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  me", SQLITE_STAT
91b0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
91c0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
91d0: 6d 65 28 76 2c 20 32 2c 20 43 4f 4c 4e 41 4d 45  me(v, 2, COLNAME
91e0: 5f 4e 41 4d 45 2c 20 22 75 6e 69 71 75 65 22 2c  _NAME, "unique",
91f0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
9200: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 70  .        while(p
9210: 49 64 78 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Idx){.          
9220: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9230: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9240: 20 69 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   i, 1);.        
9250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9260: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
9270: 38 2c 20 30 2c 20 32 2c 20 30 2c 20 70 49 64 78  8, 0, 2, 0, pIdx
9280: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
9290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
92a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
92b0: 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e  nteger, pIdx->on
92c0: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20  Error!=OE_None, 
92d0: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  3);.          sq
92e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
92f0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
9300: 20 31 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20   1, 3);.        
9310: 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20 20 20 20    ++i;.         
9320: 20 70 49 64 78 20 3d 20 70 49 64 78 2d 3e 70 4e   pIdx = pIdx->pN
9330: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
9340: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9350: 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
9360: 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  te3StrICmp(zLeft
9370: 2c 20 22 64 61 74 61 62 61 73 65 5f 6c 69 73 74  , "database_list
9380: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ")==0 ){.    int
9390: 20 69 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   i;.    if( sqli
93a0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
93b0: 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61  arse) ) goto pra
93c0: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 73 71 6c  gma_out;.    sql
93d0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
93e0: 6c 73 28 76 2c 20 33 29 3b 0a 20 20 20 20 70 50  ls(v, 3);.    pP
93f0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a  arse->nMem = 3;.
9400: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
9410: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
9420: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 73  COLNAME_NAME, "s
9430: 65 71 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  eq", SQLITE_STAT
9440: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
9450: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
9460: 2c 20 31 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 1, COLNAME_NAM
9470: 45 2c 20 22 6e 61 6d 65 22 2c 20 53 51 4c 49 54  E, "name", SQLIT
9480: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
9490: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
94a0: 4e 61 6d 65 28 76 2c 20 32 2c 20 43 4f 4c 4e 41  Name(v, 2, COLNA
94b0: 4d 45 5f 4e 41 4d 45 2c 20 22 66 69 6c 65 22 2c  ME_NAME, "file",
94c0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
94d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
94e0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
94f0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62       if( db->aDb
9500: 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 20 63 6f 6e  [i].pBt==0 ) con
9510: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
9520: 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert( db->aDb[i].
9530: 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  zName!=0 );.    
9540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9550: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9560: 72 2c 20 69 2c 20 31 29 3b 0a 20 20 20 20 20 20  r, i, 1);.      
9570: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9580: 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
9590: 20 30 2c 20 32 2c 20 30 2c 20 64 62 2d 3e 61 44   0, 2, 0, db->aD
95a0: 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  b[i].zName, 0);.
95b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
95c0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
95d0: 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 0a  ring8, 0, 3, 0,.
95e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
95f0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
9600: 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  me(db->aDb[i].pB
9610: 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  t), 0);.      sq
9620: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9630: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
9640: 20 31 2c 20 33 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 3);.    }.  
9650: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
9660: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66  ite3StrICmp(zLef
9670: 74 2c 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6c 69  t, "collation_li
9680: 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  st")==0 ){.    i
9690: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 48 61  nt i = 0;.    Ha
96a0: 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 73  shElem *p;.    s
96b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
96c0: 43 6f 6c 73 28 76 2c 20 32 29 3b 0a 20 20 20 20  Cols(v, 2);.    
96d0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32  pParse->nMem = 2
96e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
96f0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30  eSetColName(v, 0
9700: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
9710: 22 73 65 71 22 2c 20 53 51 4c 49 54 45 5f 53 54  "seq", SQLITE_ST
9720: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
9730: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
9740: 28 76 2c 20 31 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, 1, COLNAME_N
9750: 41 4d 45 2c 20 22 6e 61 6d 65 22 2c 20 53 51 4c  AME, "name", SQL
9760: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
9770: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
9780: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c  hFirst(&db->aCol
9790: 6c 53 65 71 29 3b 20 70 3b 20 70 3d 73 71 6c 69  lSeq); p; p=sqli
97a0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
97b0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
97c0: 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20  Coll = (CollSeq 
97d0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
97e0: 28 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (p);.      sqlit
97f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9800: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2b 2b 2c  OP_Integer, i++,
9810: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
9820: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
9830: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 32  OP_String8, 0, 2
9840: 2c 20 30 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  , 0, pColl->zNam
9850: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 0);.      sql
9860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9870: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
9880: 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 2);.    }.  }
9890: 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
98a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48 45 4d  QLITE_OMIT_SCHEM
98b0: 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 23 69  A_PRAGMAS */..#i
98c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
98d0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
98e0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
98f0: 6d 70 28 7a 4c 65 66 74 2c 20 22 66 6f 72 65 69  mp(zLeft, "forei
9900: 67 6e 5f 6b 65 79 5f 6c 69 73 74 22 29 3d 3d 30  gn_key_list")==0
9910: 20 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20   && zRight ){.  
9920: 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20 20 20    FKey *pFK;.   
9930: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
9940: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
9950: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
9960: 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75  ) goto pragma_ou
9970: 74 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  t;.    pTab = sq
9980: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
9990: 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b  b, zRight, zDb);
99a0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
99b0: 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74  .      v = sqlit
99c0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
99d0: 29 3b 0a 20 20 20 20 20 20 70 46 4b 20 3d 20 70  );.      pFK = p
99e0: 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20 20 20 20  Tab->pFKey;.    
99f0: 20 20 69 66 28 20 70 46 4b 20 29 7b 0a 20 20 20    if( pFK ){.   
9a00: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20       int i = 0; 
9a10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9a20: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
9a30: 2c 20 38 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 8);.        pP
9a40: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 38 3b 0a  arse->nMem = 8;.
9a50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
9a60: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
9a70: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
9a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9a90: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30  eSetColName(v, 0
9aa0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
9ab0: 22 69 64 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  "id", SQLITE_STA
9ac0: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
9ad0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
9ae0: 61 6d 65 28 76 2c 20 31 2c 20 43 4f 4c 4e 41 4d  ame(v, 1, COLNAM
9af0: 45 5f 4e 41 4d 45 2c 20 22 73 65 71 22 2c 20 53  E_NAME, "seq", S
9b00: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
9b10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9b20: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
9b30: 32 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  2, COLNAME_NAME,
9b40: 20 22 74 61 62 6c 65 22 2c 20 53 51 4c 49 54 45   "table", SQLITE
9b50: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
9b60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
9b70: 43 6f 6c 4e 61 6d 65 28 76 2c 20 33 2c 20 43 4f  ColName(v, 3, CO
9b80: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 66 72 6f  LNAME_NAME, "fro
9b90: 6d 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  m", SQLITE_STATI
9ba0: 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
9bb0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
9bc0: 65 28 76 2c 20 34 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, 4, COLNAME_
9bd0: 4e 41 4d 45 2c 20 22 74 6f 22 2c 20 53 51 4c 49  NAME, "to", SQLI
9be0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
9bf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
9c00: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 35 2c 20  etColName(v, 5, 
9c10: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 6f  COLNAME_NAME, "o
9c20: 6e 5f 75 70 64 61 74 65 22 2c 20 53 51 4c 49 54  n_update", SQLIT
9c30: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
9c40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9c50: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 36 2c 20 43  tColName(v, 6, C
9c60: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 6f 6e  OLNAME_NAME, "on
9c70: 5f 64 65 6c 65 74 65 22 2c 20 53 51 4c 49 54 45  _delete", SQLITE
9c80: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
9c90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
9ca0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 37 2c 20 43 4f  ColName(v, 7, CO
9cb0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 6d 61 74  LNAME_NAME, "mat
9cc0: 63 68 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ch", SQLITE_STAT
9cd0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  IC);.        whi
9ce0: 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20  le(pFK){.       
9cf0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
9d00: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
9d10: 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  FK->nCol; j++){.
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
9d30: 20 2a 7a 43 6f 6c 20 3d 20 70 46 4b 2d 3e 61 43   *zCol = pFK->aC
9d40: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 3b 0a 20 20 20 20  ol[j].zCol;.    
9d50: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f          char *zO
9d60: 6e 44 65 6c 65 74 65 20 3d 20 28 63 68 61 72 20  nDelete = (char 
9d70: 2a 29 61 63 74 69 6f 6e 4e 61 6d 65 28 70 46 4b  *)actionName(pFK
9d80: 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 3b 0a 20  ->aAction[0]);. 
9d90: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
9da0: 2a 7a 4f 6e 55 70 64 61 74 65 20 3d 20 28 63 68  *zOnUpdate = (ch
9db0: 61 72 20 2a 29 61 63 74 69 6f 6e 4e 61 6d 65 28  ar *)actionName(
9dc0: 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 29  pFK->aAction[1])
9dd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
9de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9df0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
9e00: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
9e10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9e20: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9e30: 72 2c 20 6a 2c 20 32 29 3b 0a 20 20 20 20 20 20  r, j, 2);.      
9e40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9e50: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
9e60: 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20  ring8, 0, 3, 0, 
9e70: 70 46 4b 2d 3e 7a 54 6f 2c 20 30 29 3b 0a 20 20  pFK->zTo, 0);.  
9e80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9e90: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
9ea0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 34 2c  P_String8, 0, 4,
9eb0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b    pTab->aCol[pFK
9ee0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d  ->aCol[j].iFrom]
9ef0: 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  .zName, 0);.    
9f00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9f10: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 7a 43 6f  dbeAddOp4(v, zCo
9f20: 6c 20 3f 20 4f 50 5f 53 74 72 69 6e 67 38 20 3a  l ? OP_String8 :
9f30: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 35 2c 20   OP_Null, 0, 5, 
9f40: 30 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  0, zCol, 0);.   
9f50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9f60: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
9f70: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 36 2c 20  _String8, 0, 6, 
9f80: 30 2c 20 7a 4f 6e 55 70 64 61 74 65 2c 20 30 29  0, zOnUpdate, 0)
9f90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
9fa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
9fb0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
9fc0: 2c 20 37 2c 20 30 2c 20 7a 4f 6e 44 65 6c 65 74  , 7, 0, zOnDelet
9fd0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
9fe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9ff0: 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
a000: 67 38 2c 20 30 2c 20 38 2c 20 30 2c 20 22 4e 4f  g8, 0, 8, 0, "NO
a010: 4e 45 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  NE", 0);.       
a020: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a030: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
a040: 75 6c 74 52 6f 77 2c 20 31 2c 20 38 29 3b 0a 20  ultRow, 1, 8);. 
a050: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a060: 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20       ++i;.      
a070: 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d 3e 70      pFK = pFK->p
a080: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 20 20  NextFrom;.      
a090: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a0a0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
a0b0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
a0c0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
a0d0: 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  _KEY) */..#ifnde
a0e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
a0f0: 52 45 49 47 4e 5f 4b 45 59 0a 23 69 66 6e 64 65  REIGN_KEY.#ifnde
a100: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
a110: 49 47 47 45 52 0a 20 20 69 66 28 20 73 71 6c 69  IGGER.  if( sqli
a120: 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  te3StrICmp(zLeft
a130: 2c 20 22 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 63  , "foreign_key_c
a140: 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20  heck")==0 ){.   
a150: 20 46 4b 65 79 20 2a 70 46 4b 3b 20 20 20 20 20   FKey *pFK;     
a160: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 6f 72          /* A for
a170: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
a180: 69 6e 74 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  int */.    Table
a190: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
a1a0: 20 20 2f 2a 20 43 68 69 6c 64 20 74 61 62 6c 65    /* Child table
a1b0: 20 63 6f 6e 74 61 69 6e 20 22 52 45 46 45 52 45   contain "REFERE
a1c0: 4e 43 45 53 22 20 6b 65 79 77 6f 72 64 20 2a 2f  NCES" keyword */
a1d0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 50 61 72  .    Table *pPar
a1e0: 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  ent;        /* P
a1f0: 61 72 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74  arent table that
a200: 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 74 6f   child points to
a210: 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
a220: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
a230: 2a 20 49 6e 64 65 78 20 69 6e 20 74 68 65 20 70  * Index in the p
a240: 61 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  arent table */. 
a250: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
a260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
a270: 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 6f 72 65  p counter:  Fore
a280: 69 67 6e 20 6b 65 79 20 6e 75 6d 62 65 72 20 66  ign key number f
a290: 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 69  or pTab */.    i
a2a0: 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
a2b0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a2c0: 75 6e 74 65 72 3a 20 20 46 69 65 6c 64 20 6f 66  unter:  Field of
a2d0: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
a2e0: 20 2a 2f 0a 20 20 20 20 48 61 73 68 45 6c 65 6d   */.    HashElem
a2f0: 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f   *k;           /
a300: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20  * Loop counter: 
a310: 20 4e 65 78 74 20 74 61 62 6c 65 20 69 6e 20 73   Next table in s
a320: 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 6e 74  chema */.    int
a330: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
a340: 20 20 20 20 2f 2a 20 72 65 73 75 6c 74 20 76 61      /* result va
a350: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
a360: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
a370: 20 20 20 20 20 2f 2a 20 33 20 72 65 67 69 73 74       /* 3 regist
a380: 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20 72 65  ers to hold a re
a390: 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
a3a0: 69 6e 74 20 72 65 67 4b 65 79 3b 20 20 20 20 20  int regKey;     
a3b0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
a3c0: 65 72 20 74 6f 20 68 6f 6c 64 20 6b 65 79 20 66  er to hold key f
a3d0: 6f 72 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20  or checking the 
a3e0: 46 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  FK */.    int re
a3f0: 67 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  gRow;           
a400: 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f   /* Registers to
a410: 20 68 6f 6c 64 20 61 20 72 6f 77 20 66 72 6f 6d   hold a row from
a420: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 69 6e 74   pTab */.    int
a430: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
a440: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 61 20      /* Top of a 
a450: 6c 6f 6f 70 20 63 68 65 63 6b 69 6e 67 20 66 6f  loop checking fo
a460: 72 65 69 67 6e 20 6b 65 79 73 20 2a 2f 0a 20 20  reign keys */.  
a470: 20 20 69 6e 74 20 61 64 64 72 4f 6b 3b 20 20 20    int addrOk;   
a480: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
a490: 20 68 65 72 65 20 69 66 20 74 68 65 20 6b 65 79   here if the key
a4a0: 20 69 73 20 4f 4b 20 2a 2f 0a 20 20 20 20 69 6e   is OK */.    in
a4b0: 74 20 2a 61 69 43 6f 6c 73 3b 20 20 20 20 20 20  t *aiCols;      
a4c0: 20 20 20 20 20 2f 2a 20 63 68 69 6c 64 20 74 6f       /* child to
a4d0: 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6d   parent column m
a4e0: 61 70 70 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 69  apping */..    i
a4f0: 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63  f( sqlite3ReadSc
a500: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
a510: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
a520: 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20      regResult = 
a530: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
a540: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
a550: 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67 4b 65   += 4;.    regKe
a560: 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  y = ++pParse->nM
a570: 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  em;.    regRow =
a580: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
a590: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
a5a0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
a5b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a5c0: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 34 29  SetNumCols(v, 4)
a5d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a5e0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30  eSetColName(v, 0
a5f0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
a600: 22 74 61 62 6c 65 22 2c 20 53 51 4c 49 54 45 5f  "table", SQLITE_
a610: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
a620: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a630: 6d 65 28 76 2c 20 31 2c 20 43 4f 4c 4e 41 4d 45  me(v, 1, COLNAME
a640: 5f 4e 41 4d 45 2c 20 22 72 6f 77 69 64 22 2c 20  _NAME, "rowid", 
a650: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
a660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
a670: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 32 2c 20  etColName(v, 2, 
a680: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 70  COLNAME_NAME, "p
a690: 61 72 65 6e 74 22 2c 20 53 51 4c 49 54 45 5f 53  arent", SQLITE_S
a6a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
a6b0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
a6c0: 65 28 76 2c 20 33 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, 3, COLNAME_
a6d0: 4e 41 4d 45 2c 20 22 66 6b 69 64 22 2c 20 53 51  NAME, "fkid", SQ
a6e0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
a6f0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
a700: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
a710: 2c 20 69 44 62 29 3b 0a 20 20 20 20 6b 20 3d 20  , iDb);.    k = 
a720: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
a730: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
a740: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
a750: 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 20 29 7b  .    while( k ){
a760: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67 68  .      if( zRigh
a770: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  t ){.        pTa
a780: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
a790: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  eTable(pParse, 0
a7a0: 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29 3b 0a  , zRight, zDb);.
a7b0: 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20          k = 0;. 
a7c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a7d0: 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
a7e0: 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
a7f0: 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20 6b 20  a(k);.        k 
a800: 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  = sqliteHashNext
a810: 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (k);.      }.   
a820: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c     if( pTab==0 |
a830: 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d 3d 30  | pTab->pFKey==0
a840: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a850: 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
a860: 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
a870: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
a880: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
a890: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43      if( pTab->nC
a8a0: 6f 6c 2b 72 65 67 52 6f 77 3e 70 50 61 72 73 65  ol+regRow>pParse
a8b0: 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d  ->nMem ) pParse-
a8c0: 3e 6e 4d 65 6d 20 3d 20 70 54 61 62 2d 3e 6e 43  >nMem = pTab->nC
a8d0: 6f 6c 20 2b 20 72 65 67 52 6f 77 3b 0a 20 20 20  ol + regRow;.   
a8e0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
a8f0: 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ble(pParse, 0, i
a900: 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
a910: 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 73 71  nRead);.      sq
a920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
a930: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a940: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 30 2c 20  , regResult, 0, 
a950: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 20 20 20 50 34 5f 54 52 41 4e 53 49 45 4e       P4_TRANSIEN
a980: 54 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  T);.      for(i=
a990: 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b  1, pFK=pTab->pFK
a9a0: 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46  ey; pFK; i++, pF
a9b0: 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d  K=pFK->pNextFrom
a9c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65  ){.        pPare
a9d0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  nt = sqlite3Loca
a9e0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
a9f0: 30 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62  0, pFK->zTo, zDb
aa00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
aa10: 50 61 72 65 6e 74 3d 3d 30 20 29 20 62 72 65 61  Parent==0 ) brea
aa20: 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  k;.        pIdx 
aa30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
aa40: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
aa50: 61 72 73 65 2c 20 69 44 62 2c 20 70 50 61 72 65  arse, iDb, pPare
aa60: 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 50 61  nt->tnum, 0, pPa
aa70: 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  rent->zName);.  
aa80: 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
aa90: 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78 28 70  3FkLocateIndex(p
aaa0: 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
aab0: 70 46 4b 2c 20 26 70 49 64 78 2c 20 30 29 3b 0a  pFK, &pIdx, 0);.
aac0: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30          if( x==0
aad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
aae0: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
aaf0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ab00: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
ab10: 2c 20 69 2c 20 69 44 62 2c 20 70 50 61 72 65 6e  , i, iDb, pParen
ab20: 74 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  t, OP_OpenRead);
ab30: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ab40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4b 65  {.            Ke
ab50: 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71  yInfo *pKey = sq
ab60: 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
ab70: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
ab80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
ab90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
aba0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
abb0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
abc0: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
abd0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
abe0: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
abf0: 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
ac00: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
ac10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ac20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ac30: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    k = 0;.       
ac40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ac50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ac60: 20 20 69 66 28 20 70 46 4b 20 29 20 62 72 65 61    if( pFK ) brea
ac70: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  k;.      if( pPa
ac80: 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20 70 50  rse->nTab<i ) pP
ac90: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 3b 0a  arse->nTab = i;.
aca0: 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20        addrTop = 
acb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
acc0: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
acd0: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
ace0: 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70 46 4b  1, pFK=pTab->pFK
acf0: 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20 70 46  ey; pFK; i++, pF
ad00: 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d  K=pFK->pNextFrom
ad10: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 65  ){.        pPare
ad20: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  nt = sqlite3Loca
ad30: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
ad40: 30 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a 44 62  0, pFK->zTo, zDb
ad50: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
ad60: 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b  t( pParent!=0 );
ad70: 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20  .        pIdx = 
ad80: 30 3b 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c  0;.        aiCol
ad90: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 78  s = 0;.        x
ada0: 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f 63 61   = sqlite3FkLoca
adb0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
adc0: 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20 26 70  pParent, pFK, &p
add0: 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b 0a 20  Idx, &aiCols);. 
ade0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78         assert( x
adf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
ae00: 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  ddrOk = sqlite3V
ae10: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
ae20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
ae30: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
ae40: 20 20 69 6e 74 20 69 4b 65 79 20 3d 20 70 46 4b    int iKey = pFK
ae50: 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 3b  ->aCol[0].iFrom;
ae60: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
ae70: 74 28 20 69 4b 65 79 3e 3d 30 20 26 26 20 69 4b  t( iKey>=0 && iK
ae80: 65 79 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ey<pTab->nCol );
ae90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
aea0: 4b 65 79 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Key!=pTab->iPKey
aeb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
aec0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aed0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
aee0: 30 2c 20 69 4b 65 79 2c 20 72 65 67 52 6f 77 29  0, iKey, regRow)
aef0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
af00: 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75  lite3ColumnDefau
af10: 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 4b 65 79  lt(v, pTab, iKey
af20: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20  , regRow);.     
af30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
af40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
af50: 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2c 20 61  sNull, regRow, a
af60: 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20  ddrOk);.        
af70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
af80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
af90: 42 65 49 6e 74 2c 20 72 65 67 52 6f 77 2c 0a 20  BeInt, regRow,. 
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
afb0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
afc0: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
afd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
afe0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
aff0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b000: 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 6f  _Rowid, 0, regRo
b010: 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  w);.          }.
b020: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b030: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b040: 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 2c 20  P_NotExists, i, 
b050: 30 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  0, regRow);.    
b060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b070: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
b080: 74 6f 2c 20 30 2c 20 61 64 64 72 4f 6b 29 3b 0a  to, 0, addrOk);.
b090: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b0a0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
b0c0: 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20  entAddr(v)-2);. 
b0d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b0e0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
b0f0: 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b   j<pFK->nCol; j+
b100: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
b110: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
b120: 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
b130: 76 2c 20 70 54 61 62 2c 20 30 2c 0a 20 20 20 20  v, pTab, 0,.    
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b150: 20 20 20 20 20 20 20 20 61 69 43 6f 6c 73 20 3f          aiCols ?
b160: 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20 70 46 4b   aiCols[j] : pFK
b170: 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 2c  ->aCol[0].iFrom,
b180: 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20 20 20   regRow+j);.    
b190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b1a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b1b0: 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2b 6a  IsNull, regRow+j
b1c0: 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20  , addrOk);.     
b1d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b1f0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
b200: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 70 46 4b  ord, regRow, pFK
b210: 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79 29 3b  ->nCol, regKey);
b220: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b230: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
b240: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
b250: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b260: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
b270: 28 76 2c 70 49 64 78 29 2c 20 50 34 5f 54 52 41  (v,pIdx), P4_TRA
b280: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20  NSIENT);.       
b290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b2a0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
b2b0: 75 6e 64 2c 20 69 2c 20 61 64 64 72 4f 6b 2c 20  und, i, addrOk, 
b2c0: 72 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  regKey, 0);.    
b2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
b2e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b2f0: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20  v, OP_Rowid, 0, 
b300: 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a 20 20  regResult+1);.  
b310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b320: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
b330: 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 52 65 73  ring8, 0, regRes
b340: 75 6c 74 2b 32 2c 20 30 2c 20 0a 20 20 20 20 20  ult+2, 0, .     
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c 20 50       pFK->zTo, P
b370: 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  4_TRANSIENT);.  
b380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b390: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
b3a0: 74 65 67 65 72 2c 20 69 2d 31 2c 20 72 65 67 52  teger, i-1, regR
b3b0: 65 73 75 6c 74 2b 33 29 3b 0a 20 20 20 20 20 20  esult+3);.      
b3c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b3d0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
b3e0: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
b3f0: 34 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  4);.        sqli
b400: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
b410: 62 65 6c 28 76 2c 20 61 64 64 72 4f 6b 29 3b 0a  bel(v, addrOk);.
b420: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
b430: 62 46 72 65 65 28 64 62 2c 20 61 69 43 6f 6c 73  bFree(db, aiCols
b440: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b460: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30  p2(v, OP_Next, 0
b470: 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20  , addrTop+1);.  
b480: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b490: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
b4a0: 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  op);.    }.  }el
b4b0: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  se.#endif /* !de
b4c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b4d0: 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 23 65  T_TRIGGER) */.#e
b4e0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
b4f0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
b500: 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69  EIGN_KEY) */..#i
b510: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
b520: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
b530: 70 28 7a 4c 65 66 74 2c 20 22 70 61 72 73 65 72  p(zLeft, "parser
b540: 5f 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20  _trace")==0 ){. 
b550: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
b560: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
b570: 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69  e3GetBoolean(zRi
b580: 67 68 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ght, 0) ){.     
b590: 20 20 20 73 71 6c 69 74 65 33 50 61 72 73 65 72     sqlite3Parser
b5a0: 54 72 61 63 65 28 73 74 64 65 72 72 2c 20 22 70  Trace(stderr, "p
b5b0: 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 20  arser: ");.     
b5c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b5d0: 73 71 6c 69 74 65 33 50 61 72 73 65 72 54 72 61  sqlite3ParserTra
b5e0: 63 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ce(0, 0);.      
b5f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
b600: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 69  #endif..  /* Rei
b610: 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b 45 20  nstall the LIKE 
b620: 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74 69 6f  and GLOB functio
b630: 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61 6e 74  ns.  The variant
b640: 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20 75 73   of LIKE.  ** us
b650: 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73 65 20  ed will be case 
b660: 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e 6f 74  sensitive or not
b670: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
b680: 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66  e RHS..  */.  if
b690: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
b6a0: 28 7a 4c 65 66 74 2c 20 22 63 61 73 65 5f 73 65  (zLeft, "case_se
b6b0: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 22 29 3d 3d  nsitive_like")==
b6c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 52 69  0 ){.    if( zRi
b6d0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
b6e0: 69 74 65 33 52 65 67 69 73 74 65 72 4c 69 6b 65  ite3RegisterLike
b6f0: 46 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20 73 71  Functions(db, sq
b700: 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
b710: 7a 52 69 67 68 74 2c 20 30 29 29 3b 0a 20 20 20  zRight, 0));.   
b720: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
b730: 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  def SQLITE_INTEG
b740: 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52 4f 52  RITY_CHECK_ERROR
b750: 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65 20 53 51  _MAX.# define SQ
b760: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
b770: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 20 31  HECK_ERROR_MAX 1
b780: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
b790: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
b7a0: 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 20  NTEGRITY_CHECK. 
b7b0: 20 2f 2a 20 50 72 61 67 6d 61 20 22 71 75 69 63   /* Pragma "quic
b7c0: 6b 5f 63 68 65 63 6b 22 20 69 73 20 61 6e 20 65  k_check" is an e
b7d0: 78 70 65 72 69 6d 65 6e 74 61 6c 20 72 65 64 75  xperimental redu
b7e0: 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  ced version of .
b7f0: 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79 5f 63    ** integrity_c
b800: 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20 74 6f  heck designed to
b810: 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64 61 74   detect most dat
b820: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
b830: 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6d 6f  .  ** without mo
b840: 73 74 20 6f 66 20 74 68 65 20 6f 76 65 72 68 65  st of the overhe
b850: 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 69 6e 74  ad of a full int
b860: 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 0a 20 20  egrity-check..  
b870: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
b880: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
b890: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22  integrity_check"
b8a0: 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74  )==0.   || sqlit
b8b0: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
b8c0: 20 22 71 75 69 63 6b 5f 63 68 65 63 6b 22 29 3d   "quick_check")=
b8d0: 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  =0 .  ){.    int
b8e0: 20 69 2c 20 6a 2c 20 61 64 64 72 2c 20 6d 78 45   i, j, addr, mxE
b8f0: 72 72 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65  rr;..    /* Code
b900: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
b910: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
b920: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 2e  integrity check.
b930: 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 0a 20 20    If no error.  
b940: 20 20 2a 2a 20 6d 65 73 73 61 67 65 73 20 68 61    ** messages ha
b950: 76 65 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  ve been generate
b960: 64 2c 20 6f 75 74 70 75 74 20 4f 4b 2e 20 20 4f  d, output OK.  O
b970: 74 68 65 72 77 69 73 65 20 6f 75 74 70 75 74 20  therwise output 
b980: 74 68 65 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  the.    ** error
b990: 20 6d 65 73 73 61 67 65 0a 20 20 20 20 2a 2f 0a   message.    */.
b9a0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
b9b0: 20 56 64 62 65 4f 70 4c 69 73 74 20 65 6e 64 43   VdbeOpList endC
b9c0: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
b9d0: 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20  { OP_AddImm,    
b9e0: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
b9f0: 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20  },    /* 0 */.  
ba00: 20 20 20 20 7b 20 4f 50 5f 49 66 4e 65 67 2c 20      { OP_IfNeg, 
ba10: 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20        1, 0,     
ba20: 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a     0},    /* 1 *
ba30: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  /.      { OP_Str
ba40: 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33 2c 20  ing8,     0, 3, 
ba50: 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
ba60: 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   2 */.      { OP
ba70: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c  _ResultRow,   3,
ba80: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   1,        0},. 
ba90: 20 20 20 7d 3b 0a 0a 20 20 20 20 69 6e 74 20 69     };..    int i
baa0: 73 51 75 69 63 6b 20 3d 20 28 73 71 6c 69 74 65  sQuick = (sqlite
bab0: 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74 5b 30  3Tolower(zLeft[0
bac0: 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20 20 20 20 2f  ])=='q');..    /
bad0: 2a 20 49 66 20 74 68 65 20 50 52 41 47 4d 41 20  * If the PRAGMA 
bae0: 63 6f 6d 6d 61 6e 64 20 77 61 73 20 6f 66 20 74  command was of t
baf0: 68 65 20 66 6f 72 6d 20 22 50 52 41 47 4d 41 20  he form "PRAGMA 
bb00: 3c 64 62 3e 2e 69 6e 74 65 67 72 69 74 79 5f 63  <db>.integrity_c
bb10: 68 65 63 6b 22 2c 0a 20 20 20 20 2a 2a 20 74 68  heck",.    ** th
bb20: 65 6e 20 69 44 62 20 69 73 20 73 65 74 20 74 6f  en iDb is set to
bb30: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
bb40: 65 20 64 61 74 61 62 61 73 65 20 69 64 65 6e 74  e database ident
bb50: 69 66 69 65 64 20 62 79 20 3c 64 62 3e 2e 0a 20  ified by <db>.. 
bb60: 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
bb70: 73 65 2c 20 74 68 65 20 69 6e 74 65 67 72 69 74  se, the integrit
bb80: 79 20 6f 66 20 64 61 74 61 62 61 73 65 20 69 44  y of database iD
bb90: 62 20 6f 6e 6c 79 20 69 73 20 76 65 72 69 66 69  b only is verifi
bba0: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65  ed by.    ** the
bbb0: 20 56 44 42 45 20 63 72 65 61 74 65 64 20 62 65   VDBE created be
bbc0: 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  low..    **.    
bbd0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
bbe0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 77 61 73   the command was
bbf0: 20 73 69 6d 70 6c 79 20 22 50 52 41 47 4d 41 20   simply "PRAGMA 
bc00: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22  integrity_check"
bc10: 20 28 6f 72 0a 20 20 20 20 2a 2a 20 22 50 52 41   (or.    ** "PRA
bc20: 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63 6b 22  GMA quick_check"
bc30: 29 2c 20 74 68 65 6e 20 69 44 62 20 69 73 20 73  ), then iDb is s
bc40: 65 74 20 74 6f 20 30 2e 20 49 6e 20 74 68 69 73  et to 0. In this
bc50: 20 63 61 73 65 2c 20 73 65 74 20 69 44 62 0a 20   case, set iDb. 
bc60: 20 20 20 2a 2a 20 74 6f 20 2d 31 20 68 65 72 65     ** to -1 here
bc70: 2c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  , to indicate th
bc80: 61 74 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  at the VDBE shou
bc90: 6c 64 20 76 65 72 69 66 79 20 74 68 65 20 69 6e  ld verify the in
bca0: 74 65 67 72 69 74 79 0a 20 20 20 20 2a 2a 20 6f  tegrity.    ** o
bcb0: 66 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  f all attached d
bcc0: 61 74 61 62 61 73 65 73 2e 20 20 2a 2f 0a 20 20  atabases.  */.  
bcd0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
bce0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
bcf0: 69 44 62 3d 3d 30 20 7c 7c 20 70 49 64 32 2d 3e  iDb==0 || pId2->
bd00: 7a 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  z );.    if( pId
bd10: 32 2d 3e 7a 3d 3d 30 20 29 20 69 44 62 20 3d 20  2->z==0 ) iDb = 
bd20: 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74  -1;..    /* Init
bd30: 69 61 6c 69 7a 65 20 74 68 65 20 56 44 42 45 20  ialize the VDBE 
bd40: 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 20 20 69  program */.    i
bd50: 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63  f( sqlite3ReadSc
bd60: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
bd70: 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a  oto pragma_out;.
bd80: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
bd90: 20 3d 20 36 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 6;.    sqlite
bda0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
bdb0: 76 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  v, 1);.    sqlit
bdc0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
bdd0: 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, 0, COLNAME_N
bde0: 41 4d 45 2c 20 22 69 6e 74 65 67 72 69 74 79 5f  AME, "integrity_
bdf0: 63 68 65 63 6b 22 2c 20 53 51 4c 49 54 45 5f 53  check", SQLITE_S
be00: 54 41 54 49 43 29 3b 0a 0a 20 20 20 20 2f 2a 20  TATIC);..    /* 
be10: 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
be20: 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f 0a 20  error count */. 
be30: 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49 54     mxErr = SQLIT
be40: 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  E_INTEGRITY_CHEC
be50: 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20 20  K_ERROR_MAX;.   
be60: 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a 20   if( zRight ){. 
be70: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49       sqlite3GetI
be80: 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26 6d 78  nt32(zRight, &mx
be90: 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Err);.      if( 
bea0: 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20 20 20  mxErr<=0 ){.    
beb0: 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c 49      mxErr = SQLI
bec0: 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  TE_INTEGRITY_CHE
bed0: 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20 20  CK_ERROR_MAX;.  
bee0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bf00: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
bf10: 20 6d 78 45 72 72 2c 20 31 29 3b 20 20 2f 2a 20   mxErr, 1);  /* 
bf20: 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65 72 72  reg[1] holds err
bf30: 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20 20 20  ors left */..   
bf40: 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72   /* Do an integr
bf50: 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 65 61 63  ity check on eac
bf60: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
bf70: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
bf80: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
bf90: 0a 20 20 20 20 20 20 48 61 73 68 45 6c 65 6d 20  .      HashElem 
bfa0: 2a 78 3b 0a 20 20 20 20 20 20 48 61 73 68 20 2a  *x;.      Hash *
bfb0: 70 54 62 6c 73 3b 0a 20 20 20 20 20 20 69 6e 74  pTbls;.      int
bfc0: 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20   cnt = 0;..     
bfd0: 20 69 66 28 20 4f 4d 49 54 5f 54 45 4d 50 44 42   if( OMIT_TEMPDB
bfe0: 20 26 26 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69   && i==1 ) conti
bff0: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69  nue;.      if( i
c000: 44 62 3e 3d 30 20 26 26 20 69 21 3d 69 44 62 20  Db>=0 && i!=iDb 
c010: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
c020: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
c030: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
c040: 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 61 64 64  e, i);.      add
c050: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
c060: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
c070: 73 2c 20 31 29 3b 20 2f 2a 20 48 61 6c 74 20 69  s, 1); /* Halt i
c080: 66 20 6f 75 74 20 6f 66 20 65 72 72 6f 72 73 20  f out of errors 
c090: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
c0a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c0b0: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  _Halt, 0, 0);.  
c0c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c0d0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
c0e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61  ;..      /* Do a
c0f0: 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  n integrity chec
c100: 6b 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a  k of the B-Tree.
c110: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
c120: 2a 20 42 65 67 69 6e 20 62 79 20 66 69 6c 6c 69  * Begin by filli
c130: 6e 67 20 72 65 67 69 73 74 65 72 73 20 32 2c 20  ng registers 2, 
c140: 33 2c 20 2e 2e 2e 20 77 69 74 68 20 74 68 65 20  3, ... with the 
c150: 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65  root pages numbe
c160: 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  rs.      ** for 
c170: 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
c180: 6e 64 69 63 65 73 20 69 6e 20 74 68 65 20 64 61  ndices in the da
c190: 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
c1a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
c1b0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
c1c0: 78 48 65 6c 64 28 64 62 2c 20 69 2c 20 30 29 20  xHeld(db, i, 0) 
c1d0: 29 3b 0a 20 20 20 20 20 20 70 54 62 6c 73 20 3d  );.      pTbls =
c1e0: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63   &db->aDb[i].pSc
c1f0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
c200: 20 20 20 20 20 66 6f 72 28 78 3d 73 71 6c 69 74       for(x=sqlit
c210: 65 48 61 73 68 46 69 72 73 74 28 70 54 62 6c 73  eHashFirst(pTbls
c220: 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65 48 61  ); x; x=sqliteHa
c230: 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20  shNext(x)){.    
c240: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c250: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
c260: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64  (x);.        Ind
c270: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20  ex *pIdx;.      
c280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c290: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
c2a0: 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 32  r, pTab->tnum, 2
c2b0: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 63  +cnt);.        c
c2c0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt++;.        fo
c2d0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
c2e0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
c2f0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
c300: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c310: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c320: 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 74  Integer, pIdx->t
c330: 6e 75 6d 2c 20 32 2b 63 6e 74 29 3b 0a 20 20 20  num, 2+cnt);.   
c340: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
c350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c360: 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  .      /* Make s
c370: 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 6e  ure sufficient n
c380: 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65  umber of registe
c390: 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  rs have been all
c3a0: 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 20 20  ocated */.      
c3b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  if( pParse->nMem
c3c0: 20 3c 20 63 6e 74 2b 34 20 29 7b 0a 20 20 20 20   < cnt+4 ){.    
c3d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
c3e0: 20 3d 20 63 6e 74 2b 34 3b 0a 20 20 20 20 20 20   = cnt+4;.      
c3f0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 74  }..      /* Do t
c400: 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65 67 72  he b-tree integr
c410: 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a 20 20  ity checks */.  
c420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c430: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp3(v, OP_Inte
c440: 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e 74 2c  grityCk, 2, cnt,
c450: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
c460: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
c470: 2c 20 28 75 38 29 69 29 3b 0a 20 20 20 20 20 20  , (u8)i);.      
c480: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
c490: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
c4a0: 73 4e 75 6c 6c 2c 20 32 29 3b 0a 20 20 20 20 20  sNull, 2);.     
c4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c4c0: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
c4d0: 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20 20 20  , 0, 3, 0,.     
c4e0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
c4f0: 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e 20 64  tf(db, "*** in d
c500: 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a 5c 6e  atabase %s ***\n
c510: 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  ", db->aDb[i].zN
c520: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 50  ame),.         P
c530: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
c540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c550: 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op2(v, OP_Move, 
c560: 32 2c 20 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 4);.      sql
c570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c580: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34 2c 20  , OP_Concat, 4, 
c590: 33 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  3, 2);.      sql
c5a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c5b0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
c5c0: 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 1);.      sql
c5d0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c5e0: 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20 20 20  (v, addr);..    
c5f0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
c600: 6c 6c 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  ll the indices a
c610: 72 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 63  re constructed c
c620: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20  orrectly..      
c630: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 78 3d 73  */.      for(x=s
c640: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
c650: 54 62 6c 73 29 3b 20 78 20 26 26 20 21 69 73 51  Tbls); x && !isQ
c660: 75 69 63 6b 3b 20 78 3d 73 71 6c 69 74 65 48 61  uick; x=sqliteHa
c670: 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20 20 20  shNext(x)){.    
c680: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c690: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
c6a0: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49 6e 64  (x);.        Ind
c6b0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 20 20  ex *pIdx;.      
c6c0: 20 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b 0a 0a    int loopTop;..
c6d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
c6e0: 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f  ->pIndex==0 ) co
c6f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
c700: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
c710: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
c720: 66 50 6f 73 2c 20 31 29 3b 20 20 2f 2a 20 53 74  fPos, 1);  /* St
c730: 6f 70 20 69 66 20 6f 75 74 20 6f 66 20 65 72 72  op if out of err
c740: 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ors */.        s
c750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c760: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20  (v, OP_Halt, 0, 
c770: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
c780: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c790: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
c7a0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
c7b0: 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 70 50 61  leAndIndices(pPa
c7c0: 72 73 65 2c 20 70 54 61 62 2c 20 31 2c 20 4f 50  rse, pTab, 1, OP
c7d0: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
c7e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c7f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
c800: 67 65 72 2c 20 30 2c 20 32 29 3b 20 20 2f 2a 20  ger, 0, 2);  /* 
c810: 72 65 67 28 32 29 20 77 69 6c 6c 20 63 6f 75 6e  reg(2) will coun
c820: 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 20  t entries */.   
c830: 20 20 20 20 20 6c 6f 6f 70 54 6f 70 20 3d 20 73       loopTop = s
c840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c850: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 31  (v, OP_Rewind, 1
c860: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
c870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c880: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 32 2c  v, OP_AddImm, 2,
c890: 20 31 29 3b 20 20 20 2f 2a 20 69 6e 63 72 65 6d   1);   /* increm
c8a0: 65 6e 74 20 65 6e 74 72 79 20 63 6f 75 6e 74 20  ent entry count 
c8b0: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
c8c0: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
c8d0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
c8e0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
c8f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
c900: 6e 74 20 6a 6d 70 32 3b 0a 20 20 20 20 20 20 20  nt jmp2;.       
c910: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
c920: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
c930: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 69 64 78  t VdbeOpList idx
c940: 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  Err[] = {.      
c950: 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d        { OP_AddIm
c960: 6d 2c 20 20 20 20 20 20 31 2c 20 2d 31 2c 20 20  m,      1, -1,  
c970: 30 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0},.            
c980: 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20  { OP_String8,   
c990: 20 20 30 2c 20 20 33 2c 20 20 30 7d 2c 20 20 20    0,  3,  0},   
c9a0: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 20   /* 1 */.       
c9b0: 20 20 20 20 20 7b 20 4f 50 5f 52 6f 77 69 64 2c       { OP_Rowid,
c9c0: 20 20 20 20 20 20 20 31 2c 20 20 34 2c 20 20 30         1,  4,  0
c9d0: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
c9e0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20   OP_String8,    
c9f0: 20 30 2c 20 20 35 2c 20 20 30 7d 2c 20 20 20 20   0,  5,  0},    
ca00: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 3 */.        
ca10: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38      { OP_String8
ca20: 2c 20 20 20 20 20 30 2c 20 20 36 2c 20 20 30 7d  ,     0,  6,  0}
ca30: 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20  ,    /* 4 */.   
ca40: 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f           { OP_Co
ca50: 6e 63 61 74 2c 20 20 20 20 20 20 34 2c 20 20 33  ncat,      4,  3
ca60: 2c 20 20 33 7d 2c 0a 20 20 20 20 20 20 20 20 20  ,  3},.         
ca70: 20 20 20 7b 20 4f 50 5f 43 6f 6e 63 61 74 2c 20     { OP_Concat, 
ca80: 20 20 20 20 20 35 2c 20 20 33 2c 20 20 33 7d 2c       5,  3,  3},
ca90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f  .            { O
caa0: 50 5f 43 6f 6e 63 61 74 2c 20 20 20 20 20 20 36  P_Concat,      6
cab0: 2c 20 20 33 2c 20 20 33 7d 2c 0a 20 20 20 20 20  ,  3,  3},.     
cac0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73 75         { OP_Resu
cad0: 6c 74 52 6f 77 2c 20 20 20 33 2c 20 20 31 2c 20  ltRow,   3,  1, 
cae0: 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0},.           
caf0: 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20 20 20   { OP_IfPos,    
cb00: 20 20 20 31 2c 20 20 30 2c 20 20 30 7d 2c 20 20     1,  0,  0},  
cb10: 20 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20    /* 9 */.      
cb20: 20 20 20 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c        { OP_Halt,
cb30: 20 20 20 20 20 20 20 20 30 2c 20 20 30 2c 20 20          0,  0,  
cb40: 30 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0},.          };
cb50: 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
cb60: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
cb70: 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
cb80: 70 49 64 78 2c 20 31 2c 20 33 2c 20 30 29 3b 0a  pIdx, 1, 3, 0);.
cb90: 20 20 20 20 20 20 20 20 20 20 6a 6d 70 32 20 3d            jmp2 =
cba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cbb0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
cbc0: 64 2c 20 6a 2b 32 2c 20 30 2c 20 72 31 2c 20 70  d, j+2, 0, r1, p
cbd0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b  Idx->nColumn+1);
cbe0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20  .          addr 
cbf0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cc00: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
cc10: 69 7a 65 28 69 64 78 45 72 72 29 2c 20 69 64 78  ize(idxErr), idx
cc20: 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Err);.          
cc30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
cc40: 65 50 34 28 76 2c 20 61 64 64 72 2b 31 2c 20 22  eP4(v, addr+1, "
cc50: 72 6f 77 69 64 20 22 2c 20 50 34 5f 53 54 41 54  rowid ", P4_STAT
cc60: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  IC);.          s
cc70: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
cc80: 50 34 28 76 2c 20 61 64 64 72 2b 33 2c 20 22 20  P4(v, addr+3, " 
cc90: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 69 6e 64  missing from ind
cca0: 65 78 20 22 2c 20 50 34 5f 53 54 41 54 49 43 29  ex ", P4_STATIC)
ccb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ccc0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
ccd0: 76 2c 20 61 64 64 72 2b 34 2c 20 70 49 64 78 2d  v, addr+4, pIdx-
cce0: 3e 7a 4e 61 6d 65 2c 20 50 34 5f 54 52 41 4e 53  >zName, P4_TRANS
ccf0: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 20  IENT);.         
cd00: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
cd10: 48 65 72 65 28 76 2c 20 61 64 64 72 2b 39 29 3b  Here(v, addr+9);
cd20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cd30: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
cd40: 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20 20 20  , jmp2);.       
cd50: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
cd60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cd70: 4f 50 5f 4e 65 78 74 2c 20 31 2c 20 6c 6f 6f 70  OP_Next, 1, loop
cd80: 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Top+1);.        
cd90: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
cda0: 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70 29 3b  ere(v, loopTop);
cdb0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
cdc0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
cdd0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
cde0: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b  pIdx->pNext, j++
cdf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
ce00: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
ce10: 4c 69 73 74 20 63 6e 74 49 64 78 5b 5d 20 3d 20  List cntIdx[] = 
ce20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  {.             {
ce30: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
ce40: 20 20 30 2c 20 20 33 2c 20 20 30 7d 2c 0a 20 20    0,  3,  0},.  
ce50: 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f             { OP_
ce60: 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 30 2c  Rewind,       0,
ce70: 20 20 30 2c 20 20 30 7d 2c 20 20 2f 2a 20 31 20    0,  0},  /* 1 
ce80: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
ce90: 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20  { OP_AddImm,    
cea0: 20 20 20 33 2c 20 20 31 2c 20 20 30 7d 2c 0a 20     3,  1,  0},. 
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50              { OP
cec0: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 30  _Next,         0
ced0: 2c 20 20 30 2c 20 20 30 7d 2c 20 20 2f 2a 20 33  ,  0,  0},  /* 3
cee0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
cef0: 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20   { OP_Eq,       
cf00: 20 20 20 20 32 2c 20 20 30 2c 20 20 33 7d 2c 20      2,  0,  3}, 
cf10: 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20   /* 4 */.       
cf20: 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d        { OP_AddIm
cf30: 6d 2c 20 20 20 20 20 20 20 31 2c 20 2d 31 2c 20  m,       1, -1, 
cf40: 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0},.           
cf50: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
cf60: 20 20 20 20 20 30 2c 20 20 32 2c 20 20 30 7d 2c       0,  2,  0},
cf70: 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20    /* 6 */.      
cf80: 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69         { OP_Stri
cf90: 6e 67 38 2c 20 20 20 20 20 20 30 2c 20 20 33 2c  ng8,      0,  3,
cfa0: 20 20 30 7d 2c 20 20 2f 2a 20 37 20 2a 2f 0a 20    0},  /* 7 */. 
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50              { OP
cfc0: 5f 43 6f 6e 63 61 74 2c 20 20 20 20 20 20 20 33  _Concat,       3
cfd0: 2c 20 20 32 2c 20 20 32 7d 2c 0a 20 20 20 20 20  ,  2,  2},.     
cfe0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 73          { OP_Res
cff0: 75 6c 74 52 6f 77 2c 20 20 20 20 32 2c 20 20 31  ultRow,    2,  1
d000: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 20  ,  0},.         
d010: 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64   };.          ad
d020: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
d030: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
d040: 6f 73 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  os, 1);.        
d050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d060: 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op2(v, OP_Halt, 
d070: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
d080: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d090: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
d0a0: 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
d0b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d0c0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
d0d0: 65 28 63 6e 74 49 64 78 29 2c 20 63 6e 74 49 64  e(cntIdx), cntId
d0e0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  x);.          sq
d0f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d100: 31 28 76 2c 20 61 64 64 72 2b 31 2c 20 6a 2b 32  1(v, addr+1, j+2
d110: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d120: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
d130: 28 76 2c 20 61 64 64 72 2b 31 2c 20 61 64 64 72  (v, addr+1, addr
d140: 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  +4);.          s
d150: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d160: 50 31 28 76 2c 20 61 64 64 72 2b 33 2c 20 6a 2b  P1(v, addr+3, j+
d170: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  2);.          sq
d180: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d190: 32 28 76 2c 20 61 64 64 72 2b 33 2c 20 61 64 64  2(v, addr+3, add
d1a0: 72 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r+2);.          
d1b0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d1c0: 65 72 65 28 76 2c 20 61 64 64 72 2b 34 29 3b 0a  ere(v, addr+4);.
d1d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d1e0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
d1f0: 20 61 64 64 72 2b 36 2c 20 0a 20 20 20 20 20 20   addr+6, .      
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
d210: 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74 72 69  wrong # of entri
d220: 65 73 20 69 6e 20 69 6e 64 65 78 20 22 2c 20 50  es in index ", P
d230: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
d240: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d250: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
d260: 2b 37 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  +7, pIdx->zName,
d270: 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P4_TRANSIENT);.
d280: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d290: 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64  } .    }.    add
d2a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
d2b0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
d2c0: 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29 2c 20  ySize(endCode), 
d2d0: 65 6e 64 43 6f 64 65 29 3b 0a 20 20 20 20 73 71  endCode);.    sq
d2e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d2f0: 32 28 76 2c 20 61 64 64 72 2c 20 2d 6d 78 45 72  2(v, addr, -mxEr
d300: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
d310: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d320: 64 64 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  ddr+1);.    sqli
d330: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
d340: 76 2c 20 61 64 64 72 2b 32 2c 20 22 6f 6b 22 2c  v, addr+2, "ok",
d350: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P4_STATIC);.  }
d360: 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
d370: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
d380: 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
d390: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d3a0: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a 20 20  IT_UTF16.  /*.  
d3b0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f  **   PRAGMA enco
d3c0: 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47  ding.  **   PRAG
d3d0: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75  MA encoding = "u
d3e0: 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22  tf-8"|"utf-16"|"
d3f0: 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31  utf-16le"|"utf-1
d400: 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  6be".  **.  ** I
d410: 6e 20 69 74 73 20 66 69 72 73 74 20 66 6f 72 6d  n its first form
d420: 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20 72 65  , this pragma re
d430: 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69  turns the encodi
d440: 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20  ng of the main. 
d450: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66   ** database. If
d460: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
d470: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   not initialized
d480: 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  , it is initiali
d490: 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20  zed now..  **.  
d4a0: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
d4b0: 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d  rm of this pragm
d4c0: 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  a is a no-op if 
d4d0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
d4e0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20  e file.  ** has 
d4f0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
d500: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e   initialized. In
d510: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 73 65   this case it se
d520: 74 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20  ts the default. 
d530: 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61   ** encoding tha
d540: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
d550: 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
d560: 62 61 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e  base file if a n
d570: 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  ew file.  ** is 
d580: 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65  created. If an e
d590: 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74  xisting main dat
d5a0: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
d5b0: 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20  ened, then the. 
d5c0: 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74   ** default text
d5d0: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
d5e0: 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
d5f0: 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a  ase is used..  *
d600: 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63  * .  ** In all c
d610: 61 73 65 73 20 6e 65 77 20 64 61 74 61 62 61 73  ases new databas
d620: 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  es created using
d630: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
d640: 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65  and are.  ** cre
d650: 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  ated to use the 
d660: 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78  same default tex
d670: 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68  t encoding as th
d680: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
d690: 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69   If.  ** the mai
d6a0: 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  n database has n
d6b0: 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  ot been initiali
d6c0: 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74  zed and/or creat
d6d0: 65 64 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20  ed when ATTACH. 
d6e0: 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c   ** is executed,
d6f0: 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   this is done be
d700: 66 6f 72 65 20 74 68 65 20 41 54 54 41 43 48 20  fore the ATTACH 
d710: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a  operation..  **.
d720: 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f    ** In the seco
d730: 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61  nd form this pra
d740: 67 6d 61 20 73 65 74 73 20 74 68 65 20 74 65 78  gma sets the tex
d750: 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65  t encoding to be
d760: 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65   used in.  ** ne
d770: 77 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  w database files
d780: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
d790: 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  his database han
d7a0: 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a  dle. It is only.
d7b0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69    ** useful if i
d7c0: 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65  nvoked immediate
d7d0: 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d 61 69  ly after the mai
d7e0: 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a  n database i.  *
d7f0: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  /.  if( sqlite3S
d800: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65  trICmp(zLeft, "e
d810: 6e 63 6f 64 69 6e 67 22 29 3d 3d 30 20 29 7b 0a  ncoding")==0 ){.
d820: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
d830: 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d 65 20   struct EncName 
d840: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
d850: 61 6d 65 3b 0a 20 20 20 20 20 20 75 38 20 65 6e  ame;.      u8 en
d860: 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61 6d 65  c;.    } encname
d870: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  s[] = {.      { 
d880: 22 55 54 46 38 22 2c 20 20 20 20 20 53 51 4c 49  "UTF8",     SQLI
d890: 54 45 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d  TE_UTF8        }
d8a0: 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 2d 38  ,.      { "UTF-8
d8b0: 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46  ",    SQLITE_UTF
d8c0: 38 20 20 20 20 20 20 20 20 7d 2c 20 20 2f 2a 20  8        },  /* 
d8d0: 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e 74 20  Must be element 
d8e0: 5b 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22  [1] */.      { "
d8f0: 55 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c 49 54  UTF-16le", SQLIT
d900: 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20 7d 2c  E_UTF16LE     },
d910: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65 6c 65    /* Must be ele
d920: 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20 20 20  ment [2] */.    
d930: 20 20 7b 20 22 55 54 46 2d 31 36 62 65 22 2c 20    { "UTF-16be", 
d940: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20  SQLITE_UTF16BE  
d950: 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62     },  /* Must b
d960: 65 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20 2a 2f  e element [3] */
d970: 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 6c  .      { "UTF16l
d980: 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54 46 31  e",  SQLITE_UTF1
d990: 36 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  6LE     },.     
d9a0: 20 7b 20 22 55 54 46 31 36 62 65 22 2c 20 20 53   { "UTF16be",  S
d9b0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 20 20  QLITE_UTF16BE   
d9c0: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54    },.      { "UT
d9d0: 46 2d 31 36 22 2c 20 20 20 30 20 20 20 20 20 20  F-16",   0      
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f              }, /
d9f0: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
da00: 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20 7b 20  TIVE */.      { 
da10: 22 55 54 46 31 36 22 2c 20 20 20 20 30 20 20 20  "UTF16",    0   
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
da30: 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31  , /* SQLITE_UTF1
da40: 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20  6NATIVE */.     
da50: 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b   { 0, 0 }.    };
da60: 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .    const struc
da70: 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63 3b  t EncName *pEnc;
da80: 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74  .    if( !zRight
da90: 20 29 7b 20 20 20 20 2f 2a 20 22 50 52 41 47 4d   ){    /* "PRAGM
daa0: 41 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20  A encoding" */. 
dab0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
dac0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
dad0: 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61  e) ) goto pragma
dae0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  _out;.      sqli
daf0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
db00: 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  s(v, 1);.      s
db10: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
db20: 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41  Name(v, 0, COLNA
db30: 4d 45 5f 4e 41 4d 45 2c 20 22 65 6e 63 6f 64 69  ME_NAME, "encodi
db40: 6e 67 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ng", SQLITE_STAT
db50: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
db60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
db70: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 31  OP_String8, 0, 1
db80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
db90: 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49 54 45   encnames[SQLITE
dba0: 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51 4c 49  _UTF8].enc==SQLI
dbb0: 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20  TE_UTF8 );.     
dbc0: 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65   assert( encname
dbd0: 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  s[SQLITE_UTF16LE
dbe0: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
dbf0: 46 31 36 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  F16LE );.      a
dc00: 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65 73 5b  ssert( encnames[
dc10: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 5d 2e  SQLITE_UTF16BE].
dc20: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
dc30: 36 42 45 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  6BE );.      sql
dc40: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
dc50: 28 76 2c 20 2d 31 2c 20 65 6e 63 6e 61 6d 65 73  (v, -1, encnames
dc60: 5b 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29  [ENC(pParse->db)
dc70: 5d 2e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54 41 54  ].zName, P4_STAT
dc80: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
dc90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dca0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
dcb0: 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20   1);.    }else{ 
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 20 20 20 20 2f 2a 20 22 50 52 41 47 4d         /* "PRAGM
dce0: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58 58 58  A encoding = XXX
dcf0: 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  " */.      /* On
dd00: 6c 79 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  ly change the va
dd10: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 2e 65 6e  lue of sqlite.en
dd20: 63 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  c if the databas
dd30: 65 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 0a  e handle is not.
dd40: 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
dd50: 69 7a 65 64 2e 20 49 66 20 74 68 65 20 6d 61 69  ized. If the mai
dd60: 6e 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74  n database exist
dd70: 73 2c 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  s, the new sqlit
dd80: 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20 20 20  e.enc value.    
dd90: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f 76 65    ** will be ove
dda0: 72 77 72 69 74 74 65 6e 20 77 68 65 6e 20 74 68  rwritten when th
ddb0: 65 20 73 63 68 65 6d 61 20 69 73 20 6e 65 78 74  e schema is next
ddc0: 20 6c 6f 61 64 65 64 2e 20 49 66 20 69 74 20 64   loaded. If it d
ddd0: 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  oes not.      **
dde0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c   already exists,
ddf0: 20 69 74 20 77 69 6c 6c 20 62 65 20 63 72 65 61   it will be crea
de00: 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6e  ted to use the n
de10: 65 77 20 65 6e 63 6f 64 69 6e 67 20 76 61 6c 75  ew encoding valu
de20: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
de30: 20 20 69 66 28 20 0a 20 20 20 20 20 20 20 20 21    if( .        !
de40: 28 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  (DbHasProperty(d
de50: 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 0, DB_SchemaL
de60: 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20 20 20 20  oaded)) || .    
de70: 20 20 20 20 44 62 48 61 73 50 72 6f 70 65 72 74      DbHasPropert
de80: 79 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d 70 74  y(db, 0, DB_Empt
de90: 79 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  y) .      ){.   
dea0: 20 20 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65       for(pEnc=&e
deb0: 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63  ncnames[0]; pEnc
dec0: 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29  ->zName; pEnc++)
ded0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
dee0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
def0: 70 28 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e  p(zRight, pEnc->
df00: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
df10: 20 20 20 20 20 20 45 4e 43 28 70 50 61 72 73 65        ENC(pParse
df20: 2d 3e 64 62 29 20 3d 20 70 45 6e 63 2d 3e 65 6e  ->db) = pEnc->en
df30: 63 20 3f 20 70 45 6e 63 2d 3e 65 6e 63 20 3a 20  c ? pEnc->enc : 
df40: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
df50: 56 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  VE;.            
df60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
df70: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
df80: 20 20 20 20 20 69 66 28 20 21 70 45 6e 63 2d 3e       if( !pEnc->
df90: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
dfa0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
dfb0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73 75  sg(pParse, "unsu
dfc0: 70 70 6f 72 74 65 64 20 65 6e 63 6f 64 69 6e 67  pported encoding
dfd0: 3a 20 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a  : %s", zRight);.
dfe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dff0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
e000: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e010: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
e020: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e030: 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  MIT_SCHEMA_VERSI
e040: 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 2f 2a 0a  ON_PRAGMAS.  /*.
e050: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 64    **   PRAGMA [d
e060: 61 74 61 62 61 73 65 2e 5d 73 63 68 65 6d 61 5f  atabase.]schema_
e070: 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50  version.  **   P
e080: 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
e090: 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20  ]schema_version 
e0a0: 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a  = <integer>.  **
e0b0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
e0c0: 64 61 74 61 62 61 73 65 2e 5d 75 73 65 72 5f 76  database.]user_v
e0d0: 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20 50 52  ersion.  **   PR
e0e0: 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
e0f0: 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d 20 3c  user_version = <
e100: 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a 20 20  integer>.  **.  
e110: 2a 2a 20 54 68 65 20 70 72 61 67 6d 61 27 73 20  ** The pragma's 
e120: 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 61  schema_version a
e130: 6e 64 20 75 73 65 72 5f 76 65 72 73 69 6f 6e 20  nd user_version 
e140: 61 72 65 20 75 73 65 64 20 74 6f 20 73 65 74 20  are used to set 
e150: 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74 68 65 20  or get.  ** the 
e160: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63 68  value of the sch
e170: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20  ema-version and 
e180: 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c 20 72 65  user-version, re
e190: 73 70 65 63 74 69 76 65 6c 79 2e 20 42 6f 74 68  spectively. Both
e1a0: 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
e1b0: 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 74 68 65  -version and the
e1c0: 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20 61 72   user-version ar
e1d0: 65 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20  e 32-bit signed 
e1e0: 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 73 74  integers.  ** st
e1f0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
e200: 62 61 73 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  base header..  *
e210: 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63 68 65 6d  *.  ** The schem
e220: 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75 73 75 61  a-cookie is usua
e230: 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  lly only manipul
e240: 61 74 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ated internally 
e250: 62 79 20 53 51 4c 69 74 65 2e 20 49 74 0a 20 20  by SQLite. It.  
e260: 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ** is incremente
e270: 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
e280: 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73  ever the databas
e290: 65 20 73 63 68 65 6d 61 20 69 73 20 6d 6f 64 69  e schema is modi
e2a0: 66 69 65 64 20 28 62 79 0a 20 20 2a 2a 20 63 72  fied (by.  ** cr
e2b0: 65 61 74 69 6e 67 20 6f 72 20 64 72 6f 70 70 69  eating or droppi
e2c0: 6e 67 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  ng a table or in
e2d0: 64 65 78 29 2e 20 54 68 65 20 73 63 68 65 6d 61  dex). The schema
e2e0: 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65 64   version is used
e2f0: 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20   by.  ** SQLite 
e300: 65 61 63 68 20 74 69 6d 65 20 61 20 71 75 65 72  each time a quer
e310: 79 20 69 73 20 65 78 65 63 75 74 65 64 20 74 6f  y is executed to
e320: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
e330: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 0a   internal cache.
e340: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 68 65    ** of the sche
e350: 6d 61 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6d  ma used when com
e360: 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 71  piling the SQL q
e370: 75 65 72 79 20 6d 61 74 63 68 65 73 20 74 68 65  uery matches the
e380: 20 73 63 68 65 6d 61 20 6f 66 0a 20 20 2a 2a 20   schema of.  ** 
e390: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 67 61  the database aga
e3a0: 69 6e 73 74 20 77 68 69 63 68 20 74 68 65 20 63  inst which the c
e3b0: 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20 69 73  ompiled query is
e3c0: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
e3d0: 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76 65 72 74  ed..  ** Subvert
e3e0: 69 6e 67 20 74 68 69 73 20 6d 65 63 68 61 6e 69  ing this mechani
e3f0: 73 6d 20 62 79 20 75 73 69 6e 67 20 22 50 52 41  sm by using "PRA
e400: 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69  GMA schema_versi
e410: 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79 0a 20 20  on" to modify.  
e420: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65  ** the schema-ve
e430: 72 73 69 6f 6e 20 69 73 20 70 6f 74 65 6e 74 69  rsion is potenti
e440: 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75 73 20 61  ally dangerous a
e450: 6e 64 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 70  nd may lead to p
e460: 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63 72 61 73  rogram.  ** cras
e470: 68 65 73 20 6f 72 20 64 61 74 61 62 61 73 65 20  hes or database 
e480: 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55 73 65 20  corruption. Use 
e490: 77 69 74 68 20 63 61 75 74 69 6f 6e 21 0a 20 20  with caution!.  
e4a0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75 73 65 72  **.  ** The user
e4b0: 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e 6f 74 20  -version is not 
e4c0: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
e4d0: 62 79 20 53 51 4c 69 74 65 2e 20 49 74 20 6d 61  by SQLite. It ma
e4e0: 79 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  y be used by.  *
e4f0: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 66  * applications f
e500: 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 2e 0a  or any purpose..
e510: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
e520: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
e530: 20 22 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e   "schema_version
e540: 22 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c  ")==0 .   || sql
e550: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66  ite3StrICmp(zLef
e560: 74 2c 20 22 75 73 65 72 5f 76 65 72 73 69 6f 6e  t, "user_version
e570: 22 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c  ")==0 .   || sql
e580: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66  ite3StrICmp(zLef
e590: 74 2c 20 22 66 72 65 65 6c 69 73 74 5f 63 6f 75  t, "freelist_cou
e5a0: 6e 74 22 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  nt")==0 .  ){.  
e5b0: 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20    int iCookie;  
e5c0: 20 2f 2a 20 43 6f 6f 6b 69 65 20 69 6e 64 65 78   /* Cookie index
e5d0: 2e 20 31 20 66 6f 72 20 73 63 68 65 6d 61 2d 63  . 1 for schema-c
e5e0: 6f 6f 6b 69 65 2c 20 36 20 66 6f 72 20 75 73 65  ookie, 6 for use
e5f0: 72 2d 63 6f 6f 6b 69 65 2e 20 2a 2f 0a 20 20 20  r-cookie. */.   
e600: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
e610: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
e620: 20 20 20 73 77 69 74 63 68 28 20 7a 4c 65 66 74     switch( zLeft
e630: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73  [0] ){.      cas
e640: 65 20 27 66 27 3a 20 63 61 73 65 20 27 46 27 3a  e 'f': case 'F':
e650: 0a 20 20 20 20 20 20 20 20 69 43 6f 6f 6b 69 65  .        iCookie
e660: 20 3d 20 42 54 52 45 45 5f 46 52 45 45 5f 50 41   = BTREE_FREE_PA
e670: 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 20 20 20 20  GE_COUNT;.      
e680: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
e690: 61 73 65 20 27 73 27 3a 20 63 61 73 65 20 27 53  ase 's': case 'S
e6a0: 27 3a 0a 20 20 20 20 20 20 20 20 69 43 6f 6f 6b  ':.        iCook
e6b0: 69 65 20 3d 20 42 54 52 45 45 5f 53 43 48 45 4d  ie = BTREE_SCHEM
e6c0: 41 5f 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20  A_VERSION;.     
e6d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e6e0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
e6f0: 20 69 43 6f 6f 6b 69 65 20 3d 20 42 54 52 45 45   iCookie = BTREE
e700: 5f 55 53 45 52 5f 56 45 52 53 49 4f 4e 3b 0a 20  _USER_VERSION;. 
e710: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e720: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 7a 52 69    }..    if( zRi
e730: 67 68 74 20 26 26 20 69 43 6f 6f 6b 69 65 21 3d  ght && iCookie!=
e740: 42 54 52 45 45 5f 46 52 45 45 5f 50 41 47 45 5f  BTREE_FREE_PAGE_
e750: 43 4f 55 4e 54 20 29 7b 0a 20 20 20 20 20 20 2f  COUNT ){.      /
e760: 2a 20 57 72 69 74 65 20 74 68 65 20 73 70 65 63  * Write the spec
e770: 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76 61 6c  ified cookie val
e780: 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  ue */.      stat
e790: 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
e7a0: 69 73 74 20 73 65 74 43 6f 6f 6b 69 65 5b 5d 20  ist setCookie[] 
e7b0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
e7c0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
e7d0: 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20 20 20   0,  1,  0},    
e7e0: 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 0 */.        
e7f0: 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
e800: 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c       0,  1,  0},
e810: 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20      /* 1 */.    
e820: 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f 6f 6b      { OP_SetCook
e830: 69 65 2c 20 20 20 20 20 20 30 2c 20 20 30 2c 20  ie,      0,  0, 
e840: 20 31 7d 2c 20 20 20 20 2f 2a 20 32 20 2a 2f 0a   1},    /* 2 */.
e850: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
e860: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
e870: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
e880: 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65 74 43  , ArraySize(setC
e890: 6f 6f 6b 69 65 29 2c 20 73 65 74 43 6f 6f 6b 69  ookie), setCooki
e8a0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
e8b0: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
e8c0: 20 61 64 64 72 2c 20 69 44 62 29 3b 0a 20 20 20   addr, iDb);.   
e8d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e8e0: 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72 2b 31  angeP1(v, addr+1
e8f0: 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52  , sqlite3Atoi(zR
e900: 69 67 68 74 29 29 3b 0a 20 20 20 20 20 20 73 71  ight));.      sq
e910: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e920: 31 28 76 2c 20 61 64 64 72 2b 32 2c 20 69 44 62  1(v, addr+2, iDb
e930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e940: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
e950: 61 64 64 72 2b 32 2c 20 69 43 6f 6f 6b 69 65 29  addr+2, iCookie)
e960: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e970: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
e980: 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20  pecified cookie 
e990: 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73  value */.      s
e9a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
e9b0: 4f 70 4c 69 73 74 20 72 65 61 64 43 6f 6f 6b 69  OpList readCooki
e9c0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
e9d0: 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  { OP_Transaction
e9e0: 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30 7d  ,     0,  0,  0}
e9f0: 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  ,    /* 0 */.   
ea00: 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f       { OP_ReadCo
ea10: 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 31  okie,      0,  1
ea20: 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 20 2a  ,  0},    /* 1 *
ea30: 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52  /.        { OP_R
ea40: 65 73 75 6c 74 52 6f 77 2c 20 20 20 20 20 20 20  esultRow,       
ea50: 31 2c 20 20 31 2c 20 20 30 7d 0a 20 20 20 20 20  1,  1,  0}.     
ea60: 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   };.      int ad
ea70: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
ea80: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
ea90: 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f 6b 69  aySize(readCooki
eaa0: 65 29 2c 20 72 65 61 64 43 6f 6f 6b 69 65 29 3b  e), readCookie);
eab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
eac0: 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 61 64  beChangeP1(v, ad
ead0: 64 72 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  dr, iDb);.      
eae0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
eaf0: 65 50 31 28 76 2c 20 61 64 64 72 2b 31 2c 20 69  eP1(v, addr+1, i
eb00: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
eb10: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
eb20: 2c 20 61 64 64 72 2b 31 2c 20 69 43 6f 6f 6b 69  , addr+1, iCooki
eb30: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
eb40: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
eb50: 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  v, 1);.      sql
eb60: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
eb70: 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45  me(v, 0, COLNAME
eb80: 5f 4e 41 4d 45 2c 20 7a 4c 65 66 74 2c 20 53 51  _NAME, zLeft, SQ
eb90: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
eba0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
ebb0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ebc0: 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52 53  OMIT_SCHEMA_VERS
ebd0: 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  ION_PRAGMAS */..
ebe0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ebf0: 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
ec00: 4e 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20 20 2a  N_DIAGS.  /*.  *
ec10: 2a 20 20 20 50 52 41 47 4d 41 20 63 6f 6d 70 69  *   PRAGMA compi
ec20: 6c 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a 2a 0a  le_options.  **.
ec30: 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
ec40: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 6f 6d  names of all com
ec50: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
ec60: 73 20 75 73 65 64 20 69 6e 20 74 68 69 73 20 62  s used in this b
ec70: 75 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65 20 6f  uild,.  ** one o
ec80: 70 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e 0a 20  ption per row.. 
ec90: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
eca0: 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  3StrICmp(zLeft, 
ecb0: 22 63 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f 6e 73  "compile_options
ecc0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ")==0 ){.    int
ecd0: 20 69 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73   i = 0;.    cons
ece0: 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20  t char *zOpt;.  
ecf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ed00: 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20  NumCols(v, 1);. 
ed10: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
ed20: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
ed30: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
ed40: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
ed50: 45 2c 20 22 63 6f 6d 70 69 6c 65 5f 6f 70 74 69  E, "compile_opti
ed60: 6f 6e 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  on", SQLITE_STAT
ed70: 49 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  IC);.    while( 
ed80: 28 7a 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 5f  (zOpt = sqlite3_
ed90: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
eda0: 74 28 69 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20  t(i++))!=0 ){.  
edb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
edc0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
edd0: 6e 67 38 2c 20 30 2c 20 31 2c 20 30 2c 20 7a 4f  ng8, 0, 1, 0, zO
ede0: 70 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pt, 0);.      sq
edf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ee00: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
ee10: 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
ee20: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
ee30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
ee40: 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20  ILEOPTION_DIAGS 
ee50: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
ee60: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a  TE_OMIT_WAL.  /*
ee70: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b  .  **   PRAGMA [
ee80: 64 61 74 61 62 61 73 65 2e 5d 77 61 6c 5f 63 68  database.]wal_ch
ee90: 65 63 6b 70 6f 69 6e 74 20 3d 20 70 61 73 73 69  eckpoint = passi
eea0: 76 65 7c 66 75 6c 6c 7c 72 65 73 74 61 72 74 0a  ve|full|restart.
eeb0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 70    **.  ** Checkp
eec0: 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  oint the databas
eed0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
eee0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65  lite3StrICmp(zLe
eef0: 66 74 2c 20 22 77 61 6c 5f 63 68 65 63 6b 70 6f  ft, "wal_checkpo
ef00: 69 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  int")==0 ){.    
ef10: 69 6e 74 20 69 42 74 20 3d 20 28 70 49 64 32 2d  int iBt = (pId2-
ef20: 3e 7a 3f 69 44 62 3a 53 51 4c 49 54 45 5f 4d 41  >z?iDb:SQLITE_MA
ef30: 58 5f 41 54 54 41 43 48 45 44 29 3b 0a 20 20 20  X_ATTACHED);.   
ef40: 20 69 6e 74 20 65 4d 6f 64 65 20 3d 20 53 51 4c   int eMode = SQL
ef50: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
ef60: 41 53 53 49 56 45 3b 0a 20 20 20 20 69 66 28 20  ASSIVE;.    if( 
ef70: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  zRight ){.      
ef80: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
ef90: 6d 70 28 7a 52 69 67 68 74 2c 20 22 66 75 6c 6c  mp(zRight, "full
efa0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
efb0: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
efc0: 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3b  CHECKPOINT_FULL;
efd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
efe0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
eff0: 7a 52 69 67 68 74 2c 20 22 72 65 73 74 61 72 74  zRight, "restart
f000: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
f010: 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f   eMode = SQLITE_
f020: 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41  CHECKPOINT_RESTA
f030: 52 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RT;.      }.    
f040: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
f050: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
f060: 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  se) ) goto pragm
f070: 61 5f 6f 75 74 3b 0a 20 20 20 20 73 71 6c 69 74  a_out;.    sqlit
f080: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
f090: 28 76 2c 20 33 29 3b 0a 20 20 20 20 70 50 61 72  (v, 3);.    pPar
f0a0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20  se->nMem = 3;.  
f0b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
f0c0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f  ColName(v, 0, CO
f0d0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 62 75 73  LNAME_NAME, "bus
f0e0: 79 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  y", SQLITE_STATI
f0f0: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
f100: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
f110: 20 31 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   1, COLNAME_NAME
f120: 2c 20 22 6c 6f 67 22 2c 20 53 51 4c 49 54 45 5f  , "log", SQLITE_
f130: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
f140: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
f150: 6d 65 28 76 2c 20 32 2c 20 43 4f 4c 4e 41 4d 45  me(v, 2, COLNAME
f160: 5f 4e 41 4d 45 2c 20 22 63 68 65 63 6b 70 6f 69  _NAME, "checkpoi
f170: 6e 74 65 64 22 2c 20 53 51 4c 49 54 45 5f 53 54  nted", SQLITE_ST
f180: 41 54 49 43 29 3b 0a 0a 20 20 20 20 73 71 6c 69  ATIC);..    sqli
f190: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f1a0: 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20   OP_Checkpoint, 
f1b0: 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29 3b 0a  iBt, eMode, 1);.
f1c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f1d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
f1e0: 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20  ltRow, 1, 3);.  
f1f0: 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }else..  /*.  **
f200: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75     PRAGMA wal_au
f210: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 2a  tocheckpoint.  *
f220: 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61  *   PRAGMA wal_a
f230: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20  utocheckpoint = 
f240: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66  N.  **.  ** Conf
f250: 69 67 75 72 65 20 61 20 64 61 74 61 62 61 73 65  igure a database
f260: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
f270: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65  utomatically che
f280: 63 6b 70 6f 69 6e 74 20 61 20 64 61 74 61 62 61  ckpoint a databa
f290: 73 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 63  se.  ** after ac
f2a0: 63 75 6d 75 6c 61 74 69 6e 67 20 4e 20 66 72 61  cumulating N fra
f2b0: 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 2e 20  mes in the log. 
f2c0: 4f 72 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  Or query for the
f2d0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 0a 20   current value. 
f2e0: 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20 2a 2f 0a 20   ** of N..  */. 
f2f0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f300: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 77 61 6c 5f  Cmp(zLeft, "wal_
f310: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 22 29  autocheckpoint")
f320: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
f330: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
f340: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
f350: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 73 71  heckpoint(db, sq
f360: 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68 74  lite3Atoi(zRight
f370: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ));.    }.    re
f380: 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 70 50  turnSingleInt(pP
f390: 61 72 73 65 2c 20 22 77 61 6c 5f 61 75 74 6f 63  arse, "wal_autoc
f3a0: 68 65 63 6b 70 6f 69 6e 74 22 2c 20 0a 20 20 20  heckpoint", .   
f3b0: 20 20 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c      db->xWalCall
f3c0: 62 61 63 6b 3d 3d 73 71 6c 69 74 65 33 57 61 6c  back==sqlite3Wal
f3d0: 44 65 66 61 75 6c 74 48 6f 6f 6b 20 3f 20 0a 20  DefaultHook ? . 
f3e0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
f3f0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 64 62 2d 3e  _PTR_TO_INT(db->
f400: 70 57 61 6c 41 72 67 29 20 3a 20 30 29 3b 0a 20  pWalArg) : 0);. 
f410: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
f420: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
f430: 20 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 0a 20   shrink_memory. 
f440: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 70 72   **.  ** This pr
f450: 61 67 6d 61 20 61 74 74 65 6d 70 74 73 20 74 6f  agma attempts to
f460: 20 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65   free as much me
f470: 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
f480: 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 63   from the.  ** c
f490: 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
f4a0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2f  connection..  */
f4b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
f4c0: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 73 68  rICmp(zLeft, "sh
f4d0: 72 69 6e 6b 5f 6d 65 6d 6f 72 79 22 29 3d 3d 30  rink_memory")==0
f4e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
f4f0: 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
f500: 79 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  y(db);.  }else..
f510: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
f520: 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75 74 0a  MA busy_timeout.
f530: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 62 75    **   PRAGMA bu
f540: 73 79 5f 74 69 6d 65 6f 75 74 20 3d 20 4e 0a 20  sy_timeout = N. 
f550: 20 2a 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20 73 71   **.  ** Call sq
f560: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
f570: 75 74 28 64 62 2c 20 4e 29 2e 20 20 52 65 74 75  ut(db, N).  Retu
f580: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  rn the current t
f590: 69 6d 65 6f 75 74 20 76 61 6c 75 65 0a 20 20 2a  imeout value.  *
f5a0: 2a 20 69 66 20 6f 6e 65 20 69 73 20 73 65 74 2e  * if one is set.
f5b0: 20 20 49 66 20 6e 6f 20 62 75 73 79 20 68 61 6e    If no busy han
f5c0: 64 6c 65 72 20 6f 72 20 61 20 64 69 66 66 65 72  dler or a differ
f5d0: 65 6e 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ent busy handler
f5e0: 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 74 68 65   is set.  ** the
f5f0: 6e 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  n 0 is returned.
f600: 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 62 75    Setting the bu
f610: 73 79 5f 74 69 6d 65 6f 75 74 20 74 6f 20 30 20  sy_timeout to 0 
f620: 6f 72 20 6e 65 67 61 74 69 76 65 0a 20 20 2a 2a  or negative.  **
f630: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 74 69   disables the ti
f640: 6d 65 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  meout..  */.  if
f650: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f660: 28 7a 4c 65 66 74 2c 20 22 62 75 73 79 5f 74 69  (zLeft, "busy_ti
f670: 6d 65 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20  meout")==0 ){.  
f680: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
f690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
f6a0: 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 73  sy_timeout(db, s
f6b0: 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67 68  qlite3Atoi(zRigh
f6c0: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  t));.    }.    r
f6d0: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 70  eturnSingleInt(p
f6e0: 50 61 72 73 65 2c 20 22 74 69 6d 65 6f 75 74 22  Parse, "timeout"
f6f0: 2c 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f  ,  db->busyTimeo
f700: 75 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69  ut);.  }else..#i
f710: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
f720: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
f730: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
f740: 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f 72 74    /*.  ** Report
f750: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
f760: 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67 73 20  te of file logs 
f770: 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
f780: 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  s.  */.  if( sql
f790: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66  ite3StrICmp(zLef
f7a0: 74 2c 20 22 6c 6f 63 6b 5f 73 74 61 74 75 73 22  t, "lock_status"
f7b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
f7c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
f7d0: 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d 65 5b  onst azLockName[
f7e0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c  ] = {.      "unl
f7f0: 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65 64 22  ocked", "shared"
f800: 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20 22 70  , "reserved", "p
f810: 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c 75 73  ending", "exclus
f820: 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ive".    };.    
f830: 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
f840: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
f850: 28 76 2c 20 32 29 3b 0a 20 20 20 20 70 50 61 72  (v, 2);.    pPar
f860: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a 20 20  se->nMem = 2;.  
f870: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
f880: 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f  ColName(v, 0, CO
f890: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 64 61 74  LNAME_NAME, "dat
f8a0: 61 62 61 73 65 22 2c 20 53 51 4c 49 54 45 5f 53  abase", SQLITE_S
f8b0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
f8c0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
f8d0: 65 28 76 2c 20 31 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, 1, COLNAME_
f8e0: 4e 41 4d 45 2c 20 22 73 74 61 74 75 73 22 2c 20  NAME, "status", 
f8f0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
f900: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
f910: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
f920: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a      Btree *pBt;.
f930: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
f940: 20 2a 7a 53 74 61 74 65 20 3d 20 22 75 6e 6b 6e   *zState = "unkn
f950: 6f 77 6e 22 3b 0a 20 20 20 20 20 20 69 6e 74 20  own";.      int 
f960: 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  j;.      if( db-
f970: 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  >aDb[i].zName==0
f980: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
f990: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f9a0: 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
f9b0: 67 38 2c 20 30 2c 20 31 2c 20 30 2c 20 64 62 2d  g8, 0, 1, 0, db-
f9c0: 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 50  >aDb[i].zName, P
f9d0: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
f9e0: 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69   pBt = db->aDb[i
f9f0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
fa00: 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74   pBt==0 || sqlit
fa10: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
fa20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fa30: 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f 73 65 64  zState = "closed
fa40: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
fa50: 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  f( sqlite3_file_
fa60: 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20 3f 20  control(db, i ? 
fa70: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
fa80: 20 3a 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20   : 0, .         
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
fab0: 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
fac0: 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54 45 5f  TE, &j)==SQLITE_
fad0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 7a  OK ){.         z
fae0: 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b 4e 61  State = azLockNa
faf0: 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  me[j];.      }. 
fb00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fb10: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72  AddOp4(v, OP_Str
fb20: 69 6e 67 38 2c 20 30 2c 20 32 2c 20 30 2c 20 7a  ing8, 0, 2, 0, z
fb30: 53 74 61 74 65 2c 20 50 34 5f 53 54 41 54 49 43  State, P4_STATIC
fb40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fb50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fb60: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 32  _ResultRow, 1, 2
fb70: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  );.    }..  }els
fb80: 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  e.#endif..#ifdef
fb90: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
fba0: 43 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  C.  if( sqlite3S
fbb0: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 6b  trICmp(zLeft, "k
fbc0: 65 79 22 29 3d 3d 30 20 26 26 20 7a 52 69 67 68  ey")==0 && zRigh
fbd0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
fbe0: 5f 6b 65 79 28 64 62 2c 20 7a 52 69 67 68 74 2c  _key(db, zRight,
fbf0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
fc00: 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 7d 65 6c  (zRight));.  }el
fc10: 73 65 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  se.  if( sqlite3
fc20: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
fc30: 72 65 6b 65 79 22 29 3d 3d 30 20 26 26 20 7a 52  rekey")==0 && zR
fc40: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
fc50: 74 65 33 5f 72 65 6b 65 79 28 64 62 2c 20 7a 52  te3_rekey(db, zR
fc60: 69 67 68 74 2c 20 73 71 6c 69 74 65 33 53 74 72  ight, sqlite3Str
fc70: 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 29 3b 0a  len30(zRight));.
fc80: 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 7a 52    }else.  if( zR
fc90: 69 67 68 74 20 26 26 20 28 73 71 6c 69 74 65 33  ight && (sqlite3
fca0: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
fcb0: 68 65 78 6b 65 79 22 29 3d 3d 30 20 7c 7c 0a 20  hexkey")==0 ||. 
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fce0: 4c 65 66 74 2c 20 22 68 65 78 72 65 6b 65 79 22  Left, "hexrekey"
fcf0: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  )==0) ){.    int
fd00: 20 69 2c 20 68 31 2c 20 68 32 3b 0a 20 20 20 20   i, h1, h2;.    
fd10: 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20  char zKey[40];. 
fd20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 68 31 20     for(i=0; (h1 
fd30: 3d 20 7a 52 69 67 68 74 5b 69 5d 29 21 3d 30 20  = zRight[i])!=0 
fd40: 26 26 20 28 68 32 20 3d 20 7a 52 69 67 68 74 5b  && (h2 = zRight[
fd50: 69 2b 31 5d 29 21 3d 30 3b 20 69 2b 3d 32 29 7b  i+1])!=0; i+=2){
fd60: 0a 20 20 20 20 20 20 68 31 20 2b 3d 20 39 2a 28  .      h1 += 9*(
fd70: 31 26 28 68 31 3e 3e 36 29 29 3b 0a 20 20 20 20  1&(h1>>6));.    
fd80: 20 20 68 32 20 2b 3d 20 39 2a 28 31 26 28 68 32    h2 += 9*(1&(h2
fd90: 3e 3e 36 29 29 3b 0a 20 20 20 20 20 20 7a 4b 65  >>6));.      zKe
fda0: 79 5b 69 2f 32 5d 20 3d 20 28 68 32 20 26 20 30  y[i/2] = (h2 & 0
fdb0: 78 30 66 29 20 7c 20 28 28 68 31 20 26 20 30 78  x0f) | ((h1 & 0x
fdc0: 66 29 3c 3c 34 29 3b 0a 20 20 20 20 7d 0a 20 20  f)<<4);.    }.  
fdd0: 20 20 69 66 28 20 28 7a 4c 65 66 74 5b 33 5d 20    if( (zLeft[3] 
fde0: 26 20 30 78 66 29 3d 3d 30 78 62 20 29 7b 0a 20  & 0xf)==0xb ){. 
fdf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79       sqlite3_key
fe00: 28 64 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b  (db, zKey, i/2);
fe10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fe20: 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28    sqlite3_rekey(
fe30: 64 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a  db, zKey, i/2);.
fe40: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
fe50: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
fe60: 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
fe70: 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  C) || defined(SQ
fe80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f  LITE_ENABLE_CERO
fe90: 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  D).  if( sqlite3
fea0: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
feb0: 61 63 74 69 76 61 74 65 5f 65 78 74 65 6e 73 69  activate_extensi
fec0: 6f 6e 73 22 29 3d 3d 30 20 26 26 20 7a 52 69 67  ons")==0 && zRig
fed0: 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ht ){.#ifdef SQL
fee0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
fef0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
ff00: 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 73  NICmp(zRight, "s
ff10: 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  ee-", 4)==0 ){. 
ff20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 63 74       sqlite3_act
ff30: 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69 67 68  ivate_see(&zRigh
ff40: 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  t[4]);.    }.#en
ff50: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
ff60: 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44 0a 20  E_ENABLE_CEROD. 
ff70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
ff80: 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22  rNICmp(zRight, "
ff90: 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30 20 29  cerod-", 6)==0 )
ffa0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ffb0: 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64 28 26  activate_cerod(&
ffc0: 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20 20 20  zRight[6]);.    
ffd0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
ffe0: 0a 23 65 6e 64 69 66 0a 0a 20 0a 20 20 7b 2f 2a  .#endif.. .  {/*
fff0: 20 45 6d 70 74 79 20 45 4c 53 45 20 63 6c 61 75   Empty ELSE clau
10000 73 65 20 2a 2f 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  se */}..  /*.  *
10010 2a 20 52 65 73 65 74 20 74 68 65 20 73 61 66 65  * Reset the safe
10020 74 79 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73  ty level, in cas
10030 65 20 74 68 65 20 66 75 6c 6c 66 73 79 6e 63 20  e the fullfsync 
10040 66 6c 61 67 20 6f 72 20 73 79 6e 63 68 72 6f 6e  flag or synchron
10050 6f 75 73 0a 20 20 2a 2a 20 73 65 74 74 69 6e 67  ous.  ** setting
10060 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 23   changed..  */.#
10070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10080 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
10090 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
100a0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
100b0 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66 65  ite3BtreeSetSafe
100c0 74 79 4c 65 76 65 6c 28 70 44 62 2d 3e 70 42 74  tyLevel(pDb->pBt
100d0 2c 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65  , pDb->safety_le
100e0 76 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  vel,.           
100f0 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53      (db->flags&S
10100 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63 29  QLITE_FullFSync)
10110 21 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  !=0,.           
10120 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53      (db->flags&S
10130 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53  QLITE_CkptFullFS
10140 79 6e 63 29 21 3d 30 29 3b 0a 20 20 7d 0a 23 65  ync)!=0);.  }.#e
10150 6e 64 69 66 0a 70 72 61 67 6d 61 5f 6f 75 74 3a  ndif.pragma_out:
10160 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
10170 28 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20 20 73  (db, zLeft);.  s
10180 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10190 20 7a 52 69 67 68 74 29 3b 0a 7d 0a 0a 23 65 6e   zRight);.}..#en
101a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
101b0 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a           IT_PRAGMA */.