Skip to content

Releases: gizmodata/hardcharger-adbc

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 04:26

The first release, with Hardcharger 2.0.0: the ADBC driver for Hardcharger, speaking Warp SQL
protocol 1.0.0 through warp-sql-adbc 1.0.0, for Python (adbc-driver-hardcharger on PyPI), Go
(github.com/gizmodata/hardcharger-adbc/go/v2) and every other ADBC language through the shared
library. Earlier builds (0.1.0) were never published; the sections below are the whole history,
newest first, for anyone who installed one from git.

Changed

  • Build on the released Warp SQL ADBC Go module v1.0.0 instead of an internal pseudo-version.

Fixed

  • Python connections using a standard ADBC profile with driver = "hardcharger" resolve the
    installed driver manifest, avoiding a mismatch with the bundled library path. Named profiles,
    profile:// URIs and absolute paths are documented alongside generic driver-manager usage.

Added

  • The Go module github.com/gizmodata/hardcharger-adbc/go/v2 is versioned by go/vX.Y.Z tags on each
    release's commit (go-module.yml checks the pair, refuses a pseudo-version of warp-sql-adbc, and
    warms the module proxy); RELEASING.md has the order, warp-sql-adbc first.
  • THIRD_PARTY_NOTICES (the Go runtime's and every linked Go module's license, warp-sql-adbc's
    included), generated by scripts/third_party_notices.sh, checked by CI, inside every wheel and
    library tarball.
  • Readable access tokens and expiry on Python connections, with session handoff examples.
  • Attaching to an existing session, through warp-sql-adbc ca7845d: connect(session_id=...)
    (option adbc.warp.session.id) uses that session instead of creating one, its open
    transaction included; Connection.session_id reads a connection's.
    connect(close_session_on_release=...) (option adbc.warp.session.close_on_release, also a
    connection option) says whether closing ends the session: by default yes for a session the
    connection created, no for an attached one. A session the server doesn't have, or another
    user's, is NotFound with warp.code session_not_found. With several replicas it works
    only when routing reaches the replica that holds the session (the README says more).
  • connect(subject_token=...): sign in with your identity provider's token (an OIDC ID token
    or another JWT the server trusts), exchanged for a Hardcharger access token (Warp SQL's
    token_exchange grant, option adbc.warp.auth.subject_token). It is refused beside
    username, password, access_token, auth_type="external" or "client_certificate"
    (also when the subject token comes through db_kwargs: the driver would silently use one
    credential), and beside a different db_kwargs value for the same option.
  • connect(tls_server_name=...): the server's host name for TLS when the URI's host isn't it
    (an IP address, a tunnel, a load balancer), option adbc.warp.tls.server_name. It is sent
    as the TLS server name (SNI) on every connection, result partitions and ingest parts too,
    and the certificate is checked against it: GizmoSQL's tls_override_hostname. The tests
    read the SNI off the wire through a recording proxy.

Changed

  • A shared browser sign-in whose token the server refuses with token_revoked,
    credentials_changed or principal_dropped no longer starts another browser sign-in on its
    own (Warp SQL §4.2): the error says why. Without a reason, after token_expired, or with a
    reason the driver doesn't know, it signs in again once, as before.
  • Warp SQL protocol 1.0.0, through warp-sql-adbc b8f6cdd (needs a Hardcharger server that
    speaks 1.0.0, from its spec/v1.0 branch; the driver has no fallbacks for the draft's names).
    What changes for Hardcharger users: a server that requires client certificates and gets a
    connection without one is the refusal certificate_required (UNAUTHENTICATED; it was
    client_certificate_required, or an unreachable server, IO); codes the driver makes up
    start with client_ (client_protocol_error, and client_http_error for an error status
    without a problem document); errors carry warp.reason / warp.cancel_reason when the server
    gave one; after invalid_token with token_revoked, credentials_changed or
    principal_dropped the driver no longer signs in again on its own; a statement cancelled by
    the time the server answers is CANCELLED; unknown states and reasons are accepted (§12); a
    partitioned ingest commits with part_count; adbc.warp.statement.query_tag is sent compact
    and ASCII-escaped, at most 4,096 bytes. The README names the codes.
  • Browser sign-in (auth_type=external) is Warp SQL's (spec §4.3), on the server's own port and
    URL, run by the Warp SQL driver (warpsql.BrowserSignIn, warp-sql-adbc 6ee3a73): the driver
    creates a flow, opens the identity provider's page, polls the flow with its secret and gets
    the server's own access token, which it uses as adbc.warp.auth.access_token (the identity
    provider's ID token never reaches the client). A server without browser sign-in is refused
    before any browser opens ("does not offer browser sign-in", UNAUTHENTICATED); a refusal
    carries the server's code (access_denied, invalid_credentials, identity_provider_error)
    and detail. A shared sign-in (share_sign_in) now shares the access token, renewed from its
    expires_in; its key no longer has a sign-in server URL. The token can't be renewed: once it
    expires, a connection's requests are refused (token_expired) and a new connection signs in
    again. Needs a Hardcharger server with browser sign-in on its main port.

Removed

  • The client of GizmoSQL 1.x's separate sign-in server (/oauth/initiate, /oauth/token/… on
    port 31339): the options adbc.hardcharger.oauth.url and adbc.hardcharger.oauth.port
    (refused now as unknown options), Go's DefaultOAuthPort, Python's connect(oauth_url=..., oauth_port=...), DEFAULT_OAUTH_PORT, DatabaseOptions.OAUTH_URL and OAUTH_PORT.

