DanielLeens commented on PR #11485:
URL: https://github.com/apache/seatunnel/pull/11485#issuecomment-5379364883

   Fresh-run check-in, independently re-verified against the bare mirror rather 
than assumed. As the author, GitHub does not permit self-approval, so this is 
recorded as a plain issue comment and does not satisfy the repository approval 
gate.
   
   **What changed since my last review (2026-08-21T14:23:37Z):** nothing on the 
code side. `headRefOid` is still `9f534f6800ad6f1a476452e56511bb167726734b`, no 
new commits, no new comments, no other reviewer has weighed in (there are zero 
inline review threads and every review on this PR is mine). I did not take that 
on faith — I diffed `dev...refs/pr-review/11485` directly against the bare 
mirror (17 files, 315 insertions / 4 deletions across `docs/`, `connector-jdbc` 
main+test sources, and `connector-jdbc-e2e-part-7`) and re-read every changed 
file's current content from the object store, not from memory of the prior 
round. My conclusion is unchanged — this is still **not ready to merge** — but 
I re-derived every finding against the actual current source below, and I'm 
also flagging one thing my last review didn't check: the PR's live mergeability.
   
   **New in this round: the PR is not mergeable.** `gh pr view` currently shows 
`mergeStateStatus: DIRTY`, `mergeable: CONFLICTING`, `isDraft: true`. The 
branch is `61` commits behind `dev` (`ahead_by=5, behind_by=61`, `diverged`). 
None of my prior reviews checked this — I'd only verified CI, which is green 
but is a fork-side pointer against a stale base. This needs a rebase onto 
current `dev` before it can even be test-merged, independent of the two open 
code issues below.
   
   # What Problem Does This PR Solve?
   - **User pain point:** before this PR, `TIMESTAMP_TZ`-typed JDBC columns 
either failed discovery outright (Teradata, Vertica, Db2 for z/OS — no mapping 
case, `CommonError.convertToSeaTunnelTypeError`), produced a column with an 
unhandled JDBC 4.2 `Types.TIMESTAMP_WITH_TIMEZONE` code, or were silently 
flattened to timezone-naive `TIMESTAMP` with the offset discarded and no error 
(Presto's precision-qualified type name, and the shared legacy metadata 
fallback used by every dialect without its own `mappingColumn(BasicTypeDefine)` 
implementation).
   - **Fix approach:** add the missing type-mapping cases in five places 
(generic JDBC 4.2 converter, Db2, Presto, Teradata, Vertica); canonicalize 
Presto's precision-qualified type name before the pre-existing paren-truncation 
step; recognize proprietary native type names (`TIMESTAMPTZ`, `TIMESTAMP(n) 
WITH TIME ZONE`) in the shared legacy fallback via a regex; add a Db2-specific 
value-read branch that recovers the offset the IBM driver's `getString()` 
normally strips.
   - **One-sentence summary:** the Db2, Presto, and generic-JDBC-4.2 legs of 
this PR are correctly and rigorously implemented and tested end-to-end, but 
Teradata and Vertica are given the exact same "offset preserved" contract in 
the docs and type mappers while their actual *value*-read path is untested and 
can silently fall back to a conversion the code's own comment says is 
unreliable — that gap is why I still can't approve this.
   
   # 1. Code Change Review
   
   ## 1.1 Core Logic Analysis
   
   Re-read from the current head, not assumed:
   
   - **Generic JDBC 4.2** (`GenericTypeConverter.java:170-173`): 
`Types.TIMESTAMP_WITH_TIMEZONE` now maps to `OFFSET_DATE_TIME_TYPE`. 
`reconvert()` in this class throws `UnsupportedOperationException` 
unconditionally for every type (pre-existing, unrelated to this PR) — no 
asymmetry introduced here.
   - **Db2 for z/OS** (`DB2TypeConverter.java:224-229`): 
