summaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/pg_ndistinct.c
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2025-11-12 16:34:52 +0900
committerMichael Paquier <michael@paquier.xyz>2025-11-12 16:34:52 +0900
commita5523123430f39ba26a0d0250fbe10a396ab0703 (patch)
tree25f927a4c135ffa46f49e2830fb9d428a7f018ae /src/backend/utils/adt/pg_ndistinct.c
parentdf53fa1c1ebf9bb3e8c17217f7cc1435107067fb (diff)
Move code specific to pg_ndistinct to new file
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
Diffstat (limited to 'src/backend/utils/adt/pg_ndistinct.c')
-rw-r--r--src/backend/utils/adt/pg_ndistinct.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/backend/utils/adt/pg_ndistinct.c b/src/backend/utils/adt/pg_ndistinct.c
new file mode 100644
index 00000000000..5ce655bce75
--- /dev/null
+++ b/src/backend/utils/adt/pg_ndistinct.c
@@ -0,0 +1,102 @@
+/*-------------------------------------------------------------------------
+ *
+ * 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);
+}