From 3cd2dd559aed94f2f4a1bbe82cb3fdee4041fc70 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 24 May 2023 11:24:00 +0200 Subject: [PATCH] [jOOQ/jOOQ#15097] Compilation error in Oracle generated code for package type in PL/SQL RECORD constructor --- .../java/org/jooq/codegen/JavaGenerator.java | 66 ++++++++++--------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java index d11e7f35d6..9fbbf7bf2d 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -2255,6 +2255,8 @@ public class JavaGenerator extends AbstractGenerator { final boolean isUDT = t.getType(r).isUDT(); final boolean isArray = t.getType(r).isArray(); final boolean isUDTArray = t.getType(r).isUDTArray(); + final ArrayDefinition array = database.getArray(t.getType(r).getSchema(), t.getType(r).getQualifiedUserType()); + final String indexTypeFull = array == null || array.getIndexType() == null ? null : getJavaType(array.getIndexType(resolver(out)), out); final boolean isArrayOfUDTs = isArrayOfUDTs(t, r); final String udtType = (isUDT || isArray) @@ -2333,15 +2335,21 @@ public class JavaGenerator extends AbstractGenerator { else { if (pojoArgument) { if (isUDTArray) { - out.println("%s(value.%s() == null ? null : new %s(value.%s().stream().map(%s::new).collect(%s.toList())));", - getStrategy().getJavaSetterName(column, Mode.RECORD), - getStrategy().getJavaGetterName(column, Mode.POJO), - udtType, - generatePojosAsJavaRecordClasses() - ? getStrategy().getJavaMemberName(column, Mode.POJO) - : getStrategy().getJavaGetterName(column, Mode.POJO), - udtArrayElementType, - Collectors.class); + if (indexTypeFull == null) { + out.println("%s(value.%s() == null ? null : new %s(value.%s().stream().map(%s::new).collect(%s.toList())));", + getStrategy().getJavaSetterName(column, Mode.RECORD), + getStrategy().getJavaGetterName(column, Mode.POJO), + udtType, + generatePojosAsJavaRecordClasses() + ? getStrategy().getJavaMemberName(column, Mode.POJO) + : getStrategy().getJavaGetterName(column, Mode.POJO), + udtArrayElementType, + Collectors.class); + } + else { + out.println("if (true)"); + out.println("throw new %s(\"Cannot use POJO constructor for POJO that references Oracle associative array yet. See https://github.com/jOOQ/jOOQ/issues/15108 for details.\");", UnsupportedOperationException.class); + } } else if (isArrayOfUDTs) { final String columnTypeFull = getJavaType(t.getType(resolver(out, Mode.POJO)), out, Mode.POJO); @@ -6329,33 +6337,29 @@ public class JavaGenerator extends AbstractGenerator { out.println("});"); } else - out.println("this(alias, aliased, (%s[]) null);", Field.class); + out.println("this(alias, aliased, (%s[]) null, null);", Field.class); out.println("}"); - out.println(); - out.println("private %s(%s alias, %s<%s> aliased, %s[] parameters) {", className, Name.class, Table.class, recordType, Field.class); - - if ((generateSourcesOnViews() || table.isSynthetic()) && table.isView() && table.getSource() != null) - out.println("super(alias, null, aliased, parameters, %s.comment(\"%s\"), %s.%s(%s));", DSL.class, escapeString(comment(table)), TableOptions.class, tableType, textBlock(table.getSource())); - else if (table.isSynthetic() && table.isTableValuedFunction() && table.getSource() != null) - out.println("super(alias, null, aliased, parameters, %s.comment(\"%s\"), %s.%s(%s));", DSL.class, escapeString(comment(table)), TableOptions.class, tableType, textBlock(table.getSource())); - else - out.println("super(alias, null, aliased, parameters, %s.comment(\"%s\"), %s.%s());", DSL.class, escapeString(comment(table)), TableOptions.class, tableType); - - out.println("}"); - - if (generateWhereMethodOverrides() && !table.isTableValuedFunction()) { + if (table.isTableValuedFunction()) { out.println(); - out.println("private %s(%s alias, %s<%s> aliased, %s where) {", className, Name.class, Table.class, recordType, Condition.class); - - if ((generateSourcesOnViews() || table.isSynthetic()) && table.isView() && table.getSource() != null) - out.println("super(alias, null, aliased, null, %s.comment(\"%s\"), %s.%s(%s), where);", DSL.class, escapeString(comment(table)), TableOptions.class, tableType, textBlock(table.getSource())); - else - out.println("super(alias, null, aliased, null, %s.comment(\"%s\"), %s.%s(), where);", DSL.class, escapeString(comment(table)), TableOptions.class, tableType); - + out.println("private %s(%s alias, %s<%s> aliased, %s[] parameters) {", className, Name.class, Table.class, recordType, Field.class); + out.println("this(alias, aliased, parameters, null);"); out.println("}"); } + + out.println(); + out.println("private %s(%s alias, %s<%s> aliased, %s[] parameters, %s where) {", className, Name.class, Table.class, recordType, Field.class, Condition.class); + + + if ((generateSourcesOnViews() || table.isSynthetic()) && table.isView() && table.getSource() != null) + out.println("super(alias, null, aliased, parameters, %s.comment(\"%s\"), %s.%s(%s), where);", DSL.class, escapeString(comment(table)), TableOptions.class, tableType, textBlock(table.getSource())); + else if (table.isSynthetic() && table.isTableValuedFunction() && table.getSource() != null) + out.println("super(alias, null, aliased, parameters, %s.comment(\"%s\"), %s.%s(%s), where);", DSL.class, escapeString(comment(table)), TableOptions.class, tableType, textBlock(table.getSource())); + else + out.println("super(alias, null, aliased, parameters, %s.comment(\"%s\"), %s.%s(), where);", DSL.class, escapeString(comment(table)), TableOptions.class, tableType); + + out.println("}"); } if (scala) { @@ -7227,7 +7231,7 @@ public class JavaGenerator extends AbstractGenerator { idt.accept(() -> { out.println("%s%s where(%s condition) {", visibilityPublic(), className, Condition.class); - out.println("return new %s(getQualifiedName(), aliased() ? this : null, condition);", className); + out.println("return new %s(getQualifiedName(), aliased() ? this : null, null, condition);", className); out.println("}"); }); idt.accept(() -> {