`DB2_TIMESTAMP_WITH_TIME_ZONE = "TIMESTAMP WITH TIME ZONE"` is a new switch 
case in `convert()` mapping to `OFFSET_DATE_TIME_TYPE`. I checked whether the 
matching `reconvert()` (sink schema-creation direction) has a `TIMESTAMP_TZ` 
case — it does not, so a `TIMESTAMP_TZ` column written to a Db2 sink with 
auto-create-table enabled would hit `default:` and throw 
`CommonError.convertToConnectorTypeError`. This looked like a real gap until I 
checked the docs: `docs/en/connectors/sink/Jdbc.md` explicitly states *"Auto 
table creation remains available only for dialects that provide a catalog and a 
timezone-aware type converter; Db2 does not currently provide JDBC auto table 
creation."* So this is a disclosed, deliberate scope boundary, not an 
overlooked bug — good that it's documented rather than silently discovered by a 
user.
   - **Value-read path for Db2** (`JdbcFieldTypeUtils.java:186-196`): 
`com.ibm.db2.jcc.DBTimestamp` is detected by class name and its offset is 
recovered via reflection (`toDBString(true)`) rather than a direct import, even 
though `db2jcc` is already a `compile`-scope dependency of this module 
(confirmed in `connector-jdbc/pom.xml`, unchanged by this PR) and the new unit 
test (`JdbcFieldTypeUtilsTest.java`) imports `DBTimestamp` directly. The 
reflection isn't wrong — it fails loud via `SQLException` if the method 
signature ever changes — but it's more defensive than necessary given the 
direct dependency is already there and already used in the test. Low-severity, 
non-blocking style note.
   - **Presto** (`PrestoTypeMapper.java:69-75`): 
`columnType.startsWith(PRESTO_TIMESTAMP) && columnType.contains("WITH TIME 
ZONE")` canonicalizes `timestamp(3) with time zone` to the exact-match constant 
*before* the pre-existing `"(" `-index truncation runs. I checked the ordering 
is load-bearing: without it, `"TIMESTAMP(3) WITH TIME ZONE".split("\\(")[0]` 
would produce `"TIMESTAMP"`, colliding with plain `TIMESTAMP` and silently 
dropping the offset — exactly the bug this PR fixes. Verified end-to-end via a 
real Presto container in 
`JdbcPrestoIT.testTimestampWithTimeZoneMappingAndValue`, which pins 
`timeZoneId=UTC` on the JDBC URL and asserts an exact `OffsetDateTime` (not 
just "didn't throw").
   - **Teradata / Vertica** (`TeradataTypeMapper.java:95-96`, 
`VerticaTypeMapper.java:161-163`): metadata mapping is correct for the 
*exact-string* case (`"TIMESTAMP WITH TIME ZONE"` / `"TIMESTAMPTZ"`), but see 
Issues 1 and 2 below — both the value-read path and part of the discovery path 
have real gaps that Db2 and Presto don't.
   - **Legacy metadata fallback** (`JdbcColumnConverter.java`): 
`TIMESTAMP_WITH_TIMEZONE` is correctly split out of the previously-shared 
`TIMESTAMP` case (was: both mapped to `LOCAL_DATE_TIME_TYPE`, silently dropping 
the offset for any dialect using this fallback and reporting JDBC type `-101`). 
I also checked the new `isTimestampWithTimeZone(nativeType)` regex 
(`TIMESTAMP(?:\s*\(\s*\d+\s*\))?\s+WITH\s+TIME\s+ZONE`, used with `.matches()` 
against the fully-uppercased, trimmed native type name) against Oracle's 
`TIMESTAMP(n) WITH LOCAL TIME ZONE`, which is a *different* semantic type 
(session-relative, no explicit per-row offset) — the regex requires `WITH` 
immediately followed by `TIME`, so `"...WITH LOCAL TIME ZONE"` does not match 
and is correctly left alone. Oracle has its own dedicated `OracleTypeConverter` 
anyway, so this fallback wouldn't apply to it in practice, but it's good that 
the regex doesn't create a latent trap if a similar LTZ-style dialect string 
ever reaches this
  path.
   
   **Full runtime path for the still-open value-path gap** (Issue 1), traced 
