/ Hex Artifact Content
Login

Artifact 8bbc8c8697d13f76394e592dcecafce3491ed8ba:


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 6c 69 6d 69 74 28 4e 29  e.]mmap_limit(N)
6610: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  **.  ** Used 
6620: 74 6f 20 73 65 74 20 6d 61 70 70 69 6e 67 20 73  to set mapping s
6630: 69 7a 65 20 6c 69 6d 69 74 2e 20 54 68 65 20 6d  ize limit. The m
6640: 61 70 70 69 6e 67 20 73 69 7a 65 20 6c 69 6d 69  apping size limi
6650: 74 20 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 74  t is.  ** used t
6660: 6f 20 6c 69 6d 69 74 20 74 68 65 20 61 67 67 72  o limit the aggr
6670: 65 67 61 74 65 20 73 69 7a 65 20 6f 66 20 61 6c  egate size of al
6680: 6c 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  l memory mapped 
6690: 72 65 67 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  regions of the. 
66a0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
66b0: 65 2e 20 49 66 20 74 68 69 73 20 70 61 72 61 6d  e. If this param
66c0: 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 7a  eter is set to z
66d0: 65 72 6f 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ero, then memory
66e0: 20 6d 61 70 70 69 6e 67 0a 20 20 2a 2a 20 69 73   mapping.  ** is
66f0: 20 6e 6f 74 20 75 73 65 64 20 61 74 20 61 6c 6c   not used at all
6700: 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61 74  .  If N is negat
6710: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ive, then the de
6720: 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 6d 61 70  fault memory map
6730: 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 64 65 74 65  .  ** limit dete
6740: 72 6d 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65  rmined by sqlite
6750: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
6760: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 4c 49 4d 49  CONFIG_MMAP_LIMI
6770: 54 29 20 69 73 20 73 65 74 2e 0a 20 20 2a 2a 20  T) is set..  ** 
6780: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 4e 20  The parameter N 
6790: 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20 62  is measured in b
67a0: 79 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ytes..  **.  ** 
67b0: 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 61 64  This value is ad
67c0: 76 69 73 6f 72 79 2e 20 20 54 68 65 20 75 6e 64  visory.  The und
67d0: 65 72 6c 79 69 6e 67 20 56 46 53 20 69 73 20 66  erlying VFS is f
67e0: 72 65 65 20 74 6f 20 6d 65 6d 6f 72 79 20 6d 61  ree to memory ma
67f0: 70 0a 20 20 2a 2a 20 61 73 20 6c 69 74 74 6c 65  p.  ** as little
6800: 20 6f 72 20 61 73 20 6d 75 63 68 20 61 73 20 69   or as much as i
6810: 74 20 77 61 6e 74 73 2e 20 20 45 78 63 65 70 74  t wants.  Except
6820: 2c 20 69 66 20 4e 20 69 73 20 73 65 74 20 74 6f  , if N is set to
6830: 20 30 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a   0 then the.  **
6840: 20 75 70 70 65 72 20 6c 61 79 65 72 73 20 77 69   upper layers wi
6850: 6c 6c 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 20  ll never invoke 
6860: 74 68 65 20 78 46 65 74 63 68 20 69 6e 74 65 72  the xFetch inter
6870: 66 61 63 65 73 20 74 6f 20 74 68 65 20 56 46 53  faces to the VFS
6880: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
6890: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66  ite3StrICmp(zLef
68a0: 74 2c 22 6d 6d 61 70 5f 6c 69 6d 69 74 22 29 3d  t,"mmap_limit")=
68b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
68c0: 33 5f 69 6e 74 36 34 20 6d 78 3b 0a 20 20 20 20  3_int64 mx;.    
68d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
68e0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
68f0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
6900: 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b 0a    if( zRight ){.
6910: 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
6920: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36      sqlite3Atoi6
6930: 34 28 7a 52 69 67 68 74 2c 20 26 6d 78 2c 20 31  4(zRight, &mx, 1
6940: 30 30 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  000, SQLITE_UTF8
6950: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 3c  );.      if( mx<
6960: 30 20 29 20 6d 78 20 3d 20 73 71 6c 69 74 65 33  0 ) mx = sqlite3
6970: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
6980: 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  map;.      if( p
6990: 49 64 32 2d 3e 6e 3d 3d 30 20 29 20 64 62 2d 3e  Id2->n==0 ) db->
69a0: 6d 78 4d 6d 61 70 20 3d 20 6d 78 3b 0a 20 20 20  mxMmap = mx;.   
69b0: 20 20 20 66 6f 72 28 69 69 3d 64 62 2d 3e 6e 44     for(ii=db->nD
69c0: 62 2d 31 3b 20 69 69 3e 3d 30 3b 20 69 69 2d 2d  b-1; ii>=0; ii--
69d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  ){.        if( d
69e0: 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 20 26  b->aDb[ii].pBt &
69f0: 26 20 28 69 69 3d 3d 69 44 62 20 7c 7c 20 70 49  & (ii==iDb || pI
6a00: 64 32 2d 3e 6e 3d 3d 30 29 20 29 7b 0a 20 20 20  d2->n==0) ){.   
6a10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
6a20: 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
6a30: 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c  db->aDb[ii].pBt,
6a40: 20 6d 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   mx);.        }.
6a50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6a60: 20 20 6d 78 20 3d 20 2d 31 3b 0a 20 20 20 20 69    mx = -1;.    i
6a70: 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  f( sqlite3_file_
6a80: 63 6f 6e 74 72 6f 6c 28 64 62 2c 7a 44 62 2c 53  control(db,zDb,S
6a90: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
6aa0: 5f 4c 49 4d 49 54 2c 26 6d 78 29 3d 3d 53 51 4c  _LIMIT,&mx)==SQL
6ab0: 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 64 65  ITE_OK ){.#if de
6ac0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 53  fined(SQLITE_DIS
6ad0: 41 42 4c 45 5f 4d 4d 41 50 29 0a 20 20 20 20 20  ABLE_MMAP).     
6ae0: 20 6d 78 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a   mx = 0;.#endif.
6af0: 20 20 20 20 20 20 72 65 74 75 72 6e 53 69 6e 67        returnSing
6b00: 6c 65 49 6e 74 28 70 50 61 72 73 65 2c 20 22 6d  leInt(pParse, "m
6b10: 6d 61 70 5f 6c 69 6d 69 74 22 2c 20 6d 78 29 3b  map_limit", mx);
6b20: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
6b30: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
6b40: 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20  MA temp_store.  
6b50: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
6b60: 5f 73 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c  _store = "defaul
6b70: 74 22 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c  t"|"memory"|"fil
6b80: 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  e".  **.  ** Ret
6b90: 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c  urn or set the l
6ba0: 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68  ocal value of th
6bb0: 65 20 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61  e temp_store fla
6bc0: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
6bd0: 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  * the local valu
6be0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20  e does not make 
6bf0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
6c00: 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65  isk file and the
6c10: 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61   default.  ** va
6c20: 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74  lue will be rest
6c30: 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69  ored the next ti
6c40: 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  me the database 
6c50: 69 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a  is opened..  **.
6c60: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69    ** Note that i
6c70: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
6c80: 72 20 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f  r the library co
6c90: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
6ca0: 6e 73 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72  ns to.  ** overr
6cb0: 69 64 65 20 74 68 69 73 20 73 65 74 74 69 6e 67  ide this setting
6cc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
6cd0: 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  te3StrICmp(zLeft
6ce0: 2c 20 22 74 65 6d 70 5f 73 74 6f 72 65 22 29 3d  , "temp_store")=
6cf0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 7a  =0 ){.    if( !z
6d00: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 72  Right ){.      r
6d10: 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28 70  eturnSingleInt(p
6d20: 50 61 72 73 65 2c 20 22 74 65 6d 70 5f 73 74 6f  Parse, "temp_sto
6d30: 72 65 22 2c 20 64 62 2d 3e 74 65 6d 70 5f 73 74  re", db->temp_st
6d40: 6f 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ore);.    }else{
6d50: 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 65 6d  .      changeTem
6d60: 70 53 74 6f 72 61 67 65 28 70 50 61 72 73 65 2c  pStorage(pParse,
6d70: 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a   zRight);.    }.
6d80: 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20    }else..  /*.  
6d90: 2a 2a 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70  **   PRAGMA temp
6da0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
6db0: 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 74  .  **   PRAGMA t
6dc0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
6dd0: 6f 72 79 20 3d 20 22 22 7c 22 64 69 72 65 63 74  ory = ""|"direct
6de0: 6f 72 79 5f 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20  ory_name".  **. 
6df0: 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65   ** Return or se
6e00: 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  t the local valu
6e10: 65 20 6f 66 20 74 68 65 20 74 65 6d 70 5f 73 74  e of the temp_st
6e20: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 66 6c  ore_directory fl
6e30: 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20  ag.  Changing.  
6e40: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 73 65 74  ** the value set
6e50: 73 20 61 20 73 70 65 63 69 66 69 63 20 64 69 72  s a specific dir
6e60: 65 63 74 6f 72 79 20 74 6f 20 62 65 20 75 73 65  ectory to be use
6e70: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
6e80: 66 69 6c 65 73 2e 0a 20 20 2a 2a 20 53 65 74 74  files..  ** Sett
6e90: 69 6e 67 20 74 6f 20 61 20 6e 75 6c 6c 20 73 74  ing to a null st
6ea0: 72 69 6e 67 20 72 65 76 65 72 74 73 20 74 6f 20  ring reverts to 
6eb0: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 6d 70  the default temp
6ec0: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
6ed0: 73 65 61 72 63 68 2e 0a 20 20 2a 2a 20 49 66 20  search..  ** If 
6ee0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
6ef0: 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ory is changed, 
6f00: 74 68 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 54  then invalidateT
6f10: 65 6d 70 53 74 6f 72 61 67 65 2e 0a 20 20 2a 2a  empStorage..  **
6f20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
6f30: 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  te3StrICmp(zLeft
6f40: 2c 20 22 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  , "temp_store_di
6f50: 72 65 63 74 6f 72 79 22 29 3d 3d 30 20 29 7b 0a  rectory")==0 ){.
6f60: 20 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20      if( !zRight 
6f70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
6f80: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
6f90: 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ory ){.        s
6fa0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
6fb0: 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20  Cols(v, 1);.    
6fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
6fd0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
6fe0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20  COLNAME_NAME, . 
6ff0: 20 20 20 20 20 20 20 20 20 20 20 22 74 65 6d 70             "temp
7000: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
7010: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ", SQLITE_STATIC
7020: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7030: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
7040: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 31  OP_String8, 0, 1
7050: 2c 20 30 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  , 0, sqlite3_tem
7060: 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 30 29 3b  p_directory, 0);
7070: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7080: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7090: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 31  _ResultRow, 1, 1
70a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
70b0: 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53 51  else{.#ifndef SQ
70c0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
70d0: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 5b 30      if( zRight[0
70e0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ] ){.        int
70f0: 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
7100: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
7110: 73 73 28 64 62 2d 3e 70 56 66 73 2c 20 7a 52 69  ss(db->pVfs, zRi
7120: 67 68 74 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ght, SQLITE_ACCE
7130: 53 53 5f 52 45 41 44 57 52 49 54 45 2c 20 26 72  SS_READWRITE, &r
7140: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
7150: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
7160: 7c 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  | res==0 ){.    
7170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7180: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
7190: 6f 74 20 61 20 77 72 69 74 61 62 6c 65 20 64 69  ot a writable di
71a0: 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20  rectory");.     
71b0: 20 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61       goto pragma
71c0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
71d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
71e0: 28 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  ( SQLITE_TEMP_ST
71f0: 4f 52 45 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  ORE==0.       ||
7200: 20 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54   (SQLITE_TEMP_ST
7210: 4f 52 45 3d 3d 31 20 26 26 20 64 62 2d 3e 74 65  ORE==1 && db->te
7220: 6d 70 5f 73 74 6f 72 65 3c 3d 31 29 0a 20 20 20  mp_store<=1).   
7230: 20 20 20 20 7c 7c 20 28 53 51 4c 49 54 45 5f 54      || (SQLITE_T
7240: 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 20 26 26 20  EMP_STORE==2 && 
7250: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d  db->temp_store==
7260: 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
7270: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 54 65      invalidateTe
7280: 6d 70 53 74 6f 72 61 67 65 28 70 50 61 72 73 65  mpStorage(pParse
7290: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
72a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 71   sqlite3_free(sq
72b0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
72c0: 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28  tory);.      if(
72d0: 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20   zRight[0] ){.  
72e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
72f0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 73  mp_directory = s
7300: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
7310: 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20  %s", zRight);.  
7320: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7330: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f     sqlite3_temp_
7340: 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20  directory = 0;. 
7350: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a       }.#endif /*
7360: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44   SQLITE_OMIT_WSD
7370: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   */.    }.  }els
7380: 65 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  e..#if SQLITE_OS
7390: 5f 57 49 4e 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  _WIN.  /*.  **  
73a0: 20 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f   PRAGMA data_sto
73b0: 72 65 5f 64 69 72 65 63 74 6f 72 79 0a 20 20 2a  re_directory.  *
73c0: 2a 20 20 20 50 52 41 47 4d 41 20 64 61 74 61 5f  *   PRAGMA data_
73d0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
73e0: 3d 20 22 22 7c 22 64 69 72 65 63 74 6f 72 79 5f  = ""|"directory_
73f0: 6e 61 6d 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  name".  **.  ** 
7400: 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68  Return or set th
7410: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66  e local value of
7420: 20 74 68 65 20 64 61 74 61 5f 73 74 6f 72 65 5f   the data_store_
7430: 64 69 72 65 63 74 6f 72 79 20 66 6c 61 67 2e 20  directory flag. 
7440: 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74   Changing.  ** t
7450: 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61 20  he value sets a 
7460: 73 70 65 63 69 66 69 63 20 64 69 72 65 63 74 6f  specific directo
7470: 72 79 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ry to be used fo
7480: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  r database files
7490: 20 74 68 61 74 0a 20 20 2a 2a 20 77 65 72 65 20   that.  ** were 
74a0: 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61  specified with a
74b0: 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
74c0: 6d 65 2e 20 20 53 65 74 74 69 6e 67 20 74 6f 20  me.  Setting to 
74d0: 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 20 72 65  a null string re
74e0: 76 65 72 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68  verts.  ** to th
74f0: 65 20 64 65 66 61 75 6c 74 20 64 61 74 61 62 61  e default databa
7500: 73 65 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68  se directory, wh
7510: 69 63 68 20 66 6f 72 20 64 61 74 61 62 61 73 65  ich for database
7520: 20 66 69 6c 65 73 20 73 70 65 63 69 66 69 65 64   files specified
7530: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 6c   with.  ** a rel
7540: 61 74 69 76 65 20 70 61 74 68 20 77 69 6c 6c 20  ative path will 
7550: 70 72 6f 62 61 62 6c 79 20 62 65 20 62 61 73 65  probably be base
7560: 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
7570: 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74   directory for t
7580: 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e  he.  ** process.
7590: 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
75a0: 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20 61  specified with a
75b0: 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20  n absolute path 
75c0: 61 72 65 20 6e 6f 74 20 69 6d 70 61 63 74 65 64  are not impacted
75d0: 0a 20 20 2a 2a 20 62 79 20 74 68 69 73 20 73 65  .  ** by this se
75e0: 74 74 69 6e 67 2c 20 72 65 67 61 72 64 6c 65 73  tting, regardles
75f0: 73 20 6f 66 20 69 74 73 20 76 61 6c 75 65 2e 0a  s of its value..
7600: 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 69 66 28 20    **.  */.  if( 
7610: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
7620: 4c 65 66 74 2c 20 22 64 61 74 61 5f 73 74 6f 72  Left, "data_stor
7630: 65 5f 64 69 72 65 63 74 6f 72 79 22 29 3d 3d 30  e_directory")==0
7640: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 7a 52 69   ){.    if( !zRi
7650: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ght ){.      if(
7660: 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
7670: 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 20  rectory ){.     
7680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7690: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a  tNumCols(v, 1);.
76a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
76b0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
76c0: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
76d0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
76e0: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
76f0: 74 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 53 54  tory", SQLITE_ST
7700: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
7710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
7720: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
7730: 30 2c 20 31 2c 20 30 2c 20 73 71 6c 69 74 65 33  0, 1, 0, sqlite3
7740: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
7750: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
7760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7770: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
7780: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 1);.      }. 
7790: 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65     }else{.#ifnde
77a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  f SQLITE_OMIT_WS
77b0: 44 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69 67  D.      if( zRig
77c0: 68 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ht[0] ){.       
77d0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
77e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
77f0: 41 63 63 65 73 73 28 64 62 2d 3e 70 56 66 73 2c  Access(db->pVfs,
7800: 20 7a 52 69 67 68 74 2c 20 53 51 4c 49 54 45 5f   zRight, SQLITE_
7810: 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
7820: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
7830: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7840: 4f 4b 20 7c 7c 20 72 65 73 3d 3d 30 20 29 7b 0a  OK || res==0 ){.
7850: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7860: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7870: 2c 20 22 6e 6f 74 20 61 20 77 72 69 74 61 62 6c  , "not a writabl
7880: 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b 0a 20  e directory");. 
7890: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 72           goto pr
78a0: 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20  agma_out;.      
78b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
78c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
78d0: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
78e0: 63 74 6f 72 79 29 3b 0a 20 20 20 20 20 20 69 66  ctory);.      if
78f0: 28 20 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20  ( zRight[0] ){. 
7900: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
7910: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
7920: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
7930: 22 25 73 22 2c 20 7a 52 69 67 68 74 29 3b 0a 20  "%s", zRight);. 
7940: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7950: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
7960: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
7970: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f        }.#endif /
7980: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  * SQLITE_OMIT_WS
7990: 44 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  D */.    }.  }el
79a0: 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  se.#endif..#if !
79b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
79c0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
79d0: 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e  YLE).#  if defin
79e0: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20  ed(__APPLE__).# 
79f0: 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
7a00: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
7a10: 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a  STYLE 1.#  else.
7a20: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
7a30: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
7a40: 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64  G_STYLE 0.#  end
7a50: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  if.#endif.#if SQ
7a60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
7a70: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 2f 2a 0a 20  ING_STYLE.  /*. 
7a80: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 64    **   PRAGMA [d
7a90: 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
7aa0: 6f 78 79 5f 66 69 6c 65 0a 20 20 20 2a 2a 20 20  oxy_file.   **  
7ab0: 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
7ac0: 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
7ad0: 6c 65 20 3d 20 22 3a 61 75 74 6f 3a 22 7c 22 6c  le = ":auto:"|"l
7ae0: 6f 63 6b 5f 66 69 6c 65 5f 70 61 74 68 22 0a 20  ock_file_path". 
7af0: 20 20 2a 2a 0a 20 20 20 2a 2a 20 52 65 74 75 72    **.   ** Retur
7b00: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 76 61 6c  n or set the val
7b10: 75 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 5f 70  ue of the lock_p
7b20: 72 6f 78 79 5f 66 69 6c 65 20 66 6c 61 67 2e 20  roxy_file flag. 
7b30: 20 43 68 61 6e 67 69 6e 67 0a 20 20 20 2a 2a 20   Changing.   ** 
7b40: 74 68 65 20 76 61 6c 75 65 20 73 65 74 73 20 61  the value sets a
7b50: 20 73 70 65 63 69 66 69 63 20 66 69 6c 65 20 74   specific file t
7b60: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 64 61  o be used for da
7b70: 74 61 62 61 73 65 20 61 63 63 65 73 73 20 6c 6f  tabase access lo
7b80: 63 6b 73 2e 0a 20 20 20 2a 2a 0a 20 20 20 2a 2f  cks..   **.   */
7b90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
7ba0: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 6c 6f  rICmp(zLeft, "lo
7bb0: 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 22 29 3d  ck_proxy_file")=
7bc0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 7a  =0 ){.    if( !z
7bd0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 50  Right ){.      P
7be0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
7bf0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
7c00: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
7c10: 20 20 63 68 61 72 20 2a 70 72 6f 78 79 5f 66 69    char *proxy_fi
7c20: 6c 65 5f 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  le_path = NULL;.
7c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7c40: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
7c50: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
7c60: 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
7c70: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
7c80: 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49  Hint(pFile, SQLI
7c90: 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
7ca0: 46 49 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  FILE, .         
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 20 20 26 70 72 6f 78 79 5f 66 69 6c 65 5f 70 61    &proxy_file_pa
7cd0: 74 68 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  th);.      .    
7ce0: 20 20 69 66 28 20 70 72 6f 78 79 5f 66 69 6c 65    if( proxy_file
7cf0: 5f 70 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  _path ){.       
7d00: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
7d10: 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20  umCols(v, 1);.  
7d20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7d30: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30  eSetColName(v, 0
7d40: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
7d50: 0a 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 22                 "
7d70: 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 22  lock_proxy_file"
7d80: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7d90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7da0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
7db0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 31 2c  P_String8, 0, 1,
7dc0: 20 30 2c 20 70 72 6f 78 79 5f 66 69 6c 65 5f 70   0, proxy_file_p
7dd0: 61 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ath, 0);.       
7de0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7df0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
7e00: 6f 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  ow, 1, 1);.     
7e10: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
7e20: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
7e30: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
7e40: 50 61 67 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Pager(pDb->pBt);
7e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7e60: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c  ile *pFile = sql
7e70: 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
7e80: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74  ager);.      int
7e90: 20 72 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20   res;.      if( 
7ea0: 7a 52 69 67 68 74 5b 30 5d 20 29 7b 0a 20 20 20  zRight[0] ){.   
7eb0: 20 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33       res=sqlite3
7ec0: 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46  OsFileControl(pF
7ed0: 69 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ile, SQLITE_SET_
7ee0: 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a  LOCKPROXYFILE, .
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 20 20 20 20 20 7a 52 69 67 68 74 29 3b 0a 20 20       zRight);.  
7f20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
7f30: 20 20 20 20 20 72 65 73 3d 73 71 6c 69 74 65 33       res=sqlite3
7f40: 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46  OsFileControl(pF
7f50: 69 6c 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ile, SQLITE_SET_
7f60: 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 0a  LOCKPROXYFILE, .
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20       NULL);.    
7fa0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
7fb0: 73 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  s!=SQLITE_OK ){.
7fc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7fd0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7fe0: 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 6c  "failed to set l
7ff0: 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 22 29  ock proxy file")
8000: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
8010: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20  ragma_out;.     
8020: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
8030: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8040: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
8050: 5f 53 54 59 4c 45 20 2a 2f 20 20 20 20 20 20 0a  _STYLE */      .
8060: 20 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20      .  /*.  **  
8070: 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
8080: 65 2e 5d 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  e.]synchronous. 
8090: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 5b 64 61   **   PRAGMA [da
80a0: 74 61 62 61 73 65 2e 5d 73 79 6e 63 68 72 6f 6e  tabase.]synchron
80b0: 6f 75 73 3d 4f 46 46 7c 4f 4e 7c 4e 4f 52 4d 41  ous=OFF|ON|NORMA
80c0: 4c 7c 46 55 4c 4c 0a 20 20 2a 2a 0a 20 20 2a 2a  L|FULL.  **.  **
80d0: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
80e0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
80f0: 66 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75  f the synchronou
8100: 73 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e  s flag.  Changin
8110: 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c  g.  ** the local
8120: 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20   value does not 
8130: 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20  make changes to 
8140: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e  the disk file an
8150: 64 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75  d the.  ** defau
8160: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
8170: 20 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65   restored the ne
8180: 78 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  xt time the data
8190: 62 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65  base is.  ** ope
81a0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
81b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
81c0: 4c 65 66 74 2c 22 73 79 6e 63 68 72 6f 6e 6f 75  Left,"synchronou
81d0: 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  s")==0 ){.    if
81e0: 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
81f0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
8200: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
8210: 20 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29     if( !zRight )
8220: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 53 69  {.      returnSi
8230: 6e 67 6c 65 49 6e 74 28 70 50 61 72 73 65 2c 20  ngleInt(pParse, 
8240: 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 70  "synchronous", p
8250: 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
8260: 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  -1);.    }else{.
8270: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 61        if( !db->a
8280: 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
8290: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
82a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
82b0: 20 20 20 20 20 20 20 20 20 20 22 53 61 66 65 74            "Safet
82c0: 79 20 6c 65 76 65 6c 20 6d 61 79 20 6e 6f 74 20  y level may not 
82d0: 62 65 20 63 68 61 6e 67 65 64 20 69 6e 73 69 64  be changed insid
82e0: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22  e a transaction"
82f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8300: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66          pDb->saf
8310: 65 74 79 5f 6c 65 76 65 6c 20 3d 20 67 65 74 53  ety_level = getS
8320: 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67 68  afetyLevel(zRigh
8330: 74 2c 30 2c 31 29 2b 31 3b 0a 20 20 20 20 20 20  t,0,1)+1;.      
8340: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
8350: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8360: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
8370: 4d 41 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  MAS */..#ifndef 
8380: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 41 47  SQLITE_OMIT_FLAG
8390: 5f 50 52 41 47 4d 41 53 0a 20 20 69 66 28 20 66  _PRAGMAS.  if( f
83a0: 6c 61 67 50 72 61 67 6d 61 28 70 50 61 72 73 65  lagPragma(pParse
83b0: 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 29  , zLeft, zRight)
83c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
83d0: 6c 61 67 50 72 61 67 6d 61 28 29 20 73 75 62 72  lagPragma() subr
83e0: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 67 65 6e 65  outine also gene
83f0: 72 61 74 65 73 20 61 6e 79 20 6e 65 63 65 73 73  rates any necess
8400: 61 72 79 20 63 6f 64 65 0a 20 20 20 20 2a 2a 20  ary code.    ** 
8410: 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
8420: 20 6d 6f 72 65 20 74 6f 20 64 6f 20 68 65 72 65   more to do here
8430: 20 2a 2f 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64   */.  }else.#end
8440: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
8450: 54 5f 46 4c 41 47 5f 50 52 41 47 4d 41 53 20 2a  T_FLAG_PRAGMAS *
8460: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
8470: 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 50 52  E_OMIT_SCHEMA_PR
8480: 41 47 4d 41 53 0a 20 20 2f 2a 0a 20 20 2a 2a 20  AGMAS.  /*.  ** 
8490: 20 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69    PRAGMA table_i
84a0: 6e 66 6f 28 3c 74 61 62 6c 65 3e 29 0a 20 20 2a  nfo(<table>).  *
84b0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 20  *.  ** Return a 
84c0: 73 69 6e 67 6c 65 20 72 6f 77 20 66 6f 72 20 65  single row for e
84d0: 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
84e0: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 20 54  e named table. T
84f0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
8500: 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ** the returned 
8510: 64 61 74 61 20 73 65 74 20 61 72 65 3a 0a 20 20  data set are:.  
8520: 2a 2a 0a 20 20 2a 2a 20 63 69 64 3a 20 20 20 20  **.  ** cid:    
8530: 20 20 20 20 43 6f 6c 75 6d 6e 20 69 64 20 28 6e      Column id (n
8540: 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66  umbered from lef
8550: 74 20 74 6f 20 72 69 67 68 74 2c 20 73 74 61 72  t to right, star
8560: 74 69 6e 67 20 61 74 20 30 29 0a 20 20 2a 2a 20  ting at 0).  ** 
8570: 6e 61 6d 65 3a 20 20 20 20 20 20 20 43 6f 6c 75  name:       Colu
8580: 6d 6e 20 6e 61 6d 65 0a 20 20 2a 2a 20 74 79 70  mn name.  ** typ
8590: 65 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  e:       Column 
85a0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
85b0: 2e 0a 20 20 2a 2a 20 6e 6f 74 6e 75 6c 6c 3a 20  ..  ** notnull: 
85c0: 20 20 20 54 72 75 65 20 69 66 20 27 4e 4f 54 20     True if 'NOT 
85d0: 4e 55 4c 4c 27 20 69 73 20 70 61 72 74 20 6f 66  NULL' is part of
85e0: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
85f0: 69 6f 6e 0a 20 20 2a 2a 20 64 66 6c 74 5f 76 61  ion.  ** dflt_va
8600: 6c 75 65 3a 20 54 68 65 20 64 65 66 61 75 6c 74  lue: The default
8610: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63   value for the c
8620: 6f 6c 75 6d 6e 2c 20 69 66 20 61 6e 79 2e 0a 20  olumn, if any.. 
8630: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
8640: 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  3StrICmp(zLeft, 
8650: 22 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30  "table_info")==0
8660: 20 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20   && zRight ){.  
8670: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
8680: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
8690: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
86a0: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
86b0: 75 74 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  ut;.    pTab = s
86c0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
86d0: 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29  db, zRight, zDb)
86e0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
86f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6b  {.      int i, k
8700: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 64  ;.      int nHid
8710: 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 43  den = 0;.      C
8720: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 20  olumn *pCol;.   
8730: 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20     Index *pPk;. 
8740: 20 20 20 20 20 66 6f 72 28 70 50 6b 3d 70 54 61       for(pPk=pTa
8750: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 50 6b 20 26  b->pIndex; pPk &
8760: 26 20 70 50 6b 2d 3e 61 75 74 6f 49 6e 64 65 78  & pPk->autoIndex
8770: 21 3d 32 3b 20 70 50 6b 3d 70 50 6b 2d 3e 70 4e  !=2; pPk=pPk->pN
8780: 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 73 71 6c  ext){}.      sql
8790: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
87a0: 6c 73 28 76 2c 20 36 29 3b 0a 20 20 20 20 20 20  ls(v, 6);.      
87b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 36  pParse->nMem = 6
87c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
87d0: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
87e0: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
87f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8800: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
8810: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 63  COLNAME_NAME, "c
8820: 69 64 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  id", SQLITE_STAT
8830: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
8840: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8850: 28 76 2c 20 31 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, 1, COLNAME_N
8860: 41 4d 45 2c 20 22 6e 61 6d 65 22 2c 20 53 51 4c  AME, "name", SQL
8870: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
8880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8890: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 32 2c 20 43  tColName(v, 2, C
88a0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 74 79  OLNAME_NAME, "ty
88b0: 70 65 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  pe", SQLITE_STAT
88c0: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
88d0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
88e0: 28 76 2c 20 33 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, 3, COLNAME_N
88f0: 41 4d 45 2c 20 22 6e 6f 74 6e 75 6c 6c 22 2c 20  AME, "notnull", 
8900: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
8910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8920: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 34  eSetColName(v, 4
8930: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8940: 22 64 66 6c 74 5f 76 61 6c 75 65 22 2c 20 53 51  "dflt_value", SQ
8950: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
8960: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8970: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 35 2c 20  etColName(v, 5, 
8980: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 70  COLNAME_NAME, "p
8990: 6b 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  k", SQLITE_STATI
89a0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
89b0: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
89c0: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
89d0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
89e0: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
89f0: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
8a00: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
8a10: 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64         if( IsHid
8a20: 64 65 6e 43 6f 6c 75 6d 6e 28 70 43 6f 6c 29 20  denColumn(pCol) 
8a30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69  ){.          nHi
8a40: 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  dden++;.        
8a50: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8a60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
8a70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8a80: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
8a90: 2d 6e 48 69 64 64 65 6e 2c 20 31 29 3b 0a 20 20  -nHidden, 1);.  
8aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ab0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
8ac0: 72 69 6e 67 38 2c 20 30 2c 20 32 2c 20 30 2c 20  ring8, 0, 2, 0, 
8ad0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pCol->zName, 0);
8ae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8af0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
8b00: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20  _String8, 0, 3, 
8b10: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 43  0,.           pC
8b20: 6f 6c 2d 3e 7a 54 79 70 65 20 3f 20 70 43 6f 6c  ol->zType ? pCol
8b30: 2d 3e 7a 54 79 70 65 20 3a 20 22 22 2c 20 30 29  ->zType : "", 0)
8b40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8b50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8b60: 50 5f 49 6e 74 65 67 65 72 2c 20 28 70 43 6f 6c  P_Integer, (pCol
8b70: 2d 3e 6e 6f 74 4e 75 6c 6c 20 3f 20 31 20 3a 20  ->notNull ? 1 : 
8b80: 30 29 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0), 4);.        
8b90: 69 66 28 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20  if( pCol->zDflt 
8ba0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
8bb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
8bc0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
8bd0: 20 35 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 43   5, 0, (char*)pC
8be0: 6f 6c 2d 3e 7a 44 66 6c 74 2c 20 30 29 3b 0a 20  ol->zDflt, 0);. 
8bf0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8c00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8c10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8c20: 4e 75 6c 6c 2c 20 30 2c 20 35 29 3b 0a 20 20 20  Null, 0, 5);.   
8c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8c40: 66 28 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61  f( (pCol->colFla
8c50: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49  gs & COLFLAG_PRI
8c60: 4d 4b 45 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MKEY)==0 ){.    
8c70: 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20        k = 0;.   
8c80: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
8c90: 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pk==0 ){.       
8ca0: 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20     k = 1;.      
8cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8cc0: 20 20 20 66 6f 72 28 6b 3d 31 3b 20 41 4c 57 41     for(k=1; ALWA
8cd0: 59 53 28 6b 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  YS(k<=pTab->nCol
8ce0: 29 20 26 26 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  ) && pPk->aiColu
8cf0: 6d 6e 5b 6b 2d 31 5d 21 3d 69 3b 20 6b 2b 2b 29  mn[k-1]!=i; k++)
8d00: 7b 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  {}.        }.   
8d10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8d20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
8d30: 65 67 65 72 2c 20 6b 2c 20 36 29 3b 0a 20 20 20  eger, k, 6);.   
8d40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8d50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8d60: 75 6c 74 52 6f 77 2c 20 31 2c 20 36 29 3b 0a 20  ultRow, 1, 6);. 
8d70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8d80: 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
8d90: 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  te3StrICmp(zLeft
8da0: 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d  , "index_info")=
8db0: 3d 30 20 26 26 20 7a 52 69 67 68 74 20 29 7b 0a  =0 && zRight ){.
8dc0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
8dd0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
8de0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
8df0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
8e00: 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  se) ) goto pragm
8e10: 61 5f 6f 75 74 3b 0a 20 20 20 20 70 49 64 78 20  a_out;.    pIdx 
8e20: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
8e30: 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a  ex(db, zRight, z
8e40: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  Db);.    if( pId
8e50: 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  x ){.      int i
8e60: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
8e70: 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  Idx->pTable;.   
8e80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8e90: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 33 29 3b 0a  tNumCols(v, 3);.
8ea0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
8eb0: 65 6d 20 3d 20 33 3b 0a 20 20 20 20 20 20 73 71  em = 3;.      sq
8ec0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
8ed0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
8ee0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
8ef0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8f00: 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, 0, COLNAME_NA
8f10: 4d 45 2c 20 22 73 65 71 6e 6f 22 2c 20 53 51 4c  ME, "seqno", SQL
8f20: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
8f30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8f40: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 31 2c 20 43  tColName(v, 1, C
8f50: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 63 69  OLNAME_NAME, "ci
8f60: 64 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  d", SQLITE_STATI
8f70: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
8f80: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8f90: 76 2c 20 32 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, 2, COLNAME_NA
8fa0: 4d 45 2c 20 22 6e 61 6d 65 22 2c 20 53 51 4c 49  ME, "name", SQLI
8fb0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
8fc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
8fd0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
8fe0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6e  {.        int cn
8ff0: 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  um = pIdx->aiCol
9000: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
9010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9020: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9030: 20 69 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   i, 1);.        
9040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9050: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9060: 20 63 6e 75 6d 2c 20 32 29 3b 0a 20 20 20 20 20   cnum, 2);.     
9070: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
9080: 3e 6e 43 6f 6c 3e 63 6e 75 6d 20 29 3b 0a 20 20  >nCol>cnum );.  
9090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
90a0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
90b0: 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30 2c 20  ring8, 0, 3, 0, 
90c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d  pTab->aCol[cnum]
90d0: 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  .zName, 0);.    
90e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
90f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
9100: 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a 20 20  ltRow, 1, 3);.  
9110: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
9120: 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
9130: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
9140: 20 22 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d   "index_list")==
9150: 30 20 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20  0 && zRight ){. 
9160: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
9170: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
9180: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9190: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
91a0: 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61  e) ) goto pragma
91b0: 5f 6f 75 74 3b 0a 20 20 20 20 70 54 61 62 20 3d  _out;.    pTab =
91c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
91d0: 65 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44  e(db, zRight, zD
91e0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
91f0: 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71   ){.      v = sq
9200: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
9210: 72 73 65 29 3b 0a 20 20 20 20 20 20 70 49 64 78  rse);.      pIdx
9220: 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
9230: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20  .      if( pIdx 
9240: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
9250: 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 20 20 73   = 0; .        s
9260: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
9270: 43 6f 6c 73 28 76 2c 20 33 29 3b 0a 20 20 20 20  Cols(v, 3);.    
9280: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9290: 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 73 71   = 3;.        sq
92a0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
92b0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
92c0: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
92d0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
92e0: 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, 0, COLNAME_
92f0: 4e 41 4d 45 2c 20 22 73 65 71 22 2c 20 53 51 4c  NAME, "seq", SQL
9300: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
9310: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9320: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 31 2c  SetColName(v, 1,
9330: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22   COLNAME_NAME, "
9340: 6e 61 6d 65 22 2c 20 53 51 4c 49 54 45 5f 53 54  name", SQLITE_ST
9350: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
9360: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
9370: 4e 61 6d 65 28 76 2c 20 32 2c 20 43 4f 4c 4e 41  Name(v, 2, COLNA
9380: 4d 45 5f 4e 41 4d 45 2c 20 22 75 6e 69 71 75 65  ME_NAME, "unique
9390: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ", SQLITE_STATIC
93a0: 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
93b0: 28 70 49 64 78 29 7b 0a 20 20 20 20 20 20 20 20  (pIdx){.        
93c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
93d0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
93e0: 72 2c 20 69 2c 20 31 29 3b 0a 20 20 20 20 20 20  r, i, 1);.      
93f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9400: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
9410: 6e 67 38 2c 20 30 2c 20 32 2c 20 30 2c 20 70 49  ng8, 0, 2, 0, pI
9420: 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  dx->zName, 0);. 
9430: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9440: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9450: 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e  _Integer, pIdx->
9460: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
9470: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
9480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9490: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
94a0: 77 2c 20 31 2c 20 33 29 3b 0a 20 20 20 20 20 20  w, 1, 3);.      
94b0: 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20 20      ++i;.       
94c0: 20 20 20 70 49 64 78 20 3d 20 70 49 64 78 2d 3e     pIdx = pIdx->
94d0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
94e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
94f0: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
9500: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65  lite3StrICmp(zLe
9510: 66 74 2c 20 22 64 61 74 61 62 61 73 65 5f 6c 69  ft, "database_li
9520: 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  st")==0 ){.    i
9530: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 71  nt i;.    if( sq
9540: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
9550: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
9560: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 73  ragma_out;.    s
9570: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
9580: 43 6f 6c 73 28 76 2c 20 33 29 3b 0a 20 20 20 20  Cols(v, 3);.    
9590: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33  pParse->nMem = 3
95a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
95b0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30  eSetColName(v, 0
95c0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
95d0: 22 73 65 71 22 2c 20 53 51 4c 49 54 45 5f 53 54  "seq", SQLITE_ST
95e0: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
95f0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
9600: 28 76 2c 20 31 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, 1, COLNAME_N
9610: 41 4d 45 2c 20 22 6e 61 6d 65 22 2c 20 53 51 4c  AME, "name", SQL
9620: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
9630: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
9640: 6f 6c 4e 61 6d 65 28 76 2c 20 32 2c 20 43 4f 4c  olName(v, 2, COL
9650: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 66 69 6c 65  NAME_NAME, "file
9660: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ", SQLITE_STATIC
9670: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
9680: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
9690: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
96a0: 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 20 63  Db[i].pBt==0 ) c
96b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
96c0: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
96d0: 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ].zName!=0 );.  
96e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
96f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
9700: 67 65 72 2c 20 69 2c 20 31 29 3b 0a 20 20 20 20  ger, i, 1);.    
9710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9720: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
9730: 38 2c 20 30 2c 20 32 2c 20 30 2c 20 64 62 2d 3e  8, 0, 2, 0, db->
9740: 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29  aDb[i].zName, 0)
9750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9760: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
9770: 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30  String8, 0, 3, 0
9780: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
9790: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
97a0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  name(db->aDb[i].
97b0: 70 42 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  pBt), 0);.      
97c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
97d0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
97e0: 77 2c 20 31 2c 20 33 29 3b 0a 20 20 20 20 7d 0a  w, 1, 3);.    }.
97f0: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
9800: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c  qlite3StrICmp(zL
9810: 65 66 74 2c 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f  eft, "collation_
9820: 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  list")==0 ){.   
9830: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
9840: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
9850: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
9860: 75 6d 43 6f 6c 73 28 76 2c 20 32 29 3b 0a 20 20  umCols(v, 2);.  
9870: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
9880: 20 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   2;.    sqlite3V
9890: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
98a0: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
98b0: 2c 20 22 73 65 71 22 2c 20 53 51 4c 49 54 45 5f  , "seq", SQLITE_
98c0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
98d0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
98e0: 6d 65 28 76 2c 20 31 2c 20 43 4f 4c 4e 41 4d 45  me(v, 1, COLNAME
98f0: 5f 4e 41 4d 45 2c 20 22 6e 61 6d 65 22 2c 20 53  _NAME, "name", S
9900: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
9910: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48     for(p=sqliteH
9920: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43  ashFirst(&db->aC
9930: 6f 6c 6c 53 65 71 29 3b 20 70 3b 20 70 3d 73 71  ollSeq); p; p=sq
9940: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29  liteHashNext(p))
9950: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
9960: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
9970: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
9980: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  ta(p);.      sql
9990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
99a0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2b  , OP_Integer, i+
99b0: 2b 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  +, 1);.      sql
99c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
99d0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
99e0: 20 32 2c 20 30 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e   2, 0, pColl->zN
99f0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ame, 0);.      s
9a00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9a10: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9a20: 2c 20 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 2);.    }. 
9a30: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
9a40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 43 48   SQLITE_OMIT_SCH
9a50: 45 4d 41 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  EMA_PRAGMAS */..
9a60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9a70: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
9a80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
9a90: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66 6f 72  ICmp(zLeft, "for
9aa0: 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 22 29 3d  eign_key_list")=
9ab0: 3d 30 20 26 26 20 7a 52 69 67 68 74 20 29 7b 0a  =0 && zRight ){.
9ac0: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 0a 20      FKey *pFK;. 
9ad0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
9ae0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
9af0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
9b00: 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f  ) ) goto pragma_
9b10: 6f 75 74 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  out;.    pTab = 
9b20: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
9b30: 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62  (db, zRight, zDb
9b40: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
9b50: 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c  ){.      v = sql
9b60: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
9b70: 73 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 20 3d  se);.      pFK =
9b80: 20 70 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20 20   pTab->pFKey;.  
9b90: 20 20 20 20 69 66 28 20 70 46 4b 20 29 7b 0a 20      if( pFK ){. 
9ba0: 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30         int i = 0
9bb0: 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
9bc0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
9bd0: 28 76 2c 20 38 29 3b 0a 20 20 20 20 20 20 20 20  (v, 8);.        
9be0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 38  pParse->nMem = 8
9bf0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9c00: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
9c10: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
9c20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9c30: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9c40: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
9c50: 2c 20 22 69 64 22 2c 20 53 51 4c 49 54 45 5f 53  , "id", SQLITE_S
9c60: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
9c70: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
9c80: 6c 4e 61 6d 65 28 76 2c 20 31 2c 20 43 4f 4c 4e  lName(v, 1, COLN
9c90: 41 4d 45 5f 4e 41 4d 45 2c 20 22 73 65 71 22 2c  AME_NAME, "seq",
9ca0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
9cb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9cc0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
9cd0: 2c 20 32 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 2, COLNAME_NAM
9ce0: 45 2c 20 22 74 61 62 6c 65 22 2c 20 53 51 4c 49  E, "table", SQLI
9cf0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
9d00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
9d10: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 33 2c 20  etColName(v, 3, 
9d20: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 66  COLNAME_NAME, "f
9d30: 72 6f 6d 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  rom", SQLITE_STA
9d40: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
9d50: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
9d60: 61 6d 65 28 76 2c 20 34 2c 20 43 4f 4c 4e 41 4d  ame(v, 4, COLNAM
9d70: 45 5f 4e 41 4d 45 2c 20 22 74 6f 22 2c 20 53 51  E_NAME, "to", SQ
9d80: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
9d90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9da0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 35  eSetColName(v, 5
9db0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
9dc0: 22 6f 6e 5f 75 70 64 61 74 65 22 2c 20 53 51 4c  "on_update", SQL
9dd0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
9de0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9df0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 36 2c  SetColName(v, 6,
9e00: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22   COLNAME_NAME, "
9e10: 6f 6e 5f 64 65 6c 65 74 65 22 2c 20 53 51 4c 49  on_delete", SQLI
9e20: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
9e30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
9e40: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 37 2c 20  etColName(v, 7, 
9e50: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 6d  COLNAME_NAME, "m
9e60: 61 74 63 68 22 2c 20 53 51 4c 49 54 45 5f 53 54  atch", SQLITE_ST
9e70: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 77  ATIC);.        w
9e80: 68 69 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20  hile(pFK){.     
9e90: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
9ea0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
9eb0: 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  <pFK->nCol; j++)
9ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
9ed0: 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 46 4b 2d 3e  ar *zCol = pFK->
9ee0: 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 3b 0a 20 20  aCol[j].zCol;.  
9ef0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
9f00: 7a 4f 6e 44 65 6c 65 74 65 20 3d 20 28 63 68 61  zOnDelete = (cha
9f10: 72 20 2a 29 61 63 74 69 6f 6e 4e 61 6d 65 28 70  r *)actionName(p
9f20: 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 3b  FK->aAction[0]);
9f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
9f40: 72 20 2a 7a 4f 6e 55 70 64 61 74 65 20 3d 20 28  r *zOnUpdate = (
9f50: 63 68 61 72 20 2a 29 61 63 74 69 6f 6e 4e 61 6d  char *)actionNam
9f60: 65 28 70 46 4b 2d 3e 61 41 63 74 69 6f 6e 5b 31  e(pFK->aAction[1
9f70: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
9f80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f90: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9fa0: 20 69 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   i, 1);.        
9fb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9fc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
9fd0: 67 65 72 2c 20 6a 2c 20 32 29 3b 0a 20 20 20 20  ger, j, 2);.    
9fe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9ff0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a000: 53 74 72 69 6e 67 38 2c 20 30 2c 20 33 2c 20 30  String8, 0, 3, 0
a010: 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 30 29 3b 0a  , pFK->zTo, 0);.
a020: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a030: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
a040: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
a050: 34 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  4, 0,.          
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a070: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
a080: 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f  FK->aCol[j].iFro
a090: 6d 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  m].zName, 0);.  
a0a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a0b0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 7a  3VdbeAddOp4(v, z
a0c0: 43 6f 6c 20 3f 20 4f 50 5f 53 74 72 69 6e 67 38  Col ? OP_String8
a0d0: 20 3a 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 35   : OP_Null, 0, 5
a0e0: 2c 20 30 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20  , 0, zCol, 0);. 
a0f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a100: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a110: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 36  OP_String8, 0, 6
a120: 2c 20 30 2c 20 7a 4f 6e 55 70 64 61 74 65 2c 20  , 0, zOnUpdate, 
a130: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
a140: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a150: 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
a160: 20 30 2c 20 37 2c 20 30 2c 20 7a 4f 6e 44 65 6c   0, 7, 0, zOnDel
a170: 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ete, 0);.       
a180: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a190: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72  AddOp4(v, OP_Str
a1a0: 69 6e 67 38 2c 20 30 2c 20 38 2c 20 30 2c 20 22  ing8, 0, 8, 0, "
a1b0: 4e 4f 4e 45 22 2c 20 30 29 3b 0a 20 20 20 20 20  NONE", 0);.     
a1c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a1d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
a1e0: 65 73 75 6c 74 52 6f 77 2c 20 31 2c 20 38 29 3b  esultRow, 1, 8);
a1f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a200: 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20         ++i;.    
a210: 20 20 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d        pFK = pFK-
a220: 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20  >pNextFrom;.    
a230: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a240: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
a250: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
a260: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
a270: 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a 23 69 66 6e  GN_KEY) */..#ifn
a280: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a290: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 23 69 66 6e  FOREIGN_KEY.#ifn
a2a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a2b0: 54 52 49 47 47 45 52 0a 20 20 69 66 28 20 73 71  TRIGGER.  if( sq
a2c0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65  lite3StrICmp(zLe
a2d0: 66 74 2c 20 22 66 6f 72 65 69 67 6e 5f 6b 65 79  ft, "foreign_key
a2e0: 5f 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20  _check")==0 ){. 
a2f0: 20 20 20 46 4b 65 79 20 2a 70 46 4b 3b 20 20 20     FKey *pFK;   
a300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
a310: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
a320: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 54 61 62  raint */.    Tab
a330: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
a340: 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 74 61 62      /* Child tab
a350: 6c 65 20 63 6f 6e 74 61 69 6e 20 22 52 45 46 45  le contain "REFE
a360: 52 45 4e 43 45 53 22 20 6b 65 79 77 6f 72 64 20  RENCES" keyword 
a370: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 50  */.    Table *pP
a380: 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
a390: 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 74 68   Parent table th
a3a0: 61 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20  at child points 
a3b0: 74 6f 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  to */.    Index 
a3c0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
a3d0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 74 68 65   /* Index in the
a3e0: 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f   parent table */
a3f0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
a400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a410: 6f 6f 70 20 63 6f 75 6e 74 65 72 3a 20 20 46 6f  oop counter:  Fo
a420: 72 65 69 67 6e 20 6b 65 79 20 6e 75 6d 62 65 72  reign key number
a430: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20   for pTab */.   
a440: 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
a450: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a460: 63 6f 75 6e 74 65 72 3a 20 20 46 69 65 6c 64 20  counter:  Field 
a470: 6f 66 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  of the foreign k
a480: 65 79 20 2a 2f 0a 20 20 20 20 48 61 73 68 45 6c  ey */.    HashEl
a490: 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
a4a0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
a4b0: 3a 20 20 4e 65 78 74 20 74 61 62 6c 65 20 69 6e  :  Next table in
a4c0: 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69   schema */.    i
a4d0: 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20 20 20  nt x;           
a4e0: 20 20 20 20 20 20 2f 2a 20 72 65 73 75 6c 74 20        /* result 
a4f0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
a500: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
a510: 20 20 20 20 20 20 20 2f 2a 20 33 20 72 65 67 69         /* 3 regi
a520: 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 61 20  sters to hold a 
a530: 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
a540: 20 20 69 6e 74 20 72 65 67 4b 65 79 3b 20 20 20    int regKey;   
a550: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
a560: 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6b 65 79  ster to hold key
a570: 20 66 6f 72 20 63 68 65 63 6b 69 6e 67 20 74 68   for checking th
a580: 65 20 46 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  e FK */.    int 
a590: 72 65 67 52 6f 77 3b 20 20 20 20 20 20 20 20 20  regRow;         
a5a0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
a5b0: 74 6f 20 68 6f 6c 64 20 61 20 72 6f 77 20 66 72  to hold a row fr
a5c0: 6f 6d 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 69  om pTab */.    i
a5d0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
a5e0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
a5f0: 61 20 6c 6f 6f 70 20 63 68 65 63 6b 69 6e 67 20  a loop checking 
a600: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 2a 2f 0a  foreign keys */.
a610: 20 20 20 20 69 6e 74 20 61 64 64 72 4f 6b 3b 20      int addrOk; 
a620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
a630: 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6b  mp here if the k
a640: 65 79 20 69 73 20 4f 4b 20 2a 2f 0a 20 20 20 20  ey is OK */.    
a650: 69 6e 74 20 2a 61 69 43 6f 6c 73 3b 20 20 20 20  int *aiCols;    
a660: 20 20 20 20 20 20 20 2f 2a 20 63 68 69 6c 64 20         /* child 
a670: 74 6f 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e  to parent column
a680: 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 0a 20 20 20   mapping */..   
a690: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
a6a0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
a6b0: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
a6c0: 3b 0a 20 20 20 20 72 65 67 52 65 73 75 6c 74 20  ;.    regResult 
a6d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
a6e0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
a6f0: 65 6d 20 2b 3d 20 34 3b 0a 20 20 20 20 72 65 67  em += 4;.    reg
a700: 4b 65 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Key = ++pParse->
a710: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 52 6f 77  nMem;.    regRow
a720: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
a730: 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
a740: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
a750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a760: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
a770: 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  4);.    sqlite3V
a780: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
a790: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
a7a0: 2c 20 22 74 61 62 6c 65 22 2c 20 53 51 4c 49 54  , "table", SQLIT
a7b0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
a7c0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
a7d0: 4e 61 6d 65 28 76 2c 20 31 2c 20 43 4f 4c 4e 41  Name(v, 1, COLNA
a7e0: 4d 45 5f 4e 41 4d 45 2c 20 22 72 6f 77 69 64 22  ME_NAME, "rowid"
a7f0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
a800: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a810: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 32  eSetColName(v, 2
a820: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
a830: 22 70 61 72 65 6e 74 22 2c 20 53 51 4c 49 54 45  "parent", SQLITE
a840: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
a850: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
a860: 61 6d 65 28 76 2c 20 33 2c 20 43 4f 4c 4e 41 4d  ame(v, 3, COLNAM
a870: 45 5f 4e 41 4d 45 2c 20 22 66 6b 69 64 22 2c 20  E_NAME, "fkid", 
a880: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
a890: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
a8a0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
a8b0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6b 20  se, iDb);.    k 
a8c0: 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  = sqliteHashFirs
a8d0: 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t(&db->aDb[iDb].
a8e0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
a8f0: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 20  );.    while( k 
a900: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 69  ){.      if( zRi
a910: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ght ){.        p
a920: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
a930: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
a940: 20 30 2c 20 7a 52 69 67 68 74 2c 20 7a 44 62 29   0, zRight, zDb)
a950: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b  ;.        k = 0;
a960: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a970: 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
a980: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
a990: 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 20 20  ata(k);.        
a9a0: 6b 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 65  k = sqliteHashNe
a9b0: 78 74 28 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xt(k);.      }. 
a9c0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
a9d0: 20 7c 7c 20 70 54 61 62 2d 3e 70 46 4b 65 79 3d   || pTab->pFKey=
a9e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
a9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
aa00: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
aa10: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
aa20: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
aa30: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
aa40: 6e 43 6f 6c 2b 72 65 67 52 6f 77 3e 70 50 61 72  nCol+regRow>pPar
aa50: 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73  se->nMem ) pPars
aa60: 65 2d 3e 6e 4d 65 6d 20 3d 20 70 54 61 62 2d 3e  e->nMem = pTab->
aa70: 6e 43 6f 6c 20 2b 20 72 65 67 52 6f 77 3b 0a 20  nCol + regRow;. 
aa80: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
aa90: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
aaa0: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
aab0: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
aac0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aad0: 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
aae0: 20 30 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 30   0, regResult, 0
aaf0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pTab->zName,. 
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 20 20 50 34 5f 54 52 41 4e 53 49         P4_TRANSI
ab20: 45 4e 54 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ENT);.      for(
ab30: 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70  i=1, pFK=pTab->p
ab40: 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20  FKey; pFK; i++, 
ab50: 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72  pFK=pFK->pNextFr
ab60: 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  om){.        pPa
ab70: 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rent = sqlite3Lo
ab80: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
ab90: 2c 20 30 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a  , 0, pFK->zTo, z
aba0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Db);.        if(
abb0: 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 62 72   pParent==0 ) br
abc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64  eak;.        pId
abd0: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  x = 0;.        s
abe0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
abf0: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 50 61  pParse, iDb, pPa
ac00: 72 65 6e 74 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  rent->tnum, 0, p
ac10: 50 61 72 65 6e 74 2d 3e 7a 4e 61 6d 65 29 3b 0a  Parent->zName);.
ac20: 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69          x = sqli
ac30: 74 65 33 46 6b 4c 6f 63 61 74 65 49 6e 64 65 78  te3FkLocateIndex
ac40: 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74  (pParse, pParent
ac50: 2c 20 70 46 4b 2c 20 26 70 49 64 78 2c 20 30 29  , pFK, &pIdx, 0)
ac60: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3d  ;.        if( x=
ac70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ac80: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20  if( pIdx==0 ){. 
ac90: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
aca0: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
acb0: 73 65 2c 20 69 2c 20 69 44 62 2c 20 70 50 61 72  se, i, iDb, pPar
acc0: 65 6e 74 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  ent, OP_OpenRead
acd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
ace0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
acf0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
ad00: 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
ad10: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
ad20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
ad30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ad40: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
ad50: 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20   i, pIdx->tnum, 
ad60: 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iDb);.          
ad70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ad80: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
ad90: 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  ar*)pKey, P4_KEY
ada0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
adb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
adc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
add0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
ade0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
adf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ae00: 20 20 20 20 69 66 28 20 70 46 4b 20 29 20 62 72      if( pFK ) br
ae10: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
ae20: 50 61 72 73 65 2d 3e 6e 54 61 62 3c 69 20 29 20  Parse->nTab<i ) 
ae30: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69  pParse->nTab = i
ae40: 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20  ;.      addrTop 
ae50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ae60: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
ae70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
ae80: 69 3d 31 2c 20 70 46 4b 3d 70 54 61 62 2d 3e 70  i=1, pFK=pTab->p
ae90: 46 4b 65 79 3b 20 70 46 4b 3b 20 69 2b 2b 2c 20  FKey; pFK; i++, 
aea0: 70 46 4b 3d 70 46 4b 2d 3e 70 4e 65 78 74 46 72  pFK=pFK->pNextFr
aeb0: 6f 6d 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  om){.        pPa
aec0: 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rent = sqlite3Lo
aed0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
aee0: 2c 20 30 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 7a  , 0, pFK->zTo, z
aef0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Db);.        ass
af00: 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20  ert( pParent!=0 
af10: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  );.        pIdx 
af20: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 69 43  = 0;.        aiC
af30: 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ols = 0;.       
af40: 20 78 20 3d 20 73 71 6c 69 74 65 33 46 6b 4c 6f   x = sqlite3FkLo
af50: 63 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  cateIndex(pParse
af60: 2c 20 70 50 61 72 65 6e 74 2c 20 70 46 4b 2c 20  , pParent, pFK, 
af70: 26 70 49 64 78 2c 20 26 61 69 43 6f 6c 73 29 3b  &pIdx, &aiCols);
af80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
af90: 20 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   x==0 );.       
afa0: 20 61 64 64 72 4f 6b 20 3d 20 73 71 6c 69 74 65   addrOk = sqlite
afb0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
afc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
afd0: 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx==0 ){.      
afe0: 20 20 20 20 69 6e 74 20 69 4b 65 79 20 3d 20 70      int iKey = p
aff0: 46 4b 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f  FK->aCol[0].iFro
b000: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  m;.          ass
b010: 65 72 74 28 20 69 4b 65 79 3e 3d 30 20 26 26 20  ert( iKey>=0 && 
b020: 69 4b 65 79 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iKey<pTab->nCol 
b030: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
b040: 20 69 4b 65 79 21 3d 70 54 61 62 2d 3e 69 50 4b   iKey!=pTab->iPK
b050: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
b060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b070: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
b080: 2c 20 30 2c 20 69 4b 65 79 2c 20 72 65 67 52 6f  , 0, iKey, regRo
b090: 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  w);.            
b0a0: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
b0b0: 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 4b  ault(v, pTab, iK
b0c0: 65 79 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20  ey, regRow);.   
b0d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b0e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b0f0: 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 2c  _IsNull, regRow,
b100: 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20 20 20 20   addrOk);.      
b110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b120: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
b130: 73 74 42 65 49 6e 74 2c 20 72 65 67 52 6f 77 2c  stBeInt, regRow,
b140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b150: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
b160: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
b170: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b180: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b190: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b1a0: 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  OP_Rowid, 0, reg
b1b0: 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Row);.          
b1c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
b1d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b1e0: 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
b1f0: 2c 20 30 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  , 0, regRow);.  
b200: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b210: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b220: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 4f 6b 29  Goto, 0, addrOk)
b230: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b240: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b250: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
b260: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b  rrentAddr(v)-2);
b270: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b280: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
b290: 30 3b 20 6a 3c 70 46 4b 2d 3e 6e 43 6f 6c 3b 20  0; j<pFK->nCol; 
b2a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
b2b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b2c0: 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
b2d0: 65 28 76 2c 20 70 54 61 62 2c 20 30 2c 0a 20 20  e(v, pTab, 0,.  
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 20 20 20 20 20 20 20 20 20 20 61 69 43 6f 6c 73            aiCols
b300: 20 3f 20 61 69 43 6f 6c 73 5b 6a 5d 20 3a 20 70   ? aiCols[j] : p
b310: 46 4b 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f  FK->aCol[0].iFro
b320: 6d 2c 20 72 65 67 52 6f 77 2b 6a 29 3b 0a 20 20  m, regRow+j);.  
b330: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b340: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b350: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77  P_IsNull, regRow
b360: 2b 6a 2c 20 61 64 64 72 4f 6b 29 3b 0a 20 20 20  +j, addrOk);.   
b370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b390: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
b3a0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 70  ecord, regRow, p
b3b0: 46 4b 2d 3e 6e 43 6f 6c 2c 20 72 65 67 4b 65 79  FK->nCol, regKey
b3c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
b3d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
b3e0: 28 76 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20  (v, -1,.        
b3f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b400: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
b410: 74 72 28 76 2c 70 49 64 78 29 2c 20 50 34 5f 54  tr(v,pIdx), P4_T
b420: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
b430: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b440: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
b450: 46 6f 75 6e 64 2c 20 69 2c 20 61 64 64 72 4f 6b  Found, i, addrOk
b460: 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20  , regKey, 0);.  
b470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b490: 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30  2(v, OP_Rowid, 0
b4a0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 31 29 3b 0a  , regResult+1);.
b4b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b4c0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
b4d0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 52  String8, 0, regR
b4e0: 65 73 75 6c 74 2b 32 2c 20 30 2c 20 0a 20 20 20  esult+2, 0, .   
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 20 20 20 20 20 20 70 46 4b 2d 3e 7a 54 6f 2c         pFK->zTo,
b510: 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P4_TRANSIENT);.
b520: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b530: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b540: 49 6e 74 65 67 65 72 2c 20 69 2d 31 2c 20 72 65  Integer, i-1, re
b550: 67 52 65 73 75 6c 74 2b 33 29 3b 0a 20 20 20 20  gResult+3);.    
b560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b570: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
b580: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
b590: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 4);.        sq
b5a0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
b5b0: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 6b 29  Label(v, addrOk)
b5c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b5d0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 69 43 6f  3DbFree(db, aiCo
b5e0: 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ls);.      }.   
b5f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b600: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
b610: 20 30 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a   0, addrTop+1);.
b620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b630: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b640: 72 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rTop);.    }.  }
b650: 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21  else.#endif /* !
b660: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b670: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a  MIT_TRIGGER) */.
b680: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b690: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
b6a0: 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 0a  OREIGN_KEY) */..
b6b0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
b6c0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
b6d0: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61 72 73  Cmp(zLeft, "pars
b6e0: 65 72 5f 74 72 61 63 65 22 29 3d 3d 30 20 29 7b  er_trace")==0 ){
b6f0: 0a 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20  .    if( zRight 
b700: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
b710: 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
b720: 52 69 67 68 74 2c 20 30 29 20 29 7b 0a 20 20 20  Right, 0) ){.   
b730: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 72 73       sqlite3Pars
b740: 65 72 54 72 61 63 65 28 73 74 64 65 72 72 2c 20  erTrace(stderr, 
b750: 22 70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20  "parser: ");.   
b760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b770: 20 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 54    sqlite3ParserT
b780: 72 61 63 65 28 30 2c 20 30 29 3b 0a 20 20 20 20  race(0, 0);.    
b790: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
b7a0: 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  e.#endif..  /* R
b7b0: 65 69 6e 73 74 61 6c 6c 20 74 68 65 20 4c 49 4b  einstall the LIK
b7c0: 45 20 61 6e 64 20 47 4c 4f 42 20 66 75 6e 63 74  E and GLOB funct
b7d0: 69 6f 6e 73 2e 20 20 54 68 65 20 76 61 72 69 61  ions.  The varia
b7e0: 6e 74 20 6f 66 20 4c 49 4b 45 0a 20 20 2a 2a 20  nt of LIKE.  ** 
b7f0: 75 73 65 64 20 77 69 6c 6c 20 62 65 20 63 61 73  used will be cas
b800: 65 20 73 65 6e 73 69 74 69 76 65 20 6f 72 20 6e  e sensitive or n
b810: 6f 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ot depending on 
b820: 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
b830: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
b840: 6d 70 28 7a 4c 65 66 74 2c 20 22 63 61 73 65 5f  mp(zLeft, "case_
b850: 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 22 29  sensitive_like")
b860: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
b870: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
b880: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 4c 69  qlite3RegisterLi
b890: 6b 65 46 75 6e 63 74 69 6f 6e 73 28 64 62 2c 20  keFunctions(db, 
b8a0: 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
b8b0: 6e 28 7a 52 69 67 68 74 2c 20 30 29 29 3b 0a 20  n(zRight, 0));. 
b8c0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
b8d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54  fndef SQLITE_INT
b8e0: 45 47 52 49 54 59 5f 43 48 45 43 4b 5f 45 52 52  EGRITY_CHECK_ERR
b8f0: 4f 52 5f 4d 41 58 0a 23 20 64 65 66 69 6e 65 20  OR_MAX.# define 
b900: 53 51 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59  SQLITE_INTEGRITY
b910: 5f 43 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58  _CHECK_ERROR_MAX
b920: 20 31 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66   100.#endif..#if
b930: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b940: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
b950: 0a 20 20 2f 2a 20 50 72 61 67 6d 61 20 22 71 75  .  /* Pragma "qu
b960: 69 63 6b 5f 63 68 65 63 6b 22 20 69 73 20 61 6e  ick_check" is an
b970: 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 20 72 65   experimental re
b980: 64 75 63 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  duced version of
b990: 20 0a 20 20 2a 2a 20 69 6e 74 65 67 72 69 74 79   .  ** integrity
b9a0: 5f 63 68 65 63 6b 20 64 65 73 69 67 6e 65 64 20  _check designed 
b9b0: 74 6f 20 64 65 74 65 63 74 20 6d 6f 73 74 20 64  to detect most d
b9c0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
b9d0: 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  on.  ** without 
b9e0: 6d 6f 73 74 20 6f 66 20 74 68 65 20 6f 76 65 72  most of the over
b9f0: 68 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 69  head of a full i
ba00: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 0a  ntegrity-check..
ba10: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
ba20: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
ba30: 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63   "integrity_chec
ba40: 6b 22 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 71 6c  k")==0.   || sql
ba50: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66  ite3StrICmp(zLef
ba60: 74 2c 20 22 71 75 69 63 6b 5f 63 68 65 63 6b 22  t, "quick_check"
ba70: 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 69  )==0 .  ){.    i
ba80: 6e 74 20 69 2c 20 6a 2c 20 61 64 64 72 2c 20 6d  nt i, j, addr, m
ba90: 78 45 72 72 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  xErr;..    /* Co
baa0: 64 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  de that appears 
bab0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
bac0: 65 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  e integrity chec
bad0: 6b 2e 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 0a  k.  If no error.
bae0: 20 20 20 20 2a 2a 20 6d 65 73 73 61 67 65 73 20      ** messages 
baf0: 68 61 76 65 20 62 65 65 6e 20 67 65 6e 65 72 61  have been genera
bb00: 74 65 64 2c 20 6f 75 74 70 75 74 20 4f 4b 2e 20  ted, output OK. 
bb10: 20 4f 74 68 65 72 77 69 73 65 20 6f 75 74 70 75   Otherwise outpu
bb20: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 72 72  t the.    ** err
bb30: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 20 20 2a  or message.    *
bb40: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
bb50: 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 65 6e  st VdbeOpList en
bb60: 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  dCode[] = {.    
bb70: 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20    { OP_AddImm,  
bb80: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
bb90: 20 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a   0},    /* 0 */.
bba0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 4e 65 67        { OP_IfNeg
bbb0: 2c 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20  ,       1, 0,   
bbc0: 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31       0},    /* 1
bbd0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
bbe0: 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20 33  tring8,     0, 3
bbf0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
bc00: 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 2 */.      { 
bc10: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20  OP_ResultRow,   
bc20: 33 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  3, 1,        0},
bc30: 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 69 6e 74  .    };..    int
bc40: 20 69 73 51 75 69 63 6b 20 3d 20 28 73 71 6c 69   isQuick = (sqli
bc50: 74 65 33 54 6f 6c 6f 77 65 72 28 7a 4c 65 66 74  te3Tolower(zLeft
bc60: 5b 30 5d 29 3d 3d 27 71 27 29 3b 0a 0a 20 20 20  [0])=='q');..   
bc70: 20 2f 2a 20 49 66 20 74 68 65 20 50 52 41 47 4d   /* If the PRAGM
bc80: 41 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 6f 66  A command was of
bc90: 20 74 68 65 20 66 6f 72 6d 20 22 50 52 41 47 4d   the form "PRAGM
bca0: 41 20 3c 64 62 3e 2e 69 6e 74 65 67 72 69 74 79  A <db>.integrity
bcb0: 5f 63 68 65 63 6b 22 2c 0a 20 20 20 20 2a 2a 20  _check",.    ** 
bcc0: 74 68 65 6e 20 69 44 62 20 69 73 20 73 65 74 20  then iDb is set 
bcd0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
bce0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 64 65  the database ide
bcf0: 6e 74 69 66 69 65 64 20 62 79 20 3c 64 62 3e 2e  ntified by <db>.
bd00: 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
bd10: 63 61 73 65 2c 20 74 68 65 20 69 6e 74 65 67 72  case, the integr
bd20: 69 74 79 20 6f 66 20 64 61 74 61 62 61 73 65 20  ity of database 
bd30: 69 44 62 20 6f 6e 6c 79 20 69 73 20 76 65 72 69  iDb only is veri
bd40: 66 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74  fied by.    ** t
bd50: 68 65 20 56 44 42 45 20 63 72 65 61 74 65 64 20  he VDBE created 
bd60: 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  below..    **.  
bd70: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
bd80: 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 77  if the command w
bd90: 61 73 20 73 69 6d 70 6c 79 20 22 50 52 41 47 4d  as simply "PRAGM
bda0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
bdb0: 6b 22 20 28 6f 72 0a 20 20 20 20 2a 2a 20 22 50  k" (or.    ** "P
bdc0: 52 41 47 4d 41 20 71 75 69 63 6b 5f 63 68 65 63  RAGMA quick_chec
bdd0: 6b 22 29 2c 20 74 68 65 6e 20 69 44 62 20 69 73  k"), then iDb is
bde0: 20 73 65 74 20 74 6f 20 30 2e 20 49 6e 20 74 68   set to 0. In th
bdf0: 69 73 20 63 61 73 65 2c 20 73 65 74 20 69 44 62  is case, set iDb
be00: 0a 20 20 20 20 2a 2a 20 74 6f 20 2d 31 20 68 65  .    ** to -1 he
be10: 72 65 2c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  re, to indicate 
be20: 74 68 61 74 20 74 68 65 20 56 44 42 45 20 73 68  that the VDBE sh
be30: 6f 75 6c 64 20 76 65 72 69 66 79 20 74 68 65 20  ould verify the 
be40: 69 6e 74 65 67 72 69 74 79 0a 20 20 20 20 2a 2a  integrity.    **
be50: 20 6f 66 20 61 6c 6c 20 61 74 74 61 63 68 65 64   of all attached
be60: 20 64 61 74 61 62 61 73 65 73 2e 20 20 2a 2f 0a   databases.  */.
be70: 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e      assert( iDb>
be80: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
be90: 28 20 69 44 62 3d 3d 30 20 7c 7c 20 70 49 64 32  ( iDb==0 || pId2
bea0: 2d 3e 7a 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ->z );.    if( p
beb0: 49 64 32 2d 3e 7a 3d 3d 30 20 29 20 69 44 62 20  Id2->z==0 ) iDb 
bec0: 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  = -1;..    /* In
bed0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 56 44 42  itialize the VDB
bee0: 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 20  E program */.   
bef0: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
bf00: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
bf10: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
bf20: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
bf30: 65 6d 20 3d 20 36 3b 0a 20 20 20 20 73 71 6c 69  em = 6;.    sqli
bf40: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
bf50: 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  s(v, 1);.    sql
bf60: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
bf70: 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45  me(v, 0, COLNAME
bf80: 5f 4e 41 4d 45 2c 20 22 69 6e 74 65 67 72 69 74  _NAME, "integrit
bf90: 79 5f 63 68 65 63 6b 22 2c 20 53 51 4c 49 54 45  y_check", SQLITE
bfa0: 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20 20 2f  _STATIC);..    /
bfb0: 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
bfc0: 6d 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 2a 2f  m error count */
bfd0: 0a 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51 4c  .    mxErr = SQL
bfe0: 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  ITE_INTEGRITY_CH
bff0: 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a 20  ECK_ERROR_MAX;. 
c000: 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29 7b     if( zRight ){
c010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65  .      sqlite3Ge
c020: 74 49 6e 74 33 32 28 7a 52 69 67 68 74 2c 20 26  tInt32(zRight, &
c030: 6d 78 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66  mxErr);.      if
c040: 28 20 6d 78 45 72 72 3c 3d 30 20 29 7b 0a 20 20  ( mxErr<=0 ){.  
c050: 20 20 20 20 20 20 6d 78 45 72 72 20 3d 20 53 51        mxErr = SQ
c060: 4c 49 54 45 5f 49 4e 54 45 47 52 49 54 59 5f 43  LITE_INTEGRITY_C
c070: 48 45 43 4b 5f 45 52 52 4f 52 5f 4d 41 58 3b 0a  HECK_ERROR_MAX;.
c080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c0a0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
c0b0: 72 2c 20 6d 78 45 72 72 2c 20 31 29 3b 20 20 2f  r, mxErr, 1);  /
c0c0: 2a 20 72 65 67 5b 31 5d 20 68 6f 6c 64 73 20 65  * reg[1] holds e
c0d0: 72 72 6f 72 73 20 6c 65 66 74 20 2a 2f 0a 0a 20  rrors left */.. 
c0e0: 20 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 74 65     /* Do an inte
c0f0: 67 72 69 74 79 20 63 68 65 63 6b 20 6f 6e 20 65  grity check on e
c100: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
c110: 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
c120: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
c130: 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c 65  ){.      HashEle
c140: 6d 20 2a 78 3b 0a 20 20 20 20 20 20 48 61 73 68  m *x;.      Hash
c150: 20 2a 70 54 62 6c 73 3b 0a 20 20 20 20 20 20 69   *pTbls;.      i
c160: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  nt cnt = 0;..   
c170: 20 20 20 69 66 28 20 4f 4d 49 54 5f 54 45 4d 50     if( OMIT_TEMP
c180: 44 42 20 26 26 20 69 3d 3d 31 20 29 20 63 6f 6e  DB && i==1 ) con
c190: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
c1a0: 20 69 44 62 3e 3d 30 20 26 26 20 69 21 3d 69 44   iDb>=0 && i!=iD
c1b0: 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  b ) continue;.. 
c1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
c1d0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
c1e0: 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 61  rse, i);.      a
c1f0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c200: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
c210: 50 6f 73 2c 20 31 29 3b 20 2f 2a 20 48 61 6c 74  Pos, 1); /* Halt
c220: 20 69 66 20 6f 75 74 20 6f 66 20 65 72 72 6f 72   if out of error
c230: 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  s */.      sqlit
c240: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c250: 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a  OP_Halt, 0, 0);.
c260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c270: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
c280: 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f  r);..      /* Do
c290: 20 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68   an integrity ch
c2a0: 65 63 6b 20 6f 66 20 74 68 65 20 42 2d 54 72 65  eck of the B-Tre
c2b0: 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  e.      **.     
c2c0: 20 2a 2a 20 42 65 67 69 6e 20 62 79 20 66 69 6c   ** Begin by fil
c2d0: 6c 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 32  ling registers 2
c2e0: 2c 20 33 2c 20 2e 2e 2e 20 77 69 74 68 20 74 68  , 3, ... with th
c2f0: 65 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d  e root pages num
c300: 62 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f  bers.      ** fo
c310: 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  r all tables and
c320: 20 69 6e 64 69 63 65 73 20 69 6e 20 74 68 65 20   indices in the 
c330: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
c340: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
c350: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
c360: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 2c 20 30  texHeld(db, i, 0
c370: 29 20 29 3b 0a 20 20 20 20 20 20 70 54 62 6c 73  ) );.      pTbls
c380: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 70   = &db->aDb[i].p
c390: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
c3a0: 0a 20 20 20 20 20 20 66 6f 72 28 78 3d 73 71 6c  .      for(x=sql
c3b0: 69 74 65 48 61 73 68 46 69 72 73 74 28 70 54 62  iteHashFirst(pTb
c3c0: 6c 73 29 3b 20 78 3b 20 78 3d 73 71 6c 69 74 65  ls); x; x=sqlite
c3d0: 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20  HashNext(x)){.  
c3e0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
c3f0: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
c400: 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49  ta(x);.        I
c410: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
c420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c430: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
c440: 67 65 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  ger, pTab->tnum,
c450: 20 32 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   2+cnt);.       
c460: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
c470: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
c480: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
c490: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
c4a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c4b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c4c0: 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
c4d0: 3e 74 6e 75 6d 2c 20 32 2b 63 6e 74 29 3b 0a 20  >tnum, 2+cnt);. 
c4e0: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
c4f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c500: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  }..      /* Make
c510: 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
c520: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   number of regis
c530: 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  ters have been a
c540: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
c550: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 4d    if( pParse->nM
c560: 65 6d 20 3c 20 63 6e 74 2b 34 20 29 7b 0a 20 20  em < cnt+4 ){.  
c570: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
c580: 65 6d 20 3d 20 63 6e 74 2b 34 3b 0a 20 20 20 20  em = cnt+4;.    
c590: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 44 6f    }..      /* Do
c5a0: 20 74 68 65 20 62 2d 74 72 65 65 20 69 6e 74 65   the b-tree inte
c5b0: 67 72 69 74 79 20 63 68 65 63 6b 73 20 2a 2f 0a  grity checks */.
c5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c5d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
c5e0: 74 65 67 72 69 74 79 43 6b 2c 20 32 2c 20 63 6e  tegrityCk, 2, cn
c5f0: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
c600: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
c610: 28 76 2c 20 28 75 38 29 69 29 3b 0a 20 20 20 20  (v, (u8)i);.    
c620: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c630: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
c640: 5f 49 73 4e 75 6c 6c 2c 20 32 29 3b 0a 20 20 20  _IsNull, 2);.   
c650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c660: 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
c670: 67 38 2c 20 30 2c 20 33 2c 20 30 2c 0a 20 20 20  g8, 0, 3, 0,.   
c680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
c690: 69 6e 74 66 28 64 62 2c 20 22 2a 2a 2a 20 69 6e  intf(db, "*** in
c6a0: 20 64 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a   database %s ***
c6b0: 5c 6e 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  \n", db->aDb[i].
c6c0: 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
c6d0: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
c6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c6f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65  ddOp2(v, OP_Move
c700: 2c 20 32 2c 20 34 29 3b 0a 20 20 20 20 20 20 73  , 2, 4);.      s
c710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c720: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 34  (v, OP_Concat, 4
c730: 2c 20 33 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  , 3, 2);.      s
c740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c750: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
c760: 2c 20 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  , 2, 1);.      s
c770: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
c780: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20  re(v, addr);..  
c790: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
c7a0: 20 61 6c 6c 20 74 68 65 20 69 6e 64 69 63 65 73   all the indices
c7b0: 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74 65 64   are constructed
c7c0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20   correctly..    
c7d0: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 78    */.      for(x
c7e0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
c7f0: 28 70 54 62 6c 73 29 3b 20 78 20 26 26 20 21 69  (pTbls); x && !i
c800: 73 51 75 69 63 6b 3b 20 78 3d 73 71 6c 69 74 65  sQuick; x=sqlite
c810: 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a 20 20  HashNext(x)){.  
c820: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
c830: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
c840: 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20 20 49  ta(x);.        I
c850: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
c860: 20 20 20 20 69 6e 74 20 6c 6f 6f 70 54 6f 70 3b      int loopTop;
c870: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ..        if( pT
c880: 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20  ab->pIndex==0 ) 
c890: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c8a0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c8b0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
c8c0: 5f 49 66 50 6f 73 2c 20 31 29 3b 20 20 2f 2a 20  _IfPos, 1);  /* 
c8d0: 53 74 6f 70 20 69 66 20 6f 75 74 20 6f 66 20 65  Stop if out of e
c8e0: 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  rrors */.       
c8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c900: 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30  p2(v, OP_Halt, 0
c910: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
c920: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c930: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
c940: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
c950: 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 70  ableAndIndices(p
c960: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 31 2c 20  Parse, pTab, 1, 
c970: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
c980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c990: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
c9a0: 74 65 67 65 72 2c 20 30 2c 20 32 29 3b 20 20 2f  teger, 0, 2);  /
c9b0: 2a 20 72 65 67 28 32 29 20 77 69 6c 6c 20 63 6f  * reg(2) will co
c9c0: 75 6e 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20  unt entries */. 
c9d0: 20 20 20 20 20 20 20 6c 6f 6f 70 54 6f 70 20 3d         loopTop =
c9e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c9f0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
ca00: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
ca10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ca20: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
ca30: 32 2c 20 31 29 3b 20 20 20 2f 2a 20 69 6e 63 72  2, 1);   /* incr
ca40: 65 6d 65 6e 74 20 65 6e 74 72 79 20 63 6f 75 6e  ement entry coun
ca50: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  t */.        for
ca60: 28 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  (j=0, pIdx=pTab-
ca70: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
ca80: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
ca90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
caa0: 20 69 6e 74 20 6a 6d 70 32 3b 0a 20 20 20 20 20   int jmp2;.     
cab0: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
cac0: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
cad0: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 69  nst VdbeOpList i
cae0: 64 78 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20 20  dxErr[] = {.    
caf0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64          { OP_Add
cb00: 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 2d 31 2c  Imm,      1, -1,
cb10: 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 20 20    0},.          
cb20: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
cb30: 20 20 20 20 30 2c 20 20 33 2c 20 20 30 7d 2c 20      0,  3,  0}, 
cb40: 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20     /* 1 */.     
cb50: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 6f 77 69         { OP_Rowi
cb60: 64 2c 20 20 20 20 20 20 20 31 2c 20 20 34 2c 20  d,       1,  4, 
cb70: 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0},.           
cb80: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20   { OP_String8,  
cb90: 20 20 20 30 2c 20 20 35 2c 20 20 30 7d 2c 20 20     0,  5,  0},  
cba0: 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20    /* 3 */.      
cbb0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
cbc0: 67 38 2c 20 20 20 20 20 30 2c 20 20 36 2c 20 20  g8,     0,  6,  
cbd0: 30 7d 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20  0},    /* 4 */. 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f             { OP_
cbf0: 43 6f 6e 63 61 74 2c 20 20 20 20 20 20 34 2c 20  Concat,      4, 
cc00: 20 33 2c 20 20 33 7d 2c 0a 20 20 20 20 20 20 20   3,  3},.       
cc10: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6e 63 61 74       { OP_Concat
cc20: 2c 20 20 20 20 20 20 35 2c 20 20 33 2c 20 20 33  ,      5,  3,  3
cc30: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
cc40: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 20 20 20 20   OP_Concat,     
cc50: 20 36 2c 20 20 33 2c 20 20 33 7d 2c 0a 20 20 20   6,  3,  3},.   
cc60: 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65           { OP_Re
cc70: 73 75 6c 74 52 6f 77 2c 20 20 20 33 2c 20 20 31  sultRow,   3,  1
cc80: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 20  ,  0},.         
cc90: 20 20 20 7b 20 4f 50 5f 49 66 50 6f 73 2c 20 20     { OP_IfPos,  
cca0: 20 20 20 20 20 31 2c 20 20 30 2c 20 20 30 7d 2c       1,  0,  0},
ccb0: 20 20 20 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20      /* 9 */.    
ccc0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 48 61 6c          { OP_Hal
ccd0: 74 2c 20 20 20 20 20 20 20 20 30 2c 20 20 30 2c  t,        0,  0,
cce0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 20 20    0},.          
ccf0: 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  };.          r1 
cd00: 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  = sqlite3Generat
cd10: 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
cd20: 2c 20 70 49 64 78 2c 20 31 2c 20 33 2c 20 30 29  , pIdx, 1, 3, 0)
cd30: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 6d 70 32  ;.          jmp2
cd40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
cd50: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
cd60: 75 6e 64 2c 20 6a 2b 32 2c 20 30 2c 20 72 31 2c  und, j+2, 0, r1,
cd70: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31   pIdx->nColumn+1
cd80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  );.          add
cd90: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
cda0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
cdb0: 79 53 69 7a 65 28 69 64 78 45 72 72 29 2c 20 69  ySize(idxErr), i
cdc0: 64 78 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  dxErr);.        
cdd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
cde0: 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2b 31 2c  ngeP4(v, addr+1,
cdf0: 20 22 72 6f 77 69 64 20 22 2c 20 50 34 5f 53 54   "rowid ", P4_ST
ce00: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
ce10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ce20: 67 65 50 34 28 76 2c 20 61 64 64 72 2b 33 2c 20  geP4(v, addr+3, 
ce30: 22 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 69  " missing from i
ce40: 6e 64 65 78 20 22 2c 20 50 34 5f 53 54 41 54 49  ndex ", P4_STATI
ce50: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  C);.          sq
ce60: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
ce70: 34 28 76 2c 20 61 64 64 72 2b 34 2c 20 70 49 64  4(v, addr+4, pId
ce80: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 54 52 41  x->zName, P4_TRA
ce90: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20  NSIENT);.       
cea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
ceb0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 2b 39  mpHere(v, addr+9
cec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ced0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
cee0: 28 76 2c 20 6a 6d 70 32 29 3b 0a 20 20 20 20 20  (v, jmp2);.     
cef0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
cf00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cf10: 2c 20 4f 50 5f 4e 65 78 74 2c 20 31 2c 20 6c 6f  , OP_Next, 1, lo
cf20: 6f 70 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20  opTop+1);.      
cf30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
cf40: 70 48 65 72 65 28 76 2c 20 6c 6f 6f 70 54 6f 70  pHere(v, loopTop
cf50: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
cf60: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
cf70: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
cf80: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
cf90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
cfa0: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
cfb0: 4f 70 4c 69 73 74 20 63 6e 74 49 64 78 5b 5d 20  OpList cntIdx[] 
cfc0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
cfd0: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
cfe0: 20 20 20 20 30 2c 20 20 33 2c 20 20 30 7d 2c 0a      0,  3,  0},.
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f               { O
d000: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
d010: 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 2f 2a 20  0,  0,  0},  /* 
d020: 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  1 */.           
d030: 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20    { OP_AddImm,  
d040: 20 20 20 20 20 33 2c 20 20 31 2c 20 20 30 7d 2c       3,  1,  0},
d050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  .             { 
d060: 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20  OP_Next,        
d070: 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 2f 2a   0,  0,  0},  /*
d080: 20 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   3 */.          
d090: 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20     { OP_Eq,     
d0a0: 20 20 20 20 20 20 32 2c 20 20 30 2c 20 20 33 7d        2,  0,  3}
d0b0: 2c 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20  ,  /* 4 */.     
d0c0: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64          { OP_Add
d0d0: 49 6d 6d 2c 20 20 20 20 20 20 20 31 2c 20 2d 31  Imm,       1, -1
d0e0: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 20  ,  0},.         
d0f0: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38      { OP_String8
d100: 2c 20 20 20 20 20 20 30 2c 20 20 32 2c 20 20 30  ,      0,  2,  0
d110: 7d 2c 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20  },  /* 6 */.    
d120: 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 53 74           { OP_St
d130: 72 69 6e 67 38 2c 20 20 20 20 20 20 30 2c 20 20  ring8,      0,  
d140: 33 2c 20 20 30 7d 2c 20 20 2f 2a 20 37 20 2a 2f  3,  0},  /* 7 */
d150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  .             { 
d160: 4f 50 5f 43 6f 6e 63 61 74 2c 20 20 20 20 20 20  OP_Concat,      
d170: 20 33 2c 20 20 32 2c 20 20 32 7d 2c 0a 20 20 20   3,  2,  2},.   
d180: 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 52            { OP_R
d190: 65 73 75 6c 74 52 6f 77 2c 20 20 20 20 32 2c 20  esultRow,    2, 
d1a0: 20 31 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 20   1,  0},.       
d1b0: 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20     };.          
d1c0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d1d0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
d1e0: 66 50 6f 73 2c 20 31 29 3b 0a 20 20 20 20 20 20  fPos, 1);.      
d1f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d200: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
d210: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
d220: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d230: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
d240: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20  .          addr 
d250: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d260: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
d270: 69 7a 65 28 63 6e 74 49 64 78 29 2c 20 63 6e 74  ize(cntIdx), cnt
d280: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
d290: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d2a0: 65 50 31 28 76 2c 20 61 64 64 72 2b 31 2c 20 6a  eP1(v, addr+1, j
d2b0: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  +2);.          s
d2c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d2d0: 50 32 28 76 2c 20 61 64 64 72 2b 31 2c 20 61 64  P2(v, addr+1, ad
d2e0: 64 72 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 20  dr+4);.         
d2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
d300: 67 65 50 31 28 76 2c 20 61 64 64 72 2b 33 2c 20  geP1(v, addr+3, 
d310: 6a 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j+2);.          
d320: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d330: 65 50 32 28 76 2c 20 61 64 64 72 2b 33 2c 20 61  eP2(v, addr+3, a
d340: 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 20 20  ddr+2);.        
d350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d360: 70 48 65 72 65 28 76 2c 20 61 64 64 72 2b 34 29  pHere(v, addr+4)
d370: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d380: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
d390: 76 2c 20 61 64 64 72 2b 36 2c 20 0a 20 20 20 20  v, addr+6, .    
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 20 22 77 72 6f 6e 67 20 23 20 6f 66 20 65 6e 74   "wrong # of ent
d3c0: 72 69 65 73 20 69 6e 20 69 6e 64 65 78 20 22 2c  ries in index ",
d3d0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
d3e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d3f0: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
d400: 64 72 2b 37 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  dr+7, pIdx->zNam
d410: 65 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  e, P4_TRANSIENT)
d420: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d430: 20 20 7d 20 0a 20 20 20 20 7d 0a 20 20 20 20 61    } .    }.    a
d440: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d450: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
d460: 72 61 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29  raySize(endCode)
d470: 2c 20 65 6e 64 43 6f 64 65 29 3b 0a 20 20 20 20  , endCode);.    
d480: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d490: 65 50 32 28 76 2c 20 61 64 64 72 2c 20 2d 6d 78  eP2(v, addr, -mx
d4a0: 45 72 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Err);.    sqlite
d4b0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
d4c0: 20 61 64 64 72 2b 31 29 3b 0a 20 20 20 20 73 71   addr+1);.    sq
d4d0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d4e0: 34 28 76 2c 20 61 64 64 72 2b 32 2c 20 22 6f 6b  4(v, addr+2, "ok
d4f0: 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ", P4_STATIC);. 
d500: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
d510: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
d520: 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
d530: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d540: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 0a  OMIT_UTF16.  /*.
d550: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e    **   PRAGMA en
d560: 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52  coding.  **   PR
d570: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20  AGMA encoding = 
d580: 22 75 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22  "utf-8"|"utf-16"
d590: 7c 22 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66  |"utf-16le"|"utf
d5a0: 2d 31 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a  -16be".  **.  **
d5b0: 20 49 6e 20 69 74 73 20 66 69 72 73 74 20 66 6f   In its first fo
d5c0: 72 6d 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20  rm, this pragma 
d5d0: 72 65 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f  returns the enco
d5e0: 64 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e  ding of the main
d5f0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
d600: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
d610: 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  is not initializ
d620: 65 64 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61  ed, it is initia
d630: 6c 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a  lized now..  **.
d640: 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
d650: 66 6f 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61  form of this pra
d660: 67 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  gma is a no-op i
d670: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
d680: 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61  ase file.  ** ha
d690: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
d6a0: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  en initialized. 
d6b0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
d6c0: 73 65 74 73 20 74 68 65 20 64 65 66 61 75 6c 74  sets the default
d6d0: 0a 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74  .  ** encoding t
d6e0: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
d6f0: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
d700: 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 61  tabase file if a
d710: 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69   new file.  ** i
d720: 73 20 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e  s created. If an
d730: 20 65 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64   existing main d
d740: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
d750: 6f 70 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  opened, then the
d760: 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65  .  ** default te
d770: 78 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20  xt encoding for 
d780: 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  the existing dat
d790: 61 62 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20  abase is used.. 
d7a0: 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c   ** .  ** In all
d7b0: 20 63 61 73 65 73 20 6e 65 77 20 64 61 74 61 62   cases new datab
d7c0: 61 73 65 73 20 63 72 65 61 74 65 64 20 75 73 69  ases created usi
d7d0: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
d7e0: 6d 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63  mmand are.  ** c
d7f0: 72 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68  reated to use th
d800: 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74  e same default t
d810: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20  ext encoding as 
d820: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
d830: 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  e. If.  ** the m
d840: 61 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 73  ain database has
d850: 20 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61   not been initia
d860: 6c 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65  lized and/or cre
d870: 61 74 65 64 20 77 68 65 6e 20 41 54 54 41 43 48  ated when ATTACH
d880: 0a 20 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65  .  ** is execute
d890: 64 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  d, this is done 
d8a0: 62 65 66 6f 72 65 20 74 68 65 20 41 54 54 41 43  before the ATTAC
d8b0: 48 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a  H operation..  *
d8c0: 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65  *.  ** In the se
d8d0: 63 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70  cond form this p
d8e0: 72 61 67 6d 61 20 73 65 74 73 20 74 68 65 20 74  ragma sets the t
d8f0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20  ext encoding to 
d900: 62 65 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20  be used in.  ** 
d910: 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69 6c  new database fil
d920: 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  es created using
d930: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 68   this database h
d940: 61 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c  andle. It is onl
d950: 79 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66  y.  ** useful if
d960: 20 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61   invoked immedia
d970: 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d  tely after the m
d980: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20  ain database i. 
d990: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
d9a0: 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  3StrICmp(zLeft, 
d9b0: 22 65 6e 63 6f 64 69 6e 67 22 29 3d 3d 30 20 29  "encoding")==0 )
d9c0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
d9d0: 73 74 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d  st struct EncNam
d9e0: 65 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e {.      char *
d9f0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75 38 20  zName;.      u8 
da00: 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61  enc;.    } encna
da10: 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  mes[] = {.      
da20: 7b 20 22 55 54 46 38 22 2c 20 20 20 20 20 53 51  { "UTF8",     SQ
da30: 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20 20 20  LITE_UTF8       
da40: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46   },.      { "UTF
da50: 2d 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55  -8",    SQLITE_U
da60: 54 46 38 20 20 20 20 20 20 20 20 7d 2c 20 20 2f  TF8        },  /
da70: 2a 20 4d 75 73 74 20 62 65 20 65 6c 65 6d 65 6e  * Must be elemen
da80: 74 20 5b 31 5d 20 2a 2f 0a 20 20 20 20 20 20 7b  t [1] */.      {
da90: 20 22 55 54 46 2d 31 36 6c 65 22 2c 20 53 51 4c   "UTF-16le", SQL
daa0: 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20 20  ITE_UTF16LE     
dab0: 7d 2c 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 65  },  /* Must be e
dac0: 6c 65 6d 65 6e 74 20 5b 32 5d 20 2a 2f 0a 20 20  lement [2] */.  
dad0: 20 20 20 20 7b 20 22 55 54 46 2d 31 36 62 65 22      { "UTF-16be"
dae0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
daf0: 20 20 20 20 20 7d 2c 20 20 2f 2a 20 4d 75 73 74       },  /* Must
db00: 20 62 65 20 65 6c 65 6d 65 6e 74 20 5b 33 5d 20   be element [3] 
db10: 2a 2f 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  */.      { "UTF1
db20: 36 6c 65 22 2c 20 20 53 51 4c 49 54 45 5f 55 54  6le",  SQLITE_UT
db30: 46 31 36 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20  F16LE     },.   
db40: 20 20 20 7b 20 22 55 54 46 31 36 62 65 22 2c 20     { "UTF16be", 
db50: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
db60: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
db70: 55 54 46 2d 31 36 22 2c 20 20 20 30 20 20 20 20  UTF-16",   0    
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
db90: 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   /* SQLITE_UTF16
dba0: 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20 20 20 20  NATIVE */.      
dbb0: 7b 20 22 55 54 46 31 36 22 2c 20 20 20 20 30 20  { "UTF16",    0 
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 7d 2c 20 2f 2a 20 53 51 4c 49 54 45 5f 55 54   }, /* SQLITE_UT
dbe0: 46 31 36 4e 41 54 49 56 45 20 2a 2f 0a 20 20 20  F16NATIVE */.   
dbf0: 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
dc00: 7d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72  };.    const str
dc10: 75 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e  uct EncName *pEn
dc20: 63 3b 0a 20 20 20 20 69 66 28 20 21 7a 52 69 67  c;.    if( !zRig
dc30: 68 74 20 29 7b 20 20 20 20 2f 2a 20 22 50 52 41  ht ){    /* "PRA
dc40: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 22 20 2a 2f  GMA encoding" */
dc50: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
dc60: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
dc70: 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67  rse) ) goto prag
dc80: 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 73 71  ma_out;.      sq
dc90: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
dca0: 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  ols(v, 1);.     
dcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
dcc0: 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c  olName(v, 0, COL
dcd0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 65 6e 63 6f  NAME_NAME, "enco
dce0: 64 69 6e 67 22 2c 20 53 51 4c 49 54 45 5f 53 54  ding", SQLITE_ST
dcf0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
dd00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dd10: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
dd20: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
dd30: 74 28 20 65 6e 63 6e 61 6d 65 73 5b 53 51 4c 49  t( encnames[SQLI
dd40: 54 45 5f 55 54 46 38 5d 2e 65 6e 63 3d 3d 53 51  TE_UTF8].enc==SQ
dd50: 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20  LITE_UTF8 );.   
dd60: 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61     assert( encna
dd70: 6d 65 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36  mes[SQLITE_UTF16
dd80: 4c 45 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  LE].enc==SQLITE_
dd90: 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 20 20 20  UTF16LE );.     
dda0: 20 61 73 73 65 72 74 28 20 65 6e 63 6e 61 6d 65   assert( encname
ddb0: 73 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  s[SQLITE_UTF16BE
ddc0: 5d 2e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ].enc==SQLITE_UT
ddd0: 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20 20 73  F16BE );.      s
dde0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ddf0: 50 34 28 76 2c 20 2d 31 2c 20 65 6e 63 6e 61 6d  P4(v, -1, encnam
de00: 65 73 5b 45 4e 43 28 70 50 61 72 73 65 2d 3e 64  es[ENC(pParse->d
de10: 62 29 5d 2e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54  b)].zName, P4_ST
de20: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
de30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
de40: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
de50: 31 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  1, 1);.    }else
de60: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
de70: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 50 52 41           /* "PRA
de80: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 58  GMA encoding = X
de90: 58 58 22 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  XX" */.      /* 
dea0: 4f 6e 6c 79 20 63 68 61 6e 67 65 20 74 68 65 20  Only change the 
deb0: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 2e  value of sqlite.
dec0: 65 6e 63 20 69 66 20 74 68 65 20 64 61 74 61 62  enc if the datab
ded0: 61 73 65 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f  ase handle is no
dee0: 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69  t.      ** initi
def0: 61 6c 69 7a 65 64 2e 20 49 66 20 74 68 65 20 6d  alized. If the m
df00: 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 78 69  ain database exi
df10: 73 74 73 2c 20 74 68 65 20 6e 65 77 20 73 71 6c  sts, the new sql
df20: 69 74 65 2e 65 6e 63 20 76 61 6c 75 65 0a 20 20  ite.enc value.  
df30: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6f      ** will be o
df40: 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 20  verwritten when 
df50: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 6e 65  the schema is ne
df60: 78 74 20 6c 6f 61 64 65 64 2e 20 49 66 20 69 74  xt loaded. If it
df70: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20   does not.      
df80: 2a 2a 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ** already exist
df90: 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 72  s, it will be cr
dfa0: 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65  eated to use the
dfb0: 20 6e 65 77 20 65 6e 63 6f 64 69 6e 67 20 76 61   new encoding va
dfc0: 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lue..      */.  
dfd0: 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 20      if( .       
dfe0: 20 21 28 44 62 48 61 73 50 72 6f 70 65 72 74 79   !(DbHasProperty
dff0: 28 64 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  (db, 0, DB_Schem
e000: 61 4c 6f 61 64 65 64 29 29 20 7c 7c 20 0a 20 20  aLoaded)) || .  
e010: 20 20 20 20 20 20 44 62 48 61 73 50 72 6f 70 65        DbHasPrope
e020: 72 74 79 28 64 62 2c 20 30 2c 20 44 42 5f 45 6d  rty(db, 0, DB_Em
e030: 70 74 79 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  pty) .      ){. 
e040: 20 20 20 20 20 20 20 66 6f 72 28 70 45 6e 63 3d         for(pEnc=
e050: 26 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20 70 45  &encnames[0]; pE
e060: 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b  nc->zName; pEnc+
e070: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
e080: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
e090: 43 6d 70 28 7a 52 69 67 68 74 2c 20 70 45 6e 63  Cmp(zRight, pEnc
e0a0: 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ->zName) ){.    
e0b0: 20 20 20 20 20 20 20 20 45 4e 43 28 70 50 61 72          ENC(pPar
e0c0: 73 65 2d 3e 64 62 29 20 3d 20 70 45 6e 63 2d 3e  se->db) = pEnc->
e0d0: 65 6e 63 20 3f 20 70 45 6e 63 2d 3e 65 6e 63 20  enc ? pEnc->enc 
e0e0: 3a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  : SQLITE_UTF16NA
e0f0: 54 49 56 45 3b 0a 20 20 20 20 20 20 20 20 20 20  TIVE;.          
e100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e110: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
e120: 20 20 20 20 20 20 20 69 66 28 20 21 70 45 6e 63         if( !pEnc
e130: 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
e140: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
e150: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
e160: 73 75 70 70 6f 72 74 65 64 20 65 6e 63 6f 64 69  supported encodi
e170: 6e 67 3a 20 25 73 22 2c 20 7a 52 69 67 68 74 29  ng: %s", zRight)
e180: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e190: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
e1a0: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
e1b0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
e1c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e1d0: 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45 52  _OMIT_SCHEMA_VER
e1e0: 53 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 2f  SION_PRAGMAS.  /
e1f0: 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  *.  **   PRAGMA 
e200: 5b 64 61 74 61 62 61 73 65 2e 5d 73 63 68 65 6d  [database.]schem
e210: 61 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20  a_version.  **  
e220: 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
e230: 65 2e 5d 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  e.]schema_versio
e240: 6e 20 3d 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20  n = <integer>.  
e250: 2a 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  **.  **   PRAGMA
e260: 20 5b 64 61 74 61 62 61 73 65 2e 5d 75 73 65 72   [database.]user
e270: 5f 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 20 20 20  _version.  **   
e280: 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
e290: 2e 5d 75 73 65 72 5f 76 65 72 73 69 6f 6e 20 3d  .]user_version =
e2a0: 20 3c 69 6e 74 65 67 65 72 3e 0a 20 20 2a 2a 0a   <integer>.  **.
e2b0: 20 20 2a 2a 20 54 68 65 20 70 72 61 67 6d 61 27    ** The pragma'
e2c0: 73 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e  s schema_version
e2d0: 20 61 6e 64 20 75 73 65 72 5f 76 65 72 73 69 6f   and user_versio
e2e0: 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 65  n are used to se
e2f0: 74 20 6f 72 20 67 65 74 0a 20 20 2a 2a 20 74 68  t or get.  ** th
e300: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
e310: 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e  chema-version an
e320: 64 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 2c 20  d user-version, 
e330: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 42 6f  respectively. Bo
e340: 74 68 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  th.  ** the sche
e350: 6d 61 2d 76 65 72 73 69 6f 6e 20 61 6e 64 20 74  ma-version and t
e360: 68 65 20 75 73 65 72 2d 76 65 72 73 69 6f 6e 20  he user-version 
e370: 61 72 65 20 33 32 2d 62 69 74 20 73 69 67 6e 65  are 32-bit signe
e380: 64 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20  d integers.  ** 
e390: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
e3a0: 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 0a 20  tabase header.. 
e3b0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 63 68   **.  ** The sch
e3c0: 65 6d 61 2d 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema-cookie is us
e3d0: 75 61 6c 6c 79 20 6f 6e 6c 79 20 6d 61 6e 69 70  ually only manip
e3e0: 75 6c 61 74 65 64 20 69 6e 74 65 72 6e 61 6c 6c  ulated internall
e3f0: 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74 0a  y by SQLite. It.
e400: 20 20 2a 2a 20 69 73 20 69 6e 63 72 65 6d 65 6e    ** is incremen
e410: 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  ted by SQLite wh
e420: 65 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62  enever the datab
e430: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6d 6f  ase schema is mo
e440: 64 69 66 69 65 64 20 28 62 79 0a 20 20 2a 2a 20  dified (by.  ** 
e450: 63 72 65 61 74 69 6e 67 20 6f 72 20 64 72 6f 70  creating or drop
e460: 70 69 6e 67 20 61 20 74 61 62 6c 65 20 6f 72 20  ping a table or 
e470: 69 6e 64 65 78 29 2e 20 54 68 65 20 73 63 68 65  index). The sche
e480: 6d 61 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73  ma version is us
e490: 65 64 20 62 79 0a 20 20 2a 2a 20 53 51 4c 69 74  ed by.  ** SQLit
e4a0: 65 20 65 61 63 68 20 74 69 6d 65 20 61 20 71 75  e each time a qu
e4b0: 65 72 79 20 69 73 20 65 78 65 63 75 74 65 64 20  ery is executed 
e4c0: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
e4d0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
e4e0: 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63  e.  ** of the sc
e4f0: 68 65 6d 61 20 75 73 65 64 20 77 68 65 6e 20 63  hema used when c
e500: 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c  ompiling the SQL
e510: 20 71 75 65 72 79 20 6d 61 74 63 68 65 73 20 74   query matches t
e520: 68 65 20 73 63 68 65 6d 61 20 6f 66 0a 20 20 2a  he schema of.  *
e530: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
e540: 67 61 69 6e 73 74 20 77 68 69 63 68 20 74 68 65  gainst which the
e550: 20 63 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20   compiled query 
e560: 69 73 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  is actually exec
e570: 75 74 65 64 2e 0a 20 20 2a 2a 20 53 75 62 76 65  uted..  ** Subve
e580: 72 74 69 6e 67 20 74 68 69 73 20 6d 65 63 68 61  rting this mecha
e590: 6e 69 73 6d 20 62 79 20 75 73 69 6e 67 20 22 50  nism by using "P
e5a0: 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72  RAGMA schema_ver
e5b0: 73 69 6f 6e 22 20 74 6f 20 6d 6f 64 69 66 79 0a  sion" to modify.
e5c0: 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d    ** the schema-
e5d0: 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 74 65 6e  version is poten
e5e0: 74 69 61 6c 6c 79 20 64 61 6e 67 65 72 6f 75 73  tially dangerous
e5f0: 20 61 6e 64 20 6d 61 79 20 6c 65 61 64 20 74 6f   and may lead to
e600: 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2a 20 63 72   program.  ** cr
e610: 61 73 68 65 73 20 6f 72 20 64 61 74 61 62 61 73  ashes or databas
e620: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 55 73  e corruption. Us
e630: 65 20 77 69 74 68 20 63 61 75 74 69 6f 6e 21 0a  e with caution!.
e640: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 75 73    **.  ** The us
e650: 65 72 2d 76 65 72 73 69 6f 6e 20 69 73 20 6e 6f  er-version is no
e660: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
e670: 79 20 62 79 20 53 51 4c 69 74 65 2e 20 49 74 20  y by SQLite. It 
e680: 6d 61 79 20 62 65 20 75 73 65 64 20 62 79 0a 20  may be used by. 
e690: 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73   ** applications
e6a0: 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65   for any purpose
e6b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
e6c0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66  ite3StrICmp(zLef
e6d0: 74 2c 20 22 73 63 68 65 6d 61 5f 76 65 72 73 69  t, "schema_versi
e6e0: 6f 6e 22 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73  on")==0 .   || s
e6f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c  qlite3StrICmp(zL
e700: 65 66 74 2c 20 22 75 73 65 72 5f 76 65 72 73 69  eft, "user_versi
e710: 6f 6e 22 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73  on")==0 .   || s
e720: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c  qlite3StrICmp(zL
e730: 65 66 74 2c 20 22 66 72 65 65 6c 69 73 74 5f 63  eft, "freelist_c
e740: 6f 75 6e 74 22 29 3d 3d 30 20 0a 20 20 29 7b 0a  ount")==0 .  ){.
e750: 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b      int iCookie;
e760: 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 69 6e 64     /* Cookie ind
e770: 65 78 2e 20 31 20 66 6f 72 20 73 63 68 65 6d 61  ex. 1 for schema
e780: 2d 63 6f 6f 6b 69 65 2c 20 36 20 66 6f 72 20 75  -cookie, 6 for u
e790: 73 65 72 2d 63 6f 6f 6b 69 65 2e 20 2a 2f 0a 20  ser-cookie. */. 
e7a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
e7b0: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
e7c0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 7a 4c 65  .    switch( zLe
e7d0: 66 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63  ft[0] ){.      c
e7e0: 61 73 65 20 27 66 27 3a 20 63 61 73 65 20 27 46  ase 'f': case 'F
e7f0: 27 3a 0a 20 20 20 20 20 20 20 20 69 43 6f 6f 6b  ':.        iCook
e800: 69 65 20 3d 20 42 54 52 45 45 5f 46 52 45 45 5f  ie = BTREE_FREE_
e810: 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 20 20  PAGE_COUNT;.    
e820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e830: 20 63 61 73 65 20 27 73 27 3a 20 63 61 73 65 20   case 's': case 
e840: 27 53 27 3a 0a 20 20 20 20 20 20 20 20 69 43 6f  'S':.        iCo
e850: 6f 6b 69 65 20 3d 20 42 54 52 45 45 5f 53 43 48  okie = BTREE_SCH
e860: 45 4d 41 5f 56 45 52 53 49 4f 4e 3b 0a 20 20 20  EMA_VERSION;.   
e870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e880: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
e890: 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 42 54 52     iCookie = BTR
e8a0: 45 45 5f 55 53 45 52 5f 56 45 52 53 49 4f 4e 3b  EE_USER_VERSION;
e8b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e8c0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 7a      }..    if( z
e8d0: 52 69 67 68 74 20 26 26 20 69 43 6f 6f 6b 69 65  Right && iCookie
e8e0: 21 3d 42 54 52 45 45 5f 46 52 45 45 5f 50 41 47  !=BTREE_FREE_PAG
e8f0: 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20 20 20 20  E_COUNT ){.     
e900: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 70   /* Write the sp
e910: 65 63 69 66 69 65 64 20 63 6f 6f 6b 69 65 20 76  ecified cookie v
e920: 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 73 74  alue */.      st
e930: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
e940: 70 4c 69 73 74 20 73 65 74 43 6f 6f 6b 69 65 5b  pList setCookie[
e950: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
e960: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
e970: 20 20 20 30 2c 20 20 31 2c 20 20 30 7d 2c 20 20     0,  1,  0},  
e980: 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20 20 20    /* 0 */.      
e990: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
e9a0: 20 20 20 20 20 20 20 30 2c 20 20 31 2c 20 20 30         0,  1,  0
e9b0: 7d 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20  },    /* 1 */.  
e9c0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 43 6f        { OP_SetCo
e9d0: 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20 20 30  okie,      0,  0
e9e0: 2c 20 20 31 7d 2c 20 20 20 20 2f 2a 20 32 20 2a  ,  1},    /* 2 *
e9f0: 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  /.      };.     
ea00: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
ea10: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
ea20: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 73 65  (v, ArraySize(se
ea30: 74 43 6f 6f 6b 69 65 29 2c 20 73 65 74 43 6f 6f  tCookie), setCoo
ea40: 6b 69 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  kie);.      sqli
ea50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
ea60: 76 2c 20 61 64 64 72 2c 20 69 44 62 29 3b 0a 20  v, addr, iDb);. 
ea70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ea80: 43 68 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72  ChangeP1(v, addr
ea90: 2b 31 2c 20 73 71 6c 69 74 65 33 41 74 6f 69 28  +1, sqlite3Atoi(
eaa0: 7a 52 69 67 68 74 29 29 3b 0a 20 20 20 20 20 20  zRight));.      
eab0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
eac0: 65 50 31 28 76 2c 20 61 64 64 72 2b 32 2c 20 69  eP1(v, addr+2, i
ead0: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
eae0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
eaf0: 2c 20 61 64 64 72 2b 32 2c 20 69 43 6f 6f 6b 69  , addr+2, iCooki
eb00: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
eb10: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
eb20: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6f 6b 69   specified cooki
eb30: 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20  e value */.     
eb40: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
eb50: 62 65 4f 70 4c 69 73 74 20 72 65 61 64 43 6f 6f  beOpList readCoo
eb60: 6b 69 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  kie[] = {.      
eb70: 20 20 7b 20 4f 50 5f 54 72 61 6e 73 61 63 74 69    { OP_Transacti
eb80: 6f 6e 2c 20 20 20 20 20 30 2c 20 20 30 2c 20 20  on,     0,  0,  
eb90: 30 7d 2c 20 20 20 20 2f 2a 20 30 20 2a 2f 0a 20  0},    /* 0 */. 
eba0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64         { OP_Read
ebb0: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 30 2c 20  Cookie,      0, 
ebc0: 20 31 2c 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31   1,  0},    /* 1
ebd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 4f 50   */.        { OP
ebe0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 20 20 20 20  _ResultRow,     
ebf0: 20 20 31 2c 20 20 31 2c 20 20 30 7d 0a 20 20 20    1,  1,  0}.   
ec00: 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
ec10: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
ec20: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
ec30: 72 72 61 79 53 69 7a 65 28 72 65 61 64 43 6f 6f  rraySize(readCoo
ec40: 6b 69 65 29 2c 20 72 65 61 64 43 6f 6f 6b 69 65  kie), readCookie
ec50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ec60: 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
ec70: 61 64 64 72 2c 20 69 44 62 29 3b 0a 20 20 20 20  addr, iDb);.    
ec80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ec90: 6e 67 65 50 31 28 76 2c 20 61 64 64 72 2b 31 2c  ngeP1(v, addr+1,
eca0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
ecb0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
ecc0: 28 76 2c 20 61 64 64 72 2b 31 2c 20 69 43 6f 6f  (v, addr+1, iCoo
ecd0: 6b 69 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  kie);.      sqli
ece0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
ecf0: 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  s(v, 1);.      s
ed00: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ed10: 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41  Name(v, 0, COLNA
ed20: 4d 45 5f 4e 41 4d 45 2c 20 7a 4c 65 66 74 2c 20  ME_NAME, zLeft, 
ed30: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
ed40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
ed50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ed60: 45 5f 4f 4d 49 54 5f 53 43 48 45 4d 41 5f 56 45  E_OMIT_SCHEMA_VE
ed70: 52 53 49 4f 4e 5f 50 52 41 47 4d 41 53 20 2a 2f  RSION_PRAGMAS */
ed80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ed90: 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
eda0: 49 4f 4e 5f 44 49 41 47 53 0a 20 20 2f 2a 0a 20  ION_DIAGS.  /*. 
edb0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 63 6f 6d   **   PRAGMA com
edc0: 70 69 6c 65 5f 6f 70 74 69 6f 6e 73 0a 20 20 2a  pile_options.  *
edd0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
ede0: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63  e names of all c
edf0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
ee00: 6f 6e 73 20 75 73 65 64 20 69 6e 20 74 68 69 73  ons used in this
ee10: 20 62 75 69 6c 64 2c 0a 20 20 2a 2a 20 6f 6e 65   build,.  ** one
ee20: 20 6f 70 74 69 6f 6e 20 70 65 72 20 72 6f 77 2e   option per row.
ee30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
ee40: 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  te3StrICmp(zLeft
ee50: 2c 20 22 63 6f 6d 70 69 6c 65 5f 6f 70 74 69 6f  , "compile_optio
ee60: 6e 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ns")==0 ){.    i
ee70: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 63 6f  nt i = 0;.    co
ee80: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a  nst char *zOpt;.
ee90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
eea0: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
eeb0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
eec0: 6d 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  m = 1;.    sqlit
eed0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
eee0: 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, 0, COLNAME_N
eef0: 41 4d 45 2c 20 22 63 6f 6d 70 69 6c 65 5f 6f 70  AME, "compile_op
ef00: 74 69 6f 6e 22 2c 20 53 51 4c 49 54 45 5f 53 54  tion", SQLITE_ST
ef10: 41 54 49 43 29 3b 0a 20 20 20 20 77 68 69 6c 65  ATIC);.    while
ef20: 28 20 28 7a 4f 70 74 20 3d 20 73 71 6c 69 74 65  ( (zOpt = sqlite
ef30: 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
ef40: 67 65 74 28 69 2b 2b 29 29 21 3d 30 20 29 7b 0a  get(i++))!=0 ){.
ef50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ef60: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
ef70: 72 69 6e 67 38 2c 20 30 2c 20 31 2c 20 30 2c 20  ring8, 0, 1, 0, 
ef80: 7a 4f 70 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  zOpt, 0);.      
ef90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
efa0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
efb0: 77 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  w, 1, 1);.    }.
efc0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
efd0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
efe0: 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
eff0: 53 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  S */..#ifndef SQ
f000: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
f010: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
f020: 20 5b 64 61 74 61 62 61 73 65 2e 5d 77 61 6c 5f   [database.]wal_
f030: 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 70 61 73  checkpoint = pas
f040: 73 69 76 65 7c 66 75 6c 6c 7c 72 65 73 74 61 72  sive|full|restar
f050: 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 65 63  t.  **.  ** Chec
f060: 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62  kpoint the datab
f070: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
f080: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f090: 4c 65 66 74 2c 20 22 77 61 6c 5f 63 68 65 63 6b  Left, "wal_check
f0a0: 70 6f 69 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20  point")==0 ){.  
f0b0: 20 20 69 6e 74 20 69 42 74 20 3d 20 28 70 49 64    int iBt = (pId
f0c0: 32 2d 3e 7a 3f 69 44 62 3a 53 51 4c 49 54 45 5f  2->z?iDb:SQLITE_
f0d0: 4d 41 58 5f 41 54 54 41 43 48 45 44 29 3b 0a 20  MAX_ATTACHED);. 
f0e0: 20 20 20 69 6e 74 20 65 4d 6f 64 65 20 3d 20 53     int eMode = S
f0f0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
f100: 5f 50 41 53 53 49 56 45 3b 0a 20 20 20 20 69 66  _PASSIVE;.    if
f110: 28 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( zRight ){.    
f120: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
f130: 49 43 6d 70 28 7a 52 69 67 68 74 2c 20 22 66 75  ICmp(zRight, "fu
f140: 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ll")==0 ){.     
f150: 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54     eMode = SQLIT
f160: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
f170: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
f180: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
f190: 70 28 7a 52 69 67 68 74 2c 20 22 72 65 73 74 61  p(zRight, "resta
f1a0: 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rt")==0 ){.     
f1b0: 20 20 20 65 4d 6f 64 65 20 3d 20 53 51 4c 49 54     eMode = SQLIT
f1c0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
f1d0: 54 41 52 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TART;.      }.  
f1e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
f1f0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
f200: 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61  arse) ) goto pra
f210: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 73 71 6c  gma_out;.    sql
f220: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
f230: 6c 73 28 76 2c 20 33 29 3b 0a 20 20 20 20 70 50  ls(v, 3);.    pP
f240: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a  arse->nMem = 3;.
f250: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
f260: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
f270: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 62  COLNAME_NAME, "b
f280: 75 73 79 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  usy", SQLITE_STA
f290: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
f2a0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
f2b0: 76 2c 20 31 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, 1, COLNAME_NA
f2c0: 4d 45 2c 20 22 6c 6f 67 22 2c 20 53 51 4c 49 54  ME, "log", SQLIT
f2d0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
f2e0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
f2f0: 4e 61 6d 65 28 76 2c 20 32 2c 20 43 4f 4c 4e 41  Name(v, 2, COLNA
f300: 4d 45 5f 4e 41 4d 45 2c 20 22 63 68 65 63 6b 70  ME_NAME, "checkp
f310: 6f 69 6e 74 65 64 22 2c 20 53 51 4c 49 54 45 5f  ointed", SQLITE_
f320: 53 54 41 54 49 43 29 3b 0a 0a 20 20 20 20 73 71  STATIC);..    sq
f330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f340: 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  v, OP_Checkpoint
f350: 2c 20 69 42 74 2c 20 65 4d 6f 64 65 2c 20 31 29  , iBt, eMode, 1)
f360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f370: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f380: 73 75 6c 74 52 6f 77 2c 20 31 2c 20 33 29 3b 0a  sultRow, 1, 3);.
f390: 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20    }else..  /*.  
f3a0: 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  **   PRAGMA wal_
f3b0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 0a 20  autocheckpoint. 
f3c0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 77 61 6c   **   PRAGMA wal
f3d0: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20  _autocheckpoint 
f3e0: 3d 20 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  = N.  **.  ** Co
f3f0: 6e 66 69 67 75 72 65 20 61 20 64 61 74 61 62 61  nfigure a databa
f400: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
f410: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
f420: 68 65 63 6b 70 6f 69 6e 74 20 61 20 64 61 74 61  heckpoint a data
f430: 62 61 73 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  base.  ** after 
f440: 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 4e 20 66  accumulating N f
f450: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
f460: 2e 20 4f 72 20 71 75 65 72 79 20 66 6f 72 20 74  . Or query for t
f470: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
f480: 0a 20 20 2a 2a 20 6f 66 20 4e 2e 0a 20 20 2a 2f  .  ** of N..  */
f490: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
f4a0: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 77 61  rICmp(zLeft, "wa
f4b0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
f4c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
f4d0: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   zRight ){.     
f4e0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
f4f0: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
f500: 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69 67  sqlite3Atoi(zRig
f510: 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ht));.    }.    
f520: 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74 28  returnSingleInt(
f530: 70 50 61 72 73 65 2c 20 22 77 61 6c 5f 61 75 74  pParse, "wal_aut
f540: 6f 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 0a 20  ocheckpoint", . 
f550: 20 20 20 20 20 20 64 62 2d 3e 78 57 61 6c 43 61        db->xWalCa
f560: 6c 6c 62 61 63 6b 3d 3d 73 71 6c 69 74 65 33 57  llback==sqlite3W
f570: 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 20 3f 20  alDefaultHook ? 
f580: 0a 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  .           SQLI
f590: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 64 62  TE_PTR_TO_INT(db
f5a0: 2d 3e 70 57 61 6c 41 72 67 29 20 3a 20 30 29 3b  ->pWalArg) : 0);
f5b0: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
f5c0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
f5d0: 4d 41 20 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79  MA shrink_memory
f5e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
f5f0: 70 72 61 67 6d 61 20 61 74 74 65 6d 70 74 73 20  pragma attempts 
f600: 74 6f 20 66 72 65 65 20 61 73 20 6d 75 63 68 20  to free as much 
f610: 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
f620: 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  le from the.  **
f630: 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
f640: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
f650: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
f660: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
f670: 73 68 72 69 6e 6b 5f 6d 65 6d 6f 72 79 22 29 3d  shrink_memory")=
f680: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
f690: 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
f6a0: 6f 72 79 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65  ory(db);.  }else
f6b0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52  ..  /*.  **   PR
f6c0: 41 47 4d 41 20 62 75 73 79 5f 74 69 6d 65 6f 75  AGMA busy_timeou
f6d0: 74 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  t.  **   PRAGMA 
f6e0: 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 3d 20 4e  busy_timeout = N
f6f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20  .  **.  ** Call 
f700: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
f710: 65 6f 75 74 28 64 62 2c 20 4e 29 2e 20 20 52 65  eout(db, N).  Re
f720: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
f730: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 0a 20   timeout value. 
f740: 20 2a 2a 20 69 66 20 6f 6e 65 20 69 73 20 73 65   ** if one is se
f750: 74 2e 20 20 49 66 20 6e 6f 20 62 75 73 79 20 68  t.  If no busy h
f760: 61 6e 64 6c 65 72 20 6f 72 20 61 20 64 69 66 66  andler or a diff
f770: 65 72 65 6e 74 20 62 75 73 79 20 68 61 6e 64 6c  erent busy handl
f780: 65 72 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 74  er is set.  ** t
f790: 68 65 6e 20 30 20 69 73 20 72 65 74 75 72 6e 65  hen 0 is returne
f7a0: 64 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20  d.  Setting the 
f7b0: 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 74 6f 20  busy_timeout to 
f7c0: 30 20 6f 72 20 6e 65 67 61 74 69 76 65 0a 20 20  0 or negative.  
f7d0: 2a 2a 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  ** disables the 
f7e0: 74 69 6d 65 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20  timeout..  */.  
f7f0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
f800: 6d 70 28 7a 4c 65 66 74 2c 20 22 62 75 73 79 5f  mp(zLeft, "busy_
f810: 74 69 6d 65 6f 75 74 22 29 3d 3d 30 20 29 7b 0a  timeout")==0 ){.
f820: 20 20 20 20 69 66 28 20 7a 52 69 67 68 74 20 29      if( zRight )
f830: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
f840: 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
f850: 20 73 71 6c 69 74 65 33 41 74 6f 69 28 7a 52 69   sqlite3Atoi(zRi
f860: 67 68 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ght));.    }.   
f870: 20 72 65 74 75 72 6e 53 69 6e 67 6c 65 49 6e 74   returnSingleInt
f880: 28 70 50 61 72 73 65 2c 20 22 74 69 6d 65 6f 75  (pParse, "timeou
f890: 74 22 2c 20 20 64 62 2d 3e 62 75 73 79 54 69 6d  t",  db->busyTim
f8a0: 65 6f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  eout);.  }else..
f8b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
f8c0: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
f8d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
f8e0: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 6f  ).  /*.  ** Repo
f8f0: 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  rt the current s
f900: 74 61 74 65 20 6f 66 20 66 69 6c 65 20 6c 6f 67  tate of file log
f910: 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  s for all databa
f920: 73 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ses.  */.  if( s
f930: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c  qlite3StrICmp(zL
f940: 65 66 74 2c 20 22 6c 6f 63 6b 5f 73 74 61 74 75  eft, "lock_statu
f950: 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  s")==0 ){.    st
f960: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
f970: 2a 63 6f 6e 73 74 20 61 7a 4c 6f 63 6b 4e 61 6d  *const azLockNam
f980: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 75  e[] = {.      "u
f990: 6e 6c 6f 63 6b 65 64 22 2c 20 22 73 68 61 72 65  nlocked", "share
f9a0: 64 22 2c 20 22 72 65 73 65 72 76 65 64 22 2c 20  d", "reserved", 
f9b0: 22 70 65 6e 64 69 6e 67 22 2c 20 22 65 78 63 6c  "pending", "excl
f9c0: 75 73 69 76 65 22 0a 20 20 20 20 7d 3b 0a 20 20  usive".    };.  
f9d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
f9e0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
f9f0: 6c 73 28 76 2c 20 32 29 3b 0a 20 20 20 20 70 50  ls(v, 2);.    pP
fa00: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 32 3b 0a  arse->nMem = 2;.
fa10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
fa20: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
fa30: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 64  COLNAME_NAME, "d
fa40: 61 74 61 62 61 73 65 22 2c 20 53 51 4c 49 54 45  atabase", SQLITE
fa50: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
fa60: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
fa70: 61 6d 65 28 76 2c 20 31 2c 20 43 4f 4c 4e 41 4d  ame(v, 1, COLNAM
fa80: 45 5f 4e 41 4d 45 2c 20 22 73 74 61 74 75 73 22  E_NAME, "status"
fa90: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
faa0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
fab0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
fac0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
fad0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
fae0: 61 72 20 2a 7a 53 74 61 74 65 20 3d 20 22 75 6e  ar *zState = "un
faf0: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 20 20 69 6e  known";.      in
fb00: 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t j;.      if( d
fb10: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 3d  b->aDb[i].zName=
fb20: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
fb30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fb40: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72  AddOp4(v, OP_Str
fb50: 69 6e 67 38 2c 20 30 2c 20 31 2c 20 30 2c 20 64  ing8, 0, 1, 0, d
fb60: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c  b->aDb[i].zName,
fb70: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
fb80: 20 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62     pBt = db->aDb
fb90: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
fba0: 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20 73 71 6c  f( pBt==0 || sql
fbb0: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
fbc0: 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Bt)==0 ){.      
fbd0: 20 20 7a 53 74 61 74 65 20 3d 20 22 63 6c 6f 73    zState = "clos
fbe0: 65 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ed";.      }else
fbf0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6c   if( sqlite3_fil
fc00: 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 69 20  e_control(db, i 
fc10: 3f 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  ? db->aDb[i].zNa
fc20: 6d 65 20 3a 20 30 2c 20 0a 20 20 20 20 20 20 20  me : 0, .       
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
fc50: 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
fc60: 54 41 54 45 2c 20 26 6a 29 3d 3d 53 51 4c 49 54  TATE, &j)==SQLIT
fc70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
fc80: 20 7a 53 74 61 74 65 20 3d 20 61 7a 4c 6f 63 6b   zState = azLock
fc90: 4e 61 6d 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  Name[j];.      }
fca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fcb0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
fcc0: 74 72 69 6e 67 38 2c 20 30 2c 20 32 2c 20 30 2c  tring8, 0, 2, 0,
fcd0: 20 7a 53 74 61 74 65 2c 20 50 34 5f 53 54 41 54   zState, P4_STAT
fce0: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
fcf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fd00: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 31 2c  OP_ResultRow, 1,
fd10: 20 32 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65   2);.    }..  }e
fd20: 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  lse.#endif..#ifd
fd30: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
fd40: 44 45 43 0a 20 20 69 66 28 20 73 71 6c 69 74 65  DEC.  if( sqlite
fd50: 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  3StrICmp(zLeft, 
fd60: 22 6b 65 79 22 29 3d 3d 30 20 26 26 20 7a 52 69  "key")==0 && zRi
fd70: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
fd80: 65 33 5f 6b 65 79 28 64 62 2c 20 7a 52 69 67 68  e3_key(db, zRigh
fd90: 74 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  t, sqlite3Strlen
fda0: 33 30 28 7a 52 69 67 68 74 29 29 3b 0a 20 20 7d  30(zRight));.  }
fdb0: 65 6c 73 65 0a 20 20 69 66 28 20 73 71 6c 69 74  else.  if( sqlit
fdc0: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
fdd0: 20 22 72 65 6b 65 79 22 29 3d 3d 30 20 26 26 20   "rekey")==0 && 
fde0: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  zRight ){.    sq
fdf0: 6c 69 74 65 33 5f 72 65 6b 65 79 28 64 62 2c 20  lite3_rekey(db, 
fe00: 7a 52 69 67 68 74 2c 20 73 71 6c 69 74 65 33 53  zRight, sqlite3S
fe10: 74 72 6c 65 6e 33 30 28 7a 52 69 67 68 74 29 29  trlen30(zRight))
fe20: 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  ;.  }else.  if( 
fe30: 7a 52 69 67 68 74 20 26 26 20 28 73 71 6c 69 74  zRight && (sqlit
fe40: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
fe50: 20 22 68 65 78 6b 65 79 22 29 3d 3d 30 20 7c 7c   "hexkey")==0 ||
fe60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fe70: 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70    sqlite3StrICmp
fe80: 28 7a 4c 65 66 74 2c 20 22 68 65 78 72 65 6b 65  (zLeft, "hexreke
fe90: 79 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  y")==0) ){.    i
fea0: 6e 74 20 69 2c 20 68 31 2c 20 68 32 3b 0a 20 20  nt i, h1, h2;.  
feb0: 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b    char zKey[40];
fec0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 68  .    for(i=0; (h
fed0: 31 20 3d 20 7a 52 69 67 68 74 5b 69 5d 29 21 3d  1 = zRight[i])!=
fee0: 30 20 26 26 20 28 68 32 20 3d 20 7a 52 69 67 68  0 && (h2 = zRigh
fef0: 74 5b 69 2b 31 5d 29 21 3d 30 3b 20 69 2b 3d 32  t[i+1])!=0; i+=2
ff00: 29 7b 0a 20 20 20 20 20 20 68 31 20 2b 3d 20 39  ){.      h1 += 9
ff10: 2a 28 31 26 28 68 31 3e 3e 36 29 29 3b 0a 20 20  *(1&(h1>>6));.  
ff20: 20 20 20 20 68 32 20 2b 3d 20 39 2a 28 31 26 28      h2 += 9*(1&(
ff30: 68 32 3e 3e 36 29 29 3b 0a 20 20 20 20 20 20 7a  h2>>6));.      z
ff40: 4b 65 79 5b 69 2f 32 5d 20 3d 20 28 68 32 20 26  Key[i/2] = (h2 &
ff50: 20 30 78 30 66 29 20 7c 20 28 28 68 31 20 26 20   0x0f) | ((h1 & 
ff60: 30 78 66 29 3c 3c 34 29 3b 0a 20 20 20 20 7d 0a  0xf)<<4);.    }.
ff70: 20 20 20 20 69 66 28 20 28 7a 4c 65 66 74 5b 33      if( (zLeft[3
ff80: 5d 20 26 20 30 78 66 29 3d 3d 30 78 62 20 29 7b  ] & 0xf)==0xb ){
ff90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  .      sqlite3_k
ffa0: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 69 2f 32  ey(db, zKey, i/2
ffb0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ffc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65      sqlite3_reke
ffd0: 79 28 64 62 2c 20 7a 4b 65 79 2c 20 69 2f 32 29  y(db, zKey, i/2)
ffe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
fff0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
10000 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
10010 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  DEC) || defined(
10020 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45  SQLITE_ENABLE_CE
10030 52 4f 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74  ROD).  if( sqlit
10040 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
10050 20 22 61 63 74 69 76 61 74 65 5f 65 78 74 65 6e   "activate_exten
10060 73 69 6f 6e 73 22 29 3d 3d 30 20 26 26 20 7a 52  sions")==0 && zR
10070 69 67 68 74 20 29 7b 0a 23 69 66 64 65 66 20 53  ight ){.#ifdef S
10080 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
10090 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
100a0 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c 20  trNICmp(zRight, 
100b0 22 73 65 65 2d 22 2c 20 34 29 3d 3d 30 20 29 7b  "see-", 4)==0 ){
100c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61  .      sqlite3_a
100d0 63 74 69 76 61 74 65 5f 73 65 65 28 26 7a 52 69  ctivate_see(&zRi
100e0 67 68 74 5b 34 5d 29 3b 0a 20 20 20 20 7d 0a 23  ght[4]);.    }.#
100f0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
10100 49 54 45 5f 45 4e 41 42 4c 45 5f 43 45 52 4f 44  ITE_ENABLE_CEROD
10110 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10120 53 74 72 4e 49 43 6d 70 28 7a 52 69 67 68 74 2c  StrNICmp(zRight,
10130 20 22 63 65 72 6f 64 2d 22 2c 20 36 29 3d 3d 30   "cerod-", 6)==0
10140 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10150 33 5f 61 63 74 69 76 61 74 65 5f 63 65 72 6f 64  3_activate_cerod
10160 28 26 7a 52 69 67 68 74 5b 36 5d 29 3b 0a 20 20  (&zRight[6]);.  
10170 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
10180 73 65 0a 23 65 6e 64 69 66 0a 0a 20 0a 20 20 7b  se.#endif.. .  {
10190 2f 2a 20 45 6d 70 74 79 20 45 4c 53 45 20 63 6c  /* Empty ELSE cl
101a0 61 75 73 65 20 2a 2f 7d 0a 0a 20 20 2f 2a 0a 20  ause */}..  /*. 
101b0 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73 61   ** Reset the sa
101c0 66 65 74 79 20 6c 65 76 65 6c 2c 20 69 6e 20 63  fety level, in c
101d0 61 73 65 20 74 68 65 20 66 75 6c 6c 66 73 79 6e  ase the fullfsyn
101e0 63 20 66 6c 61 67 20 6f 72 20 73 79 6e 63 68 72  c flag or synchr
101f0 6f 6e 6f 75 73 0a 20 20 2a 2a 20 73 65 74 74 69  onous.  ** setti
10200 6e 67 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f  ng changed..  */
10210 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10220 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
10230 41 53 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  AS.  if( db->aut
10240 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73  oCommit ){.    s
10250 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61  qlite3BtreeSetSa
10260 66 65 74 79 4c 65 76 65 6c 28 70 44 62 2d 3e 70  fetyLevel(pDb->p
10270 42 74 2c 20 70 44 62 2d 3e 73 61 66 65 74 79 5f  Bt, pDb->safety_
10280 6c 65 76 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  level,.         
10290 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73        (db->flags
102a0 26 53 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e  &SQLITE_FullFSyn
102b0 63 29 21 3d 30 2c 0a 20 20 20 20 20 20 20 20 20  c)!=0,.         
102c0 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73        (db->flags
102d0 26 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c  &SQLITE_CkptFull
102e0 46 53 79 6e 63 29 21 3d 30 29 3b 0a 20 20 7d 0a  FSync)!=0);.  }.
102f0 23 65 6e 64 69 66 0a 70 72 61 67 6d 61 5f 6f 75  #endif.pragma_ou
10300 74 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  t:.  sqlite3DbFr
10310 65 65 28 64 62 2c 20 7a 4c 65 66 74 29 3b 0a 20  ee(db, zLeft);. 
10320 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10330 62 2c 20 7a 52 69 67 68 74 29 3b 0a 7d 0a 0a 23  b, zRight);.}..#
10340 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10350 4f 4d 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a     OMIT_PRAGMA */.