On Wed, 10 Dec 2025 at 13:58, jian he <[email protected]> wrote: > > On Tue, Dec 9, 2025 at 11:39 AM jian he <[email protected]> wrote: > > > > On Mon, Dec 1, 2025 at 1:41 PM Corey Huinker <[email protected]> > > wrote: > > >> > > > No, I meant implementing the syntax for being able to declare a custom > > > CAST function as safe (or not). Basically adding the [SAFE] to > > > > > > CREATE CAST (source_type AS target_type) > > > WITH [SAFE] FUNCTION function_name [ (argument_type [, ...]) ] > > > > > > I'm not tied to this syntax choice, but this one seemed the most obvious > > > and least invasive. > > > > > hi. > please see the attached v15. > the primary implementation of CAST DEFAULT is contained in V15-0021. > > changes compared to v14. > 1. separate patch (v15-0017) for float error. > -pg_noreturn extern void float_overflow_error(void); > -pg_noreturn extern void float_underflow_error(void); > -pg_noreturn extern void float_zero_divide_error(void); > +extern void float_overflow_error(struct Node *escontext); > +extern void float_underflow_error(struct Node *escontext); > +extern void float_zero_divide_error(struct Node *escontext); > > 2. separate patch (v15-0018) for newly added float8 functions: > float8_pl_safe > float8_mi_safe > float8_mul_safe > float8_div_safe > refactoring existing functions is too invasive, I choose not to. > > 3. refactor point_dt (v15-0019). This is necessary for making geometry data > type > error-safe, separate from the main patch (v15-0020). I hope to make it easier > to > review. > -static inline float8 point_dt(Point *pt1, Point *pt2); > +static inline float8 point_dt(Point *pt1, Point *pt2, Node *escontext); > > 4. skip compile DEFAULT expression (ExecInitExprRec) for binary coercion cast, > as mentioned before. See ExecInitSafeTypeCastExpr. > > 5. Support user-defined type cast error-safe, see v15-0022. > user-defined error-safe cast syntax: > CREATE CAST (source_type AS target_type) > WITH [SAFE] FUNCTION function_name [ (argument_type [, ...]) ] > [ AS ASSIGNMENT | AS IMPLICIT ] > > this only adds a new keyword SAFE. > This works for C and internal language functions only now. > To make it really usable, I have made citext, hstore module castfunc error > safe. > A new column: pg_cast.casterrorsafe was added, this is needed for > CREATE CAST WITH SAFE FUNCTION. > > +select CAST(ARRAY['a','g','b','h',null,'i'] AS hstore > + DEFAULT NULL ON CONVERSION ERROR); > + array > +------- > + > +(1 row) > + > > 6. slightly polished the doc. > > > -- > jian > https://www.enterprisedb.com/
Hi! Overall, I think this patch is doing a good thing. Also, are we holding it until the next SQL standard release, because sql/23 leaks this feature? Below are my 2c. 1) First of all, I would prefer the `Bumps catversion` comment in the commit msg of v15-0022. 2) In v15-0006, if dont understand when memory allocated by `result = (macaddr *) palloc0(sizeof(macaddr));` will be freed. Does it persist until the query ends? I tried to get OOM with a query that errors out macaddr8 casts repeatedly, but failed. 3) > * When error_safe set to true, we will evaluate the constant expression in a > * error safe way. If the evaluation fails, return NULL instead of throwing > * error. Somebody has to say it - s/error_safe set/error_safe is set/, also s/throwing error/throwing an error/ -- Best regards, Kirill Reshke
