diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java
index cf34606199..e0157a3dbd 100644
--- a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java
+++ b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java
@@ -2542,6 +2542,7 @@ public class JavaGenerator extends AbstractGenerator {
}
final String className = getStrategy().getFullJavaClassName(function);
+ final String localVar = disambiguateJavaMemberName(function.getInParameters(), "f");
out.tab(1).javadoc("Get %s as a field", function.getQualifiedOutputName());
out.tab(1).print("public static %s<%s> %s(",
@@ -2564,17 +2565,17 @@ public class JavaGenerator extends AbstractGenerator {
}
out.println(") {");
- out.tab(2).println("%s f = new %s();", className, className);
+ out.tab(2).println("%s %s = new %s();", className, localVar, className);
for (ParameterDefinition parameter : function.getInParameters()) {
final String paramSetter = getStrategy().getJavaSetterName(parameter, Mode.DEFAULT);
final String paramMember = getStrategy().getJavaMemberName(parameter);
- out.tab(2).println("f.%s(%s);", paramSetter, paramMember);
+ out.tab(2).println("%s.%s(%s);", localVar, paramSetter, paramMember);
}
out.println();
- out.tab(2).println("return f.as%s();", function.isAggregate() ? "AggregateFunction" : "Field");
+ out.tab(2).println("return %s.as%s();", localVar, function.isAggregate() ? "AggregateFunction" : "Field");
out.tab(1).println("}");
}
@@ -2662,7 +2663,10 @@ public class JavaGenerator extends AbstractGenerator {
final String functionName = function.getQualifiedOutputName();
final String functionType = getJavaType(function.getReturnType());
final String methodName = getStrategy().getJavaMethodName(function, Mode.DEFAULT);
+
+ // [#3456] Local variables should not collide with actual function arguments
final String configurationArgument = disambiguateJavaMemberName(function.getInParameters(), "configuration");
+ final String localVar = disambiguateJavaMemberName(function.getInParameters(), "f");
out.tab(1).javadoc("Call %s", functionName);
out.tab(1).print("public %s%s %s(",
@@ -2688,7 +2692,7 @@ public class JavaGenerator extends AbstractGenerator {
}
out.println(") {");
- out.tab(2).println("%s f = new %s();", className, className);
+ out.tab(2).println("%s %s = new %s();", className, localVar, className);
for (ParameterDefinition parameter : function.getInParameters()) {
final String paramSetter = getStrategy().getJavaSetterName(parameter, Mode.DEFAULT);
@@ -2696,15 +2700,15 @@ public class JavaGenerator extends AbstractGenerator {
? "this"
: getStrategy().getJavaMemberName(parameter);
- out.tab(2).println("f.%s(%s);", paramSetter, paramMember);
+ out.tab(2).println("%s.%s(%s);", localVar, paramSetter, paramMember);
}
out.println();
- out.tab(2).println("f.execute(%s);", instance ? "configuration()" : configurationArgument);
+ out.tab(2).println("%s.execute(%s);", localVar, instance ? "configuration()" : configurationArgument);
// TODO [#956] Find a way to register "SELF" as OUT parameter
// in case this is a UDT instance (member) function
- out.tab(2).println("return f.getReturnValue();");
+ out.tab(2).println("return %s.getReturnValue();", localVar);
out.tab(1).println("}");
}
@@ -2717,6 +2721,7 @@ public class JavaGenerator extends AbstractGenerator {
final String className = getStrategy().getFullJavaClassName(procedure);
final String configurationArgument = disambiguateJavaMemberName(procedure.getInParameters(), "configuration");
+ final String localVar = disambiguateJavaMemberName(procedure.getInParameters(), "p");
out.tab(1).javadoc("Call %s", procedure.getQualifiedOutputName());
out.print("\tpublic ");
@@ -2762,7 +2767,7 @@ public class JavaGenerator extends AbstractGenerator {
}
out.println(") {");
- out.tab(2).println("%s p = new %s();", className, className);
+ out.tab(2).println("%s %s = new %s();", className, localVar, className);
for (ParameterDefinition parameter : procedure.getInParameters()) {
final String setter = getStrategy().getJavaSetterName(parameter, Mode.DEFAULT);
@@ -2770,11 +2775,11 @@ public class JavaGenerator extends AbstractGenerator {
? "this"
: getStrategy().getJavaMemberName(parameter);
- out.tab(2).println("p.%s(%s);", setter, arg);
+ out.tab(2).println("%s.%s(%s);", localVar, setter, arg);
}
out.println();
- out.tab(2).println("p.execute(%s);", instance ? "configuration()" : configurationArgument);
+ out.tab(2).println("%s.execute(%s);", localVar, instance ? "configuration()" : configurationArgument);
if (procedure.getOutParameters().size() > 0) {
final ParameterDefinition parameter = procedure.getOutParameters().get(0);
@@ -2787,18 +2792,18 @@ public class JavaGenerator extends AbstractGenerator {
// [#3117] Avoid funny call-site ambiguity if this is a UDT that is implemented by an interface
if (generateInterfaces() && isUDT) {
- out.tab(2).println("from((%s) p.%s());", columnTypeInterface, getter);
+ out.tab(2).println("from((%s) %s.%s());", columnTypeInterface, localVar, getter);
}
else {
- out.tab(2).println("from(p.%s());", getter);
+ out.tab(2).println("from(%s.%s());", localVar, getter);
}
}
if (procedure.getOutParameters().size() == 1) {
- out.tab(2).println("return p.%s();", getter);
+ out.tab(2).println("return %s.%s();", localVar, getter);
}
else if (procedure.getOutParameters().size() > 1) {
- out.tab(2).println("return p;");
+ out.tab(2).println("return %s;", localVar);
}
}
diff --git a/jOOQ-test/pom.xml b/jOOQ-test/pom.xml
index 370b556f8c..fff42428ab 100644
--- a/jOOQ-test/pom.xml
+++ b/jOOQ-test/pom.xml
@@ -2734,7 +2734,7 @@
org.jooq.util.postgres.PostgresDatabase
- t_.*|x_.*|v_.*|m_.*|V_.*|p_.*|f_.*|u_.*|(f|p)[0-9]+|s_.*
+ t_.*|x_.*|v_.*|m_.*|V_.*|p(_.*)?|f(_.*)?|u_.*|(f|p)[0-9]+|s_.*
t_book_details|.*?_seq|_.*
false
true
diff --git a/jOOQ-test/src/main/resources/org/jooq/test/postgres/create.sql b/jOOQ-test/src/main/resources/org/jooq/test/postgres/create.sql
index 9f4bf56d87..a00ea96861 100644
--- a/jOOQ-test/src/main/resources/org/jooq/test/postgres/create.sql
+++ b/jOOQ-test/src/main/resources/org/jooq/test/postgres/create.sql
@@ -29,6 +29,8 @@ DROP FUNCTION p391(
/
DROP FUNCTION f_author_exists(author_name VARCHAR);/
DROP FUNCTION f_one();/
+DROP FUNCTION f(f int, f_ int);/
+DROP FUNCTION p(p int, p_ int);/
DROP FUNCTION f_number(n int);/
DROP FUNCTION f317(p1 int, p2 int, p3 int, p4 int);/
DROP FUNCTION p_get_two_cursors(books OUT refcursor, authors OUT refcursor)/
@@ -784,11 +786,28 @@ END;
$$ LANGUAGE plpgsql;
/
+CREATE FUNCTION f (f int, f_ int)
+RETURNS INT
+AS $$
+BEGIN
+ RETURN f;
+END;
+$$ LANGUAGE plpgsql;
+/
+
+CREATE FUNCTION p (p int, p_ int)
+RETURNS VOID
+AS $$
+BEGIN
+END;
+$$ LANGUAGE plpgsql;
+/
+
CREATE FUNCTION f_one ()
RETURNS INT
AS $$
BEGIN
- RETURN 1;
+ RETURN 1;
END;
$$ LANGUAGE plpgsql;
/