Fix segfault when using certain DO block in function (#7554)

When using a CASE WHEN expression in the body
of the function that is used in the DO block, a segmentation
fault occured. This fixes that.

Fixes #7381

---------

Co-authored-by: Konstantin Morozov <vzbdryn@yahoo.com>
pull/6876/merge
copetol 2024-03-08 16:21:42 +03:00 committed by GitHub
parent f0043b64a1
commit 12f56438fc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 64 additions and 0 deletions

View File

@ -91,6 +91,10 @@ bool InDelegatedFunctionCall = false;
static bool static bool
contain_param_walker(Node *node, void *context) contain_param_walker(Node *node, void *context)
{ {
if (node == NULL)
{
return false;
}
if (IsA(node, Param)) if (IsA(node, Param))
{ {
Param *paramNode = (Param *) node; Param *paramNode = (Param *) node;

View File

@ -0,0 +1,32 @@
CREATE SCHEMA function_with_case;
SET search_path TO function_with_case;
-- create function
CREATE OR REPLACE FUNCTION test_err(v1 text)
RETURNS text
LANGUAGE plpgsql
SECURITY DEFINER
AS $function$
begin
return v1 || ' - ok';
END;
$function$;
do $$ declare
lNewValues text;
val text;
begin
val = 'test';
lNewValues = test_err(v1 => case when val::text = 'test'::text then 'yes' else 'no' end);
raise notice 'lNewValues= %', lNewValues;
end;$$ ;
NOTICE: lNewValues= yes - ok
CONTEXT: PL/pgSQL function inline_code_block line XX at RAISE
-- call function
SELECT test_err('test');
test_err
---------------------------------------------------------------------
test - ok
(1 row)
DROP SCHEMA function_with_case CASCADE;
NOTICE: drop cascades to function test_err(text)

View File

@ -110,6 +110,7 @@ test: run_command_on_all_nodes
test: background_task_queue_monitor test: background_task_queue_monitor
test: other_databases grant_role_from_non_maindb role_operations_from_non_maindb seclabel_non_maindb test: other_databases grant_role_from_non_maindb role_operations_from_non_maindb seclabel_non_maindb
test: citus_internal_access test: citus_internal_access
test: function_with_case_when
# Causal clock test # Causal clock test
test: clock test: clock

View File

@ -0,0 +1,27 @@
CREATE SCHEMA function_with_case;
SET search_path TO function_with_case;
-- create function
CREATE OR REPLACE FUNCTION test_err(v1 text)
RETURNS text
LANGUAGE plpgsql
SECURITY DEFINER
AS $function$
begin
return v1 || ' - ok';
END;
$function$;
do $$ declare
lNewValues text;
val text;
begin
val = 'test';
lNewValues = test_err(v1 => case when val::text = 'test'::text then 'yes' else 'no' end);
raise notice 'lNewValues= %', lNewValues;
end;$$ ;
-- call function
SELECT test_err('test');
DROP SCHEMA function_with_case CASCADE;