from `AbstractJdbcRowConverter` down to the exact fallback branch, re-verified 
line-for-line against the current head:
   
   ```text
   AbstractJdbcRowConverter.toInternal(...)
     -> case TIMESTAMP_TZ:                                         
[AbstractJdbcRowConverter.java:121-125]
         -> JdbcFieldTypeUtils.getOffsetDateTime(rs, idx)           
[JdbcFieldTypeUtils.java:163-]
             -> resultSet.getObject(columnIndex)
             -> not OffsetDateTime / ZonedDateTime / Instant / DBTimestamp
             -> instanceof Timestamp branch                        
[JdbcFieldTypeUtils.java:198-212]
                 -> resultSet.getString(columnIndex)                // 
Teradata/Vertica drivers land here
                 -> parseOffsetDateTimeFromString(strVal)
                     -- driver renders a numeric offset ("+08:00") -> parses 
correctly
                     -- driver renders a region-ID zone (e.g. "... 
Asia/Shanghai") -> parse throws
                 -> catch (Exception e):
                        return ((Timestamp) 
obj).toInstant().atOffset(ZoneOffset.UTC)
                     -- this is exactly the conversion the method's own comment 
two lines above
                        warns against: "Avoid using Timestamp.toInstant() 
directly because the
                        Timestamp was constructed with JVM-default-timezone 
semantics, which would
                        shift the value by the JVM offset" — used here as a 
silent last resort,
                        with no log, no exception, no error code
   ```
   
   **Key findings:**
   1. This is not a boundary/exception-only path for Teradata/Vertica — it is 
their *only* value-read path for `TIMESTAMP_TZ` columns, reached on every 
normal row read once discovery has (correctly) mapped the column to 
`OFFSET_DATE_TIME_TYPE`. Before this PR, such columns never reached this code 
at all (discovery failed loudly first, per 
`CommonError.convertToSeaTunnelTypeError`); this PR's own metadata fix is what 
routes them into a value-read path that was hardened for Db2 (reflection-based, 
driver-specific) and Presto (proven via real container) but not for them.
   2. `Timestamp.toInstant()` on a `java.sql.Timestamp` that a driver 
constructed via JVM-default-timezone semantics from a TZ-aware SQL value can 
represent the **wrong instant**, not merely the right instant with a mislabeled 
offset — that's precisely why the surrounding code has a comment warning not to 
use it directly, yet the catch-block fallback does exactly that, silently.
   3. Teradata's own IT test is `@Disabled("Disabled because it needs user's 
personal teradata account to run this test!")` (`JdbcTeradataIT.java:37`) and 
Vertica's is `@Disabled` pending a usable container image 
(`JdbcVerticaIT.java:38`) — confirmed by reading both files directly. So the 
two dialects with the weakest value-path guarantee are also the two with no 
possible way to catch a regression here in this repo's CI, now or in the future 
without infrastructure changes.
   4. Separately: `TeradataTypeMapper`/`VerticaTypeMapper`'s 
`mapping(ResultSetMetaData, int)` switches on the raw, un-canonicalized 
`getColumnTypeName(...)` with no paren-stripping — so it cannot match a 
precision-qualified name like `TIMESTAMP(6) WITH TIME ZONE`. I confirmed this 
PR's own 
`TimestampWithTimeZoneTypeMappingTest.testTableMetadataFallbackRecognizesProprietaryTypeCodes`
 asserts Teradata reports exactly `"TIMESTAMP(6) WITH TIME ZONE"` — but that 
assertion goes through `JdbcColumnConverter`'s regex-based fallback, not 
through `TeradataTypeMapper.mapping()` itself, where the same 
precision-qualified string would fall to `default:` and throw. 
`JdbcColumnConverter` (regex) and `PrestoTypeMapper` (explicit 
canonicalization) both handle this correctly; Teradata/Vertica's own mappers do 
not.
   
   ## 1.2 Compatibility Impact
   
   **Partially incompatible in effect, not in API/config/SPI/serialization.** 
