From 465bc88d7ef55225971490320bf3eb2dc6ff14b2 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 9 Feb 2015 11:19:58 +0100 Subject: [PATCH] [#3778] PostgreSQL enum array types have to be cast with their fully qualified name --- .../java/org/jooq/impl/DefaultBinding.java | 62 +++++++++++-------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index da7ded0dc2..efcec8543c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -643,8 +643,7 @@ public class DefaultBinding implements Binding { // [#3214] Some PostgreSQL array type literals need explicit casting if (family == POSTGRES && EnumType.class.isAssignableFrom(type.getComponentType())) { - render.sql("::") - .keyword(DefaultDataType.getDataType(family, type).getCastTypeName(render.configuration())); + pgRenderEnumCast(render, type); } } } @@ -673,42 +672,28 @@ public class DefaultBinding implements Binding { // - UUID else { render.sql("'") - .sql(escape(val, render), true) - .sql("'"); + .sql(escape(val, render), true) + .sql("'"); } } // In Postgres, some additional casting must be done in some cases... else if (family == SQLDialect.POSTGRES) { - // Postgres needs explicit casting for array types - if (type.isArray() && byte[].class != type) { + // Postgres needs explicit casting for enum (array) types + if (EnumType.class.isAssignableFrom(type) || + (type.isArray() && EnumType.class.isAssignableFrom(type.getComponentType()))) { + render.sql(ctx.variable()); + pgRenderEnumCast(render, type); + } + + // ... and also for other array types + else if (type.isArray() && byte[].class != type) { render.sql(ctx.variable()); render.sql("::"); render.keyword(DefaultDataType.getDataType(family, type).getCastTypeName(render.configuration())); } - // ... and also for enum types - else if (EnumType.class.isAssignableFrom(type)) { - render.sql(ctx.variable()); - - // [#968] Don't cast "synthetic" enum types (note, val can be null!) - EnumType e = (EnumType) type.getEnumConstants()[0]; - Schema schema = e.getSchema(); - - if (schema != null) { - render.sql("::"); - - schema = using(render.configuration()).map(schema); - if (schema != null && TRUE.equals(render.configuration().settings().isRenderSchema())) { - render.visit(schema); - render.sql("."); - } - - render.visit(name(e.getName())); - } - } - else { render.sql(ctx.variable()); } @@ -2123,5 +2108,28 @@ public class DefaultBinding implements Binding { private static final void pgSetValue(UDTRecord record, Field field, String value) throws SQLException { record.setValue(field, pgFromString(field.getType(), value)); } + + private static final void pgRenderEnumCast(RenderContext render, Class type) { + Class enumType = type.isArray() ? type.getComponentType() : type; + + // [#968] Don't cast "synthetic" enum types (note, val can be null!) + EnumType e = (EnumType) enumType.getEnumConstants()[0]; + Schema schema = e.getSchema(); + + if (schema != null) { + render.sql("::"); + + schema = using(render.configuration()).map(schema); + if (schema != null && TRUE.equals(render.configuration().settings().isRenderSchema())) { + render.visit(schema); + render.sql("."); + } + + render.visit(name(e.getName())); + } + + if (type.isArray()) + render.sql("[]"); + } }