From 60838df922345b26a616e49ac9fab808a35d1f85 Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Thu, 25 Dec 2014 20:46:14 +0900 Subject: [PATCH] Move pg_lzcompress.c to src/common. Exposing compression and decompression APIs of pglz makes possible its use by extensions and contrib modules. pglz_decompress contained a call to elog to emit an error message in case of corrupted data. This function is changed to return a status code to let its callers return an error instead. This commit is required for upcoming WAL compression feature so that the WAL reader facility can decompress the WAL data by using pglz_decompress. Michael Paquier --- src/backend/access/heap/tuptoaster.c | 11 ++++++---- src/backend/utils/adt/Makefile | 4 ++-- src/common/Makefile | 3 ++- .../utils/adt => common}/pg_lzcompress.c | 21 ++++++++++++------- src/include/{utils => common}/pg_lzcompress.h | 4 ++-- src/tools/msvc/Mkvcbuild.pm | 3 ++- 6 files changed, 29 insertions(+), 17 deletions(-) rename src/{backend/utils/adt => common}/pg_lzcompress.c (97%) rename src/include/{utils => common}/pg_lzcompress.h (96%) diff --git a/src/backend/access/heap/tuptoaster.c b/src/backend/access/heap/tuptoaster.c index d230387c85..c91bdc0d3f 100644 --- a/src/backend/access/heap/tuptoaster.c +++ b/src/backend/access/heap/tuptoaster.c @@ -37,7 +37,7 @@ #include "catalog/catalog.h" #include "miscadmin.h" #include "utils/fmgroids.h" -#include "utils/pg_lzcompress.h" +#include "common/pg_lzcompress.h" #include "utils/rel.h" #include "utils/typcache.h" #include "utils/tqual.h" @@ -142,7 +142,8 @@ heap_tuple_untoast_attr(struct varlena * attr) attr = (struct varlena *) palloc(PGLZ_RAW_SIZE(tmp) + VARHDRSZ); SET_VARSIZE(attr, PGLZ_RAW_SIZE(tmp) + VARHDRSZ); - pglz_decompress(tmp, VARDATA(attr)); + if (!pglz_decompress(tmp, VARDATA(attr))) + elog(ERROR, "compressed data is corrupted"); pfree(tmp); } } @@ -167,7 +168,8 @@ heap_tuple_untoast_attr(struct varlena * attr) attr = (struct varlena *) palloc(PGLZ_RAW_SIZE(tmp) + VARHDRSZ); SET_VARSIZE(attr, PGLZ_RAW_SIZE(tmp) + VARHDRSZ); - pglz_decompress(tmp, VARDATA(attr)); + if (!pglz_decompress(tmp, VARDATA(attr))) + elog(ERROR, "compressed data is corrupted"); } else if (VARATT_IS_SHORT(attr)) { @@ -239,7 +241,8 @@ heap_tuple_untoast_attr_slice(struct varlena * attr, preslice = (struct varlena *) palloc(size); SET_VARSIZE(preslice, size); - pglz_decompress(tmp, VARDATA(preslice)); + if (!pglz_decompress(tmp, VARDATA(preslice))) + elog(ERROR, "compressed data is corrupted"); if (tmp != (PGLZ_Header *) attr) pfree(tmp); diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile index 3ea9bf435a..20e5ff10c7 100644 --- a/src/backend/utils/adt/Makefile +++ b/src/backend/utils/adt/Makefile @@ -25,8 +25,8 @@ OBJS = acl.o arrayfuncs.o array_selfuncs.o array_typanalyze.o \ jsonfuncs.o like.o lockfuncs.o mac.o misc.o nabstime.o name.o \ network.o network_gist.o network_selfuncs.o \ numeric.o numutils.o oid.o oracle_compat.o \ - orderedsetaggs.o pg_lzcompress.o pg_locale.o pg_lsn.o \ - pgstatfuncs.o pseudotypes.o quote.o rangetypes.o rangetypes_gist.o \ + orderedsetaggs.o pg_locale.o pg_lsn.o pgstatfuncs.o \ + pseudotypes.o quote.o rangetypes.o rangetypes_gist.o \ rangetypes_selfuncs.o rangetypes_spgist.o rangetypes_typanalyze.o \ regexp.o regproc.o ri_triggers.o rowtypes.o ruleutils.o \ selfuncs.o tid.o timestamp.o trigfuncs.o \ diff --git a/src/common/Makefile b/src/common/Makefile index 7edbaaa2c1..bd77c1da8c 100644 --- a/src/common/Makefile +++ b/src/common/Makefile @@ -23,7 +23,8 @@ include $(top_builddir)/src/Makefile.global override CPPFLAGS := -DFRONTEND $(CPPFLAGS) LIBS += $(PTHREAD_LIBS) -OBJS_COMMON = exec.o pgfnames.o psprintf.o relpath.o rmtree.o username.o wait_error.o +OBJS_COMMON = exec.o pg_lzcompress.o pgfnames.o psprintf.o relpath.o \ + rmtree.o username.o wait_error.o OBJS_FRONTEND = $(OBJS_COMMON) fe_memutils.o diff --git a/src/backend/utils/adt/pg_lzcompress.c b/src/common/pg_lzcompress.c similarity index 97% rename from src/backend/utils/adt/pg_lzcompress.c rename to src/common/pg_lzcompress.c index fe088901f0..9f97c362d1 100644 --- a/src/backend/utils/adt/pg_lzcompress.c +++ b/src/common/pg_lzcompress.c @@ -27,7 +27,7 @@ * FALSE if not; in the latter case the contents of dest * are undefined. * - * void + * bool * pglz_decompress(const PGLZ_Header *source, char *dest) * * source is the compressed input. @@ -40,6 +40,10 @@ * The data is written to buff exactly as it was handed * to pglz_compress(). No terminating zero byte is added. * + * The return value is TRUE if decompression succeeded, + * FALSE if not; in the latter case the contents of dest + * are undefined. + * * The decompression algorithm and internal data format: * * PGLZ_Header is defined as @@ -169,14 +173,14 @@ * * Copyright (c) 1999-2014, PostgreSQL Global Development Group * - * src/backend/utils/adt/pg_lzcompress.c + * src/common/pg_lzcompress.c * ---------- */ #include "postgres.h" #include -#include "utils/pg_lzcompress.h" +#include "common/pg_lzcompress.h" /* ---------- @@ -492,7 +496,8 @@ pglz_find_match(int16 *hstart, const char *input, const char *end, /* ---------- * pglz_compress - * - * Compresses source into dest using strategy. + * Compresses source into dest using strategy. Returns false if a failure + * occurred, true in case of success. * ---------- */ bool @@ -678,10 +683,11 @@ pglz_compress(const char *source, int32 slen, PGLZ_Header *dest, /* ---------- * pglz_decompress - * - * Decompresses source into dest. + * Decompresses source into dest. Returns false if a failure + * occurred, true in case of success. * ---------- */ -void +bool pglz_decompress(const PGLZ_Header *source, char *dest) { const unsigned char *sp; @@ -771,9 +777,10 @@ pglz_decompress(const PGLZ_Header *source, char *dest) * Check we decompressed the right amount. */ if (dp != destend || sp != srcend) - elog(ERROR, "compressed data is corrupt"); + return false; /* * That's it. */ + return true; } diff --git a/src/include/utils/pg_lzcompress.h b/src/include/common/pg_lzcompress.h similarity index 96% rename from src/include/utils/pg_lzcompress.h rename to src/include/common/pg_lzcompress.h index 4af24a32a4..f36d2da8ee 100644 --- a/src/include/utils/pg_lzcompress.h +++ b/src/include/common/pg_lzcompress.h @@ -3,7 +3,7 @@ * * Definitions for the builtin LZ compressor * - * src/include/utils/pg_lzcompress.h + * src/include/common/pg_lzcompress.h * ---------- */ @@ -107,6 +107,6 @@ extern const PGLZ_Strategy *const PGLZ_strategy_always; */ extern bool pglz_compress(const char *source, int32 slen, PGLZ_Header *dest, const PGLZ_Strategy *strategy); -extern void pglz_decompress(const PGLZ_Header *source, char *dest); +extern bool pglz_decompress(const PGLZ_Header *source, char *dest); #endif /* _PG_LZCOMPRESS_H_ */ diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index 004942ca07..6779b18300 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -76,7 +76,8 @@ sub mkvcbuild push(@pgportfiles, 'rint.c') if ($vsVersion < '12.00'); our @pgcommonallfiles = qw( - exec.c pgfnames.c psprintf.c relpath.c rmtree.c username.c wait_error.c); + exec.c pg_lzcompress.c pgfnames.c psprintf.c relpath.c rmtree.c + username.c wait_error.c); our @pgcommonfrontendfiles = (@pgcommonallfiles, qw(fe_memutils.c)); -- 2.39.5