From: | Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> |
---|---|
To: | Joel Jacobson <joel(at)compiler(dot)org> |
Cc: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Assert single row returning SQL-standard functions |
Date: | 2025-08-29 10:12:57 |
Message-ID: | CAFj8pRCOQxMe5kwk-UTkJp1MG8o7bpCt-vuL-ME=GVKsB5RzUA@mail.gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
pá 29. 8. 2025 v 12:05 odesílatel Joel Jacobson <joel(at)compiler(dot)org> napsal:
> On Fri, Aug 29, 2025, at 11:52, Pavel Stehule wrote:
> >>> Can we think of some SQL-standard function way to also prevent against
> 0 rows?
> >
> > If I remember - in this case, the standard can raise a warning NOT
> > FOUND. Against Postgres, the warnings can be handled in SQL/PSM - and
> > you can raise an error or you can ignore it.
> >
> > it can looks like
> >
> > BEGIN
> > DECLARE assert_error CONDITION;
> > DECLARE HANDLER FOR NOT FOUND SIGNAL assert_error;
> > RETURN (SELECT id FROM footab WHERE id = _a);
> > END;
>
> Thanks, that's interesting, even though it's SQL/PSM, maybe it can give us
> some inspiration.
>
> >> I am afraid there is not nothing. NULL is the correct result in SQL.
> SQL allow to check ROW_COUNT by using GET DIAGNOSTICS commands and raising
> an error when something is unexpected
> >>
> >> I can imagine allowing the NOT NULL flag for functions, and then the
> result can be checked on NOT NULL value.
> >
> > but again NOT NULL is maybe some different than you want
>
> I think NOT NULL would be fine, since in combination with the RETURN (...)
> trick,
> that would assert one row, since zero rows would violate NOT NULL.
>
> The only limitation would be not being able to return a NULL value,
> but that seems like an acceptable limitation at least for most use cases I
> can imagine.
>
> Is like below how you imagine the syntax?
>
> CREATE OR REPLACE FUNCTION fx(_a int)
> RETURNS bool NOT NULL
> RETURN (SELECT id = _a FROM footab WHERE id = _a);
>
> > plpgsql has extra_checks, so maybe introduction similar GUC should not
> > be too bad idea
>
> Yes, maybe, do you mean something like below?
> CREATE OR REPLACE FUNCTION fx(_a int)
> RETURNS bool
> SET assert_single_row = true
> BEGIN ATOMIC
> SELECT id = _a FROM footab WHERE id = _a;
END;
>
>
maybe, but the question is a scope. It should to work everywhere, or just
inside SQL function - or just for last SQL command in SQL function?
/Joel
>
From | Date | Subject | |
---|---|---|---|
Next Message | Joel Jacobson | 2025-08-29 10:22:30 | Re: Assert single row returning SQL-standard functions |
Previous Message | Daniel Gustafsson | 2025-08-29 10:07:54 | Re: pg_dump: fix memory leak |