mirror of
https://github.com/postgres/postgres.git
synced 2025-11-15 03:41:20 +03:00
This new file is named pg_ndistinct.c and includes all the code directly related to the data type pg_ndistinct, extracted from the extended statistics code. Some patches are under discussion to change its input and output functions, and this separation makes the follow-up changes cleaner by separating the logic related to the data type and the multivariate ndistinct coefficient core logic in mvdistinct.c. Author: Corey Huinker <corey.huinker@gmail.com> Co-authored-by: Michael Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/aQ2k8--a0FfwSwX9@paquier.xyz
103 lines
2.2 KiB
C
103 lines
2.2 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* pg_ndistinct.c
|
|
* pg_ndistinct data type support.
|
|
*
|
|
* Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* IDENTIFICATION
|
|
* src/backend/utils/adt/pg_ndistinct.c
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "lib/stringinfo.h"
|
|
#include "statistics/extended_stats_internal.h"
|
|
#include "utils/fmgrprotos.h"
|
|
|
|
|
|
/*
|
|
* pg_ndistinct_in
|
|
* input routine for type pg_ndistinct
|
|
*
|
|
* pg_ndistinct is real enough to be a table column, but it has no
|
|
* operations of its own, and disallows input (just like pg_node_tree).
|
|
*/
|
|
Datum
|
|
pg_ndistinct_in(PG_FUNCTION_ARGS)
|
|
{
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
|
errmsg("cannot accept a value of type %s", "pg_ndistinct")));
|
|
|
|
PG_RETURN_VOID(); /* keep compiler quiet */
|
|
}
|
|
|
|
/*
|
|
* pg_ndistinct
|
|
* output routine for type pg_ndistinct
|
|
*
|
|
* Produces a human-readable representation of the value.
|
|
*/
|
|
Datum
|
|
pg_ndistinct_out(PG_FUNCTION_ARGS)
|
|
{
|
|
bytea *data = PG_GETARG_BYTEA_PP(0);
|
|
MVNDistinct *ndist = statext_ndistinct_deserialize(data);
|
|
int i;
|
|
StringInfoData str;
|
|
|
|
initStringInfo(&str);
|
|
appendStringInfoChar(&str, '{');
|
|
|
|
for (i = 0; i < ndist->nitems; i++)
|
|
{
|
|
int j;
|
|
MVNDistinctItem item = ndist->items[i];
|
|
|
|
if (i > 0)
|
|
appendStringInfoString(&str, ", ");
|
|
|
|
for (j = 0; j < item.nattributes; j++)
|
|
{
|
|
AttrNumber attnum = item.attributes[j];
|
|
|
|
appendStringInfo(&str, "%s%d", (j == 0) ? "\"" : ", ", attnum);
|
|
}
|
|
appendStringInfo(&str, "\": %d", (int) item.ndistinct);
|
|
}
|
|
|
|
appendStringInfoChar(&str, '}');
|
|
|
|
PG_RETURN_CSTRING(str.data);
|
|
}
|
|
|
|
/*
|
|
* pg_ndistinct_recv
|
|
* binary input routine for type pg_ndistinct
|
|
*/
|
|
Datum
|
|
pg_ndistinct_recv(PG_FUNCTION_ARGS)
|
|
{
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
|
errmsg("cannot accept a value of type %s", "pg_ndistinct")));
|
|
|
|
PG_RETURN_VOID(); /* keep compiler quiet */
|
|
}
|
|
|
|
/*
|
|
* pg_ndistinct_send
|
|
* binary output routine for type pg_ndistinct
|
|
*
|
|
* n-distinct is serialized into a bytea value, so let's send that.
|
|
*/
|
|
Datum
|
|
pg_ndistinct_send(PG_FUNCTION_ARGS)
|
|
{
|
|
return byteasend(fcinfo);
|
|
}
|