Skip to content

fix(dataset): Fix NoSuchColumnException in CompositeTable.getValue - #908

Merged
jeffjensen merged 1 commit into
mainfrom
708-compositetable-missing-column
Aug 5, 2026
Merged

jeffjensen merged 1 commit into
mainfrom
708-compositetable-missing-column

Conversation

@jeffjensen

@jeffjensen jeffjensen commented Aug 5, 2026

Copy link
Copy Markdown
Member

CompositeDataSet merges same-named tables from separate datasets (e.g. two flat-XML files both inserting into the same table) into a single CompositeTable that exposes only the first part's metadata. Reading a column that a later part never itself declared threw NoSuchColumnException instead of being treated as not supplied, surfacing through InsertOperation's core insert path via equalsIgnoreMapping/getIgnoreMapping.

  • CompositeTable.getValue() now resolves such a column to ITable.NO_VALUE for that part's rows - the same sentinel InsertOperation already uses to omit a column from a generated statement - instead of letting the part's own NoSuchColumnException propagate.
  • Add CompositeTableTest, InsertOperationTest, and InsertOperationIT regression coverage; all three reproduce the original stack trace when the fix is reverted.

Refs: 708

Claude-Session: https://claude.ai/code/session_01Pe1saB9qxPumJjvBLLGFKj

Summary by Sourcery

Handle optional columns consistently when CompositeDataSet merges tables with divergent schemas so InsertOperation can omit missing columns instead of failing with NoSuchColumnException.

Bug Fixes:

  • Resolve CompositeTable.getValue calls for metadata-declared but part-missing columns to ITable.NO_VALUE instead of throwing NoSuchColumnException.
  • Ensure InsertOperation omits optional columns for dataset parts that do not declare them when generating insert SQL from merged tables.
  • Fix InsertOperation integration with CompositeDataSet loading from multiple flat XML datasets where only some declare an optional column.

Documentation:

  • Document CompositeTable behavior for metadata columns absent from a part's own metadata in class Javadoc and changelog.

Tests:

  • Add CompositeTableTest coverage for getValue behavior when columns are missing from one part's metadata.
  • Add InsertOperationTest to verify insert SQL omits optional columns for merged datasets with divergent columns.
  • Add InsertOperationIT regression test for inserting from CompositeDataSet built from two flat XML datasets with mismatched optional columns.

Summary by CodeRabbit

  • Bug Fixes

    • Fixed inserts from merged datasets when an optional column is missing from one source.
    • Missing optional values now correctly become database NULL instead of causing an error.
    • Preserved values for columns present in other source datasets.
  • Documentation

    • Updated the changelog with details of the fix.

@sourcery-ai

sourcery-ai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Reviewer's Guide

Fixes CompositeTable.getValue to safely handle columns present in composite metadata but missing from some backing tables by returning ITable.NO_VALUE instead of propagating NoSuchColumnException, and adds regression tests in dataset and operation layers plus a changes.xml entry for issue #708.

Sequence diagram for CompositeTable.getValue handling missing columns in InsertOperation

sequenceDiagram
    participant InsertOperation
    participant CompositeTable
    participant PartTable as ITable_part
    participant Columns

    InsertOperation->>CompositeTable: getValue(row, columnName)
    CompositeTable->>PartTable: getRowCount()
    Note right of CompositeTable: locate part backing row
    CompositeTable->>CompositeTable: isMissingFromPart(columnName, PartTable)
    CompositeTable->>Columns: getColumn(columnName, _metaData.getColumns())
    Columns-->>CompositeTable: Column or null
    CompositeTable->>Columns: getColumn(columnName, PartTable.getTableMetaData().getColumns())
    Columns-->>CompositeTable: Column or null

    alt column present in part
        CompositeTable->>PartTable: getValue(relativeRow, columnName)
        PartTable-->>CompositeTable: value
        CompositeTable-->>InsertOperation: value
    else column missing from part
        CompositeTable-->>InsertOperation: ITable.NO_VALUE
    end

    alt value == ITable.NO_VALUE
        InsertOperation->>InsertOperation: omit column from generated statement
    else value supplied
        InsertOperation->>InsertOperation: include column in generated statement
    end
