You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This release reflects a strong focus on A documentation site overhaul (new tutorials, 10 database vendor guides, a class-by-class Core Components reference, and a new Developing DbUnit contributor section); several new capabilities including DbUnitExtension for native JUnit 5/6 lifecycle management, a JSON dataset format with a matching JSON ValueComparer, MariaDB and H2 2.x database support, expanded PostgreSQL json/jsonb and array type support, and an opt-in escape hatch for schemas with circular foreign keys; and a broad set of correctness and performance fixes spanning metadata handling, DTD/XML export, PostgreSQL null-safety and large-object handling, and FlatXmlProducer memory use.
Feedback and bug reports are always welcome via GitHub Issues.
New features
Add repo-root README.adoc, rendered natively by GitHub via Asciidoctor, so the repository landing page shows a pitch, build/reproducible-build badges, a pointer to the "dbUnit in 5 Minutes" tutorial, and links to the documentation site, Maven coordinates, GitHub Discussions, and CONTRIBUTING.md instead of nothing. (docs(site): Add repo-root README.adoc #840) Thanks to jeffjensen.
Add the "dbUnit in 5 Minutes" tutorial (fiveminutes.adoc): a complete, runnable walkthrough using the recommended DefaultPrepAndExpectedTestCase + JdbcDatabaseTester composition style against an in-memory H2 database, placed first in the "Using DbUnit" site menu. (docs(site): Add "dbUnit in 5 Minutes" tutorial #841) Thanks to jeffjensen.
Add the IDatabaseTester guide (testcases/IDatabaseTester.adoc), documenting the composition-based testing style CLAUDE.md and the site's own examples already prefer but that had no dedicated page: the interface hierarchy, setup/teardown lifecycle, IOperationListener hooks, and pairing with the new CachingConnectionProvider for connection reuse across test methods. (docs(site): Add IDatabaseTester guide #842) Thanks to jeffjensen.
Fill in the JdbcBasedDBTestCase, DataSourceBasedDBTestCase, and JndiBasedDBTestCase pages, previously literal TODO stubs: each now documents what the class is, a minimal JUnit 5 example (including the @BeforeEach/@AfterEach super calls JUnit 5 requires that the prior "Getting Started" narrative omitted), and when to reach for it versus the IDatabaseTester composition alternative. (docs(site): Fill in DBTestCase-family TODO stub pages #843) Thanks to jeffjensen.
Extract connections.adoc from components.adoc's "IDatabaseConnection" section, and document CachingConnectionProvider (new in 3.4.0-SNAPSHOT, previously undocumented anywhere in the site) there. Nest the existing Properties & Features page under it in site.xml. (docs(site): Extract connections.adoc from components.adoc #847) Thanks to jeffjensen.
Extract datasets.adoc (IDataSet/ITable core contracts, DataSetBuilder) and 9 focused child pages under src/site/asciidoc/datasets/ (Flat XML, XML, CSV, Excel, YAML, Query-Based, Streaming, Data File Loader, Decorators) from components.adoc's kitchen-sink dataset-format catalog. Expanded the thinnest sections while extracting: CSV gained a full sample directory layout, Excel gained the Apache POI optional-dependency note, Streaming gained a DataSetProducerAdapter/BufferedConsumer mention, Data File Loader was written from scratch (previously only a two-line mention in howto.adoc), and Decorators absorbed SortedTable/SortedDataSet row-ordering content moved from howto.adoc. (docs(site): Extract datasets.adoc and format-specific children from components.adoc #848) Thanks to jeffjensen.
Extract operations.adoc from components.adoc's DatabaseOperation table, adding the two entries missing from it: CloseConnectionOperation and the DatabaseOperation.TRANSACTION(op)/CLOSE_CONNECTION(op) factory methods. (docs(site): Extract operations.adoc from components.adoc #849) Thanks to jeffjensen.
Add testcases/MigratingToIDatabaseTester.adoc: why migrate a test class's writing style from DBTestCase to IDatabaseTester composition (as opposed to migration.adoc, which only covers dbUnit-version API differences), a before/after code pair, a DBTestCase-subclass-to-IDatabaseTester class mapping table, what does not change, and the pre-3.0.0 raw-TestCase+IDatabaseTester legacy pattern moved here from howto.adoc. Cross-link from migration.adoc since some readers will look for "migration" there first. (docs(site): Add DBTestCase to IDatabaseTester migration guide #853) Thanks to jeffjensen.
Add 9 database-specific vendor guides under src/site/asciidoc/databases/ (db2, h2, hsqldb, mckoi, mssql, mysql, netezza, oracle, postgresql), one per org.dbunit.ext.* package, each previously represented only as a bare class-name bullet in properties.adoc's DataType Factory section. Each covers its IDataTypeFactory, IMetadataHandler (where one exists), connection preconfiguration class (where one exists), vendor-specific types/operations, and known quirks cross-linked to existing FAQ/properties entries instead of duplicating them. Oracle's page is the longest, covering both factory versions, proprietary LOB/XMLType access, and full SDO_GEOMETRY spatial object modeling. Nav wiring lands in WI-18. (docs(site): Add 9 database-specific vendor guides #855) Thanks to jeffjensen.
Add databases.adoc index page listing all 9 vendor guides with a one-line "what's special here" teaser each, and wire the new top-level "Database-Specific Guides" site.xml menu with all 9 nested underneath. (docs(site): Add databases.adoc index page #856) Thanks to jeffjensen.
Add datasets/sqlloader.adoc documenting org.dbunit.dataset.sqlloader (SqlLoaderControlDataSet), which had zero documentation anywhere in the site: what it is, the control-files directory layout, and a minimal loading example drawn from the class's own test fixtures. Cross-linked from the Oracle vendor guide since this format is Oracle-specific tooling despite living in the vendor-neutral dataset package. (docs(site): Document dataset.sqlloader (Oracle SQL*Loader control files) #857) Thanks to jeffjensen.
Add opt-in DatabaseConfig.FEATURE_SORT_ALL_COLUMNS_WHEN_NO_PRIMARY_KEY, defaulting to off. When enabled, a table with no primary key is selected with an ORDER BY over all of its non-LOB columns instead of leaving row order database-defined (and thus nondeterministic); CLOB/BLOB columns are always excluded from that fallback sort since some databases (notably Oracle) reject LOB columns in ORDER BY. (When a table has no primary key, use all columns for sorting #171) Thanks to jeffjensen.
Add MultiSchemaMySqlMetadataHandler, for a MySQL connection not restricted to a single schema (e.g. connecting as "root" specifically to work across several schemas at once with FEATURE_QUALIFIED_TABLE_NAMES enabled). MySqlMetadataHandler passes a null schema straight through as the JDBC catalog argument, which the JDBC spec defines as "search every catalog" but which MySQL Connector/J instead treats as "the connection's current catalog only" by default, silently hiding every other catalog's tables and producing NoSuchTableException for one of them. The new handler works around this by enumerating the connection's visible catalogs (skipping information_schema/mysql/performance_schema/sys) and unioning the per-catalog getTables()/getColumns()/getPrimaryKeys()/tableExists() results itself whenever no single schema is configured. (NoSuchTableException - Multiple Schema #533) Thanks to jeffjensen.
Add components/itable.adoc, a new Core Components reference page documenting ITable, ITableMetaData, Column, Columns, and ITableIterator, previously covered only in two sentences on datasets.adoc. (docs(site): Add ITable & Table Metadata core-components page #881) Thanks to jeffjensen.
Add components/verifytabledefinition.adoc, a new Core Components reference page documenting VerifyTableDefinition's fields, all 5 constructor overloads, and its DefaultVerifyTableDefinitionVerifier construction-time validation, previously explained only through usage examples on PrepAndExpectedTestCase.adoc. (docs(site): Add VerifyTableDefinition core-components page #882) Thanks to jeffjensen.
Add components/ioperationlistener.adoc, a new Core Components reference page documenting IOperationListener's 3 hook methods, DefaultOperationListener's connection-closing behavior, and NO_OP_OPERATION_LISTENER, previously undocumented anywhere in the site beyond one unexplained code reference. (docs(site): Add IOperationListener core-components page #883) Thanks to jeffjensen.
Add components/assertion.adoc, a new Core Components reference page documenting how Assertion, DbUnitAssert, and DbUnitValueComparerAssert relate (the static facade and the two instance-based engines it delegates to) and their full method surface, previously introduced only in service of the equality-comparison topic. (docs(site): Add Assertion & DbUnitAssert core-components page #884) Thanks to jeffjensen.
Add codingstandards/javastyle.adoc, the first page of a new "Developing DbUnit" contributor documentation section: general Java style rules, the Eclipse formatter tooling (java-codestyle-formatter.xml, plus the smaller legacy java-codestyle-formatter.epf), Checkstyle (confirmed wired only under Maven's reporting section, so it does not fail the build), Modernizer (confirmed bound to the verify phase and does fail the build), Lombok usage, and logger placement, none previously documented on the site. (docs(site): Add Java Style & Tooling coding-standards page #887) Thanks to jeffjensen.
Add codingstandards/javadoc.adoc, documenting the JavaDoc file-header, style, and tagging conventions. Corrects the prior @author/@SInCE class-header example against actual current practice, confirmed by checking CachingConnectionProvider (added 3.4.0): class-level @SInCE is still expected on new classes, but new @author tags are not. (docs(site): Add JavaDoc Conventions coding-standards page #888) Thanks to jeffjensen.
Add codingstandards/testconventions.adoc, documenting dbUnit's own test-suite conventions (Test/IT/AT suffixes, the test method naming pattern, AssertJ whole-object assertion preference, and the Europe/Berlin fixed test timezone), each illustrated with a real example from the current test suite rather than an invented one. Explicitly disambiguates from the existing Test Integration page, which covers using dbUnit's own testers, not writing dbUnit's tests. (docs(site): Add Test Conventions coding-standards page #889) Thanks to jeffjensen.
Add changelog.adoc, the single reference for changes.xml conventions: required attributes, valid type values, placement, the release description guidance, starting a new development cycle, and the Dependabot changelog automation (moved here from CONTRIBUTING.md, correcting its stale "master" references to "main"). (docs(site): Add Changelog (changes.xml) reference page #890) Thanks to jeffjensen.
Add commits.adoc, documenting the full commit-requirements reference: atomic commits, same-commit bundling rules, the fixup!/autosquash workflow, git mv for renames, and the Conventional Commits type/scope/footer schema. Supersedes devguide.adoc's stale Fnnn/Bnnn ticket-prefix commit-message convention, which contradicted the Conventional Commits format actually in use. (docs(site): Add Commit Requirements page #891) Thanks to jeffjensen.
Add github/issues.adoc, the first page of a new GitHub Workflow section: when to file an issue, the two issue templates, required labels/assignee/type/milestone metadata, and referencing an issue from a commit footer. (docs(site): Add GitHub Issues page #892) Thanks to jeffjensen.
Add github/pullrequests.adoc: fork/branch-from-main, keeping current with main, opening a PR, what must be true before merge, and review expectations. Corrects devguide.adoc's stale "Keep Current with Master" guidance and confirms no CODEOWNERS or PR template exists today, rather than implying a gate that isn't there. (docs(site): Add Branching & Pull Requests page #893) Thanks to jeffjensen.
Add github/continuousintegration.adoc, documenting both CI workflows with their actual trigger conditions verified directly against the workflow files: build-any-branch-with-all-dbs.yml excludes doc-only paths, and publish-docs.yml only runs against main with no pull_request trigger, so no branch ever gets a published-site CI preview. Neither fact was documented anywhere before this page. Also notes the four unused legacy CI config files still present at the repo root. (docs(site): Add Continuous Integration page #894) Thanks to jeffjensen.
Commit CONTRIBUTING.md as a short GitHub-native quick start pointing at the new "Developing DbUnit" site section instead of duplicating it: keeps the build/test commands inline, condenses the submitting-changes steps, and removes the ~80-line changes.xml/Dependabot-automation deep dive now owned by changelog.adoc. Fixes two stale "master" references (confirmed the real target branch is "main" via .github/workflows/dependabot-changelog.yml) and an overstated "enforced by Checkstyle" code-style claim. (docs: Add CONTRIBUTING.md as a quick start pointing at the site #901) Thanks to jeffjensen.
Add a DataSourceDatabaseTester(DataSource, String schema, CachingConnectionProvider, DatabaseConfig) constructor and a new DatabaseConfig#copyPropertiesInto(DatabaseConfig) method, so per-connection properties and features (e.g. PROPERTY_DATATYPE_FACTORY for a specific database) can be applied to every connection a DataSourceDatabaseTester creates directly through the constructor, instead of requiring an IOperationListener#connectionRetrieved() override to reach into each connection's DatabaseConfig after the fact. Also fix DatabaseConfig's own constructor, which left FEATURE_SKIP_ORACLE_RECYCLEBIN_TABLES's underlying property value unset despite ALL_PROPERTIES declaring it non-nullable - harmless until copyPropertiesInto()'s full iteration over ALL_PROPERTIES became the first caller to round-trip every declared property through setProperty(), which enforces that constraint strictly. (Make connection properties configurable for DataSourceDatabaseTester #707) Thanks to pmoukhataev.
Add MariaDB support in a new org.dbunit.ext.mariadb package, separate from org.dbunit.ext.mysql since MariaDB is its own distinct, independently-branded product (mirroring how org.dbunit.ext.netezza stays independent of org.dbunit.ext.postgresql despite Netezza's Postgres lineage): MariaDbDataTypeFactory (extends MySqlDataTypeFactory to reuse its real, verified-shared type handling) declares "mariadb" as a valid database product, silencing the "might cause problems with the current database" warning, and recognizes MariaDB's native UUID (10.7+) and INET4/INET6 (10.10+) column types, which MariaDB Connector/J reports as SQL type OTHER with no MySQL equivalent; MariaDB's JSON type is a LONGTEXT alias and already worked via the inherited longtext handling. Add a mariadb-11-4 Maven profile and Docker-backed IT suite mirroring the existing mysql-9-20 profile, and a dedicated databases/mariadb.adoc site page (with its own navigation entry) instead of folding coverage into the MySQL page. Along the way, found and documented that MariaDB Connector/J, unlike MySQL Connector/J, has no nullCatalogMeansCurrent-equivalent default: an unfiltered DatabaseMetaData#getTables() call leaks information_schema/performance_schema tables into dbUnit's table map, surfacing as a SQLSyntaxErrorException the moment an operation like DELETE_ALL touches one of them, unless MySqlMetadataHandler is registered or nullCatalogMeansCurrent=true is added to the JDBC URL. (Create Support for MariaDB #706) Thanks to estebanjgarcia.
Add DefaultPrepAndExpectedTestCase.setFailureHandler(FailureHandler), letting verifyData() use a caller-supplied FailureHandler such as DiffCollectingFailureHandler instead of the default fail-fast DefaultFailureHandler; unset (null) keeps the pre-existing default behavior unchanged. (Allow configuring the FailureHandler used by DefaultPrepAndExpectedTestCase #865) Thanks to jeffjensen.
Add DbUnitExtension, a JUnit 5/6 extension that manages IDatabaseTester lifecycle via BeforeTestExecutionCallback and AfterTestExecutionCallback, enabling composition-based DbUnit tests without subclassing DatabaseTestCase. (Add JUnit 5/6 extension module for @ExtendWith #751) Thanks to jeffjensen.
Add JsonDataSet, JsonProducer, and JsonWriter for reading and writing JSON-format datasets, including Ant // task support via a new "json" format; null column values are omitted on write and resolved from missing keys on read. (Add JSON datasets feature #752) Thanks to jeffjensen.
Add DatabaseConfig.FEATURE_SKIP_CYCLE_CHECK, an opt-in escape hatch letting DatabaseSequenceFilter proceed on a schema with a foreign-key dependency cycle instead of unconditionally rejecting it with CyclicTablesDependencyException (issues 501 and 517: dbUnit could not order, and therefore could not CLEAN_INSERT/DELETE_ALL, tables bound together by circular FK references). This is the configurable cycle-breaking escape hatch issue 411 originally proposed rather than a full topological resolution of the cycle itself: DatabaseSequenceFilter.sortTableNames now collapses each cycle into a single strongly-connected-component unit for ordering purposes and logs a warning per cycle instead of throwing, so a table outside the cycle is still correctly ordered relative to it (e.g. a table with its own FK to a cyclic table still sorts after the whole cycle, not merely after whichever cyclic member happened to be placed) and every requested table is still returned exactly once; only the relative order of the tables making up the cycle itself is unresolved and falls back to their original input order, leaving the caller responsible for making the cycle insertable another way (e.g. nullable FK columns populated in a later operation, or database-side deferred constraint checking). Off by default, preserving the existing fail-fast behavior for callers who never touch it. (DBUnit doesn't support circular references #501) Thanks to jeffjensen.
Add IsActualEqualToExpectedJsonValueComparer, a ValueComparer that parses expected and actual column values as JSON and compares the resulting document trees instead of their raw text: object member order is ignored while array element order stays significant, matching JSON's own equality semantics. Prompted by reviewing a Stack Overflow report of DbUnit failing on a MySQL JSON column; MySQL Connector/J already reports native JSON columns as Types.LONGVARCHAR, which DbUnit's existing StringDataType handles for reads/writes with no DataTypeFactory change needed, but MySQL (like PostgreSQL jsonb and H2 JSON) reformats the text on storage - sorting object keys and stripping insignificant whitespace - so a literal string comparison against an expected dataset value spuriously fails even when the JSON is semantically identical. Not exposed as a ValueComparers constant, since that class eagerly instantiates every constant it declares and would force the optional jackson-databind dependency onto every consumer, not only those comparing JSON columns. (Add JSON-semantic ValueComparer for comparing JSON/JSONB columns #921) Thanks to jeffjensen.
Add support for H2 2.x, whose rewritten, SQL-standard-compliant INFORMATION_SCHEMA reports most of its internal tables with the same JDBC TABLE_TYPE ("BASE TABLE") as real user tables instead of the "SYSTEM TABLE" type H2 1.x used, so those 15 tables (CONSTANTS, ENUM_VALUES, INDEXES, INDEX_COLUMNS, INFORMATION_SCHEMA_CATALOG_NAME, IN_DOUBT, LOCKS, QUERY_STATISTICS, RIGHTS, ROLES, SESSIONS, SESSION_STATE, SETTINGS, SYNONYMS, USERS) now pass DatabaseConfig#PROPERTY_TABLE_TYPE's default {"TABLE"} filter and leak into DatabaseDataSet#getTableNames()/createDataSet() whenever a connection queries without a fixed schema (schema is null, e.g. an admin/multi-schema connection with FEATURE_QUALIFIED_TABLE_NAMES). Bump h2DriverVersion from 1.4.200 to 2.4.240 and add H2MetadataHandler (wired into H2Connection) whose getTables() excludes the INFORMATION_SCHEMA schema; it builds the filtered result via a new InMemoryMetadataResultSet#filter(ResultSet, RowFilter) factory, generalized from the merge() factory MultiSchemaMySqlMetadataHandler already used (now a standalone org.dbunit.database class rather than that handler's private nested one). (H2 2.x INFORMATION_SCHEMA tables leak into unscoped table listings #923) Thanks to jeffjensen.
Add the IMetadataHandler Core Components page (components/imetadatahandler.adoc): the interface's method groups, a built-in-implementations table (DefaultMetadataHandler, Db2/MySql/MultiSchemaMySql/Netezza/H2MetadataHandler), and InMemoryMetadataResultSet's two factories (merge() for combining several real result sets, filter() for dropping rows out of one) with guidance on writing a custom handler. Update databases.adoc, databases/h2.adoc, properties.adoc, and components.adoc to reflect H2MetadataHandler and cross-reference the new page; properties.adoc's metadataHandler entry also gains the previously-undocumented MultiSchemaMySqlMetadataHandler. Add a Test Conventions section (codingstandards/testconventions.adoc) on preferring a delegating wrapper over subclassing a concrete vendor handler for test doubles, using DatabaseDataSet_MultiSchemaTest's TestMetadataHandler as the worked example. (H2 2.x INFORMATION_SCHEMA tables leak into unscoped table listings #923) Thanks to jeffjensen.
Add JsonType, recognized by PostgresqlDataTypeFactory for json and jsonb columns (reported as sql type OTHER), read/written as their raw text representation via the same reflection-based PGobject approach as UuidType/InetType/CitextType, so a bound parameter's PGobject type name always matches its target column exactly - PostgreSQL has no implicit cast between json and jsonb. Unlike the reporter's original 2015 patch attachment, setSqlValue() explicitly handles a null value (binding sql NULL) instead of dereferencing it, and typeCast() returns null for a null input. (PostgresqlDataTypeFactory support json type #574) Thanks to hieunv15.
Add ArrayType, recognized by PostgresqlDataTypeFactory for every array column (reported as sql type ARRAY, e.g. integer[], text[]), read/written as PostgreSQL's own array literal text representation (e.g. {1,2,3}); neither DefaultDataTypeFactory nor PostgresqlDataTypeFactory had any java.sql.Types.ARRAY handling before this. On write, the literal is split into its top-level elements - honoring double-quoted, backslash-escaped elements and the unquoted NULL keyword - and bound via the standard Connection#createArrayOf(String, Object[]), so PostgreSQL itself parses and validates each element against the column's actual base type instead of dbUnit typecasting elements itself; only single-dimension arrays are supported for writing, while reading one back for comparison or export works either way since the literal text is never parsed on read. (Postgres Aarray Datatype not recognized #646) Thanks to maheshmurali.
Fixed Bugs
Final link audit for the documentation overhaul: fix 33 pages across testcases/, datasets/, datacomparisons/, databases/, and anttask/ that linked to root-level or cross-directory site pages with a site-root-relative path (e.g. link:/operations.html[...]); the AsciiDoc link macro emits such paths literally, breaking navigation once deployed under GitHub Pages' /dbunit-extension/ subpath (confirmed against the rendered site.xml-driven nav, which does compute correct relative paths, unlike body-content links). Reorder site.xml's "Using DbUnit" menu to match this plan's target structure exactly. Confirmed every .adoc page is nav-reachable except the intentionally excluded components.adoc (WI-12) and the empty README.adoc (WI-02). (docs(site): Final repo-wide documentation link audit #862) Thanks to jeffjensen.
Replace TransactionOperationIT's dead JUnit-3-era runTest(String) feature gate (a leftover from the JUnit migration, never invoked under Jupiter) with a real @beforeeach Assumptions.assumeTrue(environmentHasFeature(TestFeature.TRANSACTION)) check, restoring the class's intended skip-on-unsupported-database protection. (TransactionOperationIT's TRANSACTION feature gate is silently inert #870) Thanks to jeffjensen.
Fix DbUnitAssertBase's JUnit-detection classpath probe, a leftover from the JUnit migration: it checked for junit.framework.Assert (JUnit 3/4), a class never present since the vintage engine was dropped, permanently disabling the JUnitFailureFactory path. Point the probe at org.junit.jupiter.api.Assertions instead. JUnitFailureFactory continues to return dbUnit's own DbComparisonFailure/DbAssertionFailedError (not a JUnit-framework-specific type) so that no dbUnit user incurs a runtime dependency on any particular test framework's failure classes; removed the stale comments and "TODO Junit5 update" left over from when this was last touched. (DbUnitAssertBase detects JUnit via a dead JUnit 3/4 classpath probe #872) Thanks to jeffjensen.
Split the enforcer plugin's requireJavaVersion rule from compileSource into a new enforcerJavaVersion property (17), since JUnit 6's class files require Java 17 to load (verified: bytecode major version 61) -- a build attempted on the previously-declared minimum, Java 8, could not run tests at all. compileSource (1.8) is unchanged and continues to set the shipped jar's bytecode level for consumers who don't need dbUnit's JUnit test-support classes. (Enforcer's requireJavaVersion still says Java 8, but JUnit 6 needs 17 #873) Thanks to jeffjensen.
Fix the "dbUnit in 5 Minutes" tutorial's contradictory prerequisites: it told new users "JDK 8 or newer" immediately above "JUnit 5 (org.junit.jupiter:junit-jupiter) on your test classpath", but the current JUnit Jupiter coordinates (6.x) cannot load on Java 8-16. Clarify that JDK 17+ is needed to build/run the tutorial's test, while JDK 8 remains sufficient for dbUnit's core API alone. (dbUnit in 5 Minutes tutorial gives contradictory JDK/JUnit prerequisites #874) Thanks to jeffjensen.
Fix AbstractDatabaseConnection.getRowCount(String, String) ignoring DatabaseConfig.PROPERTY_ESCAPE_PATTERN, mirroring the escape-pattern handling createTable() already applies, so a configured escape pattern is no longer silently dropped from the generated "select count(*)" SQL. (The method getRowCount(...) does not use escapePattern #492) Thanks to jeffjensen.
Fix DatabaseTableMetaData.getPrimaryKeys() returning an empty array whenever a configured PROPERTY_PRIMARY_KEY_FILTER matches zero columns for a table, instead of falling back to the table's database-declared primary key. Note: this makes the fallback unconditional whenever a filter yields zero columns for a table, which now overrides a filter deliberately configured to declare "this table has no PK". (Only single table with missing primary key failling #628) Thanks to jeffjensen.
Fix DatabaseDataSet.initialize() querying the driver/database info for debug logging after already opening the table metadata ResultSet instead of before, which could silently invalidate that still-open ResultSet on JDBC drivers that allow only a single active cursor per connection (e.g. SQL Anywhere, some legacy Sybase drivers). (If logger isDebug DatabaseDataSet ResultSet will be closed #460) Thanks to jeffjensen.
Fix FlatDtdWriter.write() emitting an invalid, unparseable "" DTD content model for a zero-table dataset. It now emits "" instead, which FlatDtdProducer already parses correctly and which, unlike EMPTY, still tolerates the whitespace a pretty-printed empty dataset file typically contains. (FlatDtdWriter produces invalid DTD from an empty database schema #542) Thanks to jeffjensen.
Fix all Javadoc warnings and errors reported by "mvnw site" (maven-javadoc-plugin's javadoc and test-javadoc reports), across 17 main and 5 test source files: @PARAM tags left mismatched by earlier signature or rename changes (DataFileLoader#load, the fileloader constructors, DefaultPrepAndExpectedTestCase#makeAdditionalColumnInfo, FlatXmlWriter/XmlDataSetWriter's Charset constructors), stale @see/@link references to renamed test methods and to classes not visible from the main sourcepath (test-only DefaultPrepAndExpectedTestCase siblings, an ant-testutils class, a decades-old dead reference in DbUnitTaskIT), an unresolvable cross-package @throws type in IDataSet, unescaped angle brackets and ampersands in Semaphore/Sync/FlatXmlDataSet code samples, mistyped @Author/@SInCE tags in UniqueIdentifierType, an invalid standalone @inheritdoc, and two placeholder "@SInCE " tags backfilled from git history (2.4.8, 2.4.7). (Fix Javadoc warnings and errors reported by mvnw site #886) Thanks to jeffjensen.
Run a full "mvnw clean install site" and fix everything it flagged. Removed the long-standing "FIXME remove -Xdoclint:none after JavaDoc cleanup" suppression from maven-javadoc-plugin's build and reporting configuration now that issue 886's cleanup is done, then fixed every doclint warning and error the removal surfaced across the main source tree: missing one-sentence class/interface/field summaries, including on the framework's core public API (IDatabaseConnection, IDatabaseTester, IDataSet, ITableMetaData, DataType, DatabaseOperation) whose methods were also missing @param/@return/@throws tags entirely; invalid HTML (unclosed and self-closing <p> tags, <code><pre> nesting, <xmp>/<tt> tags unsupported in HTML5, an unescaped "" literal, a table missing <caption>) throughout Doug Lea's vendored util.concurrent classes and elsewhere; an unresolvable {@link ITable} reference from a missing import; a typo'd </cde> closing tag and out-of-sequence heading in RelativeDateTimeParser; @see tags illegally wrapping {@link}; and stale @throws Exception tags left over from ISearchCallback/ISearchAlgorithm's narrowing to SearchException. Also fixed the compiler warnings the same build surfaced: a dead compilerVersion parameter, 21 non-varargs calls to varargs methods with an inexact array argument type (several of which were silently mis-formatting SLF4J debug messages by spreading an array's elements across a single "{}" placeholder instead of logging the array itself), and Surefire/Failsafe's deprecated systemProperties style. Finally, fixed all 54 Checkstyle violations the pinned checkstyle 13.3.0 engine reported once its (previously flaky-cached) dependency resolved correctly: missing @author/@Version Javadoc tags on 3.x-era classes that predate the project's tag convention, and two wildcard imports expanded to explicit ones. (Fix all warnings and errors from mvnw clean install site #902) Thanks to jeffjensen.
Fix all Asciidoctor warnings and errors reported by "mvnw site" rendering the doc site: two anttask.adoc/canoo-webtest-example.adoc heading levels jumping straight from the document title to level 2 instead of level 1; a numbered list in anttask.adoc splitting into a second, incorrectly-restarted list because its source-code block wasn't attached with a + list continuation; five anttask.adoc tables mistakenly using ! as the cell separator instead of |, which Asciidoctor doesn't recognize without a matching separator attribute; and four literal "[...]" elision markers in intro.adoc being misparsed as (invalid, empty) AsciiDoc block attribute lists, now backslash-escaped. Confirmed the remaining "Fallback behaviour for node: admonition/open" notices (verified present for every NOTE:/TIP:/etc. admonition and every "--" open block sitewide, not specific to any one page) are an architectural limitation of the Doxia Sink interface itself per Asciidoctor's own Maven Tools docs, not fixable via content changes or a newer asciidoctor-parser-doxia-module version. (Fix all warnings and errors from mvnw clean install site #902) Thanks to jeffjensen.
Fix the Javadoc @param/@return/@throws gaps across the main source tree that issue 902's from-scratch doclint pass left unaddressed since they are warnings, not build-failing errors: missing one-sentence summaries on classes/interfaces/methods/fields whose doc block was tag-only (doclint's "no main description"), entirely missing or description-less @param/@return/@throws tags, and missing field/method comments including on org.dbunit.assertion.DbComparisonFailure's and PropertyChangeMulticaster's private fields and readObject/writeObject methods, which doclint checks regardless of visibility once a class implements Serializable. (Document remaining Javadoc @param/@return/@throws gaps across main and test sources #904) Thanks to jeffjensen.
Fix DefaultPrepAndExpectedTestCase#verifyData false-failing tables whose generated/identity column is the first column and excluded from comparison: it always sorted the actual table by all of its native columns - identity column included - while the expected table, which never declares that column, sorted by data content only; excludeColumns/includeColumns were applied to the comparison but never to the sort. When production code does not guarantee row insertion order (e.g. Hibernate reordering a batch insert), the database's generated-ID assignment order then diverges from the data-content order, misaligning same-data rows and failing the comparison despite both sides holding identical data. Add VerifyTableDefinition#sortOnFilteredColumnsOnly (default false, preserving prior behavior), implementing the opt-in toggle proposed in issue 676: when true, both tables sort by only their excludeColumns/includeColumns-filtered columns instead of by all native columns. (PrepAndExpectedTestCase should only sort on filtered columns #672) Thanks to lufecir.
Fix NoSuchColumnException when two same-named tables merged by CompositeDataSet (e.g. from two separate flat-XML datasets both inserting into the same table) disagree on columns. A row belonging to a part that never declared an optional column crashed instead of being treated as not supplied, hitting InsertOperation's core insert path via equalsIgnoreMapping/getIgnoreMapping. InsertOperation.getIgnoreMapping/equalsIgnoreMapping now resolve such a column to ITable.NO_VALUE, the same sentinel already used to omit a column from a generated statement, instead of letting the row's NoSuchColumnException propagate. This is deliberately scoped to InsertOperation alone rather than CompositeTable itself: UpdateOperation and DeleteOperation bind every requested column's value directly with no equivalent ignore-mapping, so a genuinely missing column there must keep throwing instead of silently binding NULL into a WHERE clause. (NoSuchColumnException in second XmlDataSet #708) Thanks to roel-tjin.
Fix a flat XML/DTD table declared in the DTD but never appearing as a row element (a genuinely empty fixture table) being silently absent from the produced IDataSet: FlatXmlProducer only ever registered a table inside startElement()'s new-table handling, so a table with zero rows in a given fixture never entered the dataset at all, letting CLEAN_INSERT/DELETE_ALL skip it and risk a foreign-key violation against data a prior test left behind. FlatXmlProducer now cross-references every table name reported by the available metadata source (the parsed DTD, or an explicitly-supplied metadata IDataSet) against the tables actually encountered in the XML body once parsing finishes, and reports any still missing as an empty table using that source's column metadata. No-op, so behavior is unchanged, when no DTD or metadata dataset is available. (List of table not taken from DTD #496) Thanks to zigarn.
Add the none element to dataset.dtd's row content model and its own EMPTY declaration: XmlProducer and XmlDataSetWriter have read and written since the 2003-2004 Electric XML to SAX2 rewrite to represent ITable.NO_VALUE, but the shipped DTD never declared it (it was removed in 2002, before the rewrite reintroduced the element), so validating a document containing via XmlProducer#setValidating(true) failed with a DataSetException reporting the none element type as undeclared. (dataset.dtd does not declare the <none/> element used by XmlProducer/XmlDataSetWriter #925) Thanks to jeffjensen.
Fix DatabaseDataSet#getTable()/getTableMetaData() throwing NoSuchTableException for every table in a schema the very first time that schema is accessed under a different case than the database itself stored it in, when FEATURE_QUALIFIED_TABLE_NAMES is enabled (issue 656: a multi-schema PostgreSQL FlatXmlDataSet row like "CORE.USER" against a live "core" schema - PostgreSQL folds an unquoted schema name to lower case at creation time). DatabaseDataSet#initialize() passed the requested schema straight into IMetadataHandler#getTables(), whose underlying DatabaseMetaData#getTables() matches the schema pattern case-sensitively against the live catalog regardless of dbUnit's own FEATURE_CASE_SENSITIVE_TABLE_NAMES setting, so a wrongly-cased first request found zero tables - and DatabaseDataSet's own per-schema initialization cache then permanently remembered that schema as already-initialized-but-empty, so even a later, correctly-cased retry kept failing too. This also explains the original report's second observation, that later rows loaded fine once some earlier row happened to use the schema's actual case: that merely primed the cache under a casing OrderedTableNameMap's existing case-insensitive table lookup could then match. DatabaseDataSet now resolves a requested schema name against DatabaseMetaData#getSchemas()'s actual reported names, case-insensitively, before querying for tables, whenever FEATURE_CASE_SENSITIVE_TABLE_NAMES is off (the default); a schema that doesn't exist under any casing still resolves to zero tables exactly as before. (Postgresql with FEATURE_QUALIFIED_TABLE_NAMES and schemas in Uppercase results in NoSuchTableException #656) Thanks to jeffjensen.
Fix GenericEnumType.typeCast() throwing NullPointerException instead of returning null for a null value (issue 677: AbstractDataType.compare() calls typeCast() directly whenever comparing a null value against a non-null one - reached by any Assertion/DbUnitAssert comparison involving a null-valued native-enum column). Tracing the same defect shape through the rest of org.dbunit.ext.postgresql's reflection-based PGobject types (issue 930) found the identical gap in UuidType, InetType, and CitextType: none of the four null-checked in typeCast(), and their setSqlValue() overrides bypass typeCast() entirely to call a private PGobject-building helper (getEnum()/getUUID()/getInet()/getCitext()) that also dereferences the value unconditionally, so a direct setSqlValue(null, ...) call would separately NPE too. All four now return null from typeCast() for a null input and bind sql NULL from setSqlValue() before ever reaching the PGobject-building helper, matching the pattern JsonType (issue 574) already established. Added PostgresqlNullableOtherTypesIT, round-tripping a null uuid/inet/citext row through CLEAN_INSERT against a live PostgreSQL 16 container; GenericEnumType's fix is proven at the unit level only - writing the live round-trip test surfaced a separate, pre-existing defect (issue 933) that leaves GenericEnumType unreachable for a real table column via CLEAN_INSERT regardless of null handling. (AbstractDataType.compare and GenericEnumType.typeCast #677) Thanks to arrom.
Fix PostgreSQLOidDataType#getSqlValue() failing an entire read whenever an oid column's value doesn't reference an actual large object (issue 693: a PostgreSQL oid column is a generic object identifier, not necessarily a large object reference - e.g. a real catalog object's own oid, such as a table's oid via 'sometable'::regclass, the original report's own example). PostgreSQL reports this case as SQLState 42704 (undefined_object, exposed by the driver as PSQLState.UNDEFINED_OBJECT); getSqlValue() now distinguishes it from every other failure and returns null instead, while any other SQLException (a genuine access/permission error, for example) still propagates exactly as before - the method previously had this exact swallow-everything attempt commented out, with a note that doing so unconditionally would hide real errors, which is why a SQLState-based check was needed rather than a blanket catch. PostgreSQL aborts the whole enclosing transaction on any failed command, so the large-object open now runs under a savepoint: on failure, rolling back to it clears the abort without discarding any other work already done in that transaction, keeping the connection usable for the rest of the read (proven by PostgresSQLOidIT reading two distinct non-large-object oids back to back). Added Mockito-based PostgreSQLOidDataTypeTest coverage for the zero-oid, genuine-large-object, not-a-large-object, and other-SQLException-still-propagates cases. (PostgreSQLOidDataType should not fail if OID is not a LargeObject #693) Thanks to coiouhkc.
Changes
Expand datacomparisons/equality.adoc with the real equality-comparison examples (assertEquals usage, query-based snapshots, column-filtered comparison, row-ordering) moved from howto.adoc's "Dbunit data verification" section, bringing it to parity with its valuecomparer.adoc sibling. (docs(site): Fill in datacomparisons/equality.adoc with real examples #844) Thanks to jeffjensen.
Rewrite datatypes.adoc: its TOC listed 19 data types but the body documented only 2. Add a full reference table (Java type + notes) for all 19 org.dbunit.dataset.datatype types, and new detailed sections for NumberTolerantDataType/ToleratedDeltaMap, StringIgnoreCaseDataType, and UuidAwareBytesDataType (the latter's uuid'...' literal syntax was previously documented only in the FAQ, which now links here). (docs(site): Fix datatypes.adoc to document all 19 data types #845) Thanks to jeffjensen.
Shrink components.adoc to a pointer stub now that connections.adoc, datasets.adoc, and operations.adoc have extracted its substantive content: every former in-page anchor still exists and redirects to its new home, so old bookmarks/search results don't 404. Remove "Core Components" from site.xml's nav menu; the page remains on disk, reachable only by direct URL. Fix all repo-wide cross-references to the old components.html#... anchors (howto.adoc, anttask.adoc, src/site/fml/faq.fml). The one former components.adoc section with no existing destination page, DatabaseSequenceFilter, seeds a new filters.adoc (Table Filters/DatabaseSequenceFilter only for now) that WI-16 will expand into the full consolidated Filters guide. (docs(site): Shrink components.adoc to a pointer stub and fix cross-references #850) Thanks to jeffjensen.
Trim howto.adoc from a 518-line monolith into a short "Getting Started" orientation hub, redistributing its substantive content to the pages that now own each topic. Add datacomparisons/failurehandling.adoc (FailureHandler/DiffCollectingFailureHandler, for collecting every comparison difference instead of failing on the first) and anttask/canoo-webtest-example.adoc (the dated Ant+Canoo WebTest walkthrough), both nested in site.xml under their parent page. Fix the one remaining repo-wide cross-reference to a howto.html anchor this trim removed (src/site/fml/faq.fml's columnfilter entry). (docs(site): Trim howto.adoc and redistribute its content #851) Thanks to jeffjensen.
Reframe testcases.adoc (site menu label "Test Integration", URL unchanged) to explicitly present composition (IDatabaseTester) and inheritance (DBTestCase and its 3 subclasses) side by side, recommending composition per CLAUDE.md's stated preference while keeping inheritance fully documented. Move the DBTestCase subclass setup steps here from howto.adoc, correcting the JUnit 5 @BeforeEach/@AfterEach gap identified while writing the DBTestCase-family pages in WI-05. (docs(site): Reframe testcases.adoc as the Test Integration overview #852) Thanks to jeffjensen.
Expand filters.adoc (seeded in WI-12 with only DatabaseSequenceFilter) into the full consolidated Filters guide: table filters (IncludeTableFilter/ExcludeTableFilter, SequenceTableFilter, PrimaryKeyFilter, and the TablesDependencyHelper convenience API behind DatabaseSequenceFilter), column filters (IColumnFilter/DefaultColumnFilter, GeneratedColumnFilter), and row filters (IRowFilter/RowFilterTable, previously documented only in the FAQ). Add cross-links from the FAQ's columnfilter and rowfilter entries to this page. (docs(site): Add consolidated Filters guide #854) Thanks to jeffjensen.
Add a "Where to Start" paragraph to index.adoc linking to dbUnit in 5 Minutes, Getting Started, Test Integration, and Datasets — the homepage previously had no body-text links to any of these, leaving discovery entirely to the left nav. (docs(site): Add body links to index.adoc #858) Thanks to jeffjensen.
Add a CachingConnectionProvider subsection to bestpractices.adoc's "Connection management strategies", presenting it as the recommended modern approach for connection reuse across test methods ahead of the dated "override closeConnection() with an empty body" technique, which the page previously covered without mentioning the new (3.4.0-SNAPSHOT) alternative at all. (docs(site): Document CachingConnectionProvider in bestpractices.adoc #859) Thanks to jeffjensen.
Reframe intro.adoc: it is a reprinted early-2000s philosophical essay that read as if it might be current dbUnit-specific guidance. Add a framing note at the top pointing new users to the 5-minute tutorial/Getting Started first, rename its site.xml menu label to "Database Testing Concepts", and reposition it later in the menu, near Best Practices, instead of near the top. (docs(site): Reframe intro.adoc as background reading #860) Thanks to jeffjensen.
Add a "What This Automates For You" section to testcases/PrepAndExpectedTestCase.adoc, documenting DefaultPrepAndExpectedTestCase's automatic behaviors confirmed against its source (multi-file dataset composition, row sorting via SortedTable, expected/actual column type and case reconciliation, VerifyTableDefinition column include/exclude filtering, ValueComparer dispatch, and the expected-table/VerifyTableDefinition count safety check) that a hand-coded approach would otherwise need to implement itself. (docs(site): Document PrepAndExpectedTestCase's automatic behaviors #863) Thanks to jeffjensen.
Convert properties.adoc's per-item Feature Flags and Properties subsections into two consolidated tables (Flag/Feature ID/Default/Description; Property ID/Default/Description/Note), preserving all 17 existing anchors that other pages link to. Discovered and worked around a pre-existing rendering limitation in this project's Doxia/Asciidoctor table integration: the a| AsciiDoc-content cell style is not processed at all (anchors, bullet lists, and inline formatting inside it render as literal unprocessed text, confirmed empirically and reproduced against the unmodified pre-session file) -- plain | cells work correctly, including inline anchors, links, xrefs, and + explicit line breaks, so both new tables use plain cells exclusively. (docs(site): Convert properties.adoc Feature Flags/Properties to consolidated tables #864) Thanks to jeffjensen.
Generalize current-tense "JUnit 5" wording to "JUnit 5/6" in fiveminutes.adoc, testcases.adoc, and testcases/MigratingToIDatabaseTester.adoc, now that the project ships and tests against JUnit 6 (same org.junit.jupiter:junit-jupiter coordinates, so this is a wording generalization, not a correction). Left historical-milestone text (index.adoc's "Since 3.0.0..." framing) and changes.xml action text untouched, since those describe what was true at the time. (Generalize current-facing "JUnit 5" doc wording to JUnit 5/6 #877) Thanks to jeffjensen.
Rewrite components.adoc from an anchor-preserving redirect stub into a real class-by-class "Core Components" index, grouped by area, linking to each class's topic page (or its new dedicated page, for the 4 classes that didn't have one). Add it back to site.xml's "Using DbUnit" nav, between Database-Specific Guides and Best Practices. (docs(site): Rewrite components.adoc as Core Components index, add nav #885) Thanks to jeffjensen.
Rewrite devguide.adoc from a stale, kitchen-sink page (SourceForge-era license/JavaDoc example, an Fnnn/Bnnn commit-prefix convention contradicting actual Conventional Commits usage, "master" instead of "main," and a dead mail-lists.html link) into the "Developing DbUnit" section's orientation hub, with a Contributor Quick Start checklist and links to every page in the section. Wire site.xml's "Developing DbUnit" menu to the full new nested structure (Coding Standards and GitHub Workflow each with 3 children). (docs(site): Rewrite Developers Guide as Developing DbUnit hub #897) Thanks to jeffjensen.
Add a Quality Gates section to building.adoc listing what runs where and whether it fails the build, confirmed directly against pom.xml: Modernizer and Enforcer do fail the build, Checkstyle/JaCoCo/japicmp do not. Also note the Europe/Berlin fixed test timezone Surefire and Failsafe both force, previously undocumented anywhere on the site. (docs(site): Add Quality Gates section to Building page #898) Thanks to jeffjensen.
Cross-link the new changelog.adoc from releasing.adoc's two changes.xml touch points, replacing a "see CONTRIBUTING.md" pointer to content that has moved. (docs(site): Cross-link Changelog from Releasing page #900) Thanks to jeffjensen.
Reduce FlatXmlProducer memory footprint: column names built from SAX attribute names, previously a fresh String per occurrence even when identical to one already seen elsewhere in the document, now flow through a per-parse cache so repeated column names across rows and tables share one String instance instead of each Column retaining its own duplicate copy. Attribute values are left untouched since they are far less likely to repeat. (Reduce FlatXmlProducer memory footprint #512) Thanks to slandelle.
Remove the dead JUnit-3-era runTest(String)/runTest() gating-hook override chain from AbstractDatabaseIT, AbstractTableTest, TruncateTableOperationIT, and InsertIdentityOperationIT: a leftover from the JUnit migration, never invoked under Jupiter (there is no TestCase base to call it), and redundant with each class's already-active @EnabledIfSystemProperty/@DisabledIfSystemProperty gating. (Remove dead JUnit-3-era runTest(String) gating hooks #869) Thanks to jeffjensen.
Remove 27 orphaned JUnit Platform @Suite/@SelectClasses aggregator classes (AllTestsSuite/AllAssertionTestSuite/DatabaseTestSuite across nearly every package): a leftover JUnit 3/4-era "suite of suites" pattern that Surefire/Failsafe's filename-pattern test discovery (**/*Test.java, **/*IT.java) never executed, confirmed unreferenced by any CI workflow, build script, site doc, or IDE configuration. (Remove 27 orphaned JUnit Platform @Suite aggregator classes #871) Thanks to jeffjensen.
Remove the two Eclipse launch configs ("dbUnit tests - derby.launch", "dbUnit tests - hsqldb.launch"), last updated in 2024 and still set to Eclipse's JUnit 4 test loader, which cannot discover or run this project's pure-Jupiter test suite at all; both also carried dbunit.profile.unsupportedFeatures VM arguments that had drifted from the current *-dbunit.properties files. Removed rather than fixed, per maintainer confirmation that no one relies on Eclipse-native (non-Maven) test runs for these profiles. (Remove Eclipse .launch configs stuck on the JUnit 4 test loader #875) Thanks to jeffjensen.
Remove the dead org.hamcrest:* pattern from dependabot.yml's test-dependencies group: hamcrest has not been a dependency since the JUnit migration (no hamcrestVersion property, no org.hamcrest import anywhere), so the pattern has silently matched zero packages on every Dependabot run. (dependabot.yml groups a dead org.hamcrest:* pattern #876) Thanks to jeffjensen.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
This release reflects a strong focus on A documentation site overhaul (new tutorials, 10 database vendor guides, a class-by-class Core Components reference, and a new Developing DbUnit contributor section); several new capabilities including DbUnitExtension for native JUnit 5/6 lifecycle management, a JSON dataset format with a matching JSON ValueComparer, MariaDB and H2 2.x database support, expanded PostgreSQL json/jsonb and array type support, and an opt-in escape hatch for schemas with circular foreign keys; and a broad set of correctness and performance fixes spanning metadata handling, DTD/XML export, PostgreSQL null-safety and large-object handling, and FlatXmlProducer memory use.
Feedback and bug reports are always welcome via GitHub Issues.
New features
jsonandjsonbcolumns (reported as sql type OTHER), read/written as their raw text representation via the same reflection-based PGobject approach as UuidType/InetType/CitextType, so a bound parameter's PGobject type name always matches its target column exactly - PostgreSQL has no implicit cast betweenjsonandjsonb. Unlike the reporter's original 2015 patch attachment, setSqlValue() explicitly handles a null value (binding sql NULL) instead of dereferencing it, and typeCast() returns null for a null input. (PostgresqlDataTypeFactory support json type #574) Thanks to hieunv15.integer[],text[]), read/written as PostgreSQL's own array literal text representation (e.g.{1,2,3}); neither DefaultDataTypeFactory nor PostgresqlDataTypeFactory had any java.sql.Types.ARRAY handling before this. On write, the literal is split into its top-level elements - honoring double-quoted, backslash-escaped elements and the unquoted NULL keyword - and bound via the standard Connection#createArrayOf(String, Object[]), so PostgreSQL itself parses and validates each element against the column's actual base type instead of dbUnit typecasting elements itself; only single-dimension arrays are supported for writing, while reading one back for comparison or export works either way since the literal text is never parsed on read. (Postgres Aarray Datatype not recognized #646) Thanks to maheshmurali.Fixed Bugs
<p>tags,<code><pre>nesting,<xmp>/<tt>tags unsupported in HTML5, an unescaped "" literal, a table missing<caption>) throughout Doug Lea's vendored util.concurrent classes and elsewhere; an unresolvable {@link ITable} reference from a missing import; a typo'd</cde>closing tag and out-of-sequence heading in RelativeDateTimeParser; @see tags illegally wrapping {@link}; and stale @throws Exception tags left over from ISearchCallback/ISearchAlgorithm's narrowing to SearchException. Also fixed the compiler warnings the same build surfaced: a dead compilerVersion parameter, 21 non-varargs calls to varargs methods with an inexact array argument type (several of which were silently mis-formatting SLF4J debug messages by spreading an array's elements across a single "{}" placeholder instead of logging the array itself), and Surefire/Failsafe's deprecated systemProperties style. Finally, fixed all 54 Checkstyle violations the pinned checkstyle 13.3.0 engine reported once its (previously flaky-cached) dependency resolved correctly: missing @author/@Version Javadoc tags on 3.x-era classes that predate the project's tag convention, and two wildcard imports expanded to explicit ones. (Fix all warnings and errors from mvnw clean install site #902) Thanks to jeffjensen.+list continuation; five anttask.adoc tables mistakenly using!as the cell separator instead of|, which Asciidoctor doesn't recognize without a matchingseparatorattribute; and four literal "[...]" elision markers in intro.adoc being misparsed as (invalid, empty) AsciiDoc block attribute lists, now backslash-escaped. Confirmed the remaining "Fallback behaviour for node: admonition/open" notices (verified present for every NOTE:/TIP:/etc. admonition and every "--" open block sitewide, not specific to any one page) are an architectural limitation of the Doxia Sink interface itself per Asciidoctor's own Maven Tools docs, not fixable via content changes or a newer asciidoctor-parser-doxia-module version. (Fix all warnings and errors from mvnw clean install site #902) Thanks to jeffjensen.oidcolumn's value doesn't reference an actual large object (issue 693: a PostgreSQLoidcolumn is a generic object identifier, not necessarily a large object reference - e.g. a real catalog object's own oid, such as a table's oid via'sometable'::regclass, the original report's own example). PostgreSQL reports this case as SQLState 42704 (undefined_object, exposed by the driver asPSQLState.UNDEFINED_OBJECT); getSqlValue() now distinguishes it from every other failure and returns null instead, while any other SQLException (a genuine access/permission error, for example) still propagates exactly as before - the method previously had this exact swallow-everything attempt commented out, with a note that doing so unconditionally would hide real errors, which is why a SQLState-based check was needed rather than a blanket catch. PostgreSQL aborts the whole enclosing transaction on any failed command, so the large-object open now runs under a savepoint: on failure, rolling back to it clears the abort without discarding any other work already done in that transaction, keeping the connection usable for the rest of the read (proven by PostgresSQLOidIT reading two distinct non-large-object oids back to back). Added Mockito-based PostgreSQLOidDataTypeTest coverage for the zero-oid, genuine-large-object, not-a-large-object, and other-SQLException-still-propagates cases. (PostgreSQLOidDataType should not fail if OID is not a LargeObject #693) Thanks to coiouhkc.Changes
a|AsciiDoc-content cell style is not processed at all (anchors, bullet lists, and inline formatting inside it render as literal unprocessed text, confirmed empirically and reproduced against the unmodified pre-session file) -- plain|cells work correctly, including inline anchors, links, xrefs, and+explicit line breaks, so both new tables use plain cells exclusively. (docs(site): Convert properties.adoc Feature Flags/Properties to consolidated tables #864) Thanks to jeffjensen.Removed
All reactions