No option, public API, or checkpoint/savepoint state is touched. The one real 
behavioral flip: `JdbcColumnConverter.java` splits `TIMESTAMP_WITH_TIMEZONE` 
out of the previously-shared `TIMESTAMP` case in the generic fallback, so any 
existing job whose driver reports raw JDBC type `-101` through that fallback 
path — not just the five dialects named in this PR's title, but *any* 
mapper-less dialect routed there — will see its inferred schema flip from 
`TIMESTAMP` to `TIMESTAMP_TZ` on the next catalog discovery. 
`docs/en/introduction/concepts/incompatible-changes.md` already has a general 
"Breaking Change: Mapping of timezone-aware timestamp columns to `TIMESTAMP_TZ` 
type" entry from an earlier PR (#10685, same class of change, same author) with 
per-dialect sub-bullets (Snowflake, StarRocks, Hudi, CDC, Iceberg, Xugu) — this 
PR does not add a sub-bullet there for the newly-covered dialects (Db2, Presto, 
T
 eradata, Vertica, and the generic-fallback case), even though it follows the 
exact same established pattern that file's own convention calls for. This is a 
real, checkable documentation-completeness gap against the project's own 
established practice for this exact change class (Issue 5).
   
   ## 1.3 Performance / Side-Effect Analysis
   
   No new I/O, threads, or locks on a hot path; the regex/string 
canonicalization in `JdbcColumnConverter`/`PrestoTypeMapper` runs once per 
column at discovery time, not per row. 
`PrestoDialect.supportsPrimaryKeyMetadata()` now returning `false` changes 
runtime behavior for every Presto `table_path`-based job by skipping 
`getPrimaryKeys(...)` entirely in `CatalogUtils.getTableSchema(...)` — I traced 
this is a real, connected fix (not scope creep): `getPrimaryKey(...)` is 
exactly what previously ran unconditionally in that method, and this PR's own 
new test `testPrestoSkipsUnsupportedPrimaryKeyMetadata` confirms the change is 
deliberate. It's undisclosed in the PR description/docs, though — worth a 
one-line explanation of *why* Presto's PK metadata query needed to be skipped 
(Issue 7, non-blocking).
   
   ## 1.4 Error Handling and Logging
   
   See Issue 1 above/below — the silent fallback is the substantive 
error-handling gap in this diff. Everything else in the diff either throws 
loudly (`CommonError.convertToConnectorTypeError`/`convertToSeaTunnelTypeError` 
for unmapped types, `SQLException` for the Db2 reflective-call failure path) or 
is a pure, side-effect-free mapping addition.
   
   **Issue 1: Teradata/Vertica `TIMESTAMP_TZ` values flow exclusively through a 
fallback that can silently produce the wrong instant, with zero achievable 
value-path test coverage**
   - Location: `TeradataTypeMapper.java:95-96`, 
`VerticaTypeMapper.java:161-163` (routing), `JdbcFieldTypeUtils.java:201-212` 
(the actual fallback)
   - Problem: neither driver returns a `java.time` object or a 
`DBTimestamp`-like wrapper for a TZ column, so both land in the generic 
`Timestamp` branch, which re-reads via `getString()` and, on any unparseable 
rendering (e.g. a region-ID zone name instead of a numeric offset), silently 
substitutes `Timestamp.toInstant().atOffset(UTC)` — the exact conversion the 
method's own adjacent comment warns can shift the value by the JVM's default 
offset.
   - Potential risk: for a feature whose entire purpose is offset preservation, 
a previously loud discovery-time failure (`CommonError`) becomes a silent, 
plausible-looking, potentially wrong value at row-read time, specifically on 
the two dialects with no possible CI coverage in this repo today (Teradata 
`@Disabled`, needs a personal account; Vertica `@Disabled`, no usable container 
image).
   - Best improvement: Option A — implement real, driver-verified 