Loading

File-Level Changes

Change Details Files
Handle divergent column sets across CompositeTable parts by treating missing-part columns as NO_VALUE instead of throwing.
  • Document in CompositeTable Javadoc that columns missing from a backing part resolve to ITable.NO_VALUE.
  • Update CompositeTable.getValue to short-circuit when a requested column is absent from the backing part table but present in the composite metadata.
  • Introduce private helper isMissingFromPart to detect columns present in composite metadata but absent from a specific part's metadata.
src/main/java/org/dbunit/dataset/CompositeTable.java
Add focused unit coverage for CompositeTable.getValue when parts have different column sets.
  • Add test ensuring CompositeTable.getValue returns the real value when the backing part declares the column.
  • Add test ensuring CompositeTable.getValue returns ITable.NO_VALUE when the backing part does not declare the column but the composite metadata does.
src/test/java/org/dbunit/dataset/CompositeTableTest.java
Add InsertOperation unit and integration regression tests for CompositeDataSet scenarios with optional columns.
  • Extend InsertOperationTest with a case where a CompositeTable merges two tables sharing a name but disagreeing on an optional column, asserting that the optional column is omitted for rows from the part that lacks it.
  • Add an integration test in InsertOperationIT building two FlatXmlDataSet instances for the same table with and without an optional column, combined via CompositeDataSet, and assert both rows insert successfully with NULL for the missing optional column.
  • Wire necessary imports for CompositeTable, CompositeDataSet, and StringReader in test classes.
src/test/java/org/dbunit/operation/InsertOperationTest.java
src/test/java/org/dbunit/operation/InsertOperationIT.java
Record the fix for issue #708 in the project change log.
  • Add a changes.xml entry describing the CompositeTable/InsertOperation fix for divergent columns across merged tables.
  • Attribute the fix to the appropriate developer and reporter, including issue metadata.
src/changes/changes.xml

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@jeffjensen, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 20 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 35bd9efd-6f22-4987-99c5-4049033072ea

📥 Commits

Reviewing files that changed from the base of the PR and between 604bb2b and 484c026.

📒 Files selected for processing (6)
  • src/changes/changes.xml
  • src/main/java/org/dbunit/operation/InsertOperation.java
  • src/test/java/org/dbunit/dataset/CompositeTableTest.java
  • src/test/java/org/dbunit/operation/DeleteOperationTest.java
  • src/test/java/org/dbunit/operation/InsertOperationIT.java
  • src/test/java/org/dbunit/operation/InsertOperationTest.java
📝 Walkthrough

Walkthrough

CompositeTable now returns ITable.NO_VALUE when a merged table part lacks a column exposed by composite metadata. Unit and insertion tests cover divergent columns and database NULL results.

Changes

CompositeTable optional column handling

Layer / File(s) Summary
Handle missing composite columns
src/main/java/org/dbunit/dataset/CompositeTable.java, src/changes/changes.xml
CompositeTable.getValue returns ITable.NO_VALUE when the selected backing table lacks a composite column. The changelog and class documentation describe the behavior.
Validate merged-table insertion
src/test/java/org/dbunit/dataset/CompositeTableTest.java, src/test/java/org/dbunit/operation/InsertOperationTest.java, src/test/java/org/dbunit/operation/InsertOperationIT.java
Tests cover direct retrieval and insertion when merged table parts use different column sets. Omitted columns remain NULL in the integration test.

