citus/src/backend/columnar/columnar.c

168 lines
3.8 KiB
C

/*-------------------------------------------------------------------------
*
* columnar.c
*
* This file contains...
*
* Copyright (c) 2016, Citus Data, Inc.
*
* $Id$
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include <sys/stat.h>
#include <unistd.h>
#include "miscadmin.h"
#include "utils/guc.h"
#include "utils/rel.h"
#include "citus_version.h"
#include "columnar/columnar.h"
#include "columnar/columnar_tableam.h"
/* Default values for option parameters */
#define DEFAULT_STRIPE_ROW_COUNT 150000
#define DEFAULT_CHUNK_ROW_COUNT 10000
#if HAVE_LIBZSTD
#define DEFAULT_COMPRESSION_TYPE COMPRESSION_ZSTD
#elif HAVE_CITUS_LIBLZ4
#define DEFAULT_COMPRESSION_TYPE COMPRESSION_LZ4
#else
#define DEFAULT_COMPRESSION_TYPE COMPRESSION_PG_LZ
#endif
int columnar_compression = DEFAULT_COMPRESSION_TYPE;
int columnar_stripe_row_limit = DEFAULT_STRIPE_ROW_COUNT;
int columnar_chunk_group_row_limit = DEFAULT_CHUNK_ROW_COUNT;
int columnar_compression_level = 3;
static const struct config_enum_entry columnar_compression_options[] =
{
{ "none", COMPRESSION_NONE, false },
{ "pglz", COMPRESSION_PG_LZ, false },
#if HAVE_CITUS_LIBLZ4
{ "lz4", COMPRESSION_LZ4, false },
#endif
#if HAVE_LIBZSTD
{ "zstd", COMPRESSION_ZSTD, false },
#endif
{ NULL, 0, false }
};
void
columnar_init(void)
{
columnar_init_gucs();
columnar_tableam_init();
}
void
columnar_init_gucs()
{
DefineCustomEnumVariable("columnar.compression",
"Compression type for columnar.",
NULL,
&columnar_compression,
DEFAULT_COMPRESSION_TYPE,
columnar_compression_options,
PGC_USERSET,
0,
NULL,
NULL,
NULL);
DefineCustomIntVariable("columnar.compression_level",
"Compression level to be used with zstd.",
NULL,
&columnar_compression_level,
3,
COMPRESSION_LEVEL_MIN,
COMPRESSION_LEVEL_MAX,
PGC_USERSET,
0,
NULL,
NULL,
NULL);
DefineCustomIntVariable("columnar.stripe_row_limit",
"Maximum number of tuples per stripe.",
NULL,
&columnar_stripe_row_limit,
DEFAULT_STRIPE_ROW_COUNT,
STRIPE_ROW_COUNT_MINIMUM,
STRIPE_ROW_COUNT_MAXIMUM,
PGC_USERSET,
0,
NULL,
NULL,
NULL);
DefineCustomIntVariable("columnar.chunk_group_row_limit",
"Maximum number of rows per chunk.",
NULL,
&columnar_chunk_group_row_limit,
DEFAULT_CHUNK_ROW_COUNT,
CHUNK_ROW_COUNT_MINIMUM,
CHUNK_ROW_COUNT_MAXIMUM,
PGC_USERSET,
0,
NULL,
NULL,
NULL);
}
/*
* ParseCompressionType converts a string to a compression type.
* For compression algorithms that are invalid or not compiled, it
* returns COMPRESSION_TYPE_INVALID.
*/
CompressionType
ParseCompressionType(const char *compressionTypeString)
{
Assert(compressionTypeString != NULL);
for (int compressionIndex = 0;
columnar_compression_options[compressionIndex].name != NULL;
compressionIndex++)
{
const char *compressionName = columnar_compression_options[compressionIndex].name;
if (strncmp(compressionTypeString, compressionName, NAMEDATALEN) == 0)
{
return columnar_compression_options[compressionIndex].val;
}
}
return COMPRESSION_TYPE_INVALID;
}
/*
* CompressionTypeStr returns string representation of a compression type.
* For compression algorithms that are invalid or not compiled, it
* returns NULL.
*/
const char *
CompressionTypeStr(CompressionType requestedType)
{
for (int compressionIndex = 0;
columnar_compression_options[compressionIndex].name != NULL;
compressionIndex++)
{
CompressionType compressionType =
columnar_compression_options[compressionIndex].val;
if (compressionType == requestedType)
{
return columnar_compression_options[compressionIndex].name;
}
}
return NULL;
}