mirror of
https://github.com/postgres/postgres.git
synced 2025-05-05 09:19:17 +03:00
Compilers that don't understand that elog(ERROR) doesn't return issued warnings here. In the cases in libpq_pipeline.c, we were not exactly helping things by failing to mark pg_fatal() as noreturn. Per buildfarm.
125 lines
3.6 KiB
C
125 lines
3.6 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* toast_compression.h
|
|
* Functions for toast compression.
|
|
*
|
|
* Copyright (c) 2021, PostgreSQL Global Development Group
|
|
*
|
|
* src/include/access/toast_compression.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef TOAST_COMPRESSION_H
|
|
#define TOAST_COMPRESSION_H
|
|
|
|
#include "utils/guc.h"
|
|
|
|
/* GUCs */
|
|
extern char *default_toast_compression;
|
|
|
|
/* default compression method if not specified. */
|
|
#define DEFAULT_TOAST_COMPRESSION "pglz"
|
|
|
|
/*
|
|
* Built-in compression method-id. The toast compression header will store
|
|
* this in the first 2 bits of the raw length. These built-in compression
|
|
* method-id are directly mapped to the built-in compression methods.
|
|
*/
|
|
typedef enum ToastCompressionId
|
|
{
|
|
TOAST_PGLZ_COMPRESSION_ID = 0,
|
|
TOAST_LZ4_COMPRESSION_ID = 1,
|
|
TOAST_INVALID_COMPRESSION_ID = 2
|
|
} ToastCompressionId;
|
|
|
|
/*
|
|
* Built-in compression methods. pg_attribute will store this in the
|
|
* attcompression column.
|
|
*/
|
|
#define TOAST_PGLZ_COMPRESSION 'p'
|
|
#define TOAST_LZ4_COMPRESSION 'l'
|
|
|
|
#define InvalidCompressionMethod '\0'
|
|
#define CompressionMethodIsValid(cm) ((bool) ((cm) != InvalidCompressionMethod))
|
|
|
|
#define NO_LZ4_SUPPORT() \
|
|
ereport(ERROR, \
|
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), \
|
|
errmsg("unsupported LZ4 compression method"), \
|
|
errdetail("This functionality requires the server to be built with lz4 support."), \
|
|
errhint("You need to rebuild PostgreSQL using --with-lz4.")))
|
|
|
|
#define IsValidCompression(cm) ((cm) != InvalidCompressionMethod)
|
|
|
|
#define IsStorageCompressible(storage) ((storage) != TYPSTORAGE_PLAIN && \
|
|
(storage) != TYPSTORAGE_EXTERNAL)
|
|
|
|
/*
|
|
* GetCompressionMethodName - Get compression method name
|
|
*/
|
|
static inline const char *
|
|
GetCompressionMethodName(char method)
|
|
{
|
|
switch (method)
|
|
{
|
|
case TOAST_PGLZ_COMPRESSION:
|
|
return "pglz";
|
|
case TOAST_LZ4_COMPRESSION:
|
|
return "lz4";
|
|
default:
|
|
elog(ERROR, "invalid compression method %c", method);
|
|
return NULL; /* keep compiler quiet */
|
|
}
|
|
}
|
|
|
|
/*
|
|
* CompressionNameToMethod - Get compression method from compression name
|
|
*
|
|
* Search in the available built-in methods. If the compression not found
|
|
* in the built-in methods then return InvalidCompressionMethod.
|
|
*/
|
|
static inline char
|
|
CompressionNameToMethod(char *compression)
|
|
{
|
|
if (strcmp(compression, "pglz") == 0)
|
|
return TOAST_PGLZ_COMPRESSION;
|
|
else if (strcmp(compression, "lz4") == 0)
|
|
{
|
|
#ifndef USE_LZ4
|
|
NO_LZ4_SUPPORT();
|
|
#endif
|
|
return TOAST_LZ4_COMPRESSION;
|
|
}
|
|
|
|
return InvalidCompressionMethod;
|
|
}
|
|
|
|
/*
|
|
* GetDefaultToastCompression -- get the default toast compression method
|
|
*
|
|
* This exists to hide the use of the default_toast_compression GUC variable.
|
|
*/
|
|
static inline char
|
|
GetDefaultToastCompression(void)
|
|
{
|
|
return CompressionNameToMethod(default_toast_compression);
|
|
}
|
|
|
|
/* pglz compression/decompression routines */
|
|
extern struct varlena *pglz_compress_datum(const struct varlena *value);
|
|
extern struct varlena *pglz_decompress_datum(const struct varlena *value);
|
|
extern struct varlena *pglz_decompress_datum_slice(const struct varlena *value,
|
|
int32 slicelength);
|
|
|
|
/* lz4 compression/decompression routines */
|
|
extern struct varlena *lz4_compress_datum(const struct varlena *value);
|
|
extern struct varlena *lz4_decompress_datum(const struct varlena *value);
|
|
extern struct varlena *lz4_decompress_datum_slice(const struct varlena *value,
|
|
int32 slicelength);
|
|
extern ToastCompressionId toast_get_compression_id(struct varlena *attr);
|
|
extern bool check_default_toast_compression(char **newval, void **extra,
|
|
GucSource source);
|
|
|
|
#endif /* TOAST_COMPRESSION_H */
|