From ec42a92708e0dc7836050bda26fd59a98d2e1c39 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Tue, 13 Mar 2018 09:50:08 +0100 Subject: [PATCH] [#7270] Generating JOOQ-classes for CockroachDB fails when using PostgreSQLDatabase --- .../jooq/util/postgres/PostgresDatabase.java | 62 +++++++++++++++---- 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresDatabase.java b/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresDatabase.java index 1d94c5720c..acc8d9ec39 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresDatabase.java @@ -145,6 +145,8 @@ public class PostgresDatabase extends AbstractDatabase { private static Boolean is84; private static Boolean is94; private static Boolean canCastToEnumType; + private static Boolean canCombineArrays; + private static Boolean canUseTupleInPredicates; @Override protected List getIndexes0() throws SQLException { @@ -375,15 +377,17 @@ public class PostgresDatabase extends AbstractDatabase { // To stay on the safe side, if the INFORMATION_SCHEMA ever // includs materialised views, let's exclude them from here - .and(row(TABLES.TABLE_SCHEMA, TABLES.TABLE_NAME).notIn( - select( - PG_NAMESPACE.NSPNAME, - PG_CLASS.RELNAME) - .from(PG_CLASS) - .join(PG_NAMESPACE) - .on(PG_CLASS.RELNAMESPACE.eq(oid(PG_NAMESPACE))) - .where(PG_CLASS.RELKIND.eq(inline("m"))) - )) + .and(canUseTupleInPredicates() + ? row(TABLES.TABLE_SCHEMA, TABLES.TABLE_NAME).notIn( + select( + PG_NAMESPACE.NSPNAME, + PG_CLASS.RELNAME) + .from(PG_CLASS) + .join(PG_NAMESPACE) + .on(PG_CLASS.RELNAMESPACE.eq(oid(PG_NAMESPACE))) + .where(PG_CLASS.RELKIND.eq(inline("m")))) + : noCondition() + ) // [#3254] Materialised views are reported only in PG_CLASS, not // in INFORMATION_SCHEMA.TABLES @@ -746,8 +750,10 @@ public class PostgresDatabase extends AbstractDatabase { r1.SPECIFIC_NAME, // Ignore the data type when there is at least one out parameter - when(condition("{0} && ARRAY['o','b']::\"char\"[]", PG_PROC.PROARGMODES), inline("void")) - .otherwise(r1.DATA_TYPE).as("data_type"), + canCombineArrays() + ? when(condition("{0} && ARRAY['o','b']::\"char\"[]", PG_PROC.PROARGMODES), inline("void")) + .otherwise(r1.DATA_TYPE).as("data_type") + : r1.DATA_TYPE.as("data_type"), r1.CHARACTER_MAXIMUM_LENGTH, r1.NUMERIC_PRECISION, @@ -839,6 +845,40 @@ public class PostgresDatabase extends AbstractDatabase { return is94; } + boolean canCombineArrays() { + if (canCombineArrays == null) { + + // [#7270] The ARRAY && ARRAY operator is not implemented in all PostgreSQL + // style databases, e.g. CockroachDB + try { + create(true).select(field("array[1, 2] && array[2, 3]")).fetch(); + canCombineArrays = true; + } + catch (DataAccessException e) { + canCombineArrays = false; + } + } + + return canCombineArrays; + } + + boolean canUseTupleInPredicates() { + if (canUseTupleInPredicates == null) { + + // [#7270] The tuple in predicate is not implemented in all PostgreSQL + // style databases, e.g. CockroachDB + try { + create(true).select(field("(1, 2) in (select 1, 2)")).fetch(); + canUseTupleInPredicates = true; + } + catch (DataAccessException e) { + canUseTupleInPredicates = false; + } + } + + return canUseTupleInPredicates; + } + private List enumLabels(String nspname, String typname) { Field cast = field("{0}::{1}", PG_ENUM.ENUMLABEL, name(nspname, typname));