`TIMESTAMP_TZ` read overrides for Teradata/Vertica (mirroring the Db2 approach) 
backed by driver-mocked unit tests that exercise the actual value path, not 
just metadata mapping. Option B — scope Teradata and Vertica out of this PR's 
mappers and docs entirely, and land Db2/Presto/generic-JDBC-4.2 now (all three 
are proven with real evidence); revisit Teradata/Vertica once their value path 
has real coverage. I'd lean toward B given neither dialect can be exercised in 
this repo's CI as things stand.
   - Severity: High
   - Raised by another reviewer: No — my own finding.
   
   **Issue 2: Teradata/Vertica metadata mapping can't match a 
precision-qualified type name, contradicting this PR's own test fixture**
   - Location: `TeradataTypeMapper.java:66,95`, 
`VerticaTypeMapper.java:100,161-162`
   - Problem: both mappers switch on the raw, un-canonicalized column type 
name, so only the exact string `TIMESTAMP WITH TIME ZONE` matches, while 
`JdbcColumnConverter`'s regex and `PrestoTypeMapper`'s explicit 
canonicalization both correctly accept the precision-qualified form 
`TIMESTAMP(n) WITH TIME ZONE` — which this PR's own 
`TimestampWithTimeZoneTypeMappingTest` fixture asserts Teradata actually 
reports (just through a different code path than the one that would really run 
for a `query =`-configured Teradata source).
   - Potential risk: a Teradata/Vertica source configured with `query =` (a 
mainstream configuration path, not the catalog/table_path path) throws 
`CommonError.convertToSeaTunnelTypeError` on exactly the columns this PR 
advertises as newly supported. Loud, not silent, hence Medium rather than High.
   - Best improvement: extract a shared canonicalization helper (generalizing 
`JdbcColumnConverter`'s regex or `PrestoTypeMapper`'s prefix-check) and call it 
from both mappers' `mapping(...)` overrides, with a test that drives it through 
the mappers themselves rather than only through the fallback.
   - Severity: Medium
   - Raised by another reviewer: No.
   
   # 2. Code Quality Assessment
   
   ## 2.1 Coding Standards
   
   License headers, AOSP/Spotless formatting, no wildcard imports, no 
`System.out.println`, no special-symbol comments — all compliant on inspection. 
Comments explain *why* rather than restating code (e.g. the ordering-constraint 
comment in `PrestoTypeMapper`, the JVM-offset-shift warning in 
`JdbcFieldTypeUtils`). Non-blocking: 
`PrestoDialect.supportsPrimaryKeyMetadata()` has no explanatory comment for 
*why* Presto needs this override (1.3); the new Presto/Teradata/Vertica 
canonicalization calls plain `toUpperCase()` rather than 
`toUpperCase(Locale.ROOT)`, inconsistent with `JdbcColumnConverter`'s own 
`Locale.ROOT` usage added in this same PR (Issue 6, Low).
   
   ## 2.2 Test Coverage and Test Stability
   
   **Stability rating: Stable.** The Db2 unit test 
(`JdbcFieldTypeUtilsTest.testGetOffsetDateTimeFromDb2TimestampPreservesOffsetAndTruncatesPicos`)
 and the Presto E2E (`JdbcPrestoIT.testTimestampWithTimeZoneMappingAndValue`) 
are both deterministic: no `Thread.sleep`, `LIMIT 1` is safe against a fixed 
3-row fixture, the Presto assertion pins the session zone via `timeZoneId=UTC` 
on the JDBC URL rather than depending on the runner's default zone, and both 
use strict `OffsetDateTime`/`assertEquals` comparisons rather than a weak 
"didn't throw" check. No flaky-test anti-patterns in the new/changed test code.
   
   Coverage gap — this is Issue 1's other half: Teradata has zero achievable 
value-path coverage in this repo today; Vertica's IT is disabled pending a 
container image. The new `TimestampWithTimeZoneTypeMappingTest` for both 
dialects only exercises `mapping(ResultSetMetaData, int)` via mocks 
(metadata/schema-shape correctness), never the row-value read that Issue 1 
concerns — so the new tests genuinely improve discovery-time confidence but say 
nothing about the specific gap that's blocking this PR.
   
   ## 2.3 Documentation Updates
   
   `docs/en`/`docs/zh` `Jdbc.md` (source and sink) are updated in parallel and 