Documentation

  • The README banner is the new Hardcharger™ logo, the bull mascot lockup in a light and a dark
    version that follows the reader's color scheme, in place of the GizmoData banner card.
  • Trademark notices: Hardcharger™ and GizmoData™ on the README titles and first mentions, package
    metadata and the footer, which says both are trademarks of GizmoData LLC.

Added

  • adbc.warp.session.transaction (read-only, connection; Python
    ConnectionOptions.SESSION_TRANSACTION): the session's transaction as the server reports it
    (none, open, aborted, unknown), which sees SQL BEGIN and ROLLBACK too. Live tests
    (Go, Python) for it and for certificate_required at the handshake; both fail with the
    previous warp-sql-adbc.
  • The live-test servers (Go and Python) run with a HOME of their own. The Python ingest tests'
    recording proxy listens with a backlog of 64: with the default 5, on macOS, a part upload was
    sometimes reset and sent again, and the request count came out one too high (about 1 run in
    10 under load; 0 in 120 after). The Go ingest tests drop their table first, so the live suite
    runs with -count.
  • One browser sign-in for many connections: adbc.hardcharger.oauth.share_sign_in=true (Python
    connect(auth_type="external", share_sign_in=True)) shares a browser sign-in among the
    process's databases that sign in to the same server, through the same sign-in server, with the
    same TLS trust and the same adbc.hardcharger.oauth.sign_in_key (Python: share_sign_in="name").
    The first to open a connection signs in and concurrent ones wait for it; the rest reuse its ID
    token (each exchanging it for its own access token) until a minute (or a quarter of a shorter
    lifetime) before it expires, then the next one signs in again; a shared token the server refuses
    is dropped and that database signs in again, once. Go: ForgetSharedSignIns(). One dbt run
    opened a browser window per connection (five for one model); dbt-hardcharger had to share a
    driver-manager database through adbc_driver_manager internals instead. Sharing needs
    auth_type=external and is refused otherwise. Live tests (Go, Python) against
    hardcharger-server with a mock identity provider: 5 sequential and 8 (Go) or 6 (Python, from
    threads) concurrent connections sign in once; without sharing each signs in; another key or
    server signs in separately; a token close to its expiry is not handed out and the next
    connection signs in again; a refused token is replaced (and a failed sign-in after it fails,
    with no loop).
  • Client certificate sign-in (mutual TLS, Warp SQL §4.4): adbc.hardcharger.auth_type=client_certificate
    (also mtls), Python connect(auth_type="client_certificate", tls_client_cert=..., tls_client_key=...).
    It is the Warp SQL driver's adbc.warp.auth.type: the certificate is the credential, the token is
    bound to it, and result partitions and ingest parts present it too. Needs a server with
    --mtls-ca-cert and --mtls-certificate-sign-in. Live tests in Go and Python against
    hardcharger-server: sign-in (an e-mail identity matching --mtls-admin-identities ignoring
    case), a split result and a partitioned ingest (row count, distinct keys and sum checked
    exactly), an unknown identity (unknown_certificate_identity), a bound token over another
    certificate (certificate_mismatch) and its twin, a password beside the certificate, and a server
    with certificate sign-in off (capability mtls_identity) with its password twin.

Changed

  • Built on warp-sql-adbc 56483f5 (fix/driver-polish: the plain-HTTP hint and best-effort close),
    from b74dfe2 (client certificate sign-in), from b3d2ab8.

Fixed

  • A user's SQL that failed while running (execution_error, HTTP 422: a division by zero, a failed
    conversion, error()) was ADBC status INTERNAL, so Python raised InternalError, which says
    the driver or server is broken. It is now INVALID_ARGUMENT (ProgrammingError), like a SQL
    error bef...
Read more

adbc-driver-hardcharger 0.1.0 (internal pre-release rc2)

Choose a tag to compare

@prmoore77 prmoore77 released this 20 Oct 16:48

Internal pre-release: not for distribution. Org-only build of adbc-driver-hardcharger 0.1.0 for GizmoData Cloud's API until the public PyPI release at Hardcharger GA.

  • Commit: a825708 (branch fix/session-attach, pinned to warp-sql-adbc 45968357): Warp SQL 1.0 + ADBC error statuses + session attach (session_id= / close_session_on_release=), readable access token (Connection.access_token / .access_token_expires_at), subject_token= / tls_server_name= kwargs.
  • Built by release.yml run 39458668918 (workflow_dispatch: tests + wheels, no publish).
  • Verified on python:3.14.7 linux/arm64 against Hardcharger 2.0.0-rc.1 (query + readable token), with adbc-driver-gizmosql>=2.0.14 (pip check clean).
  • Checksums: SHA256SUMS.

adbc-driver-hardcharger 0.1.0 (internal pre-release rc1)

Choose a tag to compare

@prmoore77 prmoore77 released this 20 Oct 13:59

Internal pre-release: not for distribution. Org-only build of adbc-driver-hardcharger 0.1.0 for GizmoData Cloud's API until the public PyPI release at Hardcharger GA.

  • Commit: 3d1cbc6 (branch fix/adbc-error-status): Warp SQL 1.0 (warp-sql-adbc 15ff0499) + ADBC error-status mapping.
  • Built by release.yml run 39432960220 (workflow_dispatch: tests + wheels, no publish).
  • Wheels: py3-none for manylinux x86_64 (glibc 2.5+) / aarch64 (glibc 2.17+), macOS x86_64/arm64, Windows amd64. Verified on python:3.14.7 (linux/arm64: install + query against Hardcharger 2.0.0-rc.1; linux/amd64: install + import), coexisting with adbc-driver-gizmosql>=2.0.14 (pip check clean; adbc-driver-manager 1.12.0).
  • Checksums: SHA256SUMS.