From 45ffeb7e00576dc8b0544611f2a244540e9662c1 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 3 Mar 2014 07:14:31 -0500 Subject: [PATCH] pageinspect: Use new pg_lsn datatype. Michael Paquier, with slight comment changes by me --- contrib/pageinspect/Makefile | 4 ++-- contrib/pageinspect/pageinspect--1.1--1.2.sql | 18 ++++++++++++++++++ ...geinspect--1.1.sql => pageinspect--1.2.sql} | 4 ++-- contrib/pageinspect/pageinspect.control | 2 +- contrib/pageinspect/rawpage.c | 16 ++++++++++++---- 5 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 contrib/pageinspect/pageinspect--1.1--1.2.sql rename contrib/pageinspect/{pageinspect--1.1.sql => pageinspect--1.2.sql} (97%) diff --git a/contrib/pageinspect/Makefile b/contrib/pageinspect/Makefile index 0e267eb869..ee78cb2989 100644 --- a/contrib/pageinspect/Makefile +++ b/contrib/pageinspect/Makefile @@ -4,8 +4,8 @@ MODULE_big = pageinspect OBJS = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o EXTENSION = pageinspect -DATA = pageinspect--1.1.sql pageinspect--1.0--1.1.sql \ - pageinspect--unpackaged--1.0.sql +DATA = pageinspect--1.2.sql pageinspect--1.0--1.1.sql \ + pageinspect--1.1--1.2.sql pageinspect--unpackaged--1.0.sql ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/contrib/pageinspect/pageinspect--1.1--1.2.sql b/contrib/pageinspect/pageinspect--1.1--1.2.sql new file mode 100644 index 0000000000..5e23ca4dd5 --- /dev/null +++ b/contrib/pageinspect/pageinspect--1.1--1.2.sql @@ -0,0 +1,18 @@ +/* contrib/pageinspect/pageinspect--1.1--1.2.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION pageinspect UPDATE TO 1.2" to load this file. \quit + +DROP FUNCTION page_header(bytea); +CREATE FUNCTION page_header(IN page bytea, + OUT lsn pg_lsn, + OUT checksum smallint, + OUT flags smallint, + OUT lower smallint, + OUT upper smallint, + OUT special smallint, + OUT pagesize smallint, + OUT version smallint, + OUT prune_xid xid) +AS 'MODULE_PATHNAME', 'page_header' +LANGUAGE C STRICT; diff --git a/contrib/pageinspect/pageinspect--1.1.sql b/contrib/pageinspect/pageinspect--1.2.sql similarity index 97% rename from contrib/pageinspect/pageinspect--1.1.sql rename to contrib/pageinspect/pageinspect--1.2.sql index 22a47d53e7..15e8e1e381 100644 --- a/contrib/pageinspect/pageinspect--1.1.sql +++ b/contrib/pageinspect/pageinspect--1.2.sql @@ -1,4 +1,4 @@ -/* contrib/pageinspect/pageinspect--1.1.sql */ +/* contrib/pageinspect/pageinspect--1.2.sql */ -- complain if script is sourced in psql, rather than via CREATE EXTENSION \echo Use "CREATE EXTENSION pageinspect" to load this file. \quit @@ -20,7 +20,7 @@ LANGUAGE C STRICT; -- page_header() -- CREATE FUNCTION page_header(IN page bytea, - OUT lsn text, + OUT lsn pg_lsn, OUT checksum smallint, OUT flags smallint, OUT lower smallint, diff --git a/contrib/pageinspect/pageinspect.control b/contrib/pageinspect/pageinspect.control index a412cf13dd..aecd91a711 100644 --- a/contrib/pageinspect/pageinspect.control +++ b/contrib/pageinspect/pageinspect.control @@ -1,5 +1,5 @@ # pageinspect extension comment = 'inspect the contents of database pages at a low level' -default_version = '1.1' +default_version = '1.2' module_pathname = '$libdir/pageinspect' relocatable = true diff --git a/contrib/pageinspect/rawpage.c b/contrib/pageinspect/rawpage.c index ff541ed40d..f1e0944c0e 100644 --- a/contrib/pageinspect/rawpage.c +++ b/contrib/pageinspect/rawpage.c @@ -18,10 +18,12 @@ #include "access/htup_details.h" #include "catalog/catalog.h" #include "catalog/namespace.h" +#include "catalog/pg_type.h" #include "funcapi.h" #include "miscadmin.h" #include "storage/bufmgr.h" #include "utils/builtins.h" +#include "utils/pg_lsn.h" #include "utils/rel.h" PG_MODULE_MAGIC; @@ -180,7 +182,6 @@ page_header(PG_FUNCTION_ARGS) PageHeader page; XLogRecPtr lsn; - char lsnchar[64]; if (!superuser()) ereport(ERROR, @@ -207,10 +208,17 @@ page_header(PG_FUNCTION_ARGS) /* Extract information from the page header */ lsn = PageGetLSN(page); - snprintf(lsnchar, sizeof(lsnchar), "%X/%X", - (uint32) (lsn >> 32), (uint32) lsn); - values[0] = CStringGetTextDatum(lsnchar); + /* pageinspect >= 1.2 uses pg_lsn instead of text for the LSN field. */ + if (tupdesc->attrs[0]->atttypid == TEXTOID) + { + char lsnchar[64]; + snprintf(lsnchar, sizeof(lsnchar), "%X/%X", + (uint32) (lsn >> 32), (uint32) lsn); + values[0] = CStringGetTextDatum(lsnchar); + } + else + values[0] = LSNGetDatum(lsn); values[1] = UInt16GetDatum(page->pd_checksum); values[2] = UInt16GetDatum(page->pd_flags); values[3] = UInt16GetDatum(page->pd_lower);