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 →
-
Make cast functions to type money error safe
- b36b95640487 19 (unreleased) landed
-
Make cast function from circle to polygon error safe
- 26f9012beecf 19 (unreleased) landed
-
Make geometry cast functions error safe
- 45cdaf3665be 19 (unreleased) landed
-
Make cast functions from jsonb error safe
- 10e4d8aaf46f 19 (unreleased) landed
-
Make many cast functions error safe
- e2f289e5b9b8 19 (unreleased) landed
-
Add SQL/JSON query functions
- 6185c9737cf4 17.0 cited
-
Add soft error handling to some expression nodes
- aaaf9449ec6b 17.0 cited
Attachments
- v11-0018-error-safe-for-casting-geometry-data-type.patch (text/x-patch) patch v11-0018
- v11-0020-CAST-expr-AS-newtype-DEFAULT-ON-ERROR.patch (text/x-patch) patch v11-0020
- v11-0016-error-safe-for-casting-timestamp-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0016
- v11-0017-error-safe-for-casting-jsonb-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0017
- v11-0019-invent-some-error-safe-functions.patch (text/x-patch) patch v11-0019
- v11-0012-error-safe-for-casting-float8-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0012
- v11-0015-error-safe-for-casting-timestamptz-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0015
- v11-0014-error-safe-for-casting-interval-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0014
- v11-0013-error-safe-for-casting-date-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0013
- v11-0011-error-safe-for-casting-float4-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0011
- v11-0009-error-safe-for-casting-bigint-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0009
- v11-0010-error-safe-for-casting-numeric-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0010
- v11-0007-error-safe-for-casting-macaddr8-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0007
- v11-0008-error-safe-for-casting-integer-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0008
- v11-0005-error-safe-for-casting-character-varying-to-other-types-per-pg_c.patch (text/x-patch) patch v11-0005
- v11-0006-error-safe-for-casting-inet-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0006
- v11-0004-error-safe-for-casting-text-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0004
- v11-0002-error-safe-for-casting-bit-varbit-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0002
- v11-0003-error-safe-for-casting-character-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0003
- v11-0001-error-safe-for-casting-bytea-to-other-types-per-pg_cast.patch (text/x-patch) patch v11-0001
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/