From b7f1ded3512993cb2b71270dd0124af51d2e1936 Mon Sep 17 00:00:00 2001 From: Man Zeng Date: Sat, 20 Dec 2025 12:09:07 +0800 Subject: [PATCH] misc_functions: Verify inline fallback & fix TEXT check/warnings Verify inline failure falls back to Function Scan (original PL/pgSQL logic) Clean up redundant TEXT check and adjust warnings Signed-off-by: Man Zeng --- src/test/regress/expected/misc_functions.out | 21 +++++++++++++++++++- src/test/regress/regress.c | 8 ++++---- src/test/regress/sql/misc_functions.sql | 8 +++++++- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/test/regress/expected/misc_functions.out b/src/test/regress/expected/misc_functions.out index d7d965d884a..44e4450cacd 100644 --- a/src/test/regress/expected/misc_functions.out +++ b/src/test/regress/expected/misc_functions.out @@ -815,13 +815,17 @@ CREATE FUNCTION test_inline_in_from_support_func(internal) RETURNS internal AS :'regresslib', 'test_inline_in_from_support_func' LANGUAGE C STRICT; -CREATE FUNCTION foo_from_bar(colname TEXT, tablename TEXT, filter TEXT) +CREATE FUNCTION foo_from_bar(colname TEXT DEFAULT NULL, tablename TEXT DEFAULT NULL, filter TEXT DEFAULT NULL) RETURNS SETOF TEXT LANGUAGE plpgsql AS $function$ DECLARE sql TEXT; BEGIN + IF tablename IS NULL AND colname IS NULL THEN + tablename = 'text_tbl'; + colname = 'f1'; + END IF; sql := format('SELECT %I::text FROM %I', colname, tablename); IF filter IS NOT NULL THEN sql := CONCAT(sql, format(' WHERE %I::text = $1', colname)); @@ -844,6 +848,14 @@ SELECT * FROM foo_from_bar('f1', 'text_tbl', 'doh!'); doh! (1 row) +SELECT * FROM foo_from_bar(); +WARNING: test_inline_in_from_support_func called with null parameter for colname + foo_from_bar +------------------- + doh! + hi de ho neighbor +(2 rows) + EXPLAIN (COSTS OFF) SELECT * FROM foo_from_bar('f1', 'text_tbl', NULL); QUERY PLAN ---------------------- @@ -857,6 +869,13 @@ EXPLAIN (COSTS OFF) SELECT * FROM foo_from_bar('f1', 'text_tbl', 'doh!'); Filter: (f1 = 'doh!'::text) (2 rows) +EXPLAIN (COSTS OFF) SELECT * FROM foo_from_bar(); +WARNING: test_inline_in_from_support_func called with null parameter for colname + QUERY PLAN +------------------------------- + Function Scan on foo_from_bar +(1 row) + DROP FUNCTION foo_from_bar; -- Test functions for control data SELECT count(*) > 0 AS ok FROM pg_control_checkpoint(); diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c index b7a926c6f01..adb8b9793ba 100644 --- a/src/test/regress/regress.c +++ b/src/test/regress/regress.c @@ -849,9 +849,9 @@ test_inline_in_from_support_func(PG_FUNCTION_ARGS) } c = (Const *) node; - if (c->consttype != TEXTOID || c->constisnull) + if (c->constisnull) { - ereport(WARNING, (errmsg("test_inline_in_from_support_func called with non-TEXT parameters"))); + ereport(WARNING, (errmsg("test_inline_in_from_support_func called with null parameter for colname"))); PG_RETURN_POINTER(NULL); } colname = TextDatumGetCString(c->constvalue); @@ -865,9 +865,9 @@ test_inline_in_from_support_func(PG_FUNCTION_ARGS) } c = (Const *) node; - if (c->consttype != TEXTOID || c->constisnull) + if (c->constisnull) { - ereport(WARNING, (errmsg("test_inline_in_from_support_func called with non-TEXT parameters"))); + ereport(WARNING, (errmsg("test_inline_in_from_support_func called with null parameter for tablename"))); PG_RETURN_POINTER(NULL); } tablename = TextDatumGetCString(c->constvalue); diff --git a/src/test/regress/sql/misc_functions.sql b/src/test/regress/sql/misc_functions.sql index 0fc20fbb6b4..a4078ee3dfc 100644 --- a/src/test/regress/sql/misc_functions.sql +++ b/src/test/regress/sql/misc_functions.sql @@ -369,13 +369,17 @@ CREATE FUNCTION test_inline_in_from_support_func(internal) AS :'regresslib', 'test_inline_in_from_support_func' LANGUAGE C STRICT; -CREATE FUNCTION foo_from_bar(colname TEXT, tablename TEXT, filter TEXT) +CREATE FUNCTION foo_from_bar(colname TEXT DEFAULT NULL, tablename TEXT DEFAULT NULL, filter TEXT DEFAULT NULL) RETURNS SETOF TEXT LANGUAGE plpgsql AS $function$ DECLARE sql TEXT; BEGIN + IF tablename IS NULL AND colname IS NULL THEN + tablename = 'text_tbl'; + colname = 'f1'; + END IF; sql := format('SELECT %I::text FROM %I', colname, tablename); IF filter IS NOT NULL THEN sql := CONCAT(sql, format(' WHERE %I::text = $1', colname)); @@ -389,8 +393,10 @@ ALTER FUNCTION foo_from_bar(TEXT, TEXT, TEXT) SELECT * FROM foo_from_bar('f1', 'text_tbl', NULL); SELECT * FROM foo_from_bar('f1', 'text_tbl', 'doh!'); +SELECT * FROM foo_from_bar(); EXPLAIN (COSTS OFF) SELECT * FROM foo_from_bar('f1', 'text_tbl', NULL); EXPLAIN (COSTS OFF) SELECT * FROM foo_from_bar('f1', 'text_tbl', 'doh!'); +EXPLAIN (COSTS OFF) SELECT * FROM foo_from_bar(); DROP FUNCTION foo_from_bar; -- 2.45.2