Re: CAST(... ON DEFAULT) - WIP build on top of Error-Safe User Functions

jian he <jian.universality@gmail.com>

From: jian he <jian.universality@gmail.com>
To: Amul Sul <sulamul@gmail.com>
Cc: Corey Huinker <corey.huinker@gmail.com>, Vik Fearing <vik@postgresfriends.org>, Isaac Morland <isaac.morland@gmail.com>, pgsql-hackers@lists.postgresql.org
Date: 2025-11-25T02:59:42Z
Lists: pgsql-hackers

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Make cast functions to type money error safe

  2. Make cast function from circle to polygon error safe

  3. Make geometry cast functions error safe

  4. Make cast functions from jsonb error safe

  5. Make many cast functions error safe

  6. Add SQL/JSON query functions

  7. Add soft error handling to some expression nodes

Attachments

On Mon, Nov 24, 2025 at 11:38 AM Amul Sul <sulamul@gmail.com> wrote:
>
> The change I was suggesting will be as below:
>
> --- a/src/backend/utils/adt/varlena.c
> +++ b/src/backend/utils/adt/varlena.c
> @@ -2684,6 +2684,13 @@ name_text(PG_FUNCTION_ARGS)
>   */
>  List *
>  textToQualifiedNameList(text *textval)
> +{
> +   textToQualifiedNameListSafe(textval, NULL);
> +}
> +
> +/* error safe version of textToQualifiedNameList */
> +List *
> +textToQualifiedNameListSafe(text *textval, Node *escontext)
>  {
>     char       *rawname;
>     List       *result = NIL;
>
>
> We must try to avoid duplication whenever possible, as any bug fixes
> or enhancements would need to be copied to multiple places, which is
> often overlooked.
>
hi.
great idea!

I incorporated all of your ideas into v11.
I replaced all errsave to ereturn.
I aslo simplified T_SafeTypeCastExpr expression initialization, evaluation logic
within execExpr.c, execExprInterp.c.

but one thing I didn't touch: float8_div.

+static inline float8
+float8_div_safe(const float8 val1, const float8 val2, struct Node *escontext)

but we can change float8_div to:

static inline float8
float8_div(const float8 val1, const float8 val2)
{
   return float8_div_safe(val1, val2, NULL);
}
I am worried that entering another function would cause a minor performance
degradation.  And since these simple functions are so simple, keeping them
separated should not be a big problem.  also I placed float8_div,
float8_div_safe together.


--
jian
https://www.enterprisedb.com/