structurally consistent between languages. I spot-checked the factual claims 
against the code: the Db2 auto-table-creation limitation and the 
12-fractional-digit truncation are both accurate. Gap: the docs give an 
unqualified "value is represented by `java.time.OffsetDateTime`" guarantee 
across all five dialects with no caveat for the two (Teradata, Vertica) whose 
value path is unproven per Issue 1 — and, per 1.2, no incompatible-changes.md 
sub-bullet for this PR's specific dialects (Issue 5, Medium, non-blocking on 
its own but connected to Issue 1's severity).
   
   # 3. Architectural Soundness
   
   ## 3.1 Elegance of the Solution
   
   Each change lands at the layer that owns the concern — per-dialect 
mappers/converters for schema mapping, the shared 
`AbstractJdbcRowConverter`/`JdbcFieldTypeUtils` for value conversion, the 
generic fallback for mapper-less dialects. The Presto reordering fix is a 
small, surgical correction to a genuine pre-existing bug. The one structural 
inconsistency: type-name recognition for the "with time zone" pattern is 
expressed three different ways across this PR (regex in the shared fallback, 
explicit prefix-check in Presto, exact-string switch in Teradata/Vertica) — 
this PR synced Presto's canonicalization but not Teradata/Vertica's, which is 
the direct root cause of Issue 2. A single shared predicate used by all four 
native-type-name-based mappers would remove this class of drift permanently — 
this is a **precise fix for Db2/Presto/generic**, but a **partial/incomplete 
fix for Teradata/Vertica** given Issues 1 and 2.
   
   ## 3.2 Maintainability
   
   Solid overall: constants carry rationale, ordering constraints are commented 
where they matter. `normalizeDb2OffsetDateTimeString` is invoked from the 
shared `parseOffsetDateTimeFromString` rather than scoped to the Db2-only call 
site — harmless given how specific its regex is (it only matches Db2's 
`yyyy-mm-dd-hh.mm.ss` external format), but it's slightly wider coupling than 
strictly needed. The reflective `toDBString(boolean)` call has no compile-time 
safety net against a driver upgrade changing that method's signature, but fails 
loud via `SQLException` rather than silently, which is the right failure mode 
if it ever breaks.
   
   ## 3.3 Extensibility
   
   The per-dialect mapper/converter split and the new 
`supportsPrimaryKeyMetadata()` hook are both clean extension seams. Extracting 
the shared type-name-recognition predicate discussed in 3.1 would directly 
resolve Issue 2 and make the next dialect's "with time zone" support trivial to 
add correctly.
   
   ## 3.4 Historical-Version Compatibility
   
   No serialization, checkpoint/savepoint, config option, or public API surface 
is touched by this diff — a job restored from an existing checkpoint is 
unaffected at the state level. The only historical-compatibility consideration 
is the inferred-schema flip covered in 1.2, which the project's existing 
general `incompatible-changes.md` entry already covers as a change class; a 
per-dialect sub-bullet for this PR's five dialects would be a precision 
improvement consistent with that file's own established convention, not a 
net-new compatibility requirement.
   
   # 4. Issue Summary
   
   | # | Issue | Location | Severity |
   |---|-------|----------|----------|
   | 1 | Teradata/Vertica `TIMESTAMP_TZ` values flow only through a fallback 
that can silently produce the wrong instant on parse failure; zero achievable 
value-path test coverage | `TeradataTypeMapper.java:95-96`, 
`VerticaTypeMapper.java:161-163`, `JdbcFieldTypeUtils.java:201-212` | High |
   | 2 | Teradata/Vertica metadata mapping can't match `TIMESTAMP(n) WITH TIME 
