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
Surfaced by the multi-language coverage fan-out while conformance-testing these SPEC-IDs against databricks/databricks-sql-nodejs. Each finding is committed as an expected-failure (xfail) test in the coverage PR — the test asserts the CORRECT (post-fix) behavior and stays red until THIS driver (databricks/databricks-sql-nodejs) is fixed, then flips green as a tripwire.
Findings
STATEMENT-022 [thrift]: Thrift does not deduplicate concurrent Operation.cancel() calls: three simultaneous cancels send three CancelOperation RPCs instead of the single deduped RPC the reference driver sends
failing test: STATEMENT-022 — three simultaneous cancel() calls: no deadlock, dedup per protocol [thrift] (see the coverage PR diff under tests/)
Reproduce & Expected
STATEMENT-022 — Validates driver handles multiple threads calling CancelOperation on same statement without deadlock or crash.
Reproduce:
SELECT a.*, b.*FROMmain.tpcds_sf1_delta.catalog_returns a CROSS JOIN range(1, 10000) b ORDER BYa.cr_order_number, b.id
Expected (per the shared spec):
completes without an exception
[thrift] exactly 1 CancelOperation call(s)
[sea] between 1 and 3 CancelStatement call(s)
Context
The behavior was first fixed in a DIFFERENT driver — reference PR: Tag staging, decompression, and cancellation errors for telemetry databricks-sql-go#419 — which seeded the shared language-neutral spec. This issue tracks the same conformance gap in databricks/databricks-sql-nodejs; the reference PR is for cross-referencing the intended behavior, NOT a change to this repo.
STATEMENT-022's goal is that concurrent cancel() calls don't deadlock or crash. The spec notes in specs/statement-execution.yaml say: "The primary goal is testing that multiple Cancel() calls don't cause deadlock or crash." The Node.js driver already does this: three concurrent cancels on Thrift all complete. The only mismatch reported here is the number of RPCs.
The Thrift CancelOperation expected: 1 assertion just copies the C# driver's client-side dedup. The server handles repeated CancelOperation calls fine, and other drivers already pass while sending more than one:
JDBC asserts 1..3 cancel RPCs on both backends ("JDBC does not deduplicate them").
Python asserts at least 1; its Thrift recording has three CancelOperation calls.
The fix in #564 grew into a cancel/close lifecycle change. For example, close() would skip CloseOperation when it overlapped a successful cancel. That isn't worth the risk for a gap that only concerns the RPC count, so #564 is closed too. The right fix is in the spec: relax the Thrift assertion to 1..3 and set nodejs/thrift back to implemented (databricks/databricks-driver-test#1015).
Activity
peco-engineer-bot commentedon Nov 5, 2026
🤖 engineer-bot produced a fix but could not open the PR (push or PR creation failed). See the workflow run for details.
peco-engineer-bot commentedon Nov 5, 2026
🤖 engineer-bot opened a fix PR: #564
Review before merge.
vuanhphung commentedon Nov 5, 2026
Closing as not a bug.
STATEMENT-022's goal is that concurrent
cancel()calls don't deadlock or crash. The spec notes inspecs/statement-execution.yamlsay: "The primary goal is testing that multiple Cancel() calls don't cause deadlock or crash." The Node.js driver already does this: three concurrent cancels on Thrift all complete. The only mismatch reported here is the number of RPCs.The Thrift
CancelOperation expected: 1assertion just copies the C# driver's client-side dedup. The server handles repeated CancelOperation calls fine, and other drivers already pass while sending more than one:Also, the cited reference (databricks/databricks-sql-go#419) only tags telemetry errors; it doesn't dedup cancels.
The fix in #564 grew into a cancel/close lifecycle change. For example,
close()would skip CloseOperation when it overlapped a successful cancel. That isn't worth the risk for a gap that only concerns the RPC count, so #564 is closed too. The right fix is in the spec: relax the Thrift assertion to 1..3 and set nodejs/thrift back toimplemented(databricks/databricks-driver-test#1015).