Skip to content

flightsql/driver: tx.QueryContext with no args appears to ignore active transaction handle #667

@wjywbs

Description

@wjywbs

Describe the bug, including details regarding any error messages, version, and platform.

I was using GPT-5.3-Codex to generate code for querying db using Arrow Flight SQL, and it found a possible bug in the arrow-go client. All the text below and the title is generated by Codex.

Description
I’m seeing inconsistent transaction behavior in github.com/apache/arrow-go/v18/arrow/flight/flightsql/driver (v18.5.1) when using database/sql.

In a transaction, queries with parameters behave correctly, but zero-argument tx.QueryRowContext(...) appears to execute outside the transaction.

This is easy to reproduce with tx-local DDL:

  1. BEGIN
  2. CREATE TABLE tx_tmp (id BIGINT, v BIGINT)
  3. INSERT INTO tx_tmp VALUES (1, 10)
  4. tx.QueryRowContext(ctx, "SELECT COUNT(*) FROM tx_tmp") -> fails (table does not exist)
  5. tx.QueryRowContext(ctx, "SELECT COUNT(*) FROM tx_tmp WHERE id >= ?", 1) -> works (returns 1)

Expected:

  • Both queries run in the same active transaction and return 1.

Actual:

  • Zero-arg query can behave as if it is outside the tx (cannot see uncommitted DDL/data).

From code inspection, this may be because Connection.QueryContext uses c.client.Execute(...) directly and does not branch on c.txn, while prepared-statement paths do use txn.Prepare(...).

Likely affected code:

  • arrow/flight/flightsql/driver/driver.go
    • Connection.QueryContext(...)
    • compare with Connection.PrepareContext(...) transaction handling

Suggested fix:

  • In Connection.QueryContext, when c.txn != nil && c.txn.ID().IsValid(), execute through transaction handle (or force transaction-bound prepared execution path), so no-arg tx queries stay transaction-scoped.

Suggested tests:

  • Add regression test for tx-local DDL visibility with:
    • zero-arg tx.QueryRowContext(...)
    • parameterized tx.QueryRowContext(..., arg)
  • Both should see uncommitted tx-local table/data consistently.

Component(s)

Integration, Other

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type: bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions