Re: PL/pgSQL THEN binging in condition - Mailing list pgsql-bugs

From Pavel Stehule
Subject Re: PL/pgSQL THEN binging in condition
Date
Msg-id CAFj8pRD2uadHhmUy6y1R65nu1z4tXWVTyXz_689WeaiXO4p_BQ@mail.gmail.com
Whole thread Raw
In response to PL/pgSQL THEN binging in condition  (PetSerAl <petseral@gmail.com>)
Responses Re: PL/pgSQL THEN binging in condition
List pgsql-bugs
Hi

út 17. 9. 2024 v 20:04 odesílatel PetSerAl <petseral@gmail.com> napsal:
postgres=# SELECT version();
                          version
------------------------------------------------------------
 PostgreSQL 16.4, compiled by Visual C++ build 1940, 64-bit
(1 row)


postgres=# DO $$
postgres$#   BEGIN
postgres$#     IF
postgres$#       CASE
postgres$#         WHEN TRUE
postgres$#         THEN TRUE
postgres$#       END
postgres$#     THEN
postgres$#       NULL;
postgres$#     END IF;
postgres$#   END
postgres$# $$;
ERROR:  syntax error at end of input
LINE 5:         WHEN TRUE
                         ^

It seems error here because first THEN bound to IF statement rather than CASE expression. Workaround here would be using parenthesis:

postgres=# DO $$
postgres$#   BEGIN
postgres$#     IF
postgres$#       (CASE
postgres$#         WHEN TRUE
postgres$#         THEN TRUE
postgres$#       END)
postgres$#     THEN
postgres$#       NULL;
postgres$#     END IF;
postgres$#   END
postgres$# $$;
DO

If behavior can not be changed for compatibility reasons, it at least can use better error message.

It is an interesting use case, but I am afraid it can be fixed (enhanced)  without a strong rewrite of the plpgsql engine.

plpgsql parser knows nothing about embedded SQL expressions. It just tries to cut the string between IF and THEN, and in this case, it should be confused.

This is a feature - it is the cost of a very simple plpgsql parser, that doesn't support expressions explicitly.

Regards

Pavel

pgsql-bugs by date:

Previous
From: PetSerAl
Date:
Subject: PL/pgSQL THEN binging in condition
Next
From: Tom Lane
Date:
Subject: Re: BUG #18618: pg_upgrade from 14 to 15+ fails for unlogged table with identity column