/ Hex Artifact Content
Login

Artifact 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 2d 30 39 2d 32 37  /*.** 2018-09-27
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 61 6e 20  demonstrates an 
0190: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
01a0: 6c 20 74 61 62 6c 65 20 74 68 61 74 20 72 65 74  l table that ret
01b0: 75 72 6e 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  urns information
01c0: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  .** from sqlite3
01d0: 5f 73 74 61 74 75 73 36 34 28 29 20 61 6e 64 20  _status64() and 
01e0: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
01f0: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  s()..**.** Usage
0200: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
0210: 20 20 20 20 2e 6c 6f 61 64 20 2e 2f 6d 65 6d 73      .load ./mems
0220: 74 61 74 0a 2a 2a 20 20 20 20 20 2e 6d 6f 64 65  tat.**     .mode
0230: 20 71 75 6f 74 65 0a 2a 2a 20 20 20 20 20 2e 68   quote.**     .h
0240: 65 61 64 65 72 20 6f 6e 0a 2a 2a 20 20 20 20 20  eader on.**     
0250: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 65  SELECT * FROM me
0260: 6d 73 74 61 74 3b 0a 2a 2f 0a 23 69 66 20 21 64  mstat;.*/.#if !d
0270: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
0280: 52 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  RE) || defined(S
0290: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
02a0: 53 54 41 54 56 54 41 42 29 0a 23 69 66 20 21 64  STATVTAB).#if !d
02b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 49 4e 54  efined(SQLITEINT
02c0: 5f 48 29 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  _H).#include "sq
02d0: 6c 69 74 65 33 65 78 74 2e 68 22 0a 23 65 6e 64  lite3ext.h".#end
02e0: 69 66 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  if.SQLITE_EXTENS
02f0: 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75  ION_INIT1.#inclu
0300: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
0310: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0320: 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  >..#ifndef SQLIT
0330: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
0340: 42 4c 45 0a 0a 2f 2a 20 6d 65 6d 73 74 61 74 5f  BLE../* memstat_
0350: 76 74 61 62 20 69 73 20 61 20 73 75 62 63 6c 61  vtab is a subcla
0360: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 74  ss of sqlite3_vt
0370: 61 62 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a  ab which will.**
0380: 20 73 65 72 76 65 20 61 73 20 74 68 65 20 75 6e   serve as the un
0390: 64 65 72 6c 79 69 6e 67 20 72 65 70 72 65 73 65  derlying represe
03a0: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 6d 65 6d  ntation of a mem
03b0: 73 74 61 74 20 76 69 72 74 75 61 6c 20 74 61 62  stat virtual tab
03c0: 6c 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  le.*/.typedef st
03d0: 72 75 63 74 20 6d 65 6d 73 74 61 74 5f 76 74 61  ruct memstat_vta
03e0: 62 20 6d 65 6d 73 74 61 74 5f 76 74 61 62 3b 0a  b memstat_vtab;.
03f0: 73 74 72 75 63 74 20 6d 65 6d 73 74 61 74 5f 76  struct memstat_v
0400: 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  tab {.  sqlite3_
0410: 76 74 61 62 20 62 61 73 65 3b 20 20 2f 2a 20 42  vtab base;  /* B
0420: 61 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73 74  ase class - must
0430: 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73   be first */.  s
0440: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
0450: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
0460: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 74 68  onnection for th
0470: 69 73 20 6d 65 6d 73 74 61 74 20 76 74 61 62 20  is memstat vtab 
0480: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 6d 65 6d 73 74 61  */.};../* memsta
0490: 74 5f 63 75 72 73 6f 72 20 69 73 20 61 20 73 75  t_cursor is a su
04a0: 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65  bclass of sqlite
04b0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 77 68  3_vtab_cursor wh
04c0: 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 73 65 72 76  ich will.** serv
04d0: 65 20 61 73 20 74 68 65 20 75 6e 64 65 72 6c 79  e as the underly
04e0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
04f0: 6f 6e 20 6f 66 20 61 20 63 75 72 73 6f 72 20 74  on of a cursor t
0500: 68 61 74 20 73 63 61 6e 73 0a 2a 2a 20 6f 76 65  hat scans.** ove
0510: 72 20 72 6f 77 73 20 6f 66 20 74 68 65 20 72 65  r rows of the re
0520: 73 75 6c 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  sult.*/.typedef 
0530: 73 74 72 75 63 74 20 6d 65 6d 73 74 61 74 5f 63  struct memstat_c
0540: 75 72 73 6f 72 20 6d 65 6d 73 74 61 74 5f 63 75  ursor memstat_cu
0550: 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 6d 65 6d  rsor;.struct mem
0560: 73 74 61 74 5f 63 75 72 73 6f 72 20 7b 0a 20 20  stat_cursor {.  
0570: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
0580: 73 6f 72 20 62 61 73 65 3b 20 20 2f 2a 20 42 61  sor base;  /* Ba
0590: 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20  se class - must 
05a0: 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71  be first */.  sq
05b0: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
05c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
05d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
05e0: 66 6f 72 20 74 68 69 73 20 63 75 72 73 6f 72 20  for this cursor 
05f0: 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 3b  */.  int iRowid;
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 20 69  /* Current row i
0620: 6e 20 61 4d 65 6d 73 74 61 74 43 6f 6c 75 6d 6e  n aMemstatColumn
0630: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  [] */.  int iDb;
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0650: 20 20 20 2f 2a 20 57 68 69 63 68 20 73 63 68 65     /* Which sche
0660: 6d 61 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  ma we are lookin
0670: 67 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  g at */.  int nD
0680: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
0690: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
06a0: 66 20 73 63 68 65 6d 61 73 20 2a 2f 0a 20 20 63  f schemas */.  c
06b0: 68 61 72 20 2a 2a 61 7a 44 62 3b 20 20 20 20 20  har **azDb;     
06c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
06d0: 65 73 20 6f 66 20 61 6c 6c 20 73 63 68 65 6d 61  es of all schema
06e0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  s */.  sqlite3_i
06f0: 6e 74 36 34 20 61 56 61 6c 5b 32 5d 3b 20 20 20  nt64 aVal[2];   
0700: 20 20 2f 2a 20 52 65 73 75 6c 74 20 76 61 6c 75    /* Result valu
0710: 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
0720: 54 68 65 20 6d 65 6d 73 74 61 74 43 6f 6e 6e 65  The memstatConne
0730: 63 74 28 29 20 6d 65 74 68 6f 64 20 69 73 20 69  ct() method is i
0740: 6e 76 6f 6b 65 64 20 74 6f 20 63 72 65 61 74 65  nvoked to create
0750: 20 61 20 6e 65 77 0a 2a 2a 20 6d 65 6d 73 74 61   a new.** memsta
0760: 74 5f 76 74 61 62 20 74 68 61 74 20 64 65 73 63  t_vtab that desc
0770: 72 69 62 65 73 20 74 68 65 20 6d 65 6d 73 74 61  ribes the memsta
0780: 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  t virtual table.
0790: 0a 2a 2a 0a 2a 2a 20 54 68 69 6e 6b 20 6f 66 20  .**.** Think of 
07a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 20  this routine as 
07b0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20  the constructor 
07c0: 66 6f 72 20 6d 65 6d 73 74 61 74 5f 76 74 61 62  for memstat_vtab
07d0: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20   objects..**.** 
07e0: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
07f0: 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 69 73 3a   needs to do is:
0800: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 41 6c  .**.**    (1) Al
0810: 6c 6f 63 61 74 65 20 74 68 65 20 6d 65 6d 73 74  locate the memst
0820: 61 74 5f 76 74 61 62 20 6f 62 6a 65 63 74 20 61  at_vtab object a
0830: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c  nd initialize al
0840: 6c 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  l fields..**.** 
0850: 20 20 20 28 32 29 20 54 65 6c 6c 20 53 51 4c 69     (2) Tell SQLi
0860: 74 65 20 28 76 69 61 20 74 68 65 20 73 71 6c 69  te (via the sqli
0870: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
0880: 28 29 20 69 6e 74 65 72 66 61 63 65 29 20 77 68  () interface) wh
0890: 61 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  at the.**       
08a0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 71   result set of q
08b0: 75 65 72 69 65 73 20 61 67 61 69 6e 73 74 20 6d  ueries against m
08c0: 65 6d 73 74 61 74 20 77 69 6c 6c 20 6c 6f 6f 6b  emstat will look
08d0: 20 6c 69 6b 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   like..*/.static
08e0: 20 69 6e 74 20 6d 65 6d 73 74 61 74 43 6f 6e 6e   int memstatConn
08f0: 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
0900: 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78  db,.  void *pAux
0910: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f  ,.  int argc, co
0920: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a  nst char *const*
0930: 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argv,.  sqlite3_
0940: 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20  vtab **ppVtab,. 
0950: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
0960: 0a 20 20 6d 65 6d 73 74 61 74 5f 76 74 61 62 20  .  memstat_vtab 
0970: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 3b  *pNew;.  int rc;
0980: 0a 0a 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62  ../* Column numb
0990: 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ers */.#define M
09a0: 53 56 5f 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 20 20  SV_COLUMN_NAME  
09b0: 20 20 30 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66    0   /* Name of
09c0: 20 71 75 61 6e 74 69 74 79 20 62 65 69 6e 67 20   quantity being 
09d0: 6d 65 61 73 75 72 65 64 20 2a 2f 0a 23 64 65 66  measured */.#def
09e0: 69 6e 65 20 4d 53 56 5f 43 4f 4c 55 4d 4e 5f 53  ine MSV_COLUMN_S
09f0: 43 48 45 4d 41 20 20 31 20 20 20 2f 2a 20 73 63  CHEMA  1   /* sc
0a00: 68 65 6d 61 20 6e 61 6d 65 20 2a 2f 0a 23 64 65  hema name */.#de
0a10: 66 69 6e 65 20 4d 53 56 5f 43 4f 4c 55 4d 4e 5f  fine MSV_COLUMN_
0a20: 56 41 4c 55 45 20 20 20 32 20 20 20 2f 2a 20 43  VALUE   2   /* C
0a30: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 2a 2f 0a  urrent value */.
0a40: 23 64 65 66 69 6e 65 20 4d 53 56 5f 43 4f 4c 55  #define MSV_COLU
0a50: 4d 4e 5f 48 49 57 54 52 20 20 20 33 20 20 20 2f  MN_HIWTR   3   /
0a60: 2a 20 48 69 67 68 77 61 74 65 72 20 6d 61 72 6b  * Highwater mark
0a70: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   */..  rc = sqli
0a80: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
0a90: 28 64 62 2c 22 43 52 45 41 54 45 20 54 41 42 4c  (db,"CREATE TABL
0aa0: 45 20 78 28 6e 61 6d 65 2c 73 63 68 65 6d 61 2c  E x(name,schema,
0ab0: 76 61 6c 75 65 2c 68 69 77 74 72 29 22 29 3b 0a  value,hiwtr)");.
0ac0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
0ad0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  _OK ){.    pNew 
0ae0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
0af0: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
0b00: 29 3b 0a 20 20 20 20 2a 70 70 56 74 61 62 20 3d  );.    *ppVtab =
0b10: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29   (sqlite3_vtab*)
0b20: 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 70 4e  pNew;.    if( pN
0b30: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
0b40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
0b50: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
0b60: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
0b70: 0a 20 20 20 20 70 4e 65 77 2d 3e 64 62 20 3d 20  .    pNew->db = 
0b80: 64 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  db;.  }.  return
0b90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
0ba0: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65  is method is the
0bb0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
0bc0: 6d 65 6d 73 74 61 74 5f 63 75 72 73 6f 72 20 6f  memstat_cursor o
0bd0: 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
0be0: 63 20 69 6e 74 20 6d 65 6d 73 74 61 74 44 69 73  c int memstatDis
0bf0: 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f  connect(sqlite3_
0c00: 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
0c10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
0c20: 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
0c30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
0c40: 2a 20 43 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f  * Constructor fo
0c50: 72 20 61 20 6e 65 77 20 6d 65 6d 73 74 61 74 5f  r a new memstat_
0c60: 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  cursor object..*
0c70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
0c80: 73 74 61 74 4f 70 65 6e 28 73 71 6c 69 74 65 33  statOpen(sqlite3
0c90: 5f 76 74 61 62 20 2a 70 2c 20 73 71 6c 69 74 65  _vtab *p, sqlite
0ca0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a  3_vtab_cursor **
0cb0: 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 6d 65 6d  ppCursor){.  mem
0cc0: 73 74 61 74 5f 63 75 72 73 6f 72 20 2a 70 43 75  stat_cursor *pCu
0cd0: 72 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69  r;.  pCur = sqli
0ce0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
0cf0: 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69  of(*pCur) );.  i
0d00: 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72 65 74  f( pCur==0 ) ret
0d10: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
0d20: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2c  ;.  memset(pCur,
0d30: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72   0, sizeof(*pCur
0d40: 29 29 3b 0a 20 20 70 43 75 72 2d 3e 64 62 20 3d  ));.  pCur->db =
0d50: 20 28 28 6d 65 6d 73 74 61 74 5f 76 74 61 62 2a   ((memstat_vtab*
0d60: 29 70 29 2d 3e 64 62 3b 0a 20 20 2a 70 70 43 75  )p)->db;.  *ppCu
0d70: 72 73 6f 72 20 3d 20 26 70 43 75 72 2d 3e 62 61  rsor = &pCur->ba
0d80: 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  se;.  return SQL
0d90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
0da0: 20 43 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73   Clear all the s
0db0: 63 68 65 6d 61 20 6e 61 6d 65 73 20 66 72 6f 6d  chema names from
0dc0: 20 61 20 63 75 72 73 6f 72 0a 2a 2f 0a 73 74 61   a cursor.*/.sta
0dd0: 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 74 61 74  tic void memstat
0de0: 43 6c 65 61 72 53 63 68 65 6d 61 28 6d 65 6d 73  ClearSchema(mems
0df0: 74 61 74 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  tat_cursor *pCur
0e00: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
0e10: 28 20 70 43 75 72 2d 3e 61 7a 44 62 3d 3d 30 20  ( pCur->azDb==0 
0e20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
0e30: 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 6e 44 62  i=0; i<pCur->nDb
0e40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
0e50: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61  te3_free(pCur->a
0e60: 7a 44 62 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73  zDb[i]);.  }.  s
0e70: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
0e80: 2d 3e 61 7a 44 62 29 3b 0a 20 20 70 43 75 72 2d  ->azDb);.  pCur-
0e90: 3e 61 7a 44 62 20 3d 20 30 3b 0a 20 20 70 43 75  >azDb = 0;.  pCu
0ea0: 72 2d 3e 6e 44 62 20 3d 20 30 3b 0a 7d 0a 0a 2f  r->nDb = 0;.}../
0eb0: 2a 0a 2a 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65  *.** Fill in the
0ec0: 20 61 7a 44 62 5b 5d 20 61 72 72 61 79 20 66 6f   azDb[] array fo
0ed0: 72 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  r the cursor..*/
0ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 73  .static int mems
0ef0: 74 61 74 46 69 6e 64 53 63 68 65 6d 61 73 28 6d  tatFindSchemas(m
0f00: 65 6d 73 74 61 74 5f 63 75 72 73 6f 72 20 2a 70  emstat_cursor *p
0f10: 43 75 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Cur){.  sqlite3_
0f20: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
0f30: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
0f40: 20 70 43 75 72 2d 3e 6e 44 62 20 29 20 72 65 74   pCur->nDb ) ret
0f50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
0f60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
0f70: 65 70 61 72 65 5f 76 32 28 70 43 75 72 2d 3e 64  epare_v2(pCur->d
0f80: 62 2c 20 22 50 52 41 47 4d 41 20 64 61 74 61 62  b, "PRAGMA datab
0f90: 61 73 65 5f 6c 69 73 74 22 2c 20 2d 31 2c 20 26  ase_list", -1, &
0fa0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
0fb0: 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
0fc0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
0fd0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  t);.    return r
0fe0: 63 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  c;.  }.  while( 
0ff0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1000: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
1010: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a  ){.    char **az
1020: 2c 20 2a 7a 3b 0a 20 20 20 20 61 7a 20 3d 20 73  , *z;.    az = s
1030: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34  qlite3_realloc64
1040: 28 70 43 75 72 2d 3e 61 7a 44 62 2c 20 73 69 7a  (pCur->azDb, siz
1050: 65 6f 66 28 63 68 61 72 2a 29 2a 28 70 43 75 72  eof(char*)*(pCur
1060: 2d 3e 6e 44 62 2b 31 29 29 3b 0a 20 20 20 20 69  ->nDb+1));.    i
1070: 66 28 20 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  f( az==0 ){.    
1080: 20 20 6d 65 6d 73 74 61 74 43 6c 65 61 72 53 63    memstatClearSc
1090: 68 65 6d 61 28 70 43 75 72 29 3b 0a 20 20 20 20  hema(pCur);.    
10a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
10c0: 20 70 43 75 72 2d 3e 61 7a 44 62 20 3d 20 61 7a   pCur->azDb = az
10d0: 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  ;.    z = sqlite
10e0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
10f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1100: 65 78 74 28 70 53 74 6d 74 2c 20 31 29 29 3b 0a  ext(pStmt, 1));.
1110: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
1120: 20 20 20 20 20 20 6d 65 6d 73 74 61 74 43 6c 65        memstatCle
1130: 61 72 53 63 68 65 6d 61 28 70 43 75 72 29 3b 0a  arSchema(pCur);.
1140: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1150: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1160: 0a 20 20 20 20 70 43 75 72 2d 3e 61 7a 44 62 5b  .    pCur->azDb[
1170: 70 43 75 72 2d 3e 6e 44 62 5d 20 3d 20 7a 3b 0a  pCur->nDb] = z;.
1180: 20 20 20 20 70 43 75 72 2d 3e 6e 44 62 2b 2b 3b      pCur->nDb++;
1190: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
11a0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
11b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11c0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  OK;.}.../*.** De
11d0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20 6d  structor for a m
11e0: 65 6d 73 74 61 74 5f 63 75 72 73 6f 72 2e 0a 2a  emstat_cursor..*
11f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
1200: 73 74 61 74 43 6c 6f 73 65 28 73 71 6c 69 74 65  statClose(sqlite
1210: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
1220: 75 72 29 7b 0a 20 20 6d 65 6d 73 74 61 74 5f 63  ur){.  memstat_c
1230: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 6d  ursor *pCur = (m
1240: 65 6d 73 74 61 74 5f 63 75 72 73 6f 72 2a 29 63  emstat_cursor*)c
1250: 75 72 3b 0a 20 20 6d 65 6d 73 74 61 74 43 6c 65  ur;.  memstatCle
1260: 61 72 53 63 68 65 6d 61 28 70 43 75 72 29 3b 0a  arSchema(pCur);.
1270: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63    sqlite3_free(c
1280: 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ur);.  return SQ
1290: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
12a0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
12b0: 73 20 66 6f 72 20 61 4d 65 6d 73 74 61 74 43 6f  s for aMemstatCo
12c0: 6c 75 6d 6e 5b 5d 2e 65 54 79 70 65 0a 2a 2f 0a  lumn[].eType.*/.
12d0: 23 64 65 66 69 6e 65 20 4d 53 56 5f 47 53 54 41  #define MSV_GSTA
12e0: 54 20 20 20 30 20 20 20 20 20 20 20 20 20 20 2f  T   0          /
12f0: 2a 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73  * sqlite3_status
1300: 36 34 28 29 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  64() information
1310: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 53 56 5f   */.#define MSV_
1320: 44 42 20 20 20 20 20 20 31 20 20 20 20 20 20 20  DB      1       
1330: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 64 62     /* sqlite3_db
1340: 5f 73 74 61 74 75 73 28 29 20 69 6e 66 6f 72 6d  _status() inform
1350: 61 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ation */.#define
1360: 20 4d 53 56 5f 5a 49 50 56 46 53 20 20 32 20 20   MSV_ZIPVFS  2  
1370: 20 20 20 20 20 20 20 20 2f 2a 20 5a 49 50 56 46          /* ZIPVF
1380: 53 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 77  S file-control w
1390: 69 74 68 20 36 34 2d 62 69 74 20 72 65 74 75 72  ith 64-bit retur
13a0: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61  n */../*.** An a
13b0: 72 72 61 79 20 6f 66 20 71 75 61 6e 74 69 74 69  rray of quantiti
13c0: 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 6d  es that can be m
13d0: 65 61 73 75 72 65 64 20 61 6e 64 20 72 65 70 6f  easured and repo
13e0: 72 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  rted by.** this 
13f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a 2f  virtual table.*/
1400: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74  .static const st
1410: 72 75 63 74 20 4d 65 6d 73 74 61 74 43 6f 6c 75  ruct MemstatColu
1420: 6d 6e 73 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  mns {.  const ch
1430: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 2f 2a  ar *zName;    /*
1440: 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 2a   Symbolic name *
1450: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1460: 72 20 65 54 79 70 65 3b 20 20 2f 2a 20 54 79 70  r eType;  /* Typ
1470: 65 20 6f 66 20 69 6e 74 65 72 66 61 63 65 20 2a  e of interface *
1480: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1490: 72 20 6d 4e 75 6c 6c 3b 20 20 2f 2a 20 42 69 74  r mNull;  /* Bit
14a0: 6d 61 73 6b 20 6f 66 20 77 68 69 63 68 20 63 6f  mask of which co
14b0: 6c 75 6d 6e 73 20 61 72 65 20 4e 55 4c 4c 20 2a  lumns are NULL *
14c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
14d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
14e0: 64 62 6e 61 6d 65 2c 20 20 34 3a 20 63 75 72 72  dbname,  4: curr
14f0: 65 6e 74 2c 20 20 38 3a 20 68 69 77 74 72 20 2a  ent,  8: hiwtr *
1500: 2f 0a 20 20 69 6e 74 20 65 4f 70 3b 20 20 20 20  /.  int eOp;    
1510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
1520: 6f 64 65 20 2a 2f 0a 7d 20 61 4d 65 6d 73 74 61  ode */.} aMemsta
1530: 74 43 6f 6c 75 6d 6e 5b 5d 20 3d 20 7b 0a 20 7b  tColumn[] = {. {
1540: 22 4d 45 4d 4f 52 59 5f 55 53 45 44 22 2c 20 20  "MEMORY_USED",  
1550: 20 20 20 20 20 20 20 20 20 20 4d 53 56 5f 47 53            MSV_GS
1560: 54 41 54 2c 20 20 32 2c 20 53 51 4c 49 54 45 5f  TAT,  2, SQLITE_
1570: 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53  STATUS_MEMORY_US
1580: 45 44 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ED          },. 
1590: 7b 22 4d 41 4c 4c 4f 43 5f 53 49 5a 45 22 2c 20  {"MALLOC_SIZE", 
15a0: 20 20 20 20 20 20 20 20 20 20 20 4d 53 56 5f 47             MSV_G
15b0: 53 54 41 54 2c 20 20 36 2c 20 53 51 4c 49 54 45  STAT,  6, SQLITE
15c0: 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53  _STATUS_MALLOC_S
15d0: 49 5a 45 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  IZE          },.
15e0: 20 7b 22 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 22   {"MALLOC_COUNT"
15f0: 2c 20 20 20 20 20 20 20 20 20 20 20 4d 53 56 5f  ,           MSV_
1600: 47 53 54 41 54 2c 20 20 32 2c 20 53 51 4c 49 54  GSTAT,  2, SQLIT
1610: 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f  E_STATUS_MALLOC_
1620: 43 4f 55 4e 54 20 20 20 20 20 20 20 20 20 7d 2c  COUNT         },
1630: 0a 20 7b 22 50 41 47 45 43 41 43 48 45 5f 55 53  . {"PAGECACHE_US
1640: 45 44 22 2c 20 20 20 20 20 20 20 20 20 4d 53 56  ED",         MSV
1650: 5f 47 53 54 41 54 2c 20 20 32 2c 20 53 51 4c 49  _GSTAT,  2, SQLI
1660: 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
1670: 43 48 45 5f 55 53 45 44 20 20 20 20 20 20 20 7d  CHE_USED       }
1680: 2c 0a 20 7b 22 50 41 47 45 43 41 43 48 45 5f 4f  ,. {"PAGECACHE_O
1690: 56 45 52 46 4c 4f 57 22 2c 20 20 20 20 20 4d 53  VERFLOW",     MS
16a0: 56 5f 47 53 54 41 54 2c 20 20 32 2c 20 53 51 4c  V_GSTAT,  2, SQL
16b0: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
16c0: 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 20 20 20  ACHE_OVERFLOW   
16d0: 7d 2c 0a 20 7b 22 50 41 47 45 43 41 43 48 45 5f  },. {"PAGECACHE_
16e0: 53 49 5a 45 22 2c 20 20 20 20 20 20 20 20 20 4d  SIZE",         M
16f0: 53 56 5f 47 53 54 41 54 2c 20 20 36 2c 20 53 51  SV_GSTAT,  6, SQ
1700: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
1710: 43 41 43 48 45 5f 53 49 5a 45 20 20 20 20 20 20  CACHE_SIZE      
1720: 20 7d 2c 0a 20 7b 22 50 41 52 53 45 52 5f 53 54   },. {"PARSER_ST
1730: 41 43 4b 22 2c 20 20 20 20 20 20 20 20 20 20 20  ACK",           
1740: 4d 53 56 5f 47 53 54 41 54 2c 20 20 36 2c 20 53  MSV_GSTAT,  6, S
1750: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 52  QLITE_STATUS_PAR
1760: 53 45 52 5f 53 54 41 43 4b 20 20 20 20 20 20 20  SER_STACK       
1770: 20 20 7d 2c 0a 20 7b 22 44 42 5f 4c 4f 4f 4b 41    },. {"DB_LOOKA
1780: 53 49 44 45 5f 55 53 45 44 22 2c 20 20 20 20 20  SIDE_USED",     
1790: 20 4d 53 56 5f 44 42 2c 20 20 20 20 20 32 2c 20   MSV_DB,     2, 
17a0: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
17b0: 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 20 20  LOOKASIDE_USED  
17c0: 20 20 20 7d 2c 0a 20 7b 22 44 42 5f 4c 4f 4f 4b     },. {"DB_LOOK
17d0: 41 53 49 44 45 5f 48 49 54 22 2c 20 20 20 20 20  ASIDE_HIT",     
17e0: 20 20 4d 53 56 5f 44 42 2c 20 20 20 20 20 36 2c    MSV_DB,     6,
17f0: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
1800: 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 20 20  _LOOKASIDE_HIT  
1810: 20 20 20 20 7d 2c 0a 20 7b 22 44 42 5f 4c 4f 4f      },. {"DB_LOO
1820: 4b 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45  KASIDE_MISS_SIZE
1830: 22 2c 20 4d 53 56 5f 44 42 2c 20 20 20 20 20 36  ", MSV_DB,     6
1840: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
1850: 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53  S_LOOKASIDE_MISS
1860: 5f 53 49 5a 45 7d 2c 0a 20 7b 22 44 42 5f 4c 4f  _SIZE},. {"DB_LO
1870: 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c  OKASIDE_MISS_FUL
1880: 4c 22 2c 20 4d 53 56 5f 44 42 2c 20 20 20 20 20  L", MSV_DB,     
1890: 36 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  6, SQLITE_DBSTAT
18a0: 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53  US_LOOKASIDE_MIS
18b0: 53 5f 46 55 4c 4c 7d 2c 0a 20 7b 22 44 42 5f 43  S_FULL},. {"DB_C
18c0: 41 43 48 45 5f 55 53 45 44 22 2c 20 20 20 20 20  ACHE_USED",     
18d0: 20 20 20 20 20 4d 53 56 5f 44 42 2c 20 20 20 20       MSV_DB,    
18e0: 31 30 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  10, SQLITE_DBSTA
18f0: 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 20 20  TUS_CACHE_USED  
1900: 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 20 53 51         },.#if SQ
1910: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
1920: 42 45 52 20 3e 3d 20 33 31 34 30 30 30 30 0a 20  BER >= 3140000. 
1930: 7b 22 44 42 5f 43 41 43 48 45 5f 55 53 45 44 5f  {"DB_CACHE_USED_
1940: 53 48 41 52 45 44 22 2c 20 20 20 4d 53 56 5f 44  SHARED",   MSV_D
1950: 42 2c 20 20 20 20 31 30 2c 20 53 51 4c 49 54 45  B,    10, SQLITE
1960: 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
1970: 55 53 45 44 5f 53 48 41 52 45 44 20 20 7d 2c 0a  USED_SHARED  },.
1980: 23 65 6e 64 69 66 0a 20 7b 22 44 42 5f 53 43 48  #endif. {"DB_SCH
1990: 45 4d 41 5f 55 53 45 44 22 2c 20 20 20 20 20 20  EMA_USED",      
19a0: 20 20 20 4d 53 56 5f 44 42 2c 20 20 20 20 31 30     MSV_DB,    10
19b0: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
19c0: 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 20 20 20  S_SCHEMA_USED   
19d0: 20 20 20 20 20 7d 2c 0a 20 7b 22 44 42 5f 53 54       },. {"DB_ST
19e0: 4d 54 5f 55 53 45 44 22 2c 20 20 20 20 20 20 20  MT_USED",       
19f0: 20 20 20 20 4d 53 56 5f 44 42 2c 20 20 20 20 31      MSV_DB,    1
1a00: 30 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  0, SQLITE_DBSTAT
1a10: 55 53 5f 53 54 4d 54 5f 55 53 45 44 20 20 20 20  US_STMT_USED    
1a20: 20 20 20 20 20 20 7d 2c 0a 20 7b 22 44 42 5f 43        },. {"DB_C
1a30: 41 43 48 45 5f 48 49 54 22 2c 20 20 20 20 20 20  ACHE_HIT",      
1a40: 20 20 20 20 20 4d 53 56 5f 44 42 2c 20 20 20 20       MSV_DB,    
1a50: 31 30 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  10, SQLITE_DBSTA
1a60: 54 55 53 5f 43 41 43 48 45 5f 48 49 54 20 20 20  TUS_CACHE_HIT   
1a70: 20 20 20 20 20 20 20 7d 2c 0a 20 7b 22 44 42 5f         },. {"DB_
1a80: 43 41 43 48 45 5f 4d 49 53 53 22 2c 20 20 20 20  CACHE_MISS",    
1a90: 20 20 20 20 20 20 4d 53 56 5f 44 42 2c 20 20 20        MSV_DB,   
1aa0: 20 31 30 2c 20 53 51 4c 49 54 45 5f 44 42 53 54   10, SQLITE_DBST
1ab0: 41 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 20  ATUS_CACHE_MISS 
1ac0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 7b 22 44 42          },. {"DB
1ad0: 5f 43 41 43 48 45 5f 57 52 49 54 45 22 2c 20 20  _CACHE_WRITE",  
1ae0: 20 20 20 20 20 20 20 4d 53 56 5f 44 42 2c 20 20         MSV_DB,  
1af0: 20 20 31 30 2c 20 53 51 4c 49 54 45 5f 44 42 53    10, SQLITE_DBS
1b00: 54 41 54 55 53 5f 43 41 43 48 45 5f 57 52 49 54  TATUS_CACHE_WRIT
1b10: 45 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 20  E        },.#if 
1b20: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
1b30: 55 4d 42 45 52 20 3e 3d 20 33 32 33 30 30 30 30  UMBER >= 3230000
1b40: 0a 20 7b 22 44 42 5f 43 41 43 48 45 5f 53 50 49  . {"DB_CACHE_SPI
1b50: 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 4d 53 56  LL",         MSV
1b60: 5f 44 42 2c 20 20 20 20 31 30 2c 20 53 51 4c 49  _DB,    10, SQLI
1b70: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
1b80: 45 5f 53 50 49 4c 4c 20 20 20 20 20 20 20 20 7d  E_SPILL        }
1b90: 2c 0a 23 65 6e 64 69 66 0a 20 7b 22 44 42 5f 44  ,.#endif. {"DB_D
1ba0: 45 46 45 52 52 45 44 5f 46 4b 53 22 2c 20 20 20  EFERRED_FKS",   
1bb0: 20 20 20 20 20 4d 53 56 5f 44 42 2c 20 20 20 20       MSV_DB,    
1bc0: 31 30 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  10, SQLITE_DBSTA
1bd0: 54 55 53 5f 44 45 46 45 52 52 45 44 5f 46 4b 53  TUS_DEFERRED_FKS
1be0: 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66         },.#ifdef
1bf0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a   SQLITE_ENABLE_Z
1c00: 49 50 56 46 53 0a 20 7b 22 5a 49 50 56 46 53 5f  IPVFS. {"ZIPVFS_
1c10: 43 41 43 48 45 5f 55 53 45 44 22 2c 20 20 20 20  CACHE_USED",    
1c20: 20 20 4d 53 56 5f 5a 49 50 56 46 53 2c 20 38 2c    MSV_ZIPVFS, 8,
1c30: 20 32 33 31 34 35 34 20 7d 2c 0a 20 7b 22 5a 49   231454 },. {"ZI
1c40: 50 56 46 53 5f 43 41 43 48 45 5f 48 49 54 22 2c  PVFS_CACHE_HIT",
1c50: 20 20 20 20 20 20 20 4d 53 56 5f 5a 49 50 56 46         MSV_ZIPVF
1c60: 53 2c 20 38 2c 20 32 33 31 34 35 35 20 7d 2c 0a  S, 8, 231455 },.
1c70: 20 7b 22 5a 49 50 56 46 53 5f 43 41 43 48 45 5f   {"ZIPVFS_CACHE_
1c80: 4d 49 53 53 22 2c 20 20 20 20 20 20 4d 53 56 5f  MISS",      MSV_
1c90: 5a 49 50 56 46 53 2c 20 38 2c 20 32 33 31 34 35  ZIPVFS, 8, 23145
1ca0: 36 20 7d 2c 0a 20 7b 22 5a 49 50 56 46 53 5f 43  6 },. {"ZIPVFS_C
1cb0: 41 43 48 45 5f 57 52 49 54 45 22 2c 20 20 20 20  ACHE_WRITE",    
1cc0: 20 4d 53 56 5f 5a 49 50 56 46 53 2c 20 38 2c 20   MSV_ZIPVFS, 8, 
1cd0: 32 33 31 34 35 37 20 7d 2c 0a 20 7b 22 5a 49 50  231457 },. {"ZIP
1ce0: 56 46 53 5f 44 49 52 45 43 54 5f 52 45 41 44 22  VFS_DIRECT_READ"
1cf0: 2c 20 20 20 20 20 4d 53 56 5f 5a 49 50 56 46 53  ,     MSV_ZIPVFS
1d00: 2c 20 38 2c 20 32 33 31 34 35 38 20 7d 2c 0a 20  , 8, 231458 },. 
1d10: 7b 22 5a 49 50 56 46 53 5f 44 49 52 45 43 54 5f  {"ZIPVFS_DIRECT_
1d20: 42 59 54 45 53 22 2c 20 20 20 20 4d 53 56 5f 5a  BYTES",    MSV_Z
1d30: 49 50 56 46 53 2c 20 38 2c 20 32 33 31 34 35 39  IPVFS, 8, 231459
1d40: 20 7d 2c 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   },.#endif /* SQ
1d50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a 49 50 56  LITE_ENABLE_ZIPV
1d60: 46 53 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  FS */.};.#define
1d70: 20 4d 53 56 5f 4e 52 4f 57 20 28 73 69 7a 65 6f   MSV_NROW (sizeo
1d80: 66 28 61 4d 65 6d 73 74 61 74 43 6f 6c 75 6d 6e  f(aMemstatColumn
1d90: 29 2f 73 69 7a 65 6f 66 28 61 4d 65 6d 73 74 61  )/sizeof(aMemsta
1da0: 74 43 6f 6c 75 6d 6e 5b 30 5d 29 29 0a 0a 2f 2a  tColumn[0]))../*
1db0: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 61 20 6d 65  .** Advance a me
1dc0: 6d 73 74 61 74 5f 63 75 72 73 6f 72 20 74 6f 20  mstat_cursor to 
1dd0: 69 74 73 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  its next row of 
1de0: 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  output..*/.stati
1df0: 63 20 69 6e 74 20 6d 65 6d 73 74 61 74 4e 65 78  c int memstatNex
1e00: 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  t(sqlite3_vtab_c
1e10: 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 6d  ursor *cur){.  m
1e20: 65 6d 73 74 61 74 5f 63 75 72 73 6f 72 20 2a 70  emstat_cursor *p
1e30: 43 75 72 20 3d 20 28 6d 65 6d 73 74 61 74 5f 63  Cur = (memstat_c
1e40: 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 6e  ursor*)cur;.  in
1e50: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
1e60: 43 75 72 2d 3e 69 52 6f 77 69 64 3c 3d 4d 53 56  Cur->iRowid<=MSV
1e70: 5f 4e 52 4f 57 20 29 3b 0a 20 20 77 68 69 6c 65  _NROW );.  while
1e80: 28 31 29 7b 0a 20 20 20 20 69 20 3d 20 28 69 6e  (1){.    i = (in
1e90: 74 29 70 43 75 72 2d 3e 69 52 6f 77 69 64 20 2d  t)pCur->iRowid -
1ea0: 20 31 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20   1;.    if( i<0 
1eb0: 7c 7c 20 28 61 4d 65 6d 73 74 61 74 43 6f 6c 75  || (aMemstatColu
1ec0: 6d 6e 5b 69 5d 2e 6d 4e 75 6c 6c 20 26 20 32 29  mn[i].mNull & 2)
1ed0: 21 3d 30 20 7c 7c 20 28 2b 2b 70 43 75 72 2d 3e  !=0 || (++pCur->
1ee0: 69 44 62 29 3e 3d 70 43 75 72 2d 3e 6e 44 62 20  iDb)>=pCur->nDb 
1ef0: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  ){.      pCur->i
1f00: 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 69  Rowid++;.      i
1f10: 66 28 20 70 43 75 72 2d 3e 69 52 6f 77 69 64 3e  f( pCur->iRowid>
1f20: 4d 53 56 5f 4e 52 4f 57 20 29 20 72 65 74 75 72  MSV_NROW ) retur
1f30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
1f40: 20 45 6e 64 20 6f 66 20 74 68 65 20 74 61 62 6c   End of the tabl
1f50: 65 20 2a 2f 0a 20 20 20 20 20 20 70 43 75 72 2d  e */.      pCur-
1f60: 3e 69 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  >iDb = 0;.      
1f70: 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  i++;.    }.    p
1f80: 43 75 72 2d 3e 61 56 61 6c 5b 30 5d 20 3d 20 30  Cur->aVal[0] = 0
1f90: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 56 61 6c  ;.    pCur->aVal
1fa0: 5b 31 5d 20 3d 20 30 3b 20 20 20 20 0a 20 20 20  [1] = 0;    .   
1fb0: 20 73 77 69 74 63 68 28 20 61 4d 65 6d 73 74 61   switch( aMemsta
1fc0: 74 43 6f 6c 75 6d 6e 5b 69 5d 2e 65 54 79 70 65  tColumn[i].eType
1fd0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4d   ){.      case M
1fe0: 53 56 5f 47 53 54 41 54 3a 20 7b 0a 20 20 20 20  SV_GSTAT: {.    
1ff0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2000: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
2010: 72 28 29 3e 3d 33 30 31 30 30 30 30 20 29 7b 0a  r()>=3010000 ){.
2020: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2030: 33 5f 73 74 61 74 75 73 36 34 28 61 4d 65 6d 73  3_status64(aMems
2040: 74 61 74 43 6f 6c 75 6d 6e 5b 69 5d 2e 65 4f 70  tatColumn[i].eOp
2050: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 43               &pC
2070: 75 72 2d 3e 61 56 61 6c 5b 30 5d 2c 20 26 70 43  ur->aVal[0], &pC
2080: 75 72 2d 3e 61 56 61 6c 5b 31 5d 2c 30 29 3b 0a  ur->aVal[1],0);.
2090: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20a0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 43 75           int xCu
20b0: 72 2c 20 78 48 69 77 74 72 3b 0a 20 20 20 20 20  r, xHiwtr;.     
20c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61       sqlite3_sta
20d0: 74 75 73 28 61 4d 65 6d 73 74 61 74 43 6f 6c 75  tus(aMemstatColu
20e0: 6d 6e 5b 69 5d 2e 65 4f 70 2c 20 26 78 43 75 72  mn[i].eOp, &xCur
20f0: 2c 20 26 78 48 69 77 74 72 2c 20 30 29 3b 0a 20  , &xHiwtr, 0);. 
2100: 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
2110: 56 61 6c 5b 30 5d 20 3d 20 78 43 75 72 3b 0a 20  Val[0] = xCur;. 
2120: 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
2130: 56 61 6c 5b 31 5d 20 3d 20 78 48 69 77 74 72 3b  Val[1] = xHiwtr;
2140: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2150: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2160: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4d 53 56  }.      case MSV
2170: 5f 44 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  _DB: {.        i
2180: 6e 74 20 78 43 75 72 2c 20 78 48 69 77 74 72 3b  nt xCur, xHiwtr;
2190: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21a0: 5f 64 62 5f 73 74 61 74 75 73 28 70 43 75 72 2d  _db_status(pCur-
21b0: 3e 64 62 2c 20 61 4d 65 6d 73 74 61 74 43 6f 6c  >db, aMemstatCol
21c0: 75 6d 6e 5b 69 5d 2e 65 4f 70 2c 20 26 78 43 75  umn[i].eOp, &xCu
21d0: 72 2c 20 26 78 48 69 77 74 72 2c 20 30 29 3b 0a  r, &xHiwtr, 0);.
21e0: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 56          pCur->aV
21f0: 61 6c 5b 30 5d 20 3d 20 78 43 75 72 3b 0a 20 20  al[0] = xCur;.  
2200: 20 20 20 20 20 20 70 43 75 72 2d 3e 61 56 61 6c        pCur->aVal
2210: 5b 31 5d 20 3d 20 78 48 69 77 74 72 3b 0a 20 20  [1] = xHiwtr;.  
2220: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2230: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
2240: 4d 53 56 5f 5a 49 50 56 46 53 3a 20 7b 0a 20 20  MSV_ZIPVFS: {.  
2250: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
2260: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2270: 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
2280: 70 43 75 72 2d 3e 64 62 2c 20 70 43 75 72 2d 3e  pCur->db, pCur->
2290: 61 7a 44 62 5b 70 43 75 72 2d 3e 69 44 62 5d 2c  azDb[pCur->iDb],
22a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 20 20 61 4d 65 6d 73 74 61 74 43 6f 6c 75 6d     aMemstatColum
22d0: 6e 5b 69 5d 2e 65 4f 70 2c 20 28 76 6f 69 64 2a  n[i].eOp, (void*
22e0: 29 26 70 43 75 72 2d 3e 61 56 61 6c 5b 30 5d 29  )&pCur->aVal[0])
22f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2300: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 63 6f  !=SQLITE_OK ) co
2310: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2320: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2330: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
2340: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2350: 49 54 45 5f 4f 4b 3b 0a 7d 0a 20 20 0a 0a 2f 2a  ITE_OK;.}.  ../*
2360: 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
2370: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  s of columns for
2380: 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
2390: 68 20 74 68 65 20 6d 65 6d 73 74 61 74 5f 63 75  h the memstat_cu
23a0: 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65  rsor.** is curre
23b0: 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
23c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
23d0: 73 74 61 74 43 6f 6c 75 6d 6e 28 0a 20 20 73 71  statColumn(.  sq
23e0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
23f0: 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68 65  r *cur,   /* The
2400: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71 6c   cursor */.  sql
2410: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
2420: 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  x,       /* Firs
2430: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  t argument to sq
2440: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e  lite3_result_...
2450: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  () */.  int iCol
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c      /* Which col
2480: 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  umn to return */
2490: 0a 29 7b 0a 20 20 6d 65 6d 73 74 61 74 5f 63 75  .){.  memstat_cu
24a0: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 6d 65  rsor *pCur = (me
24b0: 6d 73 74 61 74 5f 63 75 72 73 6f 72 2a 29 63 75  mstat_cursor*)cu
24c0: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  r;.  int i;.  as
24d0: 73 65 72 74 28 20 70 43 75 72 2d 3e 69 52 6f 77  sert( pCur->iRow
24e0: 69 64 3e 30 20 26 26 20 70 43 75 72 2d 3e 69 52  id>0 && pCur->iR
24f0: 6f 77 69 64 3c 3d 4d 53 56 5f 4e 52 4f 57 20 29  owid<=MSV_NROW )
2500: 3b 0a 20 20 69 20 3d 20 28 69 6e 74 29 70 43 75  ;.  i = (int)pCu
2510: 72 2d 3e 69 52 6f 77 69 64 20 2d 20 31 3b 0a 20  r->iRowid - 1;. 
2520: 20 69 66 28 20 28 61 4d 65 6d 73 74 61 74 43 6f   if( (aMemstatCo
2530: 6c 75 6d 6e 5b 69 5d 2e 6d 4e 75 6c 6c 20 26 20  lumn[i].mNull & 
2540: 28 31 3c 3c 69 43 6f 6c 29 29 21 3d 30 20 29 7b  (1<<iCol))!=0 ){
2550: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2560: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 77 69  TE_OK;.  }.  swi
2570: 74 63 68 28 20 69 43 6f 6c 20 29 7b 0a 20 20 20  tch( iCol ){.   
2580: 20 63 61 73 65 20 4d 53 56 5f 43 4f 4c 55 4d 4e   case MSV_COLUMN
2590: 5f 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 73  _NAME: {.      s
25a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
25b0: 78 74 28 63 74 78 2c 20 61 4d 65 6d 73 74 61 74  xt(ctx, aMemstat
25c0: 43 6f 6c 75 6d 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c  Column[i].zName,
25d0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
25e0: 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
25f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2600: 20 4d 53 56 5f 43 4f 4c 55 4d 4e 5f 53 43 48 45   MSV_COLUMN_SCHE
2610: 4d 41 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  MA: {.      sqli
2620: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
2630: 63 74 78 2c 20 70 43 75 72 2d 3e 61 7a 44 62 5b  ctx, pCur->azDb[
2640: 70 43 75 72 2d 3e 69 44 62 5d 2c 20 2d 31 2c 20  pCur->iDb], -1, 
2650: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
2660: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2670: 4d 53 56 5f 43 4f 4c 55 4d 4e 5f 56 41 4c 55 45  MSV_COLUMN_VALUE
2680: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
2690: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
26a0: 74 78 2c 20 70 43 75 72 2d 3e 61 56 61 6c 5b 30  tx, pCur->aVal[0
26b0: 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ]);.      break;
26c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26d0: 4d 53 56 5f 43 4f 4c 55 4d 4e 5f 48 49 57 54 52  MSV_COLUMN_HIWTR
26e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
26f0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
2700: 74 78 2c 20 70 43 75 72 2d 3e 61 56 61 6c 5b 31  tx, pCur->aVal[1
2710: 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ]);.      break;
2720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2730: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2740: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2750: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
2760: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 20 49   current row.  I
2770: 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  n this implement
2780: 61 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 72 6f  ation, the.** ro
2790: 77 69 64 20 69 73 20 74 68 65 20 73 61 6d 65 20  wid is the same 
27a0: 61 73 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  as the output va
27b0: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
27c0: 6e 74 20 6d 65 6d 73 74 61 74 52 6f 77 69 64 28  nt memstatRowid(
27d0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
27e0: 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74 65  sor *cur, sqlite
27f0: 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b  _int64 *pRowid){
2800: 0a 20 20 6d 65 6d 73 74 61 74 5f 63 75 72 73 6f  .  memstat_curso
2810: 72 20 2a 70 43 75 72 20 3d 20 28 6d 65 6d 73 74  r *pCur = (memst
2820: 61 74 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a  at_cursor*)cur;.
2830: 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 75 72    *pRowid = pCur
2840: 2d 3e 69 52 6f 77 69 64 2a 31 30 30 30 20 2b 20  ->iRowid*1000 + 
2850: 70 43 75 72 2d 3e 69 44 62 3b 0a 20 20 72 65 74  pCur->iDb;.  ret
2860: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2870: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2880: 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2890: 72 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  r has been moved
28a0: 20 6f 66 66 20 6f 66 20 74 68 65 20 6c 61 73 74   off of the last
28b0: 0a 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  .** row of outpu
28c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
28d0: 20 6d 65 6d 73 74 61 74 45 6f 66 28 73 71 6c 69   memstatEof(sqli
28e0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
28f0: 2a 63 75 72 29 7b 0a 20 20 6d 65 6d 73 74 61 74  *cur){.  memstat
2900: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
2910: 28 6d 65 6d 73 74 61 74 5f 63 75 72 73 6f 72 2a  (memstat_cursor*
2920: 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  )cur;.  return p
2930: 43 75 72 2d 3e 69 52 6f 77 69 64 3e 4d 53 56 5f  Cur->iRowid>MSV_
2940: 4e 52 4f 57 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  NROW;.}../*.** T
2950: 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 63 61  his method is ca
2960: 6c 6c 65 64 20 74 6f 20 22 72 65 77 69 6e 64 22  lled to "rewind"
2970: 20 74 68 65 20 6d 65 6d 73 74 61 74 5f 63 75 72   the memstat_cur
2980: 73 6f 72 20 6f 62 6a 65 63 74 20 62 61 63 6b 0a  sor object back.
2990: 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
29a0: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20  row of output.  
29b0: 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 61  This method is a
29c0: 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 61 74 20  lways called at 
29d0: 6c 65 61 73 74 0a 2a 2a 20 6f 6e 63 65 20 70 72  least.** once pr
29e0: 69 6f 72 20 74 6f 20 61 6e 79 20 63 61 6c 6c 20  ior to any call 
29f0: 74 6f 20 6d 65 6d 73 74 61 74 43 6f 6c 75 6d 6e  to memstatColumn
2a00: 28 29 20 6f 72 20 6d 65 6d 73 74 61 74 52 6f 77  () or memstatRow
2a10: 69 64 28 29 20 6f 72 20 0a 2a 2a 20 6d 65 6d 73  id() or .** mems
2a20: 74 61 74 45 6f 66 28 29 2e 0a 2a 2f 0a 73 74 61  tatEof()..*/.sta
2a30: 74 69 63 20 69 6e 74 20 6d 65 6d 73 74 61 74 46  tic int memstatF
2a40: 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
2a50: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
2a60: 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e  tabCursor, .  in
2a70: 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
2a80: 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
2a90: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
2aa0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
2ab0: 7b 0a 20 20 6d 65 6d 73 74 61 74 5f 63 75 72 73  {.  memstat_curs
2ac0: 6f 72 20 2a 70 43 75 72 20 3d 20 28 6d 65 6d 73  or *pCur = (mems
2ad0: 74 61 74 5f 63 75 72 73 6f 72 20 2a 29 70 56 74  tat_cursor *)pVt
2ae0: 61 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  abCursor;.  int 
2af0: 72 63 20 3d 20 6d 65 6d 73 74 61 74 46 69 6e 64  rc = memstatFind
2b00: 53 63 68 65 6d 61 73 28 70 43 75 72 29 3b 0a 20  Schemas(pCur);. 
2b10: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b20: 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 69 52 6f   rc;.  pCur->iRo
2b30: 77 69 64 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  wid = 0;.  pCur-
2b40: 3e 69 44 62 20 3d 20 30 3b 0a 20 20 72 65 74 75  >iDb = 0;.  retu
2b50: 72 6e 20 6d 65 6d 73 74 61 74 4e 65 78 74 28 70  rn memstatNext(p
2b60: 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a  VtabCursor);.}..
2b70: 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c  /*.** SQLite wil
2b80: 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6d 65  l invoke this me
2b90: 74 68 6f 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  thod one or more
2ba0: 20 74 69 6d 65 73 20 77 68 69 6c 65 20 70 6c 61   times while pla
2bb0: 6e 6e 69 6e 67 20 61 20 71 75 65 72 79 0a 2a 2a  nning a query.**
2bc0: 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 6d   that uses the m
2bd0: 65 6d 73 74 61 74 20 76 69 72 74 75 61 6c 20 74  emstat virtual t
2be0: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
2bf0: 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 63 72 65  ine needs to cre
2c00: 61 74 65 0a 2a 2a 20 61 20 71 75 65 72 79 20 70  ate.** a query p
2c10: 6c 61 6e 20 66 6f 72 20 65 61 63 68 20 69 6e 76  lan for each inv
2c20: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6d 70  ocation and comp
2c30: 75 74 65 20 61 6e 20 65 73 74 69 6d 61 74 65 64  ute an estimated
2c40: 20 63 6f 73 74 20 66 6f 72 20 74 68 61 74 0a 2a   cost for that.*
2c50: 2a 20 70 6c 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  * plan..*/.stati
2c60: 63 20 69 6e 74 20 6d 65 6d 73 74 61 74 42 65 73  c int memstatBes
2c70: 74 49 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65  tIndex(.  sqlite
2c80: 33 5f 76 74 61 62 20 2a 74 61 62 2c 0a 20 20 73  3_vtab *tab,.  s
2c90: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
2ca0: 6f 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a 20  o *pIdxInfo.){. 
2cb0: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
2cc0: 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62  atedCost = (doub
2cd0: 6c 65 29 35 30 30 3b 0a 20 20 70 49 64 78 49 6e  le)500;.  pIdxIn
2ce0: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77  fo->estimatedRow
2cf0: 73 20 3d 20 35 30 30 3b 0a 20 20 72 65 74 75 72  s = 500;.  retur
2d00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2d10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 6f 6c 6c 6f  /*.** This follo
2d20: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 64  wing structure d
2d30: 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
2d40: 65 74 68 6f 64 73 20 66 6f 72 20 74 68 65 20 0a  ethods for the .
2d50: 2a 2a 20 6d 65 6d 73 74 61 74 20 76 69 72 74 75  ** memstat virtu
2d60: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
2d70: 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
2d80: 6c 65 20 6d 65 6d 73 74 61 74 4d 6f 64 75 6c 65  le memstatModule
2d90: 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20   = {.  0,       
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2dc0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2de0: 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 6d 65   xCreate */.  me
2df0: 6d 73 74 61 74 43 6f 6e 6e 65 63 74 2c 20 20 20  mstatConnect,   
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e           /* xCon
2e10: 6e 65 63 74 20 2a 2f 0a 20 20 6d 65 6d 73 74 61  nect */.  memsta
2e20: 74 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  tBestIndex,     
2e30: 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64       /* xBestInd
2e40: 65 78 20 2a 2f 0a 20 20 6d 65 6d 73 74 61 74 44  ex */.  memstatD
2e50: 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  isconnect,      
2e60: 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63     /* xDisconnec
2e70: 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f    /* xDestroy */
2ea0: 0a 20 20 6d 65 6d 73 74 61 74 4f 70 65 6e 2c 20  .  memstatOpen, 
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ec0: 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20   xOpen - open a 
2ed0: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6d 65 6d 73  cursor */.  mems
2ee0: 74 61 74 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  tatClose,       
2ef0: 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2f00: 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f   - close a curso
2f10: 72 20 2a 2f 0a 20 20 6d 65 6d 73 74 61 74 46 69  r */.  memstatFi
2f20: 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  lter,           
2f30: 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63    /* xFilter - c
2f40: 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f  onfigure scan co
2f50: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6d  nstraints */.  m
2f60: 65 6d 73 74 61 74 4e 65 78 74 2c 20 20 20 20 20  emstatNext,     
2f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65            /* xNe
2f80: 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63  xt - advance a c
2f90: 75 72 73 6f 72 20 2a 2f 0a 20 20 6d 65 6d 73 74  ursor */.  memst
2fa0: 61 74 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  atEof,          
2fb0: 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20        /* xEof - 
2fc0: 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66  check for end of
2fd0: 20 73 63 61 6e 20 2a 2f 0a 20 20 6d 65 6d 73 74   scan */.  memst
2fe0: 61 74 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  atColumn,       
2ff0: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e        /* xColumn
3000: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
3010: 20 20 6d 65 6d 73 74 61 74 52 6f 77 69 64 2c 20    memstatRowid, 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3030: 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61  xRowid - read da
3040: 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ta */.  0,      
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f     /* xUpdate */
3070: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3090: 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20   xBegin */.  0, 
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
30c0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20   /* xCommit */. 
30f0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
3100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
3110: 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c  Rollback */.  0,
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
3140: 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20  dMethod */.  0, 
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3160: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
3170: 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  me */.  0,      
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74     /* xSavepoint
31a0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a   /* xRelease */.
31d0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31f0: 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 20  xRollbackTo */. 
3200: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
3210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
3220: 53 68 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a 7d 3b  ShadowName */.};
3230: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
3240: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
3250: 41 42 4c 45 20 2a 2f 0a 0a 69 6e 74 20 73 71 6c  ABLE */..int sql
3260: 69 74 65 33 4d 65 6d 73 74 61 74 56 74 61 62 49  ite3MemstatVtabI
3270: 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nit(sqlite3 *db)
3280: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
3290: 49 54 45 5f 4f 4b 3b 0a 23 69 66 6e 64 65 66 20  ITE_OK;.#ifndef 
32a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
32b0: 55 41 4c 54 41 42 4c 45 0a 20 20 72 63 20 3d 20  UALTABLE.  rc = 
32c0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
32d0: 6f 64 75 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  odule(db, "sqlit
32e0: 65 5f 6d 65 6d 73 74 61 74 22 2c 20 26 6d 65 6d  e_memstat", &mem
32f0: 73 74 61 74 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a  statModule, 0);.
3300: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
3310: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
3320: 51 4c 49 54 45 5f 43 4f 52 45 0a 23 69 66 64 65  QLITE_CORE.#ifde
3330: 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73  f _WIN32.__decls
3340: 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23  pec(dllexport).#
3350: 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65  endif.int sqlite
3360: 33 5f 6d 65 6d 73 74 61 74 5f 69 6e 69 74 28 0a  3_memstat_init(.
3370: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
3380: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
3390: 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  g, .  const sqli
33a0: 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
33b0: 20 2a 70 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20   *pApi.){.  int 
33c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33d0: 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
33e0: 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a  ON_INIT2(pApi);.
33f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3400: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
3410: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d  .  rc = sqlite3M
3420: 65 6d 73 74 61 74 56 74 61 62 49 6e 69 74 28 64  emstatVtabInit(d
3430: 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  b);.#endif.  ret
3440: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
3450: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 45 20   /* SQLITE_CORE 
3460: 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  */.#endif /* !de
3470: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52  fined(SQLITE_COR
3480: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
3490: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
34a0: 54 41 54 56 54 41 42 29 20 2a 2f 0a              TATVTAB) */.