Version 3.18.29 - April 2, 2025
================================================================================
This is a 3.18 patch release with minor improvements and bug fixes
Features and Improvements
-------------------------
#18180 - Add some WARN logging about the Settings.namePathSeparator when people turn off quoting of identifiers and use flattened nested rows
#18245 - SnowflakeDatabase::getTables should read table comments from INFORMATION_SCHEMA.TABLES
Bug Fixes
---------
#18136 - Log message doesn't concatenate helpful information in code generator
#18147 - MULTISET emulation using XML doesn't correctly encode NULL String values when nesting tables as SelectField
#18155 - JSON MULTISET emulation of deeply nested records doesn't correctly set touched flag to false
#18160 - ORA-17004 Invalid column type when trying to read XML typed expression using R2DBC in Oracle
#18164 - YearToMonth::valueOf cannot parse P0D, which is a valid Period value
#18168 - Wrong YearToMonth interval parsed when parsing ISO interval values with negative components
#18172 - Wrong type generated in Oracle NVARCHAR CAST
#18183 - AbstractRowAsField should generate DSL.quotedName() identifiers when emulating nested records using aliased flattened fields
#18189 - MULTISET XML emulation doesn't work on SQL Server for unnamed columns: An object or column name is missing or empty
#18195 - Converter<String, String> is not applied in multisets
#18209 - XJC generated toString() methods produce empty list elements
#18213 - XJC generated equals() and hashCode() values are List lazy initialisation sensitive
#18217 - ROWNUM transformation prevents FOR UPDATE transformation in SQL Server
#18225 - BatchMultiple rendering Context doesn't have a Context.executeContext() reference
#18229 - SQLite doesn't actually support a REGEXP operator
#18237 - Window specification isn't inlined in Snowflake query using WITH TIES syntax
#18241 - Excess whitespace in formatted CREATE TABLE .. COMMENT clause for Snowflake
#18250 - Wrong SET SCHEMA implementation for Snowflake
#18254 - Add SNOWFLAKE to the DerivedTable.NO_SUPPORT_CORRELATED_DERIVED_TABLE list
#18268 - DSLContext::nextvals and DSL::digits isn't really supported by Derby
#18279 - Query.getSQL(NAMED) produces a gap in the parameter numbering when the query contains a null UDT value, while Query::getBindValues still produces the value
Version 3.19.22 - April 2, 2025
================================================================================
This is a 3.19 patch release with minor improvements and bug fixes
Features and Improvements
-------------------------
#18179 - Add some WARN logging about the Settings.namePathSeparator when people turn off quoting of identifiers and use flattened nested rows
#18244 - SnowflakeDatabase::getTables should read table comments from INFORMATION_SCHEMA.TABLES
Bug Fixes
---------
#18135 - Log message doesn't concatenate helpful information in code generator
#18146 - MULTISET emulation using XML doesn't correctly encode NULL String values when nesting tables as SelectField
#18154 - JSON MULTISET emulation of deeply nested records doesn't correctly set touched flag to false
#18159 - ORA-17004 Invalid column type when trying to read XML typed expression using R2DBC in Oracle
#18163 - YearToMonth::valueOf cannot parse P0D, which is a valid Period value
#18167 - Wrong YearToMonth interval parsed when parsing ISO interval values with negative components
#18171 - Wrong type generated in Oracle NVARCHAR CAST
#18182 - AbstractRowAsField should generate DSL.quotedName() identifiers when emulating nested records using aliased flattened fields
#18188 - MULTISET XML emulation doesn't work on SQL Server for unnamed columns: An object or column name is missing or empty
#18194 - Converter<String, String> is not applied in multisets
#18200 - DefaultConverterProvider cannot convert "1970-01-01T00:00Z" string to OffsetDateTime
#18205 - DSL.excluded with UDTField creates query with syntax error
#18208 - XJC generated toString() methods produce empty list elements
#18212 - XJC generated equals() and hashCode() values are List lazy initialisation sensitive
#18216 - ROWNUM transformation prevents FOR UPDATE transformation in SQL Server
#18224 - BatchMultiple rendering Context doesn't have a Context.executeContext() reference
#18228 - SQLite doesn't actually support a REGEXP operator
#18236 - Window specification isn't inlined in Snowflake query using WITH TIES syntax
#18240 - Excess whitespace in formatted CREATE TABLE .. COMMENT clause for Snowflake
#18249 - Wrong SET SCHEMA implementation for Snowflake
#18253 - Add SNOWFLAKE to the DerivedTable.NO_SUPPORT_CORRELATED_DERIVED_TABLE list
#18259 - KotlinGenerator doesn't produce TriggerNames file in a names subpackage
#18267 - DSLContext::nextvals and DSL::digits isn't really supported by Derby
#18278 - Query.getSQL(NAMED) produces a gap in the parameter numbering when the query contains a null UDT value, while Query::getBindValues still produces the value
Version 3.20.3 - April 2, 2025
================================================================================
This is a 3.20 patch release with minor improvements and bug fixes
Features and Improvements
-------------------------
#18139 - Add Settings.emulateNestedRecordProjectionsUsingMultisetEmulation to replace flattening emulation by MULTISET emulation for top level nested record projections
#18178 - Add some WARN logging about the Settings.namePathSeparator when people turn off quoting of identifiers and use flattened nested rows
#18230 - Add Snowflake support for Field::likeRegex and DSL::regexpReplaceAll
#18243 - SnowflakeDatabase::getTables should read table comments from INFORMATION_SCHEMA.TABLES
Bug Fixes
---------
#18134 - Log message doesn't concatenate helpful information in code generator
#18142 - MergeImpl shouldn't implement QOM.UNotYetImplemented anymore
#18145 - MULTISET emulation using XML doesn't correctly encode NULL String values when nesting tables as SelectField
#18153 - JSON MULTISET emulation of deeply nested records doesn't correctly set touched flag to false
#18158 - ORA-17004 Invalid column type when trying to read XML typed expression using R2DBC in Oracle
#18162 - YearToMonth::valueOf cannot parse P0D, which is a valid Period value
#18166 - Wrong YearToMonth interval parsed when parsing ISO interval values with negative components
#18170 - Wrong type generated in Oracle NVARCHAR CAST
#18181 - AbstractRowAsField should generate DSL.quotedName() identifiers when emulating nested records using aliased flattened fields
#18187 - MULTISET XML emulation doesn't work on SQL Server for unnamed columns: An object or column name is missing or empty
#18193 - Converter<String, String> is not applied in multisets
#18199 - DefaultConverterProvider cannot convert "1970-01-01T00:00Z" string to OffsetDateTime
#18204 - DSL.excluded with UDTField creates query with syntax error
#18207 - XJC generated toString() methods produce empty list elements
#18211 - XJC generated equals() and hashCode() values are List lazy initialisation sensitive
#18215 - ROWNUM transformation prevents FOR UPDATE transformation in SQL Server
#18220 - Revert deprecation of internal, protected AbstractRecord.from(Record) method
#18223 - BatchMultiple rendering Context doesn't have a Context.executeContext() reference
#18227 - SQLite doesn't actually support a REGEXP operator
#18235 - Window specification isn't inlined in Snowflake query using WITH TIES syntax
#18239 - Excess whitespace in formatted CREATE TABLE .. COMMENT clause for Snowflake
#18248 - Wrong SET SCHEMA implementation for Snowflake
#18252 - Add SNOWFLAKE to the DerivedTable.NO_SUPPORT_CORRELATED_DERIVED_TABLE list
#18258 - KotlinGenerator doesn't produce TriggerNames file in a names subpackage
#18266 - DSLContext::nextvals and DSL::digits isn't really supported by Derby
#18270 - Derby cannot emulate CONTAINS, STARTS_WITH, ENDS_WITH using LIKE
#18277 - Query.getSQL(NAMED) produces a gap in the parameter numbering when the query contains a null UDT value, while Query::getBindValues still produces the value
#18280 - Regression: Failed UpdateableRecord::delete resets the Record::original values to null and sets the Record::touched values to true