mirror of
https://github.com/postgres/postgres.git
synced 2025-11-19 13:42:17 +03:00
Add pg_column_toast_chunk_id().
This function returns the chunk_id of an on-disk TOASTed value. If the value is un-TOASTed or not on-disk, it returns NULL. This is useful for identifying which values are actually TOASTed and for investigating "unexpected chunk number" errors. Bumps catversion. Author: Yugo Nagata Reviewed-by: Jian He Discussion: https://postgr.es/m/20230329105507.d764497456eeac1ca491b5bd%40sraoss.co.jp
This commit is contained in:
@@ -5105,6 +5105,47 @@ pg_column_compression(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_TEXT_P(cstring_to_text(result));
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the chunk_id of the on-disk TOASTed value. Return NULL if the value
|
||||
* is un-TOASTed or not on-disk.
|
||||
*/
|
||||
Datum
|
||||
pg_column_toast_chunk_id(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int typlen;
|
||||
struct varlena *attr;
|
||||
struct varatt_external toast_pointer;
|
||||
|
||||
/* On first call, get the input type's typlen, and save at *fn_extra */
|
||||
if (fcinfo->flinfo->fn_extra == NULL)
|
||||
{
|
||||
/* Lookup the datatype of the supplied argument */
|
||||
Oid argtypeid = get_fn_expr_argtype(fcinfo->flinfo, 0);
|
||||
|
||||
typlen = get_typlen(argtypeid);
|
||||
if (typlen == 0) /* should not happen */
|
||||
elog(ERROR, "cache lookup failed for type %u", argtypeid);
|
||||
|
||||
fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
|
||||
sizeof(int));
|
||||
*((int *) fcinfo->flinfo->fn_extra) = typlen;
|
||||
}
|
||||
else
|
||||
typlen = *((int *) fcinfo->flinfo->fn_extra);
|
||||
|
||||
if (typlen != -1)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
attr = (struct varlena *) DatumGetPointer(PG_GETARG_DATUM(0));
|
||||
|
||||
if (!VARATT_IS_EXTERNAL_ONDISK(attr))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr);
|
||||
|
||||
PG_RETURN_OID(toast_pointer.va_valueid);
|
||||
}
|
||||
|
||||
/*
|
||||
* string_agg - Concatenates values and returns string.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user