Estimated code review effort: 2 (Simple) | ~10 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main fix for NoSuchColumnException in CompositeTable.getValue.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 708-compositetable-missing-column

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 1 issue, and left some high level feedback:

  • In CompositeTable.isMissingFromPart, you repeatedly scan both the composite and part metadata via Columns.getColumn on every getValue call; consider caching a column lookup map or reusing existing metadata structures to avoid repeated linear scans on hot paths.
  • The new InsertOperationIT test asserts specific row ordering when reading back from EMPTY_TABLE without an explicit ORDER BY; to avoid potential flakiness across databases, consider either enforcing a deterministic ordering (e.g., via a primary key) or relaxing the assertions to be order-insensitive.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In CompositeTable.isMissingFromPart, you repeatedly scan both the composite and part metadata via Columns.getColumn on every getValue call; consider caching a column lookup map or reusing existing metadata structures to avoid repeated linear scans on hot paths.
- The new InsertOperationIT test asserts specific row ordering when reading back from EMPTY_TABLE without an explicit ORDER BY; to avoid potential flakiness across databases, consider either enforcing a deterministic ordering (e.g., via a primary key) or relaxing the assertions to be order-insensitive.

## Individual Comments

### Comment 1
<location path="src/test/java/org/dbunit/dataset/CompositeTableTest.java" line_range="93-102" />
<code_context>
+        connection.verify();
+    }
+
     @Test
     void testExecute_withEscapePatternConfigured_schemaTableAndColumnNamesEscaped() throws Exception
     {
</code_context>
<issue_to_address>
**suggestion (testing):** Add a test to ensure columns not present in CompositeTable metadata still throw NoSuchColumnException

To fully pin down the behaviour and prevent regressions, please also add a test asserting that `getValue` still throws `NoSuchColumnException` when the requested column is absent from the composite metadata itself. This will confirm the new `isMissingFromPart` logic doesn’t mask exceptions for truly unknown columns.

Suggested implementation:

```java
        assertThat(renamed.getRowCount()).as("row count preserved.").isEqualTo(1);
        assertThat(renamed.getValue(0, "VAL")).as("row data preserved.").isEqualTo("hello");
    }

    @Test
    void testGetValue_whenColumnMissingFromCompositeMetaData_throwsNoSuchColumnException()
            throws Exception
    {
        final Column[] columns = new Column[] {new Column("COL1", DataType.INTEGER)};
        final DefaultTable table = new DefaultTable("TABLE_1", columns);
        table.addRow(new Object[] {1});

        final CompositeTable composite =
                new CompositeTable(table.getTableMetaData(), new ITable[] {table});

        assertThatThrownBy(() -> composite.getValue(0, "UNKNOWN_COL"))
                .isInstanceOf(NoSuchColumnException.class)
                .hasMessageContaining("UNKNOWN_COL");
    }

    // -------------------------------------------------------------------------
    // getValue(int, String) across parts with divergent columns (issue #708)
    // -------------------------------------------------------------------------

```

To compile:
1. Ensure `assertThatThrownBy` is statically imported (e.g. `import static org.assertj.core.api.Assertions.assertThatThrownBy;`) if not already present.
2. Confirm `CompositeTable`, `ITable`, and `NoSuchColumnException` imports are present in this test class; if not, add:
   - `import org.dbunit.dataset.CompositeTable;`
   - `import org.dbunit.dataset.ITable;`
   - `import org.dbunit.dataset.NoSuchColumnException;`
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread src/test/java/org/dbunit/dataset/CompositeTableTest.java
@jeffjensen jeffjensen linked an issue Aug 5, 2026 that may be closed by this pull request

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8d6a2cbea6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/main/java/org/dbunit/dataset/CompositeTable.java Outdated
Comment thread src/main/java/org/dbunit/dataset/CompositeTable.java Outdated
Comment thread src/test/java/org/dbunit/operation/InsertOperationIT.java Outdated
jeffjensen added a commit that referenced this pull request Aug 5, 2026
…alue

fixup! fix(dataset): Fix NoSuchColumnException in CompositeTable.getValue

Address sourcery-ai review feedback on PR #908:
* CompositeTable.getValue() validates columnName against this table's own
  metadata once via the O(1) cached AbstractTableMetaData#getColumnIndex,
  instead of rescanning _metaData.getColumns() with Columns.getColumn on
  every call; only one linear scan (over the smaller part-table column
  list) remains, addressing the flagged hot-path concern.
* Add CompositeTableTest coverage asserting a column absent from the
  composite's own metadata still throws NoSuchColumnException, pinning
  down that isMissingFromPart cannot mask a genuinely unknown column.
* Make InsertOperationIT's new test order-insensitive when reading rows
  back without an ORDER BY, matching by COLUMN0 instead of assuming a
  particular physical row order across database vendors.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pe1saB9qxPumJjvBLLGFKj
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@jeffjensen

Copy link
Copy Markdown
Member Author

Addressed both overall comments in 3d99ac3 (fixup, will squash into 8d6a2cb before merge):

  • Hot-path scanning: CompositeTable.getValue() now validates columnName against _metaData once via AbstractTableMetaData#getColumnIndex's existing O(1) cached lookup (built lazily on first use, same idiom the class already uses elsewhere), instead of a second Columns.getColumn linear scan over _metaData.getColumns(). Only one linear scan remains — over the specific backing part's own, typically small, column list — since there's no cheaper existing primitive for "does this part declare this column" without adding new per-part caching state. Didn't add that: CompositeTable is only used for explicit multi-source merges, not the framework's default single-table path, so the extra complexity didn't look proportionate here.
  • IT row ordering: good catch — reading back from EMPTY_TABLE without an ORDER BY isn't guaranteed to preserve insertion order across all 9 supported DB profiles this IT runs against. Rewrote the assertions to match rows by their COLUMN0 identifier instead of assuming index 0/1 map to insertion order.

Also added the suggested unknown-column regression test (replied inline). Full unit suite (1945 tests) and the hsqldb-2-7 integration profile both green after these changes.

@jeffjensen
jeffjensen force-pushed the 708-compositetable-missing-column branch from 3d99ac3 to 7781c02 Compare August 5, 2026 02:27
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

jeffjensen added a commit that referenced this pull request Aug 5, 2026
…alue

fixup! fix(dataset): Fix NoSuchColumnException in CompositeTable.getValue

Address chatgpt-codex-connector review feedback on PR #908 (P1 correctness
issue): the fix belonged in InsertOperation, not CompositeTable.