ZONE`, contradicting this PR's own test fixture | 
`TeradataTypeMapper.java:66,95`, `VerticaTypeMapper.java:100,161-162` | Medium |
   | 3 | No incompatible-changes.md sub-bullet for this PR's specific dialects, 
despite the project's own established convention for this exact change class | 
`docs/en/introduction/concepts/incompatible-changes.md` | Medium |
   | 4 | `PrestoDialect.supportsPrimaryKeyMetadata()` behavior change is real 
and tested but undisclosed/uncommented as to *why* | `PrestoDialect.java:43-46` 
| Low |
   | 5 | Db2 `DBTimestamp` access uses reflection despite `db2jcc` already 
being a compile-scope dependency used directly in this PR's own test | 
`JdbcFieldTypeUtils.java:186-196` | Low |
   | 6 | Presto/Teradata/Vertica canonicalization uses locale-sensitive 
`toUpperCase()` instead of `Locale.ROOT`, inconsistent with 
`JdbcColumnConverter` in the same PR | `PrestoTypeMapper.java:71`, 
`TeradataTypeMapper.java:66`, `VerticaTypeMapper.java:100` | Low |
   | 7 | Docs give an unqualified `OffsetDateTime`-preservation guarantee for 
all five dialects with no caveat for the two whose value path is unproven | 
`docs/en(zh)/connectors/source/Jdbc.md` | Low, follows from Issue 1 |
   
   # 5. Merge Recommendation
   
   ### Conclusion: Not recommended for merge
   
   1. **Blockers — must be fixed**
      - Issue 1 (High): give Teradata/Vertica a real, driver-verified 
`TIMESTAMP_TZ` value-read path, or scope both out of this PR's mappers/docs and 
land the proven Db2/Presto/generic-JDBC-4.2 work now.
      - Issue 2 (Medium, blocking as-is because it leaves the same two dialects 
half-delivered against their own advertised contract): make Teradata/Vertica's 
metadata mapping recognize the precision-qualified form. This dissolves 
automatically if Issue 1 is resolved via the scope-out option.
      - **Gate, not code:** the branch must be rebased onto current `dev` — 
it's currently `61` commits behind with `mergeable: CONFLICTING` / 
`mergeStateStatus: DIRTY`. This is independent of Issues 1-2 and needs to 
happen regardless of which fix direction is chosen.
   
   2. **Recommended fixes — non-blocking**
      - Issues 3-7 as itemized above (incompatible-changes.md sub-bullet, 
`PrestoDialect` disclosure comment, Db2 reflection-vs-direct-import 
simplification, `Locale.ROOT` consistency, doc caveat scoped to the proven 
dialects).
   
   **Option A vs Option B:** (A) finish Teradata/Vertica's value-path properly 
in this PR — the row-converter seam already exists, so this is plausible; or 
(B) land the proven Db2/Presto/generic-JDBC-4.2 work now and split 
Teradata/Vertica into a follow-up once their value path has real, achievable 
coverage. I'd lean toward (B): it ships three of five dialects against fully 
verified evidence (a real Presto container with exact-instant assertions, and 
Db2's reflection-based offset recovery which I traced end-to-end against the 
actual `DBTimestamp` class this module already depends on) without letting two 
currently-untestable dialects hold up work that's already solid.
   
   **CI:** green on the current head (`Build`, `Notify test workflow`, 
`labeler` all pass) — not itself a blocker, and unaffected by any of the issues 
above since none of them are exercised by CI-reachable tests.
   
   **Overall assessment:** the Db2, Presto, and generic-JDBC-4.2 legs of this 
PR are genuinely well-built and thoroughly verified — the Presto ordering fix 
in particular closes a real silent-data-loss bug with solid container-based 
proof, and the Db2 doc already gets ahead of its own auto-table-creation 
limitation rather than leaving users to discover it. But Teradata and Vertica 
are given the identical "offset preserved" promise in the docs and type mappers 
as the three proven dialects, without the value-path correctness or achievable 
test coverage to back that promise — and that's a real risk for a feature whose 
entire point is not silently losing timezone information. I'd merge confidently 
today if this were scoped to Db2/Presto/generic, or if Issue 1 were closed with 
real coverage for Teradata/Vertica; as-is, I'm not approving my own PR.
   
   As the author, this review is a technical self-check recorded as a plain 
comment; it does not count toward the approval gate. A write-capable maintainer 
still needs to review and approve once Issues 1-2 and the rebase are resolved.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to