Test/spark geospatial - #35
Merged
Merged
Conversation
added 3 commits
July 31, 2026 09:21
PR #32 replaced the Flink suite with a stronger, Docker-driven one, but its report dropped the fields the EMR, Glue, Dataproc and Spark reports carry, so a Flink run could no longer be read the same way as the others. In particular it had no notion of matrix coverage, which is what stops a feature added to features.json from sitting untested indefinitely. Add platform, platform_label, catalog_mode, versions_tested and coverage to the JSON report plus summary.uncovered_features, render the matching header lines, the uncovered-features row and the coverage section in the markdown, and let uncovered features fail the run as they already do for Spark. Also make the comparison target configurable through MATRIX_PLATFORM_ID, MATRIX_DATA_PATH, PLATFORM_LABEL and MATRIX_CATALOG_MODE, so the suite is no longer pinned to the OSS Flink cells. Nothing about how tests execute changed: the docker/local modes, the 35 tests, their per-version runs and every result they produce are untouched. The two things the merged suite added that the older report lacked, the unverified count and the execution mode, are kept and now sit alongside the coverage row. Verified by building one synthetic result per test and version, then asserting the report fields and every markdown fragment, including re-rendering with a feature dropped to prove the uncovered section and the failing exit code work. Coverage reads 35/35 with no ids outside the matrix.
Adds Redshift to the managed-engine drivers. A low-RPU Serverless workgroup joins the existing stack, and the suite is driven through the Redshift Data API rather than shipped to a cluster, so it runs in the runner and needs no bundle or entry point. Two things about Redshift shaped the design. Writes need an external schema that names the IAM role. Creating an Iceberg table through the auto-mounted awsdatacatalog fails with "No session credential found": that path authorises data access with the caller's IAM session, and a Data API connection authenticated as a database user has none. S3 Tables needs a Glue resource link. A table bucket is a federated Glue catalog and Redshift cannot name one directly; putting the federated path in CATALOG_ID silently resolves against the default catalog instead, so the schema is created and every SELECT then raises EntityNotFoundException. With a resource link in the default catalog, and CATALOG_ID set to the plain account id, Redshift creates, reads, updates and deletes Iceberg tables in S3 Tables. Some features cannot be tested against a table Redshift is able to create: it refuses format-version 3 outright. Spark on EMR builds those fixtures instead and the suite reads and writes them, which separates "cannot write" from "cannot read". Redshift turns out to read v3 tables and apply deletion vectors correctly while refusing every v3 write, so those cells are partial rather than absent. A new "partial" result records that, and compute_match requires partial to meet partial exactly, so the level is falsifiable instead of matching anything. Also fixes two leaks found on the way. DROP TABLE removes only the Glue entry in the s3buckets mode, leaving the data behind, so the suite deletes its own S3 prefix; and the shared teardown never swept the fixture warehouse, which holds real Parquet. Verified against Redshift 1.0.365190 on 8 RPU, both modes, with the fixtures in place and no leftover billable resources afterwards.
Fourteen cells disagreed with what the engine actually does. Both modes claimed copy-on-write and time travel; neither exists. Redshift is merge-on-read only and refuses the write.delete.mode property outright, and no time-travel syntax is accepted at all, with no snapshot metadata table to fall back on. The S3 Tables file was the staler of the two and had the catalog story backwards. It said S3 Tables uses its own built-in catalog rather than Glue, and that Redshift consumes the REST API. It is the other way round: Glue is the only way Redshift reaches S3 Tables, through a resource link, and it has no Iceberg REST client whatsoever. Three cells become partial because the feature is genuinely half-present. Redshift reads format-version 3 tables and applies deletion vectors correctly, but refuses every v3 write; and on S3 Tables, PARTITIONED BY at CREATE is accepted and then silently discarded while ALTER ADD PARTITION FIELD does apply, so transform partitioning takes two statements instead of one. Each entry now carries the engine's own error text in its caveats, so a future reader can tell why a cell says what it says without rerunning anything. equality-deletes is deliberately left alone. Its notes claim Redshift reads equality deletes, and all that could be established is that Redshift never writes them, which does not contradict a read claim. No fixture carrying equality deletes could be produced, because Spark writes position deletes, so the cell stays unverified rather than being changed on a hunch. Both storage modes now report zero discrepancies.
PyIceberg Feature Test Report
Summary
Test Results
|
DuckDB Iceberg Feature Test Report
Summary
Test Results
|
ClickHouse Iceberg Feature Test Report
Summary
Test Results
|
Iceberg Feature Test Report (Spark, V2 + V3)
Summary
Matrix coverage: 35/35 features in Test Results
|
Flink Iceberg Feature Test Report
Summary
Matrix coverage: 35/35 features in Test Results
UnverifiedThese could not be exercised here, so they neither confirm nor contradict the matrix:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.