diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BindMaxLength.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BindMaxLength.java index 51bdcfa1a..bee29ad4a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BindMaxLength.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BindMaxLength.java @@ -35,25 +35,33 @@ public interface BindMaxLength { @Override public long length(int dbLength, Object obj) { - if (obj instanceof String) { + if (obj == null) { + return -1; + } else if (obj instanceof String) { String s = (String) obj; - int stringLength = s.length(); - if (stringLength > dbLength) { - return stringLength; - } else if (stringLength * 4 <= dbLength) { - return -1; - } else { - return s.getBytes(StandardCharsets.UTF_8).length; - } - + return utf8String(dbLength, s); } else if (obj instanceof byte[]) { return ((byte[]) obj).length; } else if (obj instanceof InputStreamInfo) { return ((InputStreamInfo) obj).length(); + } else if ("org.postgresql.util.PGobject".equals(obj.getClass().getCanonicalName())) { + String value = ((org.postgresql.util.PGobject) obj).getValue(); + return value == null ? -1 : utf8String(dbLength, value); } else { return -1; } } + + private static int utf8String(int dbLength, String s) { + int stringLength = s.length(); + if (stringLength > dbLength) { + return stringLength; + } else if (stringLength * 4 <= dbLength) { + return -1; + } else { + return s.getBytes(StandardCharsets.UTF_8).length; + } + } } /** @@ -63,12 +71,17 @@ public interface BindMaxLength { @Override public long length(int dbLength, Object obj) { - if (obj instanceof String) { + if (obj == null) { + return -1; + } else if (obj instanceof String) { return ((String) obj).length(); } else if (obj instanceof byte[]) { return ((byte[]) obj).length; } else if (obj instanceof InputStreamInfo) { return ((InputStreamInfo) obj).length(); + } else if ("org.postgresql.util.PGobject".equals(obj.getClass().getCanonicalName())) { + String value = ((org.postgresql.util.PGobject) obj).getValue(); + return value == null ? -1 : value.length(); } else { return -1; } diff --git a/ebean-test/src/test/resources/ebean.properties b/ebean-test/src/test/resources/ebean.properties index 9dec823ee..6bd984585 100644 --- a/ebean-test/src/test/resources/ebean.properties +++ b/ebean-test/src/test/resources/ebean.properties @@ -157,6 +157,7 @@ datasource.oracle.url=jdbc:oracle:thin:@localhost:1521:XE ## set this to use timestamp rather than timestamptz #ebean.postgres.timestamp=timestamp +ebean.pg.lengthCheck=on datasource.pg.username=unit datasource.pg.password=test datasource.pg.url=jdbc:postgresql://127.0.0.1:6432/unit diff --git a/ebean-test/testconfig/ebean-cockroach.properties b/ebean-test/testconfig/ebean-cockroach.properties index 604387b76..f088b3260 100644 --- a/ebean-test/testconfig/ebean-cockroach.properties +++ b/ebean-test/testconfig/ebean-cockroach.properties @@ -2,4 +2,4 @@ ebean.test.platform=cockroach ebean.test.dbName=unit datasource.default=cockroach #ebean.test.cockroach.version=v21.2.6 - +ebean.lengthCheck=on diff --git a/ebean-test/testconfig/ebean-postgres.properties b/ebean-test/testconfig/ebean-postgres.properties index 35a8bbbda..f87670982 100644 --- a/ebean-test/testconfig/ebean-postgres.properties +++ b/ebean-test/testconfig/ebean-postgres.properties @@ -2,4 +2,4 @@ ebean.test.platform=postgres datasource.default=postgres ebean.test.dbName=unit ebean.test.postgres.version=15 - +ebean.lengthCheck=on diff --git a/ebean-test/testconfig/ebean-yugabyte.properties b/ebean-test/testconfig/ebean-yugabyte.properties index 2b8e462cc..f5befb1ac 100644 --- a/ebean-test/testconfig/ebean-yugabyte.properties +++ b/ebean-test/testconfig/ebean-yugabyte.properties @@ -2,4 +2,4 @@ ebean.test.platform=yugabyte datasource.default=yugabyte ebean.test.dbName=unit ebean.test.yugabyte.version=2.18.0.0-b65 - +ebean.lengthCheck=on