jOOQ is the best way to write SQL in Java
This is a 3.18 patch release with minor improvements and bug fixes
#16123 - Add Context.scopeParts(Class<Q>): Iterable<Q> to allow for iterating over the values that are currently in scope
#16125 - RenderTable.WHEN_AMBIGUOUS_COLUMNS doesn't cover all ambiguous column name cases #16127 - RenderTable.WHEN_MULTIPLE_TABLES doesn't work correctly in correlated subqueries #16130 - Maximum consumed results reached when Hikari close a SQL Server connection, leading to excessive logging #16182 - %ROWTYPE UDT types generate invalid system columns when underlying table references object types #16186 - Settings.returnDefaultOnUpdatableRecord and Settings.returnComputedOnUpdatableRecord don't work for replacing embeddables #16197 - Overall performance improvement in AbstractNamed.hashCode() specialisations by avoiding Name::append #16205 - Remove internal AbstractContext::toggle utilities #16211 - AbstractScope::dsl, ::settings, ::dialect, and ::family should avoid unnecessary null-checks on Configuration #16224 - BatchCRUD implementation should extract bind values with SQL string in one go #16234 - Wrong Support annotation on CREATE TRIGGER for INFORMIX #16239 - IndexOutOfBoundsException in DerbyDatabase when <includeExcludeColumns/> excludes a column from an index #16248 - Avoid allocating DataMap in short lived Scope implementations #16251 - Cache TableRecord Constructor in TableImpl for use in Tools.recordFactory() #16260 - Avoid allocating Collections.nCopies in ScopeStack #16264 - Avoid allocating JoinNode in scope registration of tables if unnecessary #16268 - Avoid constructing DSL.name() for constant internal names #16272 - Refactor QualifiedName to improve performance #16277 - name(null, "") should equal to name("") #16281 - Result::formatXML should omit type attribute on columns whose type is unknown #16285 - Meta::ddl generates incorrect queries for SQL Server (max) lengths #16299 - MULTISET equality is ORDER dependent in dialects without support for correlated derived tables #16304 - Can't parse MySQL ALTER TABLE .. DROP .., DROP .. syntax
This is a 3.19 patch release with minor improvements and bug fixes
#16122 - Add Context.scopeParts(Class<Q>): Iterable<Q> to allow for iterating over the values that are currently in scope
#16115 - jOOQ-codegen-gradle fails with UnknownDomainObjectException when java plugin isn't applied first #16116 - Generated implicit join alias collision when child table foreign keys share the same name #16124 - RenderTable.WHEN_AMBIGUOUS_COLUMNS doesn't cover all ambiguous column name cases #16126 - RenderTable.WHEN_MULTIPLE_TABLES doesn't work correctly in correlated subqueries #16129 - Maximum consumed results reached when Hikari close a SQL Server connection, leading to excessive logging #16134 - jOOQ-codegen-gradle doesn't consider basedir property for its OutputDirectory #16181 - %ROWTYPE UDT types generate invalid system columns when underlying table references object types #16185 - Settings.returnDefaultOnUpdatableRecord and Settings.returnComputedOnUpdatableRecord don't work for replacing embeddables #16196 - Overall performance improvement in AbstractNamed.hashCode() specialisations by avoiding Name::append #16204 - Remove internal AbstractContext::toggle utilities #16210 - AbstractScope::dsl, ::settings, ::dialect, and ::family should avoid unnecessary null-checks on Configuration #16223 - BatchCRUD implementation should extract bind values with SQL string in one go #16230 - Emulate LIMIT 0 where not supported #16233 - Wrong Support annotation on CREATE TRIGGER for INFORMIX #16238 - IndexOutOfBoundsException in DerbyDatabase when <includeExcludeColumns/> excludes a column from an index #16247 - Avoid allocating DataMap in short lived Scope implementations #16250 - Cache TableRecord Constructor in TableImpl for use in Tools.recordFactory() #16256 - JavaGenerator doesn't generate serialVersionUID in Path classes #16259 - Avoid allocating Collections.nCopies in ScopeStack #16263 - Avoid allocating JoinNode in scope registration of tables if unnecessary #16267 - Avoid constructing DSL.name() for constant internal names #16271 - Refactor QualifiedName to improve performance #16276 - name(null, "") should equal to name("") #16280 - Result::formatXML should omit type attribute on columns whose type is unknown #16284 - Meta::ddl generates incorrect queries for SQL Server (max) lengths #16294 - Remove unnecessary up-to-date prevention in jOOQ-codegen-gradle plugin #16295 - Wrong SQL generated for CREATE TABLE in non-default schemas for DuckDB #16298 - MULTISET equality is ORDER dependent in dialects without support for correlated derived tables #16303 - Can't parse MySQL ALTER TABLE .. DROP .., DROP .. syntax
A ground breaking new core feature available in all commercial distributions is the new client side computed columns feature, building on top of jOOQ 3.16's commercial support for readonly columns and server side computed columns.
Not all RDBMS support computed columns (e.g. using the standard SQL syntax
GENERATED ALWAYS AS
), and if they do, they might not support them
in both STORED
(computed on write) and VIRTUAL
(computed on read) variants. jOOQ can now emulate both features at the client
side, by transforming your SQL queries:
STORED
affects INSERT
, UPDATE
,
DELETE
, and MERGE
VIRTUAL
affects SELECT
and the
RETURNING
clause of DML statements. To make use of these,
combine them with the new synthetic column generation feature.Unlike their server side counterparts, these client side features can produce arbitrary expressions, including:
MULTISET
subqueriesThink of this as "views" written in jOOQ, on a per-column basis. An expecially useful feature combination is to combine these computed columns with the new visibility modifier that allows for keeping computed columns (or the underlying base columns) private and thus invisible to user code.
More about this feature here:
A special case of STORED
client side computed columns are audit
columns, whose most basic implementation comes in the form of:
CREATED_AT
CREATED_BY
MODIFIED_AT
MODIFIED_BY
Other approaches to auditing exist, including soft deletion, additional meta data, (bi)temporal versioning, but these columns are among the most popular approaches, making this commercial only convenience feature very useful to a lot of customers.
More about this feature here:
Java 17 has been the latest LTS, and it includes a lot of really cool features, including:
jOOQ 3.16's experimental new Query Object Model (QOM) API experiments with sealed types, which will be adopted more generally once the QOM API is finalized.
To get broader user feedback on these improvements, as well as to embrace Java's new LTS update cadence, we've decided to make Java 17 the baseline for the jOOQ 3.17 Open Source Edition, continuing our Java 8 and 11 support in the commercial jOOQ distributions.
The following older jOOQ releases will continue to receive upgrades for a while:
The jooq-postgres-extensions module, which contained support for the
HSTORE
type, now has a lot more support for PostgreSQL specific
data types, including array types of each of:
CIDR
CITEXT
LTREE
HSTORE
INET
RANGE
(including all the specialisations for INT4
,
INT8
, etc.)In order to profit from these data types, just add the
org.jooq:jooq-postgres-extensions
module to your code generation
and runtime dependencies, and the types are generated automatically.
In this release, we experimented with a few new implicit JOIN features, including support for implicit JOIN in DML statements. The current implementation produces correlated subqueries where JOIN isn't supported in DML statements.
We've also experimented with creating a "convenience syntax" for other commonly
used correlated subqueries, such as EXISTS(...)
subqueries or
MULTISET(...)
subqueries. The experiment has been very interesting.
The prototype, however, was rejected. See the discussions here:
Future jOOQ versions will implement the desired convenience in the form of more implicit JOIN functionality, offering the feature also as an implicit to-many JOIN.
A leftover from the prototype is the fact that you can now more easily project
expressions other than classic Field<T>
in your SELECT
clause, namely:
Table<R>
now extends SelectField<R>
Condition
now extends Field<Boolean>
This means you can write a query like this:
Result> result = ctx.select( // Project a CustomerRecord directly CUSTOMER, // Project an AddressRecord from an implicit JOIN CUSTOMER.address(), // Project a boolean expression, instead of wrapping it with DSL.field() exists( selectOne() .from(PAYMENT) .where(PAYMENT.CUSTOMER_ID.eq(CUSTOMER.CUSTOMER_ID)) ) .from(CUSTOMER) .fetch();
SQL transformations have been a strategic feature set to recent jOOQ releases, offering additional compatibility between SQL dialects to commercial customers, such as, for example:
ROWNUM
into equivalent window functions or
LIMIT
clauses.(+)
operator into ANSI
JOIN syntax.This release ships with a new commercial only feature that directly transforms the new Query Object Model (QOM)'s expression tree prior to rendering. It does so by applying pattern matching to the expression tree. Some assorted examples include:
LTRIM(RTRIM(x))
into TRIM(x)
x != a AND x != b
into x NOT IN (a, b)
x IN (a, b, c) AND x IN (b, c, d)
into x IN (b, c)
NOT (NOT (x = 1))
into x = 1
NOT (x = 1)
into x != 1
And much more. The primary use-cases for this functionality are:
ExecuteListener
ParsingConnection
For more information about the feature, see:
Note that this feature is also available for free online:
A lot of minor improvements have been implemented. A few more significant ones include:
Publisher
SPI are now
bridged automatically to kotlin coroutines in the new
org.jooq:jooq-kotlin-coroutines
module using the usual utilites
org.jetbrains.kotlinx:kotlinx-coroutines-core
and
org.jetbrains.kotlinx:kotlinx-coroutines-reactor
org.jooq:jooq-kotlin
extensions module now has additional
extension functions for more MULTISET
and other nesting related
convenience.org.jetbrains.annotations.Blocking
to help reactive jOOQ users
avoid accidentally blocking on a query, when using IntelliJ. In addition, we
now annotate experimental and internal API with the ApiStatus
annotation from the same package.For a complete list other, minor improvements, see the below change notes.
#1592 - Add formal support for "audit" fields, such as CREATED_AT, CREATED_BY, MODIFIED_AT, MODIFIED_BY
#2092 - Add support for the Postgres INET data type (java.net.InetAddress)
#2333 - Add DSL.noField() for "conditional" LIMIT, OFFSET, GROUP BY, ORDER BY support when creating dynamic SQL
#2968 - Add support for PostgreSQL RANGE types
#3497 - Add methods to Context to distinguish between derived tables and other types of subqueries
#4727 - Let Table<R> extend SelectField<R>
#5214 - Add support for PostgreSQL's EXCLUDED table
#5641 - Support overriding code generation
#12430 - Make Java 17 the baseline for the jOOQ Open Source Edition #12772 - Continue work on public query object model API #12781 - Remove pre 3.7 deprecated API and pre 3.7 documentation #12895 - Rename QOM.UOperator[N]::constructor to ::$constructor #12904 - Remove redundant limit(int) and offset(int) overloads #12910 - Add DSL.emptyGroupingSet(): GroupField for explicit empty grouping sets #13028 - Generated DAOs should use an embeddable's referencingName, not name for the fetchByXYZ() and fetchRangeOfXYZ() methods #13053 - java.lang.NoClassDefFoundError: org/postgresql/util/PGInterval when rendering SQL without the pgjdbc dependency #13068 - Change selectFrom(Table<R>) methods to selectFrom(TableLike<R>) #13080 - Standard SQL MULTISET emulation using XML produces a null Result #13082 - SQL Server MULTISET as JSON emulation of empty subquery produces NULL instead of empty Result #13094 - Throw an exception when calling ConvertedDataType.getArrayDataType() when the type has a custom Binding #13114 - SelectField.as() should return SelectField<T>, not Field<T> #13115 - Change Table::getType to Table::getTableType #13116 - Rename QOM.RowField to QOM.RowAsField #13149 - Let Query.keepStatement() return CloseableQuery and ResultQuery.keepStatement() return CloseableResultQuery #13181 - MULTISET emulation using SQL/XML doesn't correctly distinguish between NULL and '' #13208 - SQL Server JSON_OBJECT should implement NULL ON NULL semantics by default #13307 - Change $number() arguments in experimental QOM function types to $value() #13426 - DSLContext::fetchFromJSON and ::fetchFromXML wrongly assume dialect specific data types in header
#13005 - Deprecate FieldOrConstraint #13071 - Deprecate the org.jooq.Internal annotation #13542 - Replace SPI default implementation class (e.g. DefaultExecuteListener) by default methods in interface
#1049 - Better GREATEST() and LEAST() emulations for SQL Server using MAX() or MIN() with VALUES() correlated derived table
#5612 - Inline enum values should be cast to their enum type just like inline bind variables
#6133 - Cannot combine CREATE TEMPORARY TABLE .. AS .. with ON COMMIT ..
#7362 - Excess parentheses generated in NOT operator
#7783 - Nested row value expressions produce String column types when concrete type information should be available
#8614 - Passing arrays of generated tableRecords to a stored procedure generates SQL that won't parse due to cast ::any[]
#8681 - Wrong SQL generated for connectByRoot(minus(one()))
#9981 - Some BooleanDataKey values should be reset when entering a new scope
#10277 - CAST to PostgreSQL enum type lacks type qualification
#10304 - Unnecessary parentheses generated in ConditionAsField
#11114 - CAST should generate qualified type when casting to Table::getDataType or UDT::getDataType
#11424 - Improve the alignment of GenerationTool INFO log
#11441 - Inlining PostgreSQL CHAR(len)[] types produces VARCHAR[] instead
#11509 - batchStore(), batchInsert(), etc. with StatementType.STATIC_STATEMENT throws java.sql.BatchUpdateException
#11552 - UpdatableRecord::merge doesn't work in the presence of a unique constraint and in the absence of a primary key value
#11637 - FilePattern cannot load classpath resource from within jar file
#11722 - Code generator cannot handle tables from other schemas than PUBLIC referencing H2 enum domain types
#12036 - Timestamp Arithmetic fails with ConvertedDataType
#12134 - Support deserialising binary data in MULTISET emulations
#12269 - Records detached when converting nested multiset
#12287 - Replace calls to System.currentTimeMillis() by Clock usage
#12428 - DDL export no longer exports INDEX WHERE clause
#12525 - Nesting of converters causes unexpected Exception
#12783 - Feature Comparison on website is different from docs
#12788 - Support SQLite columns having no data type declaration
#12794 - Parser and code generator does not recognise H2 2.0's BINARY VARYING and other standard SQL data type synonyms
#12795 - Upgrade H2 dependency to 2.0.206
#12801 - GroupConcat renders string_agg separator argument within wrong parentheses
#12804 - Add parser support for Teradata's { UPDATE | DELETE } .. ALL syntax
#12811 - DAOImpl.findOptionalById shouldn't be final
#12818 - GROUP_CONCAT doesn't work as window function
#12820 - Parser doesn't support Derby's FOR BIT DATA data type modifier
#12824 - Parser cannot handle 1. decimal syntax in SELECT
#12825 - Parser shouldn't parse Teradata cast syntax based on Settings.parseAppendMissingTableReferences, but only based on the parseDialect()
#12852 - Parser can't handle TRIM (FROM sp_executeSQL
, which fails for binary (case sensitive) collations
#13383 - Invalid SQL generated in Oracle 11g when query has LIMIT clause and scalar subqueries without explicit aliases
#13392 - Generated column name for binary bind values shouldn't use Java's byte[].toString()
#13395 - Bump spring-core from 5.3.16 to 5.3.18
#13396 - Update spring-core dependency to 5.3.18 to mitigate CVE-2022-22965
#13403 - MULTISET and ROW generated nested records should not have their changed flags set to true
#13415 - GroupConcat renders string_agg separator argument within wrong parentheses in EXASOL
#13422 - Dead links in manual for nested class Javadocs
#13424 - Duplicate headers in manual where there exist redirects
#13429 - DSL.noCondition() isn't applied correctly to aggregate FILTER WHERE clause
#13439 - No warning is logged when readonly columns or rowids are not used
#13447 - Upgrade to org.postgresql:postgresql:42.3.3 to mitigate CVE-2022-26520
#13454 - ARRAY_AGG cannot aggregate array columns in H2
#13465 - Expressions based on computed columns must not retain computation reference
#13468 - Work around SQLite INSERT .. SELECT .. ON CONFLICT bug
#13473 - SQLException when calling oracle.jdbc.driver.ArrayDataResultSet.getMetaData()
#13479 - Bump spring-core from 5.3.18 to 5.3.19
#13488 - org.jooq.SQL and manual should document plain SQL templating's capability of recognising :named parameters
#13489 - ArrayIndexOutOfBoundsException when rendering PostgreSQL plain SQL template containing ?@
#13499 - Improve implementation of QualifiedName.hashCode()
#13503 - Parser meta lookups don't work for INSERT .. SELECT .. RETURNING
#13509 - MariaDB, MySQL, Oracle, SQL Server may ignore MULTISET subquery ORDER BY clause
#13513 - LoaderLoadStep.execute() shouldn't have @CheckReturnValue annotation
#13536 - Wrong documentation for <printMarginForBlockComment/>
#13543 - NullPointerException when rendering CTE without a top level context
#13545 - DSL.quotedName(String[]) should produce QualifiedName only if argument array length != 1
#13555 - Field::likeIgnoreCase should cast lhs operand just like Field::like and Field::similarTo
#13557 - MySQL / MariaDB generated columns with enum type are not generated as readonly
#13560 - Invalid SQL generated for Oracle when selecting multiple unaliased rows
#13563 - INSERT .. RETURNING emulations shouldn't acquire multiple connections from ConnectionProvider when using ThreadLocalTransactionProvider
#13574 - UpdatableRecord::merge might produce wrong update count if generated keys can't be fetched
#13581 - Excess parentheses generated in unary ~ (QOM.BitNot) or - (QOM.Neg) operators
#13600 - Bump spring-core from 5.3.19 to 5.3.20
#13601 - Derby boolean expressions have to be wrapped in parentheses when passed to COALESCE
#13608 - Distribute jOOQ-postgres-extensions also with the commercial distributions
#13611 - UnsupportedOperationException when selecting single nested row with JSON column
#13624 - Manual documents wrong artifactId for
#13625 - Wrong code generated for Oracle package procedure SYS.DBMS_STATS.GATHER_DATABASE_STATS
#13635 - Test container does not close in example
#13636 - Close testcontainer in example
#13643 - Wrong result column type for requested conversion when reading JSONB_ARRAY and JSONB_OBJECT nested in ROW in DB2
#13647 - DefaultRecordUnmapper should cache AbstractRow and record type
#13660 - PostgreSQL ON CONFLICT .. WHERE .. DO NOTHING generates not valid SQL
#13663 - Remove the "modern IDEs" section from the manual
#13664 - Avoid ambiguous reference when using Table<R> as SelectField<R> for table conflicting with column
#13667 - Link.$schema() is Nullable
#13671 - Oracle doesn't support ORDER BY in UPDATE .. SET correlated subquery
#13673 - Settings.returnAllOnUpdatableRecord doesn't work for UPDATE queries in HSQLDB
#13676 - Improve <inputCatalog/> warning message in code generator
#13681 - Cannot use scalar subquery originating from MULTISET in JSON_OBJECT() VALUE clause in Db2
#13691 - Manual should link JDBC types to Javadoc
This is a 3.17 patch release with minor improvements and bug fixes
#13707 - OnError.FAIL should log a message about the user's option how to handle the problem #13719 - Log warning should show jOOQ-meta type to help disambiguate objects that share the same name
#13710 - Ill formatted Javadoc in DSLContext #13714 - Cannot parse computed columns in the presence of identity column #13724 - Regression: Zero-length delimited identifier is generated for enum columns when using <outputSchemaToDefault/> #13726 - Regression: Client code no longer compiles when calling DSLContext.fetchSingle(Table, Condition...)
This is a 3.17 patch release with minor improvements and bug fixes
#13731 - Generated sources emits "reference not accessible" warning for org.jooq.impl.AbstractTable#convertFrom
#13733 - Wrong Javadoc in generated AbstractSpringDAOImpl
#13735 - Work around JDK-8289221, where javadoc aren't allowed to contain ellipses in a code tag in a method header
#13739 - Reactive transactions don't call Connection::close
#13740 - Connection::close call is skipped when R2DBC query fails
#13743 - R2DBC implementation may hang when there's an exception in the rendering logic
#13754 - GROUP BY
This is a 3.17 patch release with minor improvements and bug fixes
#13792 - Data type rewrites to BOOLEAN don't work in Oracle JSON_OBJECT #13797 - Virtual client side computed columns must be excluded from generated DDL statements #13799 - GenerationOption.DEFAULT should act as STORED in client side computed columns #13819 - MySQL DEFAULT CURRENT_TIMESTAMP column is generated as computed column #13831 - NullPointerException when calling DBMS_AQ.dequeue #13852 - Wrong DDL generated for computed columns in MEMSQL #13855 - Syntax error in MemSQL code generation #13858 - Upgrade pgjdbc to mitigate CVE-2022-31197 #13861 - Fix typo in code generation log message #13863 - AbstractSpringDAOImpl imported from wrong package when generating multiple schemas #13864 - Wrong kotlin code generated for SQL Server stored procedures #13868 - MemSQL doesn't support the SET @@var = @other_var syntax
This is a 3.17 patch release with minor improvements and bug fixes
#13886 - Parse length on unknown data types #13888 - Parse and ignore SQLite DDL conflict-clause #13931 - Show deprecation warning for javax.persistence annotations also for method and field annotations
#13874 - PostgreSQL arrays don't deserialise correctly when using XML MULTISET emulation #13877 - ArrayGet should not produce parentheses when used as a store assignment target, e.g. in UPDATE #13883 - Parser should parse and ignore PRIMARY KEY UNIQUE #13899 - The maven codegen plugin does not load syntheticObjects from external configurationFile #13908 - Logger name repeated twice #13909 - Code generation fails with H2 2.1.214 when using CASE_INSENSITIVE_IDENTIFIERS #13921 - PostgreSQL generated code doesn't maintain precision / scale on NUMERIC or TIME, TIMETZ, TIMESTAMP, TIMESTAMPTZ types #13923 - Convert truncates microseconds from OffsetDateTime when converting to Instant #13929 - NullPointerException thrown instead of DetachedException, when executing detached query #13943 - Cannot use Table as SelectField from derived table where nesting records is supported natively #13953 - IsNotDistinctFrom predicate doesn't declare non-nullability
This is a 3.17 patch release with minor improvements and bug fixes
#13997 - Improve documentation on Fields lookup methods #14072 - Add parser support for undocumented AS keyword in SQL Server procedure parameter list
#13966 - HSQLDB arrays can't be projected from nested rows
#13983 - ParsingConnection doesn't correctly relay Statement::getResultSet, Statement::getUpdateCount, or Statement::getMoreResults on static Statement
#13994 - Wrong value returned from NullCondition::isNullable
#14015 - Slow query against SYS.ALL_INDEXES in OracleDatabase
#14018 - Moderately slow query on ALL_TAB_COLS due to cartesian product in OracleTableDefinition
#14022 - Moderately slow query on ALL_ARGUMENTS due to EXTENDED DATA LINK FULL in OracleTableDefinition
#14024 - Postgres array of single-field UDT reads UDT's field as null instead of actual value
#14028 - ClobBinding and BlobBinding shouldn't delegate sql() generation to internal DefaultStringBinding or DefaultBytesBinding
#14031 - ORA-01704 when generating large CLOB inline values in Oracle
#14035 - Upgrade to Scala 2.13.9 to mitigate CVE-2022-36944
#14037 - KotlinGenerator produces directory names with backticks when catalog names contain special characters
#14054 - Upgrade jackson-databind dependency to 2.13.4 to mitigate CVE-2022-42004
#14056 - Upgrade protobuf-java to 3.16.3 to mitigate CVE-2021-22569
#14061 - Work around Derby's Error [30000] [54002]: A string constant starting with '...' is too long
#14068 - ClobBinding and BlobBinding shouldn't bind a null value on PreparedStatement::setClob and ::setBlob in Firebird, HSQLDB
#14087 - Support parsing SELECT .. INTO
#14164 - Wrong transformation for transformPatternsTrivialPredicates when DISTINCT predicate operand is NULL
This is a 3.17 patch release with minor improvements and bug fixes
#14243 - Add support for DB2 ROWNUMBER and DENSERANK window function in parser
#14177 - ParserCLI in interactive mode should use Settings defaults for its SQL transformation flags #14183 - MANIFEST.MF contains unnecessary javax.persistence dependency #14188 - StackOverflowError in transformPatternsArithmeticExpressions when commutative operator has 2 inline arguments #14192 - DefaultDiagnosticsContext should cache resultSetFetchedRows #14197 - Bad syntax generated when using the Field.collate() clause in CREATE TABLE statements #14211 - Regression in MS Access CONCAT implementation #14219 - Plain SQL INSERT .. RETURNING doesn't work with unqualified field templates in SQL Server #14221 - Update blog links from Javadoc and comments #14227 - Outdated Javadoc on DSL.array() for how jOOQ renders H2 array constructors #14233 - ORA-00904: "v0"."GET_WKT": invalid identifier #14234 - Cannot query geometry value in a nested ROW #14235 - Cannot query geometry value in a multiset #14237 - DefaultDiagnosticsContext shouldn't call ResultSet::getMetaData on already closed ResultSet #14240 - Work around SQLite's error: HAVING clause on a non-aggregate query #14259 - ClassCastException in WithImpl::$replace #14265 - Improve generated unknown data type javadoc when forcedTypes match return type, but there are still unknown parameter types #14277 - Median emulation ignores FILTER and OVER clauses #14281 - AbstractToJacksonConverter does not work when userType is array #14284 - Kotlin Value Classes in Constructor lead to name based mapping failure #14287 - Upgrade pgjdbc to 42.4.3 to mitigate CVE-2022-41946 #14290 - ScalaGenerator generated code should avoid "procedure syntax" #14292 - ForcedType enum with no matching value being converted to last enum value #14295 - ON CONFLICT DO NOTHING emulation should continue to be applied for PostgreSQL 9.3 and 9.4 #14304 - In MySQL, withReturnAllOnUpdatableRecord(true) causes two SELECT statements #14314 - Informix DDL statements generate invalid SQL for timestamp columns #14317 - Informix CURRENT_TIMESTAMP emulation doesn't work as DDL DEFAULT expression #14322 - Wrong NULL behaviour of BitAndAgg, BitOrAgg, and related aggregate function emulations #14326 - Informix BOOLEAN literals 't' and 'f' need to be cast to BOOLEAN explicitly #14329 - Excess query executed against SQLite when emulating INSERT .. RETURNING #14334 - ArrayIndexOutOfBoundsException when parsing ill formed SQL ending with a comment and a semicolon #14340 - Exception in Teradata code generation: Unknown column TVName #14344 - StackOverflowError in parser with Settings.parseWithMetaLookups == IGNORE_ON_FAILURE #14347 - Error: Invalid Top N Value: N is too big for Teradata OFFSET emulation #14350 - Teradata TOP expression or DISTINCT TOP don't work #14354 - Parser meta lookups don't work correctly when using DELETE .. FROM with aliased tables #14369 - Meta::getTables should list also PARTITIONED TABLE #14374 - Parser produces wrong projection data type when parsing doubly nested derived table #14376 - Parser reports wrong Ambiguous field identifier error when derived tables share column names
This is a 3.17 patch release with minor improvements and bug fixes
#14401 - Code generator should properly qualify H2 domain enums #14500 - Add an R2DBC LoggingConnection
#14384 - Broken link in a logging statement and Javadoc #14390 - Table::useIndex and similar table wrapping methods break joins using onKey() #14396 - DSL::noField doesn't work in SEEK clause #14399 - java.lang.StackOverflowError at org.jooq.impl.Expression.acceptAssociative #14404 - "You can't specify target table '...' for update in FROM clause" when target table has index hint in MySQL #14415 - DDLDatabase cannot handle qualified enum types in CREATE TABLE #14422 - Update error reporting URL in log messages #14427 - Code generation for sequences fails for SQL Server 2014 #14434 - Generated TableImpl::getSchema override should be annotated Nullable #14460 - Work around Db2 error "The string constant beginning with ... is too long" #14467 - Wrong result column type for requested conversion when reading JSONB_ARRAYAGG and JSONB_OBJECTAGG in DB2 #14480 - SQL Server RETURNING clause emulation for fetching trigger generated values generates incorrect SQL if no columns are fetched #14484 - Wrong SQL generated in SQL Server when virtual client side computed columns are referenced in RETURNING clause #14493 - Syntax errors lead to unclosed R2DBC connection in SQL Server #14497 - TransactionPublisher does not commit transaction when wrapped in reactor's Mono