/ Hex Artifact Content
Login

Artifact 941928c6104d8ed569a6c47caa756dc78b8091f7a15f87d3004f3b1e576b10da:


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 28 70  qlite3_realloc(p
1040: 43 75 72 2d 3e 61 7a 44 62 2c 20 73 69 7a 65 6f  Cur->azDb, sizeo
1050: 66 28 63 68 61 72 2a 29 2a 28 70 43 75 72 2d 3e  f(char*)*(pCur->
1060: 6e 44 62 2b 31 29 29 3b 0a 20 20 20 20 69 66 28  nDb+1));.    if(
1070: 20 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   az==0 ){.      
1080: 6d 65 6d 73 74 61 74 43 6c 65 61 72 53 63 68 65  memstatClearSche
1090: 6d 61 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  ma(pCur);.      
10a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10b0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
10c0: 43 75 72 2d 3e 61 7a 44 62 20 3d 20 61 7a 3b 0a  Cur->azDb = az;.
10d0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
10e0: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
10f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1100: 74 28 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20  t(pStmt, 1));.  
1110: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
1120: 20 20 20 20 6d 65 6d 73 74 61 74 43 6c 65 61 72      memstatClear
1130: 53 63 68 65 6d 61 28 70 43 75 72 29 3b 0a 20 20  Schema(pCur);.  
1140: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1150: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
1160: 20 20 20 70 43 75 72 2d 3e 61 7a 44 62 5b 70 43     pCur->azDb[pC
1170: 75 72 2d 3e 6e 44 62 5d 20 3d 20 7a 3b 0a 20 20  ur->nDb] = z;.  
1180: 20 20 70 43 75 72 2d 3e 6e 44 62 2b 2b 3b 0a 20    pCur->nDb++;. 
1190: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
11a0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
11b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74  ;.}.../*.** Dest
11d0: 72 75 63 74 6f 72 20 66 6f 72 20 61 20 6d 65 6d  ructor for a mem
11e0: 73 74 61 74 5f 63 75 72 73 6f 72 2e 0a 2a 2f 0a  stat_cursor..*/.
11f0: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 73 74  static int memst
1200: 61 74 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  atClose(sqlite3_
1210: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
1220: 29 7b 0a 20 20 6d 65 6d 73 74 61 74 5f 63 75 72  ){.  memstat_cur
1230: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 6d 65 6d  sor *pCur = (mem
1240: 73 74 61 74 5f 63 75 72 73 6f 72 2a 29 63 75 72  stat_cursor*)cur
1250: 3b 0a 20 20 6d 65 6d 73 74 61 74 43 6c 65 61 72  ;.  memstatClear
1260: 53 63 68 65 6d 61 28 70 43 75 72 29 3b 0a 20 20  Schema(pCur);.  
1270: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 75 72  sqlite3_free(cur
1280: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1290: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
12a0: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
12b0: 66 6f 72 20 61 4d 65 6d 73 74 61 74 43 6f 6c 75  for aMemstatColu
12c0: 6d 6e 5b 5d 2e 65 54 79 70 65 0a 2a 2f 0a 23 64  mn[].eType.*/.#d
12d0: 65 66 69 6e 65 20 4d 53 56 5f 47 53 54 41 54 20  efine MSV_GSTAT 
12e0: 20 20 30 20 20 20 20 20 20 20 20 20 20 2f 2a 20    0          /* 
12f0: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 36 34  sqlite3_status64
1300: 28 29 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  () information *
1310: 2f 0a 23 64 65 66 69 6e 65 20 4d 53 56 5f 44 42  /.#define MSV_DB
1320: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
1330: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 64 62 5f 73   /* sqlite3_db_s
1340: 74 61 74 75 73 28 29 20 69 6e 66 6f 72 6d 61 74  tatus() informat
1350: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ion */.#define M
1360: 53 56 5f 5a 49 50 56 46 53 20 20 32 20 20 20 20  SV_ZIPVFS  2    
1370: 20 20 20 20 20 20 2f 2a 20 5a 49 50 56 46 53 20        /* ZIPVFS 
1380: 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 77 69 74  file-control wit
1390: 68 20 36 34 2d 62 69 74 20 72 65 74 75 72 6e 20  h 64-bit return 
13a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 72 72  */../*.** An arr
13b0: 61 79 20 6f 66 20 71 75 61 6e 74 69 74 69 65 73  ay of quantities
13c0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 6d 65 61   that can be mea
13d0: 73 75 72 65 64 20 61 6e 64 20 72 65 70 6f 72 74  sured and report
13e0: 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 76 69  ed by.** this vi
13f0: 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a 2f 0a 73  rtual table.*/.s
1400: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
1410: 63 74 20 4d 65 6d 73 74 61 74 43 6f 6c 75 6d 6e  ct MemstatColumn
1420: 73 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s {.  const char
1430: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 53   *zName;    /* S
1440: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 2a 2f 0a  ymbolic name */.
1450: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1460: 65 54 79 70 65 3b 20 20 2f 2a 20 54 79 70 65 20  eType;  /* Type 
1470: 6f 66 20 69 6e 74 65 72 66 61 63 65 20 2a 2f 0a  of interface */.
1480: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1490: 6d 4e 75 6c 6c 3b 20 20 2f 2a 20 42 69 74 6d 61  mNull;  /* Bitma
14a0: 73 6b 20 6f 66 20 77 68 69 63 68 20 63 6f 6c 75  sk of which colu
14b0: 6d 6e 73 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a  mns are NULL */.
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 64 62          /* 2: db
14e0: 6e 61 6d 65 2c 20 20 34 3a 20 63 75 72 72 65 6e  name,  4: curren
14f0: 74 2c 20 20 38 3a 20 68 69 77 74 72 20 2a 2f 0a  t,  8: hiwtr */.
1500: 20 20 69 6e 74 20 65 4f 70 3b 20 20 20 20 20 20    int eOp;      
1510: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
1520: 65 20 2a 2f 0a 7d 20 61 4d 65 6d 73 74 61 74 43  e */.} aMemstatC
1530: 6f 6c 75 6d 6e 5b 5d 20 3d 20 7b 0a 20 7b 22 4d  olumn[] = {. {"M
1540: 45 4d 4f 52 59 5f 55 53 45 44 22 2c 20 20 20 20  EMORY_USED",    
1550: 20 20 20 20 20 20 20 20 4d 53 56 5f 47 53 54 41          MSV_GSTA
1560: 54 2c 20 20 32 2c 20 53 51 4c 49 54 45 5f 53 54  T,  2, SQLITE_ST
1570: 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
1580: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 7b 22            },. {"
1590: 4d 41 4c 4c 4f 43 5f 53 49 5a 45 22 2c 20 20 20  MALLOC_SIZE",   
15a0: 20 20 20 20 20 20 20 20 20 4d 53 56 5f 47 53 54           MSV_GST
15b0: 41 54 2c 20 20 36 2c 20 53 51 4c 49 54 45 5f 53  AT,  6, SQLITE_S
15c0: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a  TATUS_MALLOC_SIZ
15d0: 45 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 7b  E          },. {
15e0: 22 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 22 2c 20  "MALLOC_COUNT", 
15f0: 20 20 20 20 20 20 20 20 20 20 4d 53 56 5f 47 53            MSV_GS
1600: 54 41 54 2c 20 20 32 2c 20 53 51 4c 49 54 45 5f  TAT,  2, SQLITE_
1610: 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f  STATUS_MALLOC_CO
1620: 55 4e 54 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  UNT         },. 
1630: 7b 22 50 41 47 45 43 41 43 48 45 5f 55 53 45 44  {"PAGECACHE_USED
1640: 22 2c 20 20 20 20 20 20 20 20 20 4d 53 56 5f 47  ",         MSV_G
1650: 53 54 41 54 2c 20 20 32 2c 20 53 51 4c 49 54 45  STAT,  2, SQLITE
1660: 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
1670: 45 5f 55 53 45 44 20 20 20 20 20 20 20 7d 2c 0a  E_USED       },.
1680: 20 7b 22 50 41 47 45 43 41 43 48 45 5f 4f 56 45   {"PAGECACHE_OVE
1690: 52 46 4c 4f 57 22 2c 20 20 20 20 20 4d 53 56 5f  RFLOW",     MSV_
16a0: 47 53 54 41 54 2c 20 20 32 2c 20 53 51 4c 49 54  GSTAT,  2, SQLIT
16b0: 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
16c0: 48 45 5f 4f 56 45 52 46 4c 4f 57 20 20 20 7d 2c  HE_OVERFLOW   },
16d0: 0a 20 7b 22 50 41 47 45 43 41 43 48 45 5f 53 49  . {"PAGECACHE_SI
16e0: 5a 45 22 2c 20 20 20 20 20 20 20 20 20 4d 53 56  ZE",         MSV
16f0: 5f 47 53 54 41 54 2c 20 20 36 2c 20 53 51 4c 49  _GSTAT,  6, SQLI
1700: 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
1710: 43 48 45 5f 53 49 5a 45 20 20 20 20 20 20 20 7d  CHE_SIZE       }
1720: 2c 0a 20 7b 22 50 41 52 53 45 52 5f 53 54 41 43  ,. {"PARSER_STAC
1730: 4b 22 2c 20 20 20 20 20 20 20 20 20 20 20 4d 53  K",           MS
1740: 56 5f 47 53 54 41 54 2c 20 20 36 2c 20 53 51 4c  V_GSTAT,  6, SQL
1750: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45  ITE_STATUS_PARSE
1760: 52 5f 53 54 41 43 4b 20 20 20 20 20 20 20 20 20  R_STACK         
1770: 7d 2c 0a 20 7b 22 44 42 5f 4c 4f 4f 4b 41 53 49  },. {"DB_LOOKASI
1780: 44 45 5f 55 53 45 44 22 2c 20 20 20 20 20 20 4d  DE_USED",      M
1790: 53 56 5f 44 42 2c 20 20 20 20 20 32 2c 20 53 51  SV_DB,     2, SQ
17a0: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
17b0: 4f 4b 41 53 49 44 45 5f 55 53 45 44 20 20 20 20  OKASIDE_USED    
17c0: 20 7d 2c 0a 20 7b 22 44 42 5f 4c 4f 4f 4b 41 53   },. {"DB_LOOKAS
17d0: 49 44 45 5f 48 49 54 22 2c 20 20 20 20 20 20 20  IDE_HIT",       
17e0: 4d 53 56 5f 44 42 2c 20 20 20 20 20 36 2c 20 53  MSV_DB,     6, S
17f0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c  QLITE_DBSTATUS_L
1800: 4f 4f 4b 41 53 49 44 45 5f 48 49 54 20 20 20 20  OOKASIDE_HIT    
1810: 20 20 7d 2c 0a 20 7b 22 44 42 5f 4c 4f 4f 4b 41    },. {"DB_LOOKA
1820: 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 22 2c  SIDE_MISS_SIZE",
1830: 20 4d 53 56 5f 44 42 2c 20 20 20 20 20 36 2c 20   MSV_DB,     6, 
1840: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
1850: 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 53  LOOKASIDE_MISS_S
1860: 49 5a 45 7d 2c 0a 20 7b 22 44 42 5f 4c 4f 4f 4b  IZE},. {"DB_LOOK
1870: 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 22  ASIDE_MISS_FULL"
1880: 2c 20 4d 53 56 5f 44 42 2c 20 20 20 20 20 36 2c  , MSV_DB,     6,
1890: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
18a0: 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f  _LOOKASIDE_MISS_
18b0: 46 55 4c 4c 7d 2c 0a 20 7b 22 44 42 5f 43 41 43  FULL},. {"DB_CAC
18c0: 48 45 5f 55 53 45 44 22 2c 20 20 20 20 20 20 20  HE_USED",       
18d0: 20 20 20 4d 53 56 5f 44 42 2c 20 20 20 20 31 30     MSV_DB,    10
18e0: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
18f0: 53 5f 43 41 43 48 45 5f 55 53 45 44 20 20 20 20  S_CACHE_USED    
1900: 20 20 20 20 20 7d 2c 0a 23 69 66 20 53 51 4c 49       },.#if SQLI
1910: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1920: 52 20 3e 3d 20 33 31 34 30 30 30 30 0a 20 7b 22  R >= 3140000. {"
1930: 44 42 5f 43 41 43 48 45 5f 55 53 45 44 5f 53 48  DB_CACHE_USED_SH
1940: 41 52 45 44 22 2c 20 20 20 4d 53 56 5f 44 42 2c  ARED",   MSV_DB,
1950: 20 20 20 20 31 30 2c 20 53 51 4c 49 54 45 5f 44      10, SQLITE_D
1960: 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53  BSTATUS_CACHE_US
1970: 45 44 5f 53 48 41 52 45 44 20 20 7d 2c 0a 23 65  ED_SHARED  },.#e
1980: 6e 64 69 66 0a 20 7b 22 44 42 5f 53 43 48 45 4d  ndif. {"DB_SCHEM
1990: 41 5f 55 53 45 44 22 2c 20 20 20 20 20 20 20 20  A_USED",        
19a0: 20 4d 53 56 5f 44 42 2c 20 20 20 20 31 30 2c 20   MSV_DB,    10, 
19b0: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
19c0: 53 43 48 45 4d 41 5f 55 53 45 44 20 20 20 20 20  SCHEMA_USED     
19d0: 20 20 20 7d 2c 0a 20 7b 22 44 42 5f 53 54 4d 54     },. {"DB_STMT
19e0: 5f 55 53 45 44 22 2c 20 20 20 20 20 20 20 20 20  _USED",         
19f0: 20 20 4d 53 56 5f 44 42 2c 20 20 20 20 31 30 2c    MSV_DB,    10,
1a00: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
1a10: 5f 53 54 4d 54 5f 55 53 45 44 20 20 20 20 20 20  _STMT_USED      
1a20: 20 20 20 20 7d 2c 0a 20 7b 22 44 42 5f 43 41 43      },. {"DB_CAC
1a30: 48 45 5f 48 49 54 22 2c 20 20 20 20 20 20 20 20  HE_HIT",        
1a40: 20 20 20 4d 53 56 5f 44 42 2c 20 20 20 20 31 30     MSV_DB,    10
1a50: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
1a60: 53 5f 43 41 43 48 45 5f 48 49 54 20 20 20 20 20  S_CACHE_HIT     
1a70: 20 20 20 20 20 7d 2c 0a 20 7b 22 44 42 5f 43 41       },. {"DB_CA
1a80: 43 48 45 5f 4d 49 53 53 22 2c 20 20 20 20 20 20  CHE_MISS",      
1a90: 20 20 20 20 4d 53 56 5f 44 42 2c 20 20 20 20 31      MSV_DB,    1
1aa0: 30 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  0, SQLITE_DBSTAT
1ab0: 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 20 20 20  US_CACHE_MISS   
1ac0: 20 20 20 20 20 20 7d 2c 0a 20 7b 22 44 42 5f 43        },. {"DB_C
1ad0: 41 43 48 45 5f 57 52 49 54 45 22 2c 20 20 20 20  ACHE_WRITE",    
1ae0: 20 20 20 20 20 4d 53 56 5f 44 42 2c 20 20 20 20       MSV_DB,    
1af0: 31 30 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  10, SQLITE_DBSTA
1b00: 54 55 53 5f 43 41 43 48 45 5f 57 52 49 54 45 20  TUS_CACHE_WRITE 
1b10: 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 20 53 51         },.#if SQ
1b20: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
1b30: 42 45 52 20 3e 3d 20 33 32 33 30 30 30 30 0a 20  BER >= 3230000. 
1b40: 7b 22 44 42 5f 43 41 43 48 45 5f 53 50 49 4c 4c  {"DB_CACHE_SPILL
1b50: 22 2c 20 20 20 20 20 20 20 20 20 4d 53 56 5f 44  ",         MSV_D
1b60: 42 2c 20 20 20 20 31 30 2c 20 53 51 4c 49 54 45  B,    10, SQLITE
1b70: 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
1b80: 53 50 49 4c 4c 20 20 20 20 20 20 20 20 7d 2c 0a  SPILL        },.
1b90: 23 65 6e 64 69 66 0a 20 7b 22 44 42 5f 44 45 46  #endif. {"DB_DEF
1ba0: 45 52 52 45 44 5f 46 4b 53 22 2c 20 20 20 20 20  ERRED_FKS",     
1bb0: 20 20 20 4d 53 56 5f 44 42 2c 20 20 20 20 31 30     MSV_DB,    10
1bc0: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
1bd0: 53 5f 44 45 46 45 52 52 45 44 5f 46 4b 53 20 20  S_DEFERRED_FKS  
1be0: 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20 53       },.#ifdef S
1bf0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a 49 50  QLITE_ENABLE_ZIP
1c00: 56 46 53 0a 20 7b 22 5a 49 50 56 46 53 5f 43 41  VFS. {"ZIPVFS_CA
1c10: 43 48 45 5f 55 53 45 44 22 2c 20 20 20 20 20 20  CHE_USED",      
1c20: 4d 53 56 5f 5a 49 50 56 46 53 2c 20 38 2c 20 32  MSV_ZIPVFS, 8, 2
1c30: 33 31 34 35 34 20 7d 2c 0a 20 7b 22 5a 49 50 56  31454 },. {"ZIPV
1c40: 46 53 5f 43 41 43 48 45 5f 48 49 54 22 2c 20 20  FS_CACHE_HIT",  
1c50: 20 20 20 20 20 4d 53 56 5f 5a 49 50 56 46 53 2c       MSV_ZIPVFS,
1c60: 20 38 2c 20 32 33 31 34 35 35 20 7d 2c 0a 20 7b   8, 231455 },. {
1c70: 22 5a 49 50 56 46 53 5f 43 41 43 48 45 5f 4d 49  "ZIPVFS_CACHE_MI
1c80: 53 53 22 2c 20 20 20 20 20 20 4d 53 56 5f 5a 49  SS",      MSV_ZI
1c90: 50 56 46 53 2c 20 38 2c 20 32 33 31 34 35 36 20  PVFS, 8, 231456 
1ca0: 7d 2c 0a 20 7b 22 5a 49 50 56 46 53 5f 43 41 43  },. {"ZIPVFS_CAC
1cb0: 48 45 5f 57 52 49 54 45 22 2c 20 20 20 20 20 4d  HE_WRITE",     M
1cc0: 53 56 5f 5a 49 50 56 46 53 2c 20 38 2c 20 32 33  SV_ZIPVFS, 8, 23
1cd0: 31 34 35 37 20 7d 2c 0a 20 7b 22 5a 49 50 56 46  1457 },. {"ZIPVF
1ce0: 53 5f 44 49 52 45 43 54 5f 52 45 41 44 22 2c 20  S_DIRECT_READ", 
1cf0: 20 20 20 20 4d 53 56 5f 5a 49 50 56 46 53 2c 20      MSV_ZIPVFS, 
1d00: 38 2c 20 32 33 31 34 35 38 20 7d 2c 0a 20 7b 22  8, 231458 },. {"
1d10: 5a 49 50 56 46 53 5f 44 49 52 45 43 54 5f 42 59  ZIPVFS_DIRECT_BY
1d20: 54 45 53 22 2c 20 20 20 20 4d 53 56 5f 5a 49 50  TES",    MSV_ZIP
1d30: 56 46 53 2c 20 38 2c 20 32 33 31 34 35 39 20 7d  VFS, 8, 231459 }
1d40: 2c 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ,.#endif /* SQLI
1d50: 54 45 5f 45 4e 41 42 4c 45 5f 5a 49 50 56 46 53  TE_ENABLE_ZIPVFS
1d60: 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 4d   */.};.#define M
1d70: 53 56 5f 4e 52 4f 57 20 28 73 69 7a 65 6f 66 28  SV_NROW (sizeof(
1d80: 61 4d 65 6d 73 74 61 74 43 6f 6c 75 6d 6e 29 2f  aMemstatColumn)/
1d90: 73 69 7a 65 6f 66 28 61 4d 65 6d 73 74 61 74 43  sizeof(aMemstatC
1da0: 6f 6c 75 6d 6e 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a  olumn[0]))../*.*
1db0: 2a 20 41 64 76 61 6e 63 65 20 61 20 6d 65 6d 73  * Advance a mems
1dc0: 74 61 74 5f 63 75 72 73 6f 72 20 74 6f 20 69 74  tat_cursor to it
1dd0: 73 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 6f 75  s next row of ou
1de0: 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tput..*/.static 
1df0: 69 6e 74 20 6d 65 6d 73 74 61 74 4e 65 78 74 28  int memstatNext(
1e00: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
1e10: 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 6d 65 6d  sor *cur){.  mem
1e20: 73 74 61 74 5f 63 75 72 73 6f 72 20 2a 70 43 75  stat_cursor *pCu
1e30: 72 20 3d 20 28 6d 65 6d 73 74 61 74 5f 63 75 72  r = (memstat_cur
1e40: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 6e 74 20  sor*)cur;.  int 
1e50: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  i;.  assert( pCu
1e60: 72 2d 3e 69 52 6f 77 69 64 3c 3d 4d 53 56 5f 4e  r->iRowid<=MSV_N
1e70: 52 4f 57 20 29 3b 0a 20 20 77 68 69 6c 65 28 31  ROW );.  while(1
1e80: 29 7b 0a 20 20 20 20 69 20 3d 20 28 69 6e 74 29  ){.    i = (int)
1e90: 70 43 75 72 2d 3e 69 52 6f 77 69 64 20 2d 20 31  pCur->iRowid - 1
1ea0: 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 7c 7c  ;.    if( i<0 ||
1eb0: 20 28 61 4d 65 6d 73 74 61 74 43 6f 6c 75 6d 6e   (aMemstatColumn
1ec0: 5b 69 5d 2e 6d 4e 75 6c 6c 20 26 20 32 29 21 3d  [i].mNull & 2)!=
1ed0: 30 20 7c 7c 20 28 2b 2b 70 43 75 72 2d 3e 69 44  0 || (++pCur->iD
1ee0: 62 29 3e 3d 70 43 75 72 2d 3e 6e 44 62 20 29 7b  b)>=pCur->nDb ){
1ef0: 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 52 6f  .      pCur->iRo
1f00: 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  wid++;.      if(
1f10: 20 70 43 75 72 2d 3e 69 52 6f 77 69 64 3e 4d 53   pCur->iRowid>MS
1f20: 56 5f 4e 52 4f 57 20 29 20 72 65 74 75 72 6e 20  V_NROW ) return 
1f30: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 45  SQLITE_OK;  /* E
1f40: 6e 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  nd of the table 
1f50: 2a 2f 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  */.      pCur->i
1f60: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 2b  Db = 0;.      i+
1f70: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  +;.    }.    pCu
1f80: 72 2d 3e 61 56 61 6c 5b 30 5d 20 3d 20 30 3b 0a  r->aVal[0] = 0;.
1f90: 20 20 20 20 70 43 75 72 2d 3e 61 56 61 6c 5b 31      pCur->aVal[1
1fa0: 5d 20 3d 20 30 3b 20 20 20 20 0a 20 20 20 20 73  ] = 0;    .    s
1fb0: 77 69 74 63 68 28 20 61 4d 65 6d 73 74 61 74 43  witch( aMemstatC
1fc0: 6f 6c 75 6d 6e 5b 69 5d 2e 65 54 79 70 65 20 29  olumn[i].eType )
1fd0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4d 53 56  {.      case MSV
1fe0: 5f 47 53 54 41 54 3a 20 7b 0a 20 20 20 20 20 20  _GSTAT: {.      
1ff0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6c 69    if( sqlite3_li
2000: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
2010: 29 3e 3d 33 30 31 30 30 30 30 20 29 7b 0a 20 20  )>=3010000 ){.  
2020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2030: 73 74 61 74 75 73 36 34 28 61 4d 65 6d 73 74 61  status64(aMemsta
2040: 74 43 6f 6c 75 6d 6e 5b 69 5d 2e 65 4f 70 2c 0a  tColumn[i].eOp,.
2050: 20 20 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 26 70 43 75 72             &pCur
2070: 2d 3e 61 56 61 6c 5b 30 5d 2c 20 26 70 43 75 72  ->aVal[0], &pCur
2080: 2d 3e 61 56 61 6c 5b 31 5d 2c 30 29 3b 0a 20 20  ->aVal[1],0);.  
2090: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20a0: 20 20 20 20 20 20 20 69 6e 74 20 78 43 75 72 2c         int xCur,
20b0: 20 78 48 69 77 74 72 3b 0a 20 20 20 20 20 20 20   xHiwtr;.       
20c0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75     sqlite3_statu
20d0: 73 28 61 4d 65 6d 73 74 61 74 43 6f 6c 75 6d 6e  s(aMemstatColumn
20e0: 5b 69 5d 2e 65 4f 70 2c 20 26 78 43 75 72 2c 20  [i].eOp, &xCur, 
20f0: 26 78 48 69 77 74 72 2c 20 30 29 3b 0a 20 20 20  &xHiwtr, 0);.   
2100: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 56 61         pCur->aVa
2110: 6c 5b 30 5d 20 3d 20 78 43 75 72 3b 0a 20 20 20  l[0] = xCur;.   
2120: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 56 61         pCur->aVa
2130: 6c 5b 31 5d 20 3d 20 78 48 69 77 74 72 3b 0a 20  l[1] = xHiwtr;. 
2140: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2160: 20 20 20 20 20 20 63 61 73 65 20 4d 53 56 5f 44        case MSV_D
2170: 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  B: {.        int
2180: 20 78 43 75 72 2c 20 78 48 69 77 74 72 3b 0a 20   xCur, xHiwtr;. 
2190: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
21a0: 62 5f 73 74 61 74 75 73 28 70 43 75 72 2d 3e 64  b_status(pCur->d
21b0: 62 2c 20 61 4d 65 6d 73 74 61 74 43 6f 6c 75 6d  b, aMemstatColum
21c0: 6e 5b 69 5d 2e 65 4f 70 2c 20 26 78 43 75 72 2c  n[i].eOp, &xCur,
21d0: 20 26 78 48 69 77 74 72 2c 20 30 29 3b 0a 20 20   &xHiwtr, 0);.  
21e0: 20 20 20 20 20 20 70 43 75 72 2d 3e 61 56 61 6c        pCur->aVal
21f0: 5b 30 5d 20 3d 20 78 43 75 72 3b 0a 20 20 20 20  [0] = xCur;.    
2200: 20 20 20 20 70 43 75 72 2d 3e 61 56 61 6c 5b 31      pCur->aVal[1
2210: 5d 20 3d 20 78 48 69 77 74 72 3b 0a 20 20 20 20  ] = xHiwtr;.    
2220: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2230: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4d 53   }.      case MS
2240: 56 5f 5a 49 50 56 46 53 3a 20 7b 0a 20 20 20 20  V_ZIPVFS: {.    
2250: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
2260: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2270: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 43  _file_control(pC
2280: 75 72 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61 7a  ur->db, pCur->az
2290: 44 62 5b 70 43 75 72 2d 3e 69 44 62 5d 2c 0a 20  Db[pCur->iDb],. 
22a0: 20 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 61 4d 65 6d 73 74 61 74 43 6f 6c 75 6d 6e 5b   aMemstatColumn[
22d0: 69 5d 2e 65 4f 70 2c 20 28 76 6f 69 64 2a 29 26  i].eOp, (void*)&
22e0: 70 43 75 72 2d 3e 61 56 61 6c 5b 30 5d 29 3b 0a  pCur->aVal[0]);.
22f0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2300: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 63 6f 6e 74  SQLITE_OK ) cont
2310: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72  inue;.        br
2320: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2330: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
2340: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2350: 45 5f 4f 4b 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a  E_OK;.}.  ../*.*
2360: 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 20  * Return values 
2370: 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74  of columns for t
2380: 68 65 20 72 6f 77 20 61 74 20 77 68 69 63 68 20  he row at which 
2390: 74 68 65 20 6d 65 6d 73 74 61 74 5f 63 75 72 73  the memstat_curs
23a0: 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  or.** is current
23b0: 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a  ly pointing..*/.
23c0: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 73 74  static int memst
23d0: 61 74 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69  atColumn(.  sqli
23e0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
23f0: 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68 65 20 63  *cur,   /* The c
2400: 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  ursor */.  sqlit
2410: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
2420: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2430: 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
2440: 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e 28 29  te3_result_...()
2450: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d    /* Which colum
2480: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29  n to return */.)
2490: 7b 0a 20 20 6d 65 6d 73 74 61 74 5f 63 75 72 73  {.  memstat_curs
24a0: 6f 72 20 2a 70 43 75 72 20 3d 20 28 6d 65 6d 73  or *pCur = (mems
24b0: 74 61 74 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b  tat_cursor*)cur;
24c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
24d0: 72 74 28 20 70 43 75 72 2d 3e 69 52 6f 77 69 64  rt( pCur->iRowid
24e0: 3e 30 20 26 26 20 70 43 75 72 2d 3e 69 52 6f 77  >0 && pCur->iRow
24f0: 69 64 3c 3d 4d 53 56 5f 4e 52 4f 57 20 29 3b 0a  id<=MSV_NROW );.
2500: 20 20 69 20 3d 20 28 69 6e 74 29 70 43 75 72 2d    i = (int)pCur-
2510: 3e 69 52 6f 77 69 64 20 2d 20 31 3b 0a 20 20 69  >iRowid - 1;.  i
2520: 66 28 20 28 61 4d 65 6d 73 74 61 74 43 6f 6c 75  f( (aMemstatColu
2530: 6d 6e 5b 69 5d 2e 6d 4e 75 6c 6c 20 26 20 28 31  mn[i].mNull & (1
2540: 3c 3c 69 43 6f 6c 29 29 21 3d 30 20 29 7b 0a 20  <<iCol))!=0 ){. 
2550: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2560: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  _OK;.  }.  switc
2570: 68 28 20 69 43 6f 6c 20 29 7b 0a 20 20 20 20 63  h( iCol ){.    c
2580: 61 73 65 20 4d 53 56 5f 43 4f 4c 55 4d 4e 5f 4e  ase MSV_COLUMN_N
2590: 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AME: {.      sql
25a0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
25b0: 28 63 74 78 2c 20 61 4d 65 6d 73 74 61 74 43 6f  (ctx, aMemstatCo
25c0: 6c 75 6d 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d  lumn[i].zName, -
25d0: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
25e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
25f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
2600: 53 56 5f 43 4f 4c 55 4d 4e 5f 53 43 48 45 4d 41  SV_COLUMN_SCHEMA
2610: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
2620: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
2630: 78 2c 20 70 43 75 72 2d 3e 61 7a 44 62 5b 70 43  x, pCur->azDb[pC
2640: 75 72 2d 3e 69 44 62 5d 2c 20 2d 31 2c 20 30 29  ur->iDb], -1, 0)
2650: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2660: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 53     }.    case MS
2670: 56 5f 43 4f 4c 55 4d 4e 5f 56 41 4c 55 45 3a 20  V_COLUMN_VALUE: 
2680: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2690: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78  result_int64(ctx
26a0: 2c 20 70 43 75 72 2d 3e 61 56 61 6c 5b 30 5d 29  , pCur->aVal[0])
26b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
26c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 53     }.    case MS
26d0: 56 5f 43 4f 4c 55 4d 4e 5f 48 49 57 54 52 3a 20  V_COLUMN_HIWTR: 
26e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
26f0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78  result_int64(ctx
2700: 2c 20 70 43 75 72 2d 3e 61 56 61 6c 5b 31 5d 29  , pCur->aVal[1])
2710: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2720: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2730: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2740: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2750: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
2760: 75 72 72 65 6e 74 20 72 6f 77 2e 20 20 49 6e 20  urrent row.  In 
2770: 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
2780: 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 72 6f 77 69  ion, the.** rowi
2790: 64 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  d is the same as
27a0: 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 6c 75   the output valu
27b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27c0: 20 6d 65 6d 73 74 61 74 52 6f 77 69 64 28 73 71   memstatRowid(sq
27d0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
27e0: 72 20 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f 69  r *cur, sqlite_i
27f0: 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20  nt64 *pRowid){. 
2800: 20 6d 65 6d 73 74 61 74 5f 63 75 72 73 6f 72 20   memstat_cursor 
2810: 2a 70 43 75 72 20 3d 20 28 6d 65 6d 73 74 61 74  *pCur = (memstat
2820: 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  _cursor*)cur;.  
2830: 2a 70 52 6f 77 69 64 20 3d 20 70 43 75 72 2d 3e  *pRowid = pCur->
2840: 69 52 6f 77 69 64 2a 31 30 30 30 20 2b 20 70 43  iRowid*1000 + pC
2850: 75 72 2d 3e 69 44 62 3b 0a 20 20 72 65 74 75 72  ur->iDb;.  retur
2860: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2870: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2880: 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
2890: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 6f  has been moved o
28a0: 66 66 20 6f 66 20 74 68 65 20 6c 61 73 74 0a 2a  ff of the last.*
28b0: 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  * row of output.
28c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
28d0: 65 6d 73 74 61 74 45 6f 66 28 73 71 6c 69 74 65  emstatEof(sqlite
28e0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
28f0: 75 72 29 7b 0a 20 20 6d 65 6d 73 74 61 74 5f 63  ur){.  memstat_c
2900: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 6d  ursor *pCur = (m
2910: 65 6d 73 74 61 74 5f 63 75 72 73 6f 72 2a 29 63  emstat_cursor*)c
2920: 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  ur;.  return pCu
2930: 72 2d 3e 69 52 6f 77 69 64 3e 4d 53 56 5f 4e 52  r->iRowid>MSV_NR
2940: 4f 57 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OW;.}../*.** Thi
2950: 73 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  s method is call
2960: 65 64 20 74 6f 20 22 72 65 77 69 6e 64 22 20 74  ed to "rewind" t
2970: 68 65 20 6d 65 6d 73 74 61 74 5f 63 75 72 73 6f  he memstat_curso
2980: 72 20 6f 62 6a 65 63 74 20 62 61 63 6b 0a 2a 2a  r object back.**
2990: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
29a0: 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 54 68  w of output.  Th
29b0: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 61 6c 77  is method is alw
29c0: 61 79 73 20 63 61 6c 6c 65 64 20 61 74 20 6c 65  ays called at le
29d0: 61 73 74 0a 2a 2a 20 6f 6e 63 65 20 70 72 69 6f  ast.** once prio
29e0: 72 20 74 6f 20 61 6e 79 20 63 61 6c 6c 20 74 6f  r to any call to
29f0: 20 6d 65 6d 73 74 61 74 43 6f 6c 75 6d 6e 28 29   memstatColumn()
2a00: 20 6f 72 20 6d 65 6d 73 74 61 74 52 6f 77 69 64   or memstatRowid
2a10: 28 29 20 6f 72 20 0a 2a 2a 20 6d 65 6d 73 74 61  () or .** memsta
2a20: 74 45 6f 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  tEof()..*/.stati
2a30: 63 20 69 6e 74 20 6d 65 6d 73 74 61 74 46 69 6c  c int memstatFil
2a40: 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ter(.  sqlite3_v
2a50: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
2a60: 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20  bCursor, .  int 
2a70: 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68  idxNum, const ch
2a80: 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e  ar *idxStr,.  in
2a90: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
2aa0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
2ab0: 20 20 6d 65 6d 73 74 61 74 5f 63 75 72 73 6f 72    memstat_cursor
2ac0: 20 2a 70 43 75 72 20 3d 20 28 6d 65 6d 73 74 61   *pCur = (memsta
2ad0: 74 5f 63 75 72 73 6f 72 20 2a 29 70 56 74 61 62  t_cursor *)pVtab
2ae0: 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63  Cursor;.  int rc
2af0: 20 3d 20 6d 65 6d 73 74 61 74 46 69 6e 64 53 63   = memstatFindSc
2b00: 68 65 6d 61 73 28 70 43 75 72 29 3b 0a 20 20 69  hemas(pCur);.  i
2b10: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b20: 63 3b 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77 69  c;.  pCur->iRowi
2b30: 64 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  d = 0;.  pCur->i
2b40: 44 62 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Db = 0;.  return
2b50: 20 6d 65 6d 73 74 61 74 4e 65 78 74 28 70 56 74   memstatNext(pVt
2b60: 61 62 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a  abCursor);.}../*
2b70: 0a 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  .** SQLite will 
2b80: 69 6e 76 6f 6b 65 20 74 68 69 73 20 6d 65 74 68  invoke this meth
2b90: 6f 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  od one or more t
2ba0: 69 6d 65 73 20 77 68 69 6c 65 20 70 6c 61 6e 6e  imes while plann
2bb0: 69 6e 67 20 61 20 71 75 65 72 79 0a 2a 2a 20 74  ing a query.** t
2bc0: 68 61 74 20 75 73 65 73 20 74 68 65 20 6d 65 6d  hat uses the mem
2bd0: 73 74 61 74 20 76 69 72 74 75 61 6c 20 74 61 62  stat virtual tab
2be0: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
2bf0: 65 20 6e 65 65 64 73 20 74 6f 20 63 72 65 61 74  e needs to creat
2c00: 65 0a 2a 2a 20 61 20 71 75 65 72 79 20 70 6c 61  e.** a query pla
2c10: 6e 20 66 6f 72 20 65 61 63 68 20 69 6e 76 6f 63  n for each invoc
2c20: 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6d 70 75 74  ation and comput
2c30: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 64 20 63  e an estimated c
2c40: 6f 73 74 20 66 6f 72 20 74 68 61 74 0a 2a 2a 20  ost for that.** 
2c50: 70 6c 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  plan..*/.static 
2c60: 69 6e 74 20 6d 65 6d 73 74 61 74 42 65 73 74 49  int memstatBestI
2c70: 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65 33 5f  ndex(.  sqlite3_
2c80: 76 74 61 62 20 2a 74 61 62 2c 0a 20 20 73 71 6c  vtab *tab,.  sql
2c90: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
2ca0: 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20 70  *pIdxInfo.){.  p
2cb0: 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
2cc0: 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65  edCost = (double
2cd0: 29 35 30 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f  )500;.  pIdxInfo
2ce0: 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
2cf0: 3d 20 35 30 30 3b 0a 20 20 72 65 74 75 72 6e 20  = 500;.  return 
2d00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2d10: 0a 2a 2a 20 54 68 69 73 20 66 6f 6c 6c 6f 77 69  .** This followi
2d20: 6e 67 20 73 74 72 75 63 74 75 72 65 20 64 65 66  ng structure def
2d30: 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
2d40: 68 6f 64 73 20 66 6f 72 20 74 68 65 20 0a 2a 2a  hods for the .**
2d50: 20 6d 65 6d 73 74 61 74 20 76 69 72 74 75 61 6c   memstat virtual
2d60: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
2d70: 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  c sqlite3_module
2d80: 20 6d 65 6d 73 74 61 74 4d 6f 64 75 6c 65 20 3d   memstatModule =
2d90: 20 7b 0a 20 20 30 2c 20 20 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: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
2dc0: 20 30 2c 20 20 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 2f 2a 20 78              /* x
2de0: 43 72 65 61 74 65 20 2a 2f 0a 20 20 6d 65 6d 73  Create */.  mems
2df0: 74 61 74 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20  tatConnect,     
2e00: 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65         /* xConne
2e10: 63 74 20 2a 2f 0a 20 20 6d 65 6d 73 74 61 74 42  ct */.  memstatB
2e20: 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20  estIndex,       
2e30: 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78     /* xBestIndex
2e40: 20 2a 2f 0a 20 20 6d 65 6d 73 74 61 74 44 69 73   */.  memstatDis
2e50: 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  connect,        
2e60: 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20   /* xDisconnect 
2e70: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a 20  /* xDestroy */. 
2ea0: 20 6d 65 6d 73 74 61 74 4f 70 65 6e 2c 20 20 20   memstatOpen,   
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ec0: 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75  Open - open a cu
2ed0: 72 73 6f 72 20 2a 2f 0a 20 20 6d 65 6d 73 74 61  rsor */.  memsta
2ee0: 74 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  tClose,         
2ef0: 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d       /* xClose -
2f00: 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20   close a cursor 
2f10: 2a 2f 0a 20 20 6d 65 6d 73 74 61 74 46 69 6c 74  */.  memstatFilt
2f20: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
2f30: 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e  /* xFilter - con
2f40: 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73  figure scan cons
2f50: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6d 65 6d  traints */.  mem
2f60: 73 74 61 74 4e 65 78 74 2c 20 20 20 20 20 20 20  statNext,       
2f70: 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
2f80: 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
2f90: 73 6f 72 20 2a 2f 0a 20 20 6d 65 6d 73 74 61 74  sor */.  memstat
2fa0: 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Eof,            
2fb0: 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68      /* xEof - ch
2fc0: 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 73  eck for end of s
2fd0: 63 61 6e 20 2a 2f 0a 20 20 6d 65 6d 73 74 61 74  can */.  memstat
2fe0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
2ff0: 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d      /* xColumn -
3000: 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
3010: 6d 65 6d 73 74 61 74 52 6f 77 69 64 2c 20 20 20  memstatRowid,   
3020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
3030: 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61  owid - read data
3040: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20   /* xUpdate */. 
3070: 20 30 2c 20 20 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 2f 2a 20 78              /* x
3090: 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  Begin */.  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 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
30c0: 2f 0a 20 20 30 2c 20 20 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 2f                 /
30e0: 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30  * xCommit */.  0
30f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
3110: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20  llback */.  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 2f 2a 20 78 46 69 6e 64 4d         /* xFindM
3140: 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20  ethod */.  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 2f 2a 20 78 52 65 6e 61 6d 65        /* xRename
3170: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 2a   /* xSavepoint *
31a0: 2f 0a 20 20 30 2c 20 20 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 2f                 /
31c0: 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20  * xRelease */.  
31d0: 30 2c 20 20 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 2f 2a 20 78 52             /* xR
31f0: 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 20 20 30  ollbackTo */.  0
3200: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
3220: 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  adowName */.};..
3230: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3240: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
3250: 4c 45 20 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74  LE */..int sqlit
3260: 65 33 4d 65 6d 73 74 61 74 56 74 61 62 49 6e 69  e3MemstatVtabIni
3270: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
3280: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
3290: 45 5f 4f 4b 3b 0a 23 69 66 6e 64 65 66 20 53 51  E_OK;.#ifndef SQ
32a0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
32b0: 4c 54 41 42 4c 45 0a 20 20 72 63 20 3d 20 73 71  LTABLE.  rc = sq
32c0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64  lite3_create_mod
32d0: 75 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ule(db, "sqlite_
32e0: 6d 65 6d 73 74 61 74 22 2c 20 26 6d 65 6d 73 74  memstat", &memst
32f0: 61 74 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 23 65  atModule, 0);.#e
3300: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
3310: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
3320: 49 54 45 5f 43 4f 52 45 0a 23 69 66 64 65 66 20  ITE_CORE.#ifdef 
3330: 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65  _WIN32.__declspe
3340: 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e  c(dllexport).#en
3350: 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  dif.int sqlite3_
3360: 6d 65 6d 73 74 61 74 5f 69 6e 69 74 28 0a 20 20  memstat_init(.  
3370: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
3380: 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c  char **pzErrMsg,
3390: 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65   .  const sqlite
33a0: 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a  3_api_routines *
33b0: 70 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63  pApi.){.  int rc
33c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33d0: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
33e0: 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 23 69  _INIT2(pApi);.#i
33f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3400: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
3410: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
3420: 73 74 61 74 56 74 61 62 49 6e 69 74 28 64 62 29  statVtabInit(db)
3430: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
3440: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
3450: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 45 20 2a 2f  * SQLITE_CORE */
3460: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
3470: 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29  ned(SQLITE_CORE)
3480: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
3490: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 54 41  TE_ENABLE_MEMSTA
34a0: 54 56 54 41 42 29 20 2a 2f 0a                    TVTAB) */.