What's Changed
- Add fuzz targets for keyword lexing, parameter binding, and partition decode by @fornwall in #121
- Refactor: parse adbc.ingest.mode into an enum once at set_option time by @fornwall in #117
- Add background prefetch to the streaming result reader by @fornwall in #124
- Enable #![warn(missing_docs)] by @fornwall in #116
- ci: make the Foundry validation suite gate CI by @fornwall in #115
- Expose Spanner request priority and request/transaction tags as driver options by @fornwall in #123
- Fix get_option_int/get_option_double semantics (REVIEW.md P3) by @fornwall in #118
- Accept spanner: connection URIs with query-parameter options by @fornwall in #122
- Ship bulk ingest as native insert mutations instead of per-row INSERT DML by @fornwall in #125
- docs: add complete options reference (docs/options.md) by @fornwall in #120
- test: pin get_objects empty-list vs null semantics at every depth boundary by @fornwall in #126
- test: zero-row schema fidelity across every mapped Spanner type by @fornwall in #127
- Foundry validation: pin fork with the two suite fixes, drop all xfails by @fornwall in #138
- Version-envelope partition descriptors and assert per-partition schema by @fornwall in #129
- Add spanner.max_timestamp_precision option for full-range TIMESTAMP reads by @fornwall in #132
- test: in-process mock Spanner gRPC server for deterministic logical-fault tests by @fornwall in #135
- Add the adbc.statement.bind_by_name statement option by @fornwall in #136
- perf: run get_objects metadata queries concurrently with pushed-down filters by @fornwall in #134
- test: FFI / stream lifecycle battery for the driver-manager crash classes by @fornwall in #130
- Fix build: pass TimestampPrecision to result_set_to_batch in objects.rs by @fornwall in #139
- test: ingest edge-case matrix + error-surface fixes the tests exposed by @fornwall in #133
- feat: RPC timeout options (spanner.rpc.timeout_seconds.{query,update,fetch}) by @fornwall in #131
- Foundry validation no failures by @fornwall in #140
- Forward google.rpc.Status details (RetryInfo etc.) into the ADBC error's details by @fornwall in #128
- Migrate to Rust 2024 edition by @fornwall in #137
- chore: add Dependabot for github-actions and cargo by @fornwall in #145
- test: assert resilience suite runs single-threaded by @fornwall in #149
- chore(deps): Bump actions/cache from 4 to 6 by @dependabot[bot] in #152
- chore(deps): Bump actions/setup-python from 5 to 6 by @dependabot[bot] in #153
- docs: remove dead crates.io/docs.rs badges from README by @fornwall in #146
- test: drive spanner.rpc.timeout_seconds.update under a toxic by @fornwall in #143
- chore(deps): Bump bytes from 1.12.0 to 1.12.1 by @dependabot[bot] in #155
- Add retry-tuning options (spanner.retry.max_attempts / max_elapsed_seconds) by @fornwall in #151
- test: e2e that a google.rpc.RetryInfo detail reaches Error.details by @fornwall in #144
- chore(deps): Bump arrow-array from 59.0.0 to 59.1.0 by @dependabot[bot] in #154
- docs: soften RetryInfo-on-ABORTED to one forwardable detail among many by @fornwall in #142
- chore(deps): Bump arrow-buffer from 59.0.0 to 59.1.0 by @dependabot[bot] in #156
- chore(deps): Bump libloading from 0.8.9 to 0.9.0 by @dependabot[bot] in #157
- ci: add concurrency groups to auto-cancel superseded PR runs by @fornwall in #147
- docs: note error-detail encoding divergence from Flight SQL driver by @fornwall in #141
- chore(deps): Bump arrow-schema from 59.0.0 to 59.1.0 by @dependabot[bot] in #158
- Bound DDL and driver-internal metadata queries with RPC timeouts by @fornwall in #150
- docs: add CHANGELOG and CONTRIBUTING; document versioning policy by @fornwall in #148
- security: scrub auth-crate Display from credential-build errors by @fornwall in #162
- docs: document wheel platform floors in python/README by @fornwall in #160
- ci: open a tracking issue on nightly fuzz/resilience failures by @fornwall in #159
- ci: cache the arrow-adbc C++ validation build tree by @fornwall in #161
- refactor: unify the three comment-skipping lexer walkers behind one tokenizer by @fornwall in #163
- ci: fail the release build when the Windows import library is missing by @fornwall in #164
- test: assert values, not just counts, in DDL-note and replace-ingest tests by @fornwall in #165
- refactor: name the INFORMATION_SCHEMA column indices by @fornwall in #166
- refactor: fold the bind_one/bind_list type-mapping duplication behind one visitor by @fornwall in #168
- test: lock in null get_info VendorVersion, distinct from driver version by @fornwall in #169
- ci: make Foundry validation fail loudly on a no-coverage run by @fornwall in #170
- fix: reject PROTO/ENUM columns with a clean NotImplemented instead of a silent Utf8 mis-decode by @fornwall in #171
- test(foundry): override synthetic-column tests instead of a shared-suite flag by @fornwall in #173
- docs(python): rewrite PyPI README for end users by @fornwall in #176
- feat(ingest): let spanner.ingest.primary_key key on existing columns by @fornwall in #175
- ci: build a musl (Alpine) shared library and musllinux_1_2 wheel by @fornwall in #174
- feat: OAuth access-token auth via spanner.access_token by @fornwall in #172
- ci: derive wheel version via cargo metadata instead of positional Cargo.toml grep by @fornwall in #177
- feat: query optimizer options (spanner.query.optimizer_version / optimizer_statistics_package) by @fornwall in #178
- feat: MaxCommitDelay via spanner.max_commit_delay by @fornwall in #179
- fuzz(partition): fix false-positive round-trip oracle on huge-integer descriptors by @fornwall in #181
- refactor: consolidate scattered SQL-text helpers into one module by @fornwall in #180
- feat: directed reads via spanner.directed_read by @fornwall in #182
- test(auth): opt-in end-to-end keyfile/impersonation auth tests by @fornwall in #184
- test(resilience): cover mid-stream disconnect and truncated streams by @fornwall in #186
- feat(dml): set last_statement on single-statement autocommit DML by @fornwall in #185
- feat: add commit-stats support via spanner.commit_stats by @fornwall in #187
- chore(deps): move arrow-adbc pin to apache/arrow-adbc main, enable ErrorCompatibility by @fornwall in #190
- fix(python): repair access_token NameError, correct BigQuery auth claims, add typed option enums by @fornwall in #189
- ci: nightly non-gating workflow against real Cloud Spanner via WIF by @fornwall in #183
- test: cover GQL graph queries end-to-end against the emulator by @fornwall in #192
- refactor: move python/validation to top-level foundry-validation by @fornwall in #191
- chore: add rust-toolchain.toml pinning the dev toolchain channel by @fornwall in #198
- chore: build the ADBC validation harness out of the source tree by @fornwall in #197
- feat(retry): add exponential-backoff tuning options by @fornwall in #193
- feat(ingest): BatchWrite firehose transport behind spanner.ingest.batch_write by @fornwall in #196
- docs: trim README option tables, point to docs/options.md as authoritative by @fornwall in #199
- docs: add docs/testing.md as a single testing overview by @fornwall in #200
- test: cover Spanner change streams via plain SQL against the emulator by @fornwall in #195
- test: gate SpannerStatementTest.SqlIngestErrors in the ADBC validation subset by @fornwall in #201
- docs(foundry): clarify timestamptz_s/_ms skip reason (unit, not range) by @fornwall in #203
- ci(adbc-validation): enforce expected-failures instead of an allowlist by @fornwall in #202
- test(adbc-validation): self-skip Transactions instead of excluding it by @fornwall in #210
- fix(partition): stabilize descriptor round-trip for large floats by @fornwall in #208
- ci(adbc-validation): stop stale build-cache from masking an arrow-adbc rev bump by @fornwall in #209
- ci(foundry): guard the skip inventory against silent drift by @fornwall in #204
- chore: raise MSRV to 1.97 by @fornwall in #211
- fix(ingest): default bulk-ingest mode to create, matching the ADBC spec by @fornwall in #207
- test(adbc-validation): bump suite to arrow-adbc main, gate SqlPartitionedInts by @fornwall in #213
- test(adbc-validation): split the 10 self-skipping ingest cases by applicability by @fornwall in #212
- ci: run the mock_spanner fault-injection suite in CI by @fornwall in #215
- docs: fix CLAUDE.md revert-checklist README pointer by @fornwall in #224
- ci: gate release/publish on ADBC conformance suites, not just ci.yml by @fornwall in #229
- docs: drop dead crates.io link for the unpublished crate by @fornwall in #222
- perf: remove a few avoidable per-item allocations in metadata paths by @fornwall in #233
- test(mock_spanner): gate commit-stats mutation-count capture by @fornwall in #230
- fix(ingest): remap create_append schema-mismatch to AlreadyExists by @fornwall in #226
- fix(statement): strip trailing terminators on execute_schema/execute_partitions by @fornwall in #219
- test(integration): cover cross-thread readonly-flag propagation by @fornwall in #228
- fix(statement): clear bound rows after a DDL execute by @fornwall in #216
- test(adbc-validation): ASan/UBSan leg for the C++ validation suite by @fornwall in #237
- security: redact credential fields in SpannerDatabase Debug by @fornwall in #218
- feat(connection): accept setting current_catalog/current_schema to "" as a no-op by @fornwall in #225
- perf(conversion): drop the per-batch top-level column pointer matrix by @fornwall in #217
- perf(bound-query): build multi-row bound-query statements lazily by @fornwall in #232
- docs: add a from-first-principles ADBC driver guide by @fornwall in #235
- test(named-schema): cover CREATE SCHEMA round-trip against the emulator by @fornwall in #238
- feat(ingest): bisect-and-retry a chunk that overshoots Spanner's mutation limit by @fornwall in #234
- fix(error): map gRPC UNIMPLEMENTED to Status::NotImplemented by @fornwall in #221
- ci: SHA-pin third-party GitHub Actions in the gating workflows by @fornwall in #231
- feat(auth): add spanner.auth.quota_project option by @fornwall in #240
- refactor(options): consolidate credential options under spanner.auth.* by @fornwall in #244
- refactor(options): rename spanner.data_boost_enabled to spanner.data_boost by @fornwall in #245
- ci(adbc-validation): add a Rust-instrumented AddressSanitizer leg by @fornwall in #248
- refactor(options): regroup flat spanner.max_* keys under subsystem namespaces by @fornwall in #246
- refactor(options): merge spanner.read.timestamp into spanner.read.staleness by @fornwall in #247
- bench: emulator benchmark of ADBC driver vs official Spanner client by @fornwall in #251
- perf(conversion): decode DATE/TIMESTAMP/NUMERIC with direct scanners by @fornwall in #250
- feat(error): append fixed IAM guidance to PERMISSION_DENIED errors by @fornwall in #241
- refactor(uri): require the standard
urioption with aspanner://scheme (dropspanner.database) by @fornwall in #252 - ci: remove the nightly real Cloud Spanner workflow by @fornwall in #254
- refactor(python): drop friendly connect kwargs, use raw options in db_kwargs by @fornwall in #253
- chore: cargo update to bump the lockfile by @fornwall in #255
- ci: pin Rust to 1.97.0 with rust-toolchain.toml as the single source by @fornwall in #239
- refactor(options): collapse duplicated option-dispatch glue by @fornwall in #243
- chore(deps): Bump taiki-e/install-action from 2.83.0 to 2.83.2 by @dependabot[bot] in #256
- Promote unsupported isolation levels instead of rejecting them by @fornwall in #257
- docs: move Testing/Releasing to CONTRIBUTING.md and drop redundant License section by @fornwall in #258
- feat: map Spanner ENUM to Arrow Int64 ordinal by @fornwall in #259
- feat: map Spanner PROTO to Arrow Binary by @fornwall in #260
- docs: sketch an autocommit-based dbt materialization strategy for Spanner by @fornwall in #261
- test(proto): retry proto-bundle setup instead of silently swallowing failures by @fornwall in #264
- test(validation): enable the float cases via RewriteSql FLOAT64 rewrite by @fornwall in #265
- fix(fuzz): stop scan_timestamp_utc panic on trailing dot + fix values oracle by @fornwall in #267
- feat(txn): error on read-your-writes in a manual transaction instead of silently missing buffered DML by @fornwall in #262
- fix(options): reject oversized durations instead of panicking in parse_duration by @fornwall in #268
- test(mock): assert spanner.read.staleness and spanner.directed_read reach the wire (TEST-1/TEST-2) by @fornwall in #273
- fix(statement): route non-DML SQL in execute_update through the read-only query path (COR-3/SPEC-1) by @fornwall in #270
- test(foundry): bump the pinned validation suite to latest upstream main by @fornwall in #276
- feat(txn): kind-exclusive manual transactions — read-only snapshots and buffered DDL by @fornwall in #275
- deps: move google-cloud-* git pins from the fornwall fork to upstream googleapis main by @fornwall in #277
- chore(validation): bump ARROW_ADBC_TAG to 9be02985, adopt the QuoteIdentifier quirk by @fornwall in #278
- feat(statement): real parameter-type inference in get_parameter_schema + accept Null-typed bind columns by @fornwall in #279
- fix(cancel): per-operation cancel signals — a new operation can no longer un-cancel a live streamed reader (CON-2) by @fornwall in #272
- fix(statement): repair the cancel-API semantic conflict between #272 and #275/#279 by @fornwall in #281
- fix(bind): accept dictionary-encoded bind parameter columns (CONV-2) by @fornwall in #282
- perf(driver): share one Spanner client stack across a database's connections (SPAN-1) by @fornwall in #271
- fix(ingest): buffer manual-mode ingest mutations all-or-nothing (COR-2) by @fornwall in #269
- perf(ddl): cache the Database Admin client instead of rebuilding it per DDL statement (SPAN-10) by @fornwall in #285
- perf(txn): commit mutations-only manual transactions via the write-only path (SPAN-6) by @fornwall in #286
- perf(dml): set last_statements for multi-statement autocommit batches (SPAN-7) by @fornwall in #284
- perf(conversion): reuse a scratch buffer for BYTES base64 decoding (PERF-2) by @fornwall in #287
- fix(auth): stop returning live secrets from get_option (SEC-1) by @fornwall in #289
- fix(statistics): treat INTERVAL as non-groupable in get_statistics (CONV-3) by @fornwall in #288
- perf: avoid per-candidate/per-lexeme allocations in LikeMatcher and is_raw_prefix (PERF-6, PERF-7) by @fornwall in #290
- fix(conversion): reject non-canonical NUMERIC strings in parse_numeric_i128 (CONV-7) by @fornwall in #292
- fix(conversion): use checked offset arithmetic in build_list (CONV-4) by @fornwall in #291
- fix(statement): reject DML cleanly in execute_partitions (COR-11) by @fornwall in #293
- chore: add #[must_use] to the builder-threading apply_to_* family (IDIO-10) by @fornwall in #295
- docs(connection): fix stale run_batch_dml rustdoc (IDIO-8) by @fornwall in #296
- refactor(sql): rewrite first_keyword over the shared lexer (IDIO-6) by @fornwall in #297
- fix(statement): accept the spec-default incremental=false option (SPEC-2) by @fornwall in #294
- fix(info): make get_info(None) cover every recognised code (SPEC-5) by @fornwall in #274
- ci(fuzz): pass workflow_dispatch input via env, not shell interpolation (SEC-4) by @fornwall in #299
- docs: fix quickstart connection-URI examples the driver rejects (IDIO-1) by @fornwall in #300
- fix(statement): make execute_partitions consume bound data consistently (SPEC-3) by @fornwall in #302
- fix(options): reject int-typed sets on boolean options (COR-4) by @fornwall in #301
- fix(options)!: require exact lowercase option values everywhere (COR-7) by @fornwall in #298
- perf(info): borrow static info strings; reuse the shared arrow_err (PERF-8) by @fornwall in #303
- perf(metadata): drop per-cell String clones building metadata arrays (PERF-5) by @fornwall in #307
- test(mock): assert spanner.commit.max_delay reaches the CommitRequest (TEST-5) by @fornwall in #304
- fix(driver)!: refuse secret-bearing connection-URI query parameters (SEC-2) by @fornwall in #305
- fix(connection)!: enforce adbc.connection.readonly on the commit paths (COR-10) by @fornwall in #306
- fix(bind): honour the arrow.json tag through dictionary encoding; test null-in-dictionary-values by @fornwall in #308
- chore(deps): Bump EmbarkStudios/cargo-deny-action from 2.0.20 to 2.1.1 by @dependabot[bot] in #315
- chore(deps): Bump softprops/action-gh-release from 3.0.1 to 3.0.2 by @dependabot[bot] in #314
- test(mock): assert isolation-level promotion reaches TransactionOptions (TEST-3) by @fornwall in #310
- fix(error): forward google.rpc.Status details on the BatchWrite path (COR-8) by @fornwall in #311
- docs: surface the partition-descriptor security caveat in the READMEs (SEC-3) by @fornwall in #309
- fix(connection)!: map snapshot isolation to REPEATABLE_READ, not SERIALIZABLE (SPEC-7) by @fornwall in #316
- test(timeout): make the rpc_timeouts DDL-deadline assertion deterministic (TEST-12) by @fornwall in #318
- docs(retry): describe the client's actual attempt accounting (COR-13, UP-14) by @fornwall in #317
- refactor(retry): drop the SpannerRetryPolicy copy for the client's export (UP-3) by @fornwall in #319
- refactor(driver): express the access-token conflict as a filter over the credential ladder (IDIO-11) by @fornwall in #320
- refactor(bind): collapse the six primitive bind arms into one generic (IDIO-15) by @fornwall in #321
- refactor(options): route the four as_string copies through options::string_option (IDIO-5) by @fornwall in #322
- refactor(objects): collapse the five Option-grouping blocks into a helper (IDIO-12) by @fornwall in #323
- refactor(request,retry): emit the apply_to_* commit-builder pair from one body (IDIO-3) by @fornwall in #324
- refactor(options): emit the typed option getters from one macro (IDIO-13) by @fornwall in #325
- fix(statistics): drop the can't-happen unwrap from the scan collector (IDIO-16) by @fornwall in #330
- refactor(driver,objects): extract the credential ladder and the object assemble pass (IDIO-18) by @fornwall in #328
- refactor(visibility): make module-internal items private (IDIO-14) by @fornwall in #327
New Contributors
- @dependabot[bot] made their first contribution in #152
Full Changelog: v0.6.0...v0.7.0