CompositeTable.getValue() is shared by every DatabaseOperation, not just
InsertOperation. UpdateOperation and DeleteOperation never override
getIgnoreMapping/equalsIgnoreMapping (they use AbstractBatchOperation's
no-op defaults), so they bind every requested column's value directly --
including primary-key columns in a WHERE clause. Making CompositeTable
itself resolve a missing column to ITable.NO_VALUE meant a CompositeTable
part missing a primary-key column would silently bind SQL NULL into a
DELETE/UPDATE WHERE clause instead of throwing, causing a silent no-op
instead of a clear error. RefreshOperation's own update/exists-check paths
have the same direct-bind exposure; only its insert-new-row path reuses
InsertOperation's methods and so correctly keeps the new leniency.

* Revert CompositeTable.java to its pre-#708 state -- back to unconditional
  delegation, no missing-column handling. This also resolves a separate
  flagged concern about ColumnFilterTable-wrapped parts, since CompositeTable
  no longer makes any assumption about a part's own declared columns at all.
* Move the fix into InsertOperation.getIgnoreMapping/equalsIgnoreMapping via
  a new getValueOrNoValueIfMissing helper, so only INSERT's already-existing
  ignore-mapping mechanism (which omits the column from the generated
  statement entirely) can ever substitute NO_VALUE for a missing column.
* Replace the two CompositeTableTest additions with one confirming
  CompositeTable.getValue() still throws for this exact scenario --
  documenting that the leniency intentionally does not live there.
