mirror of https://github.com/postgres/postgres
This new file is named pg_dependencies.c and includes all the code directly related to the data type pg_dependencies, 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 functional dependencies statistics core logic in dependencies.c. Author: Corey Huinker <corey.huinker@gmail.com> Co-authored-by: Michael Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/aQ2k8--a0FfwSwX9@paquier.xyzpull/248/head
parent
a552312343
commit
2ddc8d9e9b
@ -0,0 +1,104 @@ |
|||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
* |
||||||
|
* pg_dependencies.c |
||||||
|
* pg_dependencies 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_dependencies.c |
||||||
|
* |
||||||
|
*------------------------------------------------------------------------- |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "postgres.h" |
||||||
|
|
||||||
|
#include "lib/stringinfo.h" |
||||||
|
#include "statistics/extended_stats_internal.h" |
||||||
|
#include "utils/fmgrprotos.h" |
||||||
|
|
||||||
|
/*
|
||||||
|
* pg_dependencies_in - input routine for type pg_dependencies. |
||||||
|
* |
||||||
|
* pg_dependencies is real enough to be a table column, but it has no operations |
||||||
|
* of its own, and disallows input too |
||||||
|
*/ |
||||||
|
Datum |
||||||
|
pg_dependencies_in(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
/*
|
||||||
|
* pg_node_list stores the data in binary form and parsing text input is |
||||||
|
* not needed, so disallow this. |
||||||
|
*/ |
||||||
|
ereport(ERROR, |
||||||
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), |
||||||
|
errmsg("cannot accept a value of type %s", "pg_dependencies"))); |
||||||
|
|
||||||
|
PG_RETURN_VOID(); /* keep compiler quiet */ |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* pg_dependencies - output routine for type pg_dependencies. |
||||||
|
*/ |
||||||
|
Datum |
||||||
|
pg_dependencies_out(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
bytea *data = PG_GETARG_BYTEA_PP(0); |
||||||
|
MVDependencies *dependencies = statext_dependencies_deserialize(data); |
||||||
|
int i, |
||||||
|
j; |
||||||
|
StringInfoData str; |
||||||
|
|
||||||
|
initStringInfo(&str); |
||||||
|
appendStringInfoChar(&str, '{'); |
||||||
|
|
||||||
|
for (i = 0; i < dependencies->ndeps; i++) |
||||||
|
{ |
||||||
|
MVDependency *dependency = dependencies->deps[i]; |
||||||
|
|
||||||
|
if (i > 0) |
||||||
|
appendStringInfoString(&str, ", "); |
||||||
|
|
||||||
|
appendStringInfoChar(&str, '"'); |
||||||
|
for (j = 0; j < dependency->nattributes; j++) |
||||||
|
{ |
||||||
|
if (j == dependency->nattributes - 1) |
||||||
|
appendStringInfoString(&str, " => "); |
||||||
|
else if (j > 0) |
||||||
|
appendStringInfoString(&str, ", "); |
||||||
|
|
||||||
|
appendStringInfo(&str, "%d", dependency->attributes[j]); |
||||||
|
} |
||||||
|
appendStringInfo(&str, "\": %f", dependency->degree); |
||||||
|
} |
||||||
|
|
||||||
|
appendStringInfoChar(&str, '}'); |
||||||
|
|
||||||
|
PG_RETURN_CSTRING(str.data); |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* pg_dependencies_recv - binary input routine for type pg_dependencies. |
||||||
|
*/ |
||||||
|
Datum |
||||||
|
pg_dependencies_recv(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
ereport(ERROR, |
||||||
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), |
||||||
|
errmsg("cannot accept a value of type %s", "pg_dependencies"))); |
||||||
|
|
||||||
|
PG_RETURN_VOID(); /* keep compiler quiet */ |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* pg_dependencies_send - binary output routine for type pg_dependencies. |
||||||
|
* |
||||||
|
* Functional dependencies are serialized in a bytea value (although the type |
||||||
|
* is named differently), so let's just send that. |
||||||
|
*/ |
||||||
|
Datum |
||||||
|
pg_dependencies_send(PG_FUNCTION_ARGS) |
||||||
|
{ |
||||||
|
return byteasend(fcinfo); |
||||||
|
} |
||||||
Loading…
Reference in new issue