From 92e85e32a2e64f27f677dd0cb73feb0e2f0cdd11 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Wed, 16 Mar 2022 22:13:52 +1300 Subject: [PATCH] #2598 - H2 + @Lob String fails with - Error[Value too long for column "CHARACTER VARYING": "... (1048577)" [22001-210]] --- .../server/type/ScalarTypeClob.java | 10 ++++++++++ .../org/tests/basic/lob/TestBasicClobNoVer.java | 17 ++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClob.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClob.java index 7903a76ea..33a962726 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClob.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeClob.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.type; +import io.ebean.core.type.DataBinder; import io.ebean.core.type.DataReader; import java.sql.SQLException; @@ -18,6 +19,15 @@ class ScalarTypeClob extends ScalarTypeStringBase { super(true, Types.CLOB); } + @Override + public void bind(DataBinder binder, String value) throws SQLException { + if (value == null) { + binder.setNull(Types.VARCHAR); + } else { + binder.setClob(value); + } + } + @Override public String read(DataReader reader) throws SQLException { return reader.getStringFromStream(); diff --git a/ebean-test/src/test/java/org/tests/basic/lob/TestBasicClobNoVer.java b/ebean-test/src/test/java/org/tests/basic/lob/TestBasicClobNoVer.java index 3123afc57..274912594 100644 --- a/ebean-test/src/test/java/org/tests/basic/lob/TestBasicClobNoVer.java +++ b/ebean-test/src/test/java/org/tests/basic/lob/TestBasicClobNoVer.java @@ -7,8 +7,8 @@ import io.ebean.test.LoggedSql; import org.junit.jupiter.api.Test; import org.tests.model.basic.EBasicClobNoVer; -import javax.xml.transform.sax.SAXSource; import java.util.List; +import java.util.Random; import static org.assertj.core.api.Assertions.assertThat; @@ -83,4 +83,19 @@ class TestBasicClobNoVer extends BaseTestCase { assertThat(sql.get(0)).contains(" and t0.deleted ="); } + @Test + void largeValueInsert() { + EBasicClobNoVer bean = new EBasicClobNoVer(); + bean.setDescription(largeContent()); + DB.save(bean); + } + + private String largeContent() { + Random random = new Random(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 1048577; i++) { + sb.append((char) (random.nextInt(26) + 'a')); + } + return sb.toString(); + } }