diff --git a/src/backend/distributed/commands/function.c b/src/backend/distributed/commands/function.c index c920bab17..dd6708596 100644 --- a/src/backend/distributed/commands/function.c +++ b/src/backend/distributed/commands/function.c @@ -618,29 +618,10 @@ GetFunctionAlterOwnerCommand(const RegProcedure funcOid) } /* - * Set search_path to NIL so that all objects outside of pg_catalog will be - * schema-prefixed. pg_catalog will be added automatically when we call - * PushOverrideSearchPath(), since we set addCatalog to true; - */ - OverrideSearchPath *overridePath = GetOverrideSearchPath(CurrentMemoryContext); - overridePath->schemas = NIL; - overridePath->addCatalog = true; - - PushOverrideSearchPath(overridePath); - - /* - * If the function exists we want to use pg_get_function_identity_arguments to + * If the function exists we want to use format_procedure_qualified to * serialize its canonical arguments */ - Datum functionSignatureDatum = - DirectFunctionCall1(regprocedureout, ObjectIdGetDatum(funcOid)); - - /* revert back to original search_path */ - PopOverrideSearchPath(); - - /* regprocedureout returns cstring */ - char *functionSignature = DatumGetCString(functionSignatureDatum); - + char *functionSignature = format_procedure_qualified(funcOid); char *functionOwner = GetUserNameFromId(procOwner, false); appendStringInfo(alterCommand, "ALTER %s %s OWNER TO %s;", diff --git a/src/backend/distributed/deparser/deparse_function_stmts.c b/src/backend/distributed/deparser/deparse_function_stmts.c index cd0f0aba6..54bc4ff9f 100644 --- a/src/backend/distributed/deparser/deparse_function_stmts.c +++ b/src/backend/distributed/deparser/deparse_function_stmts.c @@ -274,25 +274,27 @@ AppendDefElemSet(StringInfo buf, DefElem *def) { case VAR_SET_VALUE: { - appendStringInfo(buf, " SET %s = %s", setStmt->name, setVariableArgs); + appendStringInfo(buf, " SET %s = %s", quote_identifier(setStmt->name), + setVariableArgs); break; } case VAR_SET_CURRENT: { - appendStringInfo(buf, " SET %s FROM CURRENT", setStmt->name); + appendStringInfo(buf, " SET %s FROM CURRENT", quote_identifier( + setStmt->name)); break; } case VAR_SET_DEFAULT: { - appendStringInfo(buf, " SET %s TO DEFAULT", setStmt->name); + appendStringInfo(buf, " SET %s TO DEFAULT", quote_identifier(setStmt->name)); break; } case VAR_RESET: { - appendStringInfo(buf, " RESET %s", setStmt->name); + appendStringInfo(buf, " RESET %s", quote_identifier(setStmt->name)); break; } diff --git a/src/test/regress/expected/distributed_functions.out b/src/test/regress/expected/distributed_functions.out index 1c53e5260..4b124af05 100644 --- a/src/test/regress/expected/distributed_functions.out +++ b/src/test/regress/expected/distributed_functions.out @@ -70,7 +70,7 @@ CREATE FUNCTION add_without_param_names(integer, integer) RETURNS integer LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; -CREATE FUNCTION add_mixed_param_names(integer, val1 integer) RETURNS integer +CREATE FUNCTION "add_mi'xed_param_names"(integer, "va'l1" integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE @@ -168,21 +168,21 @@ select bool_or(hasmetadata) from pg_dist_node WHERE isactive AND noderole = 'pr -- if not paremeters are supplied, we'd see that function doesn't have -- distribution_argument_index and colocationid -SELECT create_distributed_function('add_mixed_param_names(int, int)'); +SELECT create_distributed_function('"add_mi''xed_param_names"(int, int)'); create_distributed_function ----------------------------- (1 row) SELECT distribution_argument_index is NULL, colocationid is NULL from citus.pg_dist_object -WHERE objid = 'add_mixed_param_names(int, int)'::regprocedure; +WHERE objid = 'add_mi''xed_param_names(int, int)'::regprocedure; ?column? | ?column? ----------+---------- t | t (1 row) -- also show that we can use the function -SELECT * FROM run_command_on_workers('SELECT function_tests.add_mixed_param_names(2,3);') ORDER BY 1,2; +SELECT * FROM run_command_on_workers('SELECT function_tests."add_mi''xed_param_names"(2,3);') ORDER BY 1,2; nodename | nodeport | success | result -----------+----------+---------+-------- localhost | 57637 | t | 5 @@ -510,7 +510,7 @@ SELECT create_distributed_function('add_with_param_names(int, int)', '$3'); ERROR: cannot distribute the function "add_with_param_names" since the distribution argument is not valid HINT: Either provide a valid function argument name or a valid "$paramIndex" to create_distributed_function() SELECT create_distributed_function('add_with_param_names(int, int)', '$1a'); -ERROR: invalid input syntax for integer: "1a" +ERROR: invalid input syntax for type integer: "1a" -- non existing column name SELECT create_distributed_function('add_with_param_names(int, int)', 'aaa'); ERROR: cannot distribute the function "add_with_param_names" since the distribution argument is not valid diff --git a/src/test/regress/sql/distributed_functions.sql b/src/test/regress/sql/distributed_functions.sql index 4e7adb7da..c3c7a144d 100644 --- a/src/test/regress/sql/distributed_functions.sql +++ b/src/test/regress/sql/distributed_functions.sql @@ -73,7 +73,7 @@ CREATE FUNCTION add_without_param_names(integer, integer) RETURNS integer IMMUTABLE RETURNS NULL ON NULL INPUT; -CREATE FUNCTION add_mixed_param_names(integer, val1 integer) RETURNS integer +CREATE FUNCTION "add_mi'xed_param_names"(integer, "va'l1" integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE @@ -170,12 +170,12 @@ select bool_or(hasmetadata) from pg_dist_node WHERE isactive AND noderole = 'pr -- if not paremeters are supplied, we'd see that function doesn't have -- distribution_argument_index and colocationid -SELECT create_distributed_function('add_mixed_param_names(int, int)'); +SELECT create_distributed_function('"add_mi''xed_param_names"(int, int)'); SELECT distribution_argument_index is NULL, colocationid is NULL from citus.pg_dist_object -WHERE objid = 'add_mixed_param_names(int, int)'::regprocedure; +WHERE objid = 'add_mi''xed_param_names(int, int)'::regprocedure; -- also show that we can use the function -SELECT * FROM run_command_on_workers('SELECT function_tests.add_mixed_param_names(2,3);') ORDER BY 1,2; +SELECT * FROM run_command_on_workers('SELECT function_tests."add_mi''xed_param_names"(2,3);') ORDER BY 1,2; -- make sure that none of the active and primary nodes hasmetadata -- since the function doesn't have a parameter