From d98fffd98a5cb9046117555d1b88147621311d8b Mon Sep 17 00:00:00 2001 From: Haibo Yan Date: Sun, 28 Jun 2026 13:28:19 -0700 Subject: [PATCH] Add built-in formatters for CAST ... FORMAT Add built-in formatter functions and pg_formatter bootstrap rows for the initial datetime/string formatted casts: text/varchar/bpchar <-> date text/varchar/bpchar <-> timestamp text/varchar/bpchar <-> timestamptz The wrappers reuse PostgreSQL's existing formatting code and are reached through pg_formatter, not by parser or analyzer special cases. They are STRICT, so NULL input or NULL FORMAT returns NULL. This provides SQL-standard-style CAST ... FORMAT support for the common datetime/string cases, while keeping PostgreSQL extensions from the generic infrastructure: FORMAT may be any expression coercible to text, and formatter lookup remains catalog-driven. The patch does not claim complete SQL-standard datetime-template conformance; time, timetz, numeric, interval, and fuller template coverage are left for future work. Built-in formatter rows are treated as system objects and are not dumped by pg_dump. --- src/backend/utils/adt/formatting.c | 325 ++++++++++++++++++++++ src/bin/pg_dump/pg_dump.c | 25 +- src/include/catalog/pg_formatter.dat | 71 +++++ src/include/catalog/pg_proc.dat | 77 +++++ src/test/regress/expected/expressions.out | 25 +- src/test/regress/expected/formatters.out | 282 ++++++++++++++++++- src/test/regress/sql/expressions.sql | 17 +- src/test/regress/sql/formatters.sql | 131 ++++++++- 8 files changed, 930 insertions(+), 23 deletions(-) create mode 100644 src/include/catalog/pg_formatter.dat diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index d52d71b0a8c..b1c0524a7ac 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -4138,6 +4138,331 @@ to_date(PG_FUNCTION_ARGS) PG_RETURN_DATEADT(result); } +/* ---------- + * Built-in formatters for CAST ( AS FORMAT