1
0
mirror of https://github.com/postgres/postgres.git synced 2025-09-03 15:22:11 +03:00

Fix psql's \sf and \ef for new-style SQL functions.

Some options of these commands need to be able to identify the start
of the function body within the output of pg_get_functiondef().
It used to be that that always began with "AS", but since the
introduction of new-style SQL functions, it might also start with
"BEGIN" or "RETURN".  Fix that on the psql side, and add some
regression tests.

Noted by me awhile ago, but I didn't do anything about it.
Thanks to David Johnston for a nag.

Discussion: https://postgr.es/m/AM9PR01MB8268D5CDABDF044EE9F42173FE8C9@AM9PR01MB8268.eurprd01.prod.exchangelabs.com
This commit is contained in:
Tom Lane
2022-12-02 14:24:44 -05:00
parent 47e1224d59
commit 303b26c1bb
4 changed files with 94 additions and 26 deletions

View File

@@ -5165,6 +5165,13 @@ List of access methods
pg_catalog | bit_xor | smallint | smallint | agg
(3 rows)
\df *._pg_expandarray
List of functions
Schema | Name | Result data type | Argument data types | Type
--------------------+-----------------+------------------+-------------------------------------------+------
information_schema | _pg_expandarray | SETOF record | anyarray, OUT x anyelement, OUT n integer | func
(1 row)
\do - pg_catalog.int4
List of operators
Schema | Name | Left arg type | Right arg type | Result type | Description
@@ -5179,6 +5186,61 @@ List of access methods
pg_catalog | && | anyarray | anyarray | boolean | overlaps
(1 row)
-- check \sf
\sf information_schema._pg_expandarray
CREATE OR REPLACE FUNCTION information_schema._pg_expandarray(anyarray, OUT x anyelement, OUT n integer)
RETURNS SETOF record
LANGUAGE sql
IMMUTABLE PARALLEL SAFE STRICT
AS $function$select $1[s],
s operator(pg_catalog.-) pg_catalog.array_lower($1,1) operator(pg_catalog.+) 1
from pg_catalog.generate_series(pg_catalog.array_lower($1,1),
pg_catalog.array_upper($1,1),
1) as g(s)$function$
\sf+ information_schema._pg_expandarray
CREATE OR REPLACE FUNCTION information_schema._pg_expandarray(anyarray, OUT x anyelement, OUT n integer)
RETURNS SETOF record
LANGUAGE sql
IMMUTABLE PARALLEL SAFE STRICT
1 AS $function$select $1[s],
2 s operator(pg_catalog.-) pg_catalog.array_lower($1,1) operator(pg_catalog.+) 1
3 from pg_catalog.generate_series(pg_catalog.array_lower($1,1),
4 pg_catalog.array_upper($1,1),
5 1) as g(s)$function$
\sf+ interval_pl_time
CREATE OR REPLACE FUNCTION pg_catalog.interval_pl_time(interval, time without time zone)
RETURNS time without time zone
LANGUAGE sql
IMMUTABLE PARALLEL SAFE STRICT COST 1
1 RETURN ($2 + $1)
\sf ts_debug(text)
CREATE OR REPLACE FUNCTION pg_catalog.ts_debug(document text, OUT alias text, OUT description text, OUT token text, OUT dictionaries regdictionary[], OUT dictionary regdictionary, OUT lexemes text[])
RETURNS SETOF record
LANGUAGE sql
STABLE PARALLEL SAFE STRICT
BEGIN ATOMIC
SELECT ts_debug.alias,
ts_debug.description,
ts_debug.token,
ts_debug.dictionaries,
ts_debug.dictionary,
ts_debug.lexemes
FROM ts_debug(get_current_ts_config(), ts_debug.document) ts_debug(alias, description, token, dictionaries, dictionary, lexemes);
END
\sf+ ts_debug(text)
CREATE OR REPLACE FUNCTION pg_catalog.ts_debug(document text, OUT alias text, OUT description text, OUT token text, OUT dictionaries regdictionary[], OUT dictionary regdictionary, OUT lexemes text[])
RETURNS SETOF record
LANGUAGE sql
STABLE PARALLEL SAFE STRICT
1 BEGIN ATOMIC
2 SELECT ts_debug.alias,
3 ts_debug.description,
4 ts_debug.token,
5 ts_debug.dictionaries,
6 ts_debug.dictionary,
7 ts_debug.lexemes
8 FROM ts_debug(get_current_ts_config(), ts_debug.document) ts_debug(alias, description, token, dictionaries, dictionary, lexemes);
9 END
-- check describing invalid multipart names
\dA regression.heap
improper qualified name (too many dotted names): regression.heap

View File

@@ -1239,9 +1239,17 @@ drop role regress_partitioning_role;
\df has_database_privilege oid text
\df has_database_privilege oid text -
\dfa bit* small*
\df *._pg_expandarray
\do - pg_catalog.int4
\do && anyarray *
-- check \sf
\sf information_schema._pg_expandarray
\sf+ information_schema._pg_expandarray
\sf+ interval_pl_time
\sf ts_debug(text)
\sf+ ts_debug(text)
-- check describing invalid multipart names
\dA regression.heap
\dA nonesuch.heap