jOOQ / jOOQ

jOOQ is the best way to write SQL in Java
https://www.jooq.org
Other
6.12k stars 1.2k forks source link

Support DEFAULT expressions for Derby BLOB columns #16900

Open lukaseder opened 3 months ago

lukaseder commented 3 months ago

An integration test added recently for a MySQL issue doesn't work for Derby:

byte[] a = new byte[] { 'a' };

Field<String> s = field("s", CLOB.default_("a"));
Field<byte[]> b = field("b", BLOB.default_(a));

create().createTable(t)
        .column(dummy)
        .column(s)
        .column(b)
        .primaryKey(dummy)
        .execute();

This throws:

12:52:25,524 DEBUG [LoggerListener                ] - Exception                
org.jooq.exception.DataAccessException: SQL [create table "t" ("dummy" int, s clob default 'a', b blob default cast(X'61' as blob), primary key ("dummy"))]; Syntax error: Encountered "cast" at line 1, column 67.
    at org.jooq_3.20.0-SNAPSHOT.DERBY.debug(Unknown Source) ~[?:?]
    at org.jooq.impl.Tools.translate(Tools.java:3648) ~[classes/:?]
    at org.jooq.impl.Tools.translate(Tools.java:3621) ~[classes/:?]
    at org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:827) ~[classes/:?]
    at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:362) [classes/:?]
    at org.jooq.test.all.testcases.DDLTests.testCreateTableWithConstantDefaultsMySQLTextLimitation(DDLTests.java:4847) [test-classes/:?]
    at org.jooq.test.jOOQAbstractTest.testCreateTableWithConstantDefaultsMySQLTextLimitation(jOOQAbstractTest.java:4525) [test-classes/:?]
    at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?]

I currently don't know how to work around this. The BLOB literal doesn't work for DEFAULT expressions:

create table "t" (
  "dummy" int,
  s clob default 'a',
  b blob default cast(X'61' as blob),
  primary key ("dummy")
)

Error being:

SQL Error [30000] [42X01]: Syntax error: Encountered "cast" at line 4, column 18.

Without the cast:

SQL Error [30000] [42821]: Columns of type 'BLOB' cannot hold values of type 'CHAR () FOR BIT DATA'. 

See also:

The MySQL issue is:

lukaseder commented 3 months ago

Other dialects are also possibly affected. I'll update the issue description if that's the case.