* Add a DeleteOperationTest regression test proving a CompositeTable part
  missing a primary-key column still throws NoSuchColumnException rather
  than silently deleting zero rows.
* Update the changes.xml entry to describe the corrected fix location and
  scoping rationale.

InsertOperationTest and InsertOperationIT needed no changes: the externally
observable INSERT behavior (SQL generated, rows inserted) is identical
under the corrected implementation.

Full unit suite (1945 tests) and the hsqldb-2-7 Insert/Delete/Update/Refresh
operation ITs (35 tests) all green.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pe1saB9qxPumJjvBLLGFKj
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@jeffjensen

Copy link
Copy Markdown
Member Author

Codex's P1 comment was right and caught a real correctness bug in the previous round — thanks for the sharp review. Summary of what changed in 52c5f6a (fixup, will squash before merge):

The fix moved from CompositeTable to InsertOperation. Making CompositeTable.getValue() itself resolve a missing column to ITable.NO_VALUE affected every consumer, not just InsertOperation. UpdateOperation/DeleteOperation never override getIgnoreMapping/equalsIgnoreMapping (they use AbstractBatchOperation's no-op defaults), so they bind every requested column directly — including primary keys in a WHERE clause. A CompositeTable part missing a PK column would have silently bound SQL NULL there instead of throwing, turning a DELETE/UPDATE into a silent no-op instead of a clear error. RefreshOperation's update/exists-check paths bind directly the same way; only its insert-new-row path reuses InsertOperation's methods.

  • CompositeTable.java is now back to its pre-NoSuchColumnException in second XmlDataSet #708 state: unconditional delegation, no missing-column handling at all. This also resolves the ColumnFilterTable concern for free, since CompositeTable no longer makes any assumption about what a part's own metadata does or doesn't declare.
  • The actual fix now lives in InsertOperation.getIgnoreMapping/equalsIgnoreMapping, via a new getValueOrNoValueIfMissing helper that catches NoSuchColumnException and substitutes NO_VALUE — scoped so only insert's own ignore-mapping (which omits the column from the generated statement) can ever use it.
  • Added a DeleteOperationTest regression test proving a CompositeTable part missing a primary-key column still throws NoSuchColumnException rather than silently deleting zero rows.
  • Replaced the two CompositeTableTest additions with one confirming CompositeTable.getValue() still throws for the divergent-columns scenario, documenting that the leniency deliberately does not live there.
  • InsertOperationTest/InsertOperationIT needed no changes — the externally observable INSERT behavior is identical under the corrected implementation.

Full unit suite (1945 tests) and the hsqldb-2-7 Insert/Delete/Update/Refresh operation integration tests (35 tests) all green after the change.

CompositeDataSet merges same-named tables from separate datasets (e.g.
two flat-XML files both inserting into the same table) into a single
CompositeTable that exposes only the first part's metadata. Reading a
column that a later part never itself declared threw NoSuchColumnException
instead of being treated as not supplied, surfacing through
InsertOperation's core insert path via equalsIgnoreMapping/getIgnoreMapping.

* CompositeTable.getValue() now resolves such a column to ITable.NO_VALUE
  for that part's rows - the same sentinel InsertOperation already uses to
  omit a column from a generated statement - instead of letting the part's
  own NoSuchColumnException propagate.
* Add CompositeTableTest, InsertOperationTest, and InsertOperationIT
  regression coverage; all three reproduce the original stack trace when
  the fix is reverted.

Refs: 708

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pe1saB9qxPumJjvBLLGFKj
@jeffjensen
jeffjensen force-pushed the 708-compositetable-missing-column branch from 52c5f6a to 484c026 Compare August 5, 2026 02:46
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@jeffjensen
jeffjensen merged commit d4cd39c into main Aug 5, 2026
27 checks passed
@jeffjensen
jeffjensen deleted the 708-compositetable-missing-column branch August 5, 2026 03:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NoSuchColumnException in second XmlDataSet

1 participant