This is an automated email from the ASF dual-hosted git repository.

zeroshade pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git


The following commit(s) were added to refs/heads/main by this push:
     new a8e98f1dd chore(go/adbc): bump google.golang.org/api from 0.227.0 to 
0.228.0 in /go/adbc (#2659)
a8e98f1dd is described below

commit a8e98f1ddf63779e5dd43eff0bcf823f0cbe6724
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
AuthorDate: Mon Apr 21 16:17:36 2025 -0400

    chore(go/adbc): bump google.golang.org/api from 0.227.0 to 0.228.0 in 
/go/adbc (#2659)
    
    Bumps
    [google.golang.org/api](https://github.com/googleapis/google-api-go-client)
    from 0.227.0 to 0.228.0.
    <details>
    <summary>Release notes</summary>
    <p><em>Sourced from <a
    
href="https://github.com/googleapis/google-api-go-client/releases";>google.golang.org/api's
    releases</a>.</em></p>
    <blockquote>
    <h2>v0.228.0</h2>
    <h2><a
    
href="https://github.com/googleapis/google-api-go-client/compare/v0.227.0...v0.228.0";>0.228.0</a>
    (2025-03-25)</h2>
    <h3>Features</h3>
    <ul>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3072";>#3072</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/1987dc98a165f1903aa196b1e1168fbfab57d589";>1987dc9</a>)</li>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3076";>#3076</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/b04196929868221b7008cd2044eced383709967c";>b041969</a>)</li>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3077";>#3077</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/e5c4d37cb6d560bd38cb8328723ae0555ba7e468";>e5c4d37</a>)</li>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3078";>#3078</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/2eb98950640fec46384087222d97e15403d9d9a3";>2eb9895</a>)</li>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3080";>#3080</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/d67a10510ebdbb87f0fd7744178e3008bcdf1d9b";>d67a105</a>)</li>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3081";>#3081</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/d7215475a626266ad21f6d6537041b38212a54cc";>d721547</a>)</li>
    </ul>
    <h3>Bug Fixes</h3>
    <ul>
    <li><strong>googleapi:</strong> Add JSON array support to
    CheckResponseWithBody (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3075";>#3075</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/ffcba91d985f21009b0a3186f006e7e6407c2478";>ffcba91</a>)</li>
    </ul>
    </blockquote>
    </details>
    <details>
    <summary>Changelog</summary>
    <p><em>Sourced from <a
    
href="https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md";>google.golang.org/api's
    changelog</a>.</em></p>
    <blockquote>
    <h2><a
    
href="https://github.com/googleapis/google-api-go-client/compare/v0.227.0...v0.228.0";>0.228.0</a>
    (2025-03-25)</h2>
    <h3>Features</h3>
    <ul>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3072";>#3072</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/1987dc98a165f1903aa196b1e1168fbfab57d589";>1987dc9</a>)</li>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3076";>#3076</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/b04196929868221b7008cd2044eced383709967c";>b041969</a>)</li>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3077";>#3077</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/e5c4d37cb6d560bd38cb8328723ae0555ba7e468";>e5c4d37</a>)</li>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3078";>#3078</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/2eb98950640fec46384087222d97e15403d9d9a3";>2eb9895</a>)</li>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3080";>#3080</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/d67a10510ebdbb87f0fd7744178e3008bcdf1d9b";>d67a105</a>)</li>
    <li><strong>all:</strong> Auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3081";>#3081</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/d7215475a626266ad21f6d6537041b38212a54cc";>d721547</a>)</li>
    </ul>
    <h3>Bug Fixes</h3>
    <ul>
    <li><strong>googleapi:</strong> Add JSON array support to
    CheckResponseWithBody (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3075";>#3075</a>)
    (<a
    
href="https://github.com/googleapis/google-api-go-client/commit/ffcba91d985f21009b0a3186f006e7e6407c2478";>ffcba91</a>)</li>
    </ul>
    </blockquote>
    </details>
    <details>
    <summary>Commits</summary>
    <ul>
    <li><a
    
href="https://github.com/googleapis/google-api-go-client/commit/bac81c61de0c586306eb621dcabca1687fb99753";><code>bac81c6</code></a>
    chore(main): release 0.228.0 (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3074";>#3074</a>)</li>
    <li><a
    
href="https://github.com/googleapis/google-api-go-client/commit/d7215475a626266ad21f6d6537041b38212a54cc";><code>d721547</code></a>
    feat(all): auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3081";>#3081</a>)</li>
    <li><a
    
href="https://github.com/googleapis/google-api-go-client/commit/a420b427cfb8dcc8dc6923fa207388a06b4d3fd6";><code>a420b42</code></a>
    chore(all): update all (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3079";>#3079</a>)</li>
    <li><a
    
href="https://github.com/googleapis/google-api-go-client/commit/d67a10510ebdbb87f0fd7744178e3008bcdf1d9b";><code>d67a105</code></a>
    feat(all): auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3080";>#3080</a>)</li>
    <li><a
    
href="https://github.com/googleapis/google-api-go-client/commit/2eb98950640fec46384087222d97e15403d9d9a3";><code>2eb9895</code></a>
    feat(all): auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3078";>#3078</a>)</li>
    <li><a
    
href="https://github.com/googleapis/google-api-go-client/commit/e5c4d37cb6d560bd38cb8328723ae0555ba7e468";><code>e5c4d37</code></a>
    feat(all): auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3077";>#3077</a>)</li>
    <li><a
    
href="https://github.com/googleapis/google-api-go-client/commit/ffcba91d985f21009b0a3186f006e7e6407c2478";><code>ffcba91</code></a>
    fix(googleapi): add JSON array support to CheckResponseWithBody (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3075";>#3075</a>)</li>
    <li><a
    
href="https://github.com/googleapis/google-api-go-client/commit/b04196929868221b7008cd2044eced383709967c";><code>b041969</code></a>
    feat(all): auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3076";>#3076</a>)</li>
    <li><a
    
href="https://github.com/googleapis/google-api-go-client/commit/1987dc98a165f1903aa196b1e1168fbfab57d589";><code>1987dc9</code></a>
    feat(all): auto-regenerate discovery clients (<a
    
href="https://redirect.github.com/googleapis/google-api-go-client/issues/3072";>#3072</a>)</li>
    <li>See full diff in <a
    
href="https://github.com/googleapis/google-api-go-client/compare/v0.227.0...v0.228.0";>compare
    view</a></li>
    </ul>
    </details>
    <br />
    
    
    [![Dependabot compatibility
    
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/api&package-manager=go_modules&previous-version=0.227.0&new-version=0.228.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
    
    Dependabot will resolve any conflicts with this PR as long as you don't
    alter it yourself. You can also trigger a rebase manually by commenting
    `@dependabot rebase`.
    
    [//]: # (dependabot-automerge-start)
    [//]: # (dependabot-automerge-end)
    
    ---
    
    <details>
    <summary>Dependabot commands and options</summary>
    <br />
    
    You can trigger Dependabot actions by commenting on this PR:
    - `@dependabot rebase` will rebase this PR
    - `@dependabot recreate` will recreate this PR, overwriting any edits
    that have been made to it
    - `@dependabot merge` will merge this PR after your CI passes on it
    - `@dependabot squash and merge` will squash and merge this PR after
    your CI passes on it
    - `@dependabot cancel merge` will cancel a previously requested merge
    and block automerging
    - `@dependabot reopen` will reopen this PR if it is closed
    - `@dependabot close` will close this PR and stop Dependabot recreating
    it. You can achieve the same result by closing it manually
    - `@dependabot show <dependency name> ignore conditions` will show all
    of the ignore conditions of the specified dependency
    - `@dependabot ignore this major version` will close this PR and stop
    Dependabot creating any more for this major version (unless you reopen
    the PR or upgrade to it yourself)
    - `@dependabot ignore this minor version` will close this PR and stop
    Dependabot creating any more for this minor version (unless you reopen
    the PR or upgrade to it yourself)
    - `@dependabot ignore this dependency` will close this PR and stop
    Dependabot creating any more for this dependency (unless you reopen the
    PR or upgrade to it yourself)
    
    
    </details>
    
    ---------
    
    Signed-off-by: dependabot[bot] <[email protected]>
    Co-authored-by: dependabot[bot] 
<49699333+dependabot[bot]@users.noreply.github.com>
    Co-authored-by: David Li <[email protected]>
    Co-authored-by: Matt Topol <[email protected]>
    Co-authored-by: Matt Topol <[email protected]>
---
 .env                                               |  2 +-
 .github/workflows/dev.yml                          |  5 +-
 .github/workflows/native-unix.yml                  |  7 ++-
 .pre-commit-config.yaml                            |  2 +-
 go/adbc/driver/bigquery/connection.go              |  7 ++-
 go/adbc/driver/bigquery/driver.go                  |  4 +-
 go/adbc/driver/bigquery/driver_test.go             | 56 ++++++++++++++---
 go/adbc/driver/bigquery/record_reader.go           |  2 +-
 go/adbc/driver/flightsql/example_usage_test.go     | 22 +++++--
 .../driver/flightsql/flightsql_adbc_server_test.go | 61 +++++++++---------
 go/adbc/driver/flightsql/flightsql_adbc_test.go    | 71 +++++++++++----------
 go/adbc/driver/flightsql/flightsql_connection.go   |  2 +-
 go/adbc/driver/flightsql/flightsql_database.go     | 26 +++++---
 go/adbc/driver/flightsql/record_reader_test.go     | 11 ++--
 go/adbc/driver/internal/driverbase/driver_test.go  | 15 ++---
 go/adbc/driver/snowflake/bulk_ingestion.go         | 36 +++++++----
 go/adbc/driver/snowflake/connection.go             | 24 +++++---
 go/adbc/driver/snowflake/driver.go                 |  4 +-
 go/adbc/driver/snowflake/driver_test.go            | 72 +++++++++++++---------
 go/adbc/driver/snowflake/record_reader.go          | 17 +++--
 go/adbc/driver/snowflake/snowflake_database.go     |  9 +--
 go/adbc/drivermgr/wrapper_sqlite_test.go           | 17 ++---
 go/adbc/go.mod                                     |  6 +-
 go/adbc/go.sum                                     |  8 +--
 go/adbc/sqldriver/driver.go                        |  9 +--
 go/adbc/sqldriver/driver_test.go                   |  6 +-
 go/adbc/sqldriver/flightsql/flightsql_test.go      |  5 +-
 go/adbc/validation/validation.go                   | 56 ++++++++++-------
 28 files changed, 352 insertions(+), 210 deletions(-)

diff --git a/.env b/.env
index 1c47edf90..6ea223cfb 100644
--- a/.env
+++ b/.env
@@ -33,7 +33,7 @@ MANYLINUX=2014
 MAVEN=3.6.3
 PLATFORM=linux/amd64
 PYTHON=3.9
-GO=1.23.6
+GO=1.24.1
 ARROW_MAJOR_VERSION=18
 DOTNET=8.0
 
diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml
index d89cfdbef..3f1be8f49 100644
--- a/.github/workflows/dev.yml
+++ b/.github/workflows/dev.yml
@@ -43,9 +43,12 @@ jobs:
           fetch-depth: 0
           persist-credentials: false
 
+      - name: Get required Go version
+        run: |
+          (. .env && echo "GO_VERSION=${GO}") >> $GITHUB_ENV
       - uses: actions/setup-go@v5
         with:
-          go-version-file: 'go/adbc/go.mod'
+          go-version: "${{ env.GO_VERSION }}"
           check-latest: true
       - uses: actions/setup-python@v5
         with:
diff --git a/.github/workflows/native-unix.yml 
b/.github/workflows/native-unix.yml
index 23eadd5de..98dce45a2 100644
--- a/.github/workflows/native-unix.yml
+++ b/.github/workflows/native-unix.yml
@@ -396,9 +396,14 @@ jobs:
         continue-on-error: true # if auth fails, bigquery driver tests should 
skip
         with:
           workload_identity_provider: ${{ 
secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+      # XXX: https://github.com/actions/setup-go/issues/457
+      # We can't use go-version-file for setup-go because it doesn't understand
+      # the 'toolchain' parameter and staticcheck tends to need the latest Go
+      - id: toolchain
+        run: echo "GO_VERSION=$(sed -n 's/^toolchain go//p' go/adbc/go.mod)" 
>> "$GITHUB_OUTPUT"
       - uses: actions/setup-go@v5
         with:
-          go-version-file: "go/adbc/go.mod"
+          go-version: ${{ steps.toolchain.outputs.GO_VERSION }}
           check-latest: true
           cache: true
           cache-dependency-path: go/adbc/go.sum
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index f20c4aa57..fd138759f 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -60,7 +60,7 @@ repos:
         - "--linelength=90"
         - "--verbose=2"
   - repo: https://github.com/golangci/golangci-lint
-    rev: 0a603e49e5e9870f5f9f2035bcbe42cd9620a9d5  # v1.64.5
+    rev: 2b224c2cf4c9f261c22a16af7f8ca6408467f338  # v2.0.2
     hooks:
     - id: golangci-lint
       entry: bash -c 'cd go/adbc && golangci-lint run --fix --timeout 5m'
diff --git a/go/adbc/driver/bigquery/connection.go 
b/go/adbc/driver/bigquery/connection.go
index 7ac6ffb20..3be117e12 100644
--- a/go/adbc/driver/bigquery/connection.go
+++ b/go/adbc/driver/bigquery/connection.go
@@ -504,11 +504,12 @@ func (c *connectionImpl) newClient(ctx context.Context) 
error {
        switch c.authType {
        case OptionValueAuthTypeJSONCredentialFile, 
OptionValueAuthTypeJSONCredentialString, OptionValueAuthTypeUserAuthentication:
                var credentials option.ClientOption
-               if c.authType == OptionValueAuthTypeJSONCredentialFile {
+               switch c.authType {
+               case OptionValueAuthTypeJSONCredentialFile:
                        credentials = option.WithCredentialsFile(c.credentials)
-               } else if c.authType == OptionValueAuthTypeJSONCredentialString 
{
+               case OptionValueAuthTypeJSONCredentialString:
                        credentials = 
option.WithCredentialsJSON([]byte(c.credentials))
-               } else {
+               default:
                        if c.clientID == "" {
                                return adbc.Error{
                                        Code: adbc.StatusInvalidArgument,
diff --git a/go/adbc/driver/bigquery/driver.go 
b/go/adbc/driver/bigquery/driver.go
index 0ceaefb52..ab231f150 100644
--- a/go/adbc/driver/bigquery/driver.go
+++ b/go/adbc/driver/bigquery/driver.go
@@ -85,8 +85,8 @@ var (
 func init() {
        if info, ok := debug.ReadBuildInfo(); ok {
                for _, dep := range info.Deps {
-                       switch {
-                       case dep.Path == "cloud.google.com/go/bigquery":
+                       switch dep.Path {
+                       case "cloud.google.com/go/bigquery":
                                infoVendorVersion = dep.Version
                        }
                }
diff --git a/go/adbc/driver/bigquery/driver_test.go 
b/go/adbc/driver/bigquery/driver_test.go
index 0b4e861fc..f5d162ada 100644
--- a/go/adbc/driver/bigquery/driver_test.go
+++ b/go/adbc/driver/bigquery/driver_test.go
@@ -52,7 +52,7 @@ type BigQueryQuirks struct {
        schemaName string
 }
 
-func (q *BigQueryQuirks) CreateSampleTable(tableName string, r arrow.Record) 
error {
+func (q *BigQueryQuirks) CreateSampleTable(tableName string, r arrow.Record) 
(err error) {
        var buf bytes.Buffer
 
        w, err := pqarrow.NewFileWriter(
@@ -64,7 +64,9 @@ func (q *BigQueryQuirks) CreateSampleTable(tableName string, 
r arrow.Record) err
        if err != nil {
                return err
        }
-       defer w.Close()
+       defer func() {
+               err = errors.Join(err, w.Close())
+       }()
 
        if err = w.Write(r); err != nil {
                return err
@@ -170,19 +172,34 @@ func (q *BigQueryQuirks) 
CreateSampleTableWithRecords(tableName string, r arrow.
        if err != nil {
                panic(err)
        }
-       defer db.Close()
+       defer func() {
+               err := db.Close()
+               if err != nil {
+                       panic(err)
+               }
+       }()
 
        cnxn, err := db.Open(ctx)
        if err != nil {
                panic(err)
        }
-       defer cnxn.Close()
+       defer func() {
+               err := cnxn.Close()
+               if err != nil {
+                       panic(err)
+               }
+       }()
 
        stmt, err := cnxn.NewStatement()
        if err != nil {
                panic(err)
        }
-       defer stmt.Close()
+       defer func() {
+               err := stmt.Close()
+               if err != nil {
+                       panic(err)
+               }
+       }()
 
        err = stmt.SetOption(driver.OptionBoolQueryUseLegacySQL, "false")
        if err != nil {
@@ -248,19 +265,34 @@ func (q *BigQueryQuirks) 
CreateSampleTableWithStreams(tableName string, rdr arra
        if err != nil {
                panic(err)
        }
-       defer db.Close()
+       defer func() {
+               err := db.Close()
+               if err != nil {
+                       panic(err)
+               }
+       }()
 
        cnxn, err := db.Open(ctx)
        if err != nil {
                panic(err)
        }
-       defer cnxn.Close()
+       defer func() {
+               err := cnxn.Close()
+               if err != nil {
+                       panic(err)
+               }
+       }()
 
        stmt, err := cnxn.NewStatement()
        if err != nil {
                panic(err)
        }
-       defer stmt.Close()
+       defer func() {
+               err := stmt.Close()
+               if err != nil {
+                       panic(err)
+               }
+       }()
 
        err = stmt.SetOption(driver.OptionBoolQueryUseLegacySQL, "false")
        if err != nil {
@@ -307,7 +339,11 @@ func (q *BigQueryQuirks) DropTable(cnxn adbc.Connection, 
tblname string) error {
        if err != nil {
                return err
        }
-       defer stmt.Close()
+       defer func() {
+               if err = stmt.Close(); err != nil {
+                       panic(err)
+               }
+       }()
 
        if err = stmt.SetSqlQuery(`DROP TABLE IF EXISTS ` + 
q.quoteTblName(tblname)); err != nil {
                return err
@@ -638,7 +674,7 @@ func (suite *BigQueryTests) TestNewDatabaseGetSetOptions() {
        })
        suite.NoError(err)
        suite.NotNil(db)
-       defer suite.NoError(db.Close())
+       defer validation.CheckedClose(suite.T(), db)
 
        getSetDB, ok := db.(adbc.GetSetOptions)
        suite.True(ok)
diff --git a/go/adbc/driver/bigquery/record_reader.go 
b/go/adbc/driver/bigquery/record_reader.go
index 8368dd19c..be4dcd81e 100644
--- a/go/adbc/driver/bigquery/record_reader.go
+++ b/go/adbc/driver/bigquery/record_reader.go
@@ -158,7 +158,7 @@ func queryRecordWithSchemaCallback(ctx context.Context, 
group *errgroup.Group, q
                        return -1, err
                }
                if parameters != nil {
-                       query.QueryConfig.Parameters = parameters
+                       query.Parameters = parameters
                }
 
                arrowIterator, rows, err := runQuery(ctx, query, false)
diff --git a/go/adbc/driver/flightsql/example_usage_test.go 
b/go/adbc/driver/flightsql/example_usage_test.go
index db68862ee..aac0c6f15 100644
--- a/go/adbc/driver/flightsql/example_usage_test.go
+++ b/go/adbc/driver/flightsql/example_usage_test.go
@@ -24,6 +24,7 @@ package flightsql_test
 import (
        "context"
        "database/sql"
+       "errors"
        "fmt"
        "log"
 
@@ -39,7 +40,7 @@ import (
 
 var headers = map[string]string{"foo": "bar"}
 
-func FlightSQLExample(uri string) error {
+func FlightSQLExample(uri string) (err error) {
        ctx := context.Background()
        options := map[string]string{
                adbc.OptionKeyURI: uri,
@@ -55,19 +56,25 @@ func FlightSQLExample(uri string) error {
        if err != nil {
                return fmt.Errorf("failed to open database: %s\n", err.Error())
        }
-       defer db.Close()
+       defer func() {
+               err = errors.Join(err, db.Close())
+       }()
 
        cnxn, err := db.Open(ctx)
        if err != nil {
                return fmt.Errorf("failed to open connection: %s", err.Error())
        }
-       defer cnxn.Close()
+       defer func() {
+               err = errors.Join(err, cnxn.Close())
+       }()
 
        stmt, err := cnxn.NewStatement()
        if err != nil {
                return fmt.Errorf("failed to create statement: %s", err.Error())
        }
-       defer stmt.Close()
+       defer func() {
+               err = errors.Join(err, stmt.Close())
+       }()
 
        if err = stmt.SetSqlQuery("SELECT 1 AS theresult"); err != nil {
                return fmt.Errorf("failed to set query: %s", err.Error())
@@ -105,7 +112,12 @@ func Example() {
        if err != nil {
                log.Fatal(err)
        }
-       defer db.Close()
+       defer func() {
+               err := db.Close()
+               if err != nil {
+                       log.Fatal(err)
+               }
+       }()
 
        srv, err := sqlite.NewSQLiteFlightSQLServer(db)
        if err != nil {
diff --git a/go/adbc/driver/flightsql/flightsql_adbc_server_test.go 
b/go/adbc/driver/flightsql/flightsql_adbc_server_test.go
index f2cd0060c..5ec08b1b6 100644
--- a/go/adbc/driver/flightsql/flightsql_adbc_server_test.go
+++ b/go/adbc/driver/flightsql/flightsql_adbc_server_test.go
@@ -48,6 +48,7 @@ import (
        "github.com/apache/arrow-adbc/go/adbc"
        driver "github.com/apache/arrow-adbc/go/adbc/driver/flightsql"
        "github.com/apache/arrow-adbc/go/adbc/driver/internal"
+       "github.com/apache/arrow-adbc/go/adbc/validation"
        "github.com/apache/arrow-go/v18/arrow"
        "github.com/apache/arrow-go/v18/arrow/array"
        "github.com/apache/arrow-go/v18/arrow/flight"
@@ -164,11 +165,11 @@ func (suite *ServerBasedTests) openAndExecuteQuery(query 
string) {
        var err error
        suite.cnxn, err = suite.db.Open(context.Background())
        suite.Require().NoError(err)
-       defer suite.cnxn.Close()
+       defer validation.CheckedClose(suite.T(), suite.cnxn)
 
        stmt, err := suite.cnxn.NewStatement()
        suite.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        suite.Require().NoError(stmt.SetSqlQuery(query))
        reader, _, err := stmt.ExecuteQuery(context.Background())
@@ -470,7 +471,7 @@ func (suite *OAuthTests) TestClientCredentialsFlow() {
 
        suite.cnxn, err = suite.db.Open(context.Background())
        suite.Require().NoError(err)
-       defer suite.cnxn.Close()
+       defer validation.CheckedClose(suite.T(), suite.cnxn)
 
        suite.openAndExecuteQuery("a-query")
        // golang/oauth2 tries to call the token endpoint sending the client 
credentials in the authentication header,
@@ -628,7 +629,7 @@ func (suite *DialerOptionsTests) SetupSuite() {
 func (suite *DialerOptionsTests) TestGrpcObserved() {
        stmt, err := suite.cnxn.NewStatement()
        suite.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        suite.Require().NoError(stmt.SetSqlQuery("timeout"))
        reader, _, err := stmt.ExecuteQuery(context.Background())
@@ -708,7 +709,7 @@ func (suite *ErrorDetailsTests) SetupSuite() {
 func (ts *ErrorDetailsTests) TestBinaryDetails() {
        stmt, err := ts.cnxn.NewStatement()
        ts.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.NoError(stmt.SetSqlQuery("binaryheader"))
 
@@ -745,7 +746,7 @@ func (ts *ErrorDetailsTests) TestBinaryDetails() {
 func (ts *ErrorDetailsTests) TestGetFlightInfo() {
        stmt, err := ts.cnxn.NewStatement()
        ts.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.NoError(stmt.SetSqlQuery("details"))
 
@@ -772,7 +773,7 @@ func (ts *ErrorDetailsTests) TestGetFlightInfo() {
 func (ts *ErrorDetailsTests) TestDoGet() {
        stmt, err := ts.cnxn.NewStatement()
        ts.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.NoError(stmt.SetSqlQuery("query"))
 
@@ -807,7 +808,7 @@ func (ts *ErrorDetailsTests) TestDoGet() {
 func (ts *ErrorDetailsTests) TestVendorCode() {
        stmt, err := ts.cnxn.NewStatement()
        ts.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.NoError(stmt.SetSqlQuery("vendorcode"))
 
@@ -846,6 +847,10 @@ func (srv *ExecuteSchemaTestServer) 
CreatePreparedStatement(ctx context.Context,
        return flightsql.ActionCreatePreparedStatementResult{}, 
status.Error(codes.Unimplemented, "CreatePreparedStatement not implemented")
 }
 
+func (srv *ExecuteSchemaTestServer) ClosePreparedStatement(ctx 
context.Context, req flightsql.ActionClosePreparedStatementRequest) error {
+       return nil
+}
+
 type ExecuteSchemaTests struct {
        ServerBasedTests
 }
@@ -859,7 +864,7 @@ func (suite *ExecuteSchemaTests) SetupSuite() {
 func (ts *ExecuteSchemaTests) TestNoQuery() {
        stmt, err := ts.cnxn.NewStatement()
        ts.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        es := stmt.(adbc.StatementExecuteSchema)
        _, err = es.ExecuteSchema(context.Background())
@@ -872,7 +877,7 @@ func (ts *ExecuteSchemaTests) TestNoQuery() {
 func (ts *ExecuteSchemaTests) TestPreparedQuery() {
        stmt, err := ts.cnxn.NewStatement()
        ts.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.NoError(stmt.SetSqlQuery("sample query"))
        ts.NoError(stmt.Prepare(context.Background()))
@@ -892,7 +897,7 @@ func (ts *ExecuteSchemaTests) TestPreparedQuery() {
 func (ts *ExecuteSchemaTests) TestQuery() {
        stmt, err := ts.cnxn.NewStatement()
        ts.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.NoError(stmt.SetSqlQuery("sample query"))
 
@@ -1221,7 +1226,7 @@ func (suite *IncrementalPollTests) SetupSuite() {
 func (ts *IncrementalPollTests) TestMaxProgress() {
        stmt, err := ts.cnxn.NewStatement()
        ts.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
        opts := stmt.(adbc.GetSetOptions)
 
        val, err := opts.GetOptionDouble(adbc.OptionKeyMaxProgress)
@@ -1232,7 +1237,7 @@ func (ts *IncrementalPollTests) TestMaxProgress() {
 func (ts *IncrementalPollTests) TestOptionValue() {
        stmt, err := ts.cnxn.NewStatement()
        ts.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
        opts := stmt.(adbc.GetSetOptions)
 
        val, err := opts.GetOption(adbc.OptionKeyIncremental)
@@ -1254,7 +1259,7 @@ func (ts *IncrementalPollTests) TestAppMetadata() {
        ctx, cancel := context.WithCancel(context.Background())
        stmt, err := ts.cnxn.NewStatement()
        ts.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.NoError(stmt.SetOption(adbc.OptionKeyIncremental, 
adbc.OptionValueEnabled))
 
@@ -1298,7 +1303,7 @@ func (ts *IncrementalPollTests) TestUnavailable() {
        ctx := context.Background()
        stmt, err := ts.cnxn.NewStatement()
        ts.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.NoError(stmt.SetOption(adbc.OptionKeyIncremental, 
adbc.OptionValueEnabled))
 
@@ -1352,7 +1357,7 @@ func (ts *IncrementalPollTests) TestQuery() {
                ts.Run(name, func() {
                        stmt, err := ts.cnxn.NewStatement()
                        ts.NoError(err)
-                       defer stmt.Close()
+                       defer validation.CheckedClose(ts.T(), stmt)
 
                        ts.NoError(stmt.SetOption(adbc.OptionKeyIncremental, 
adbc.OptionValueEnabled))
 
@@ -1371,7 +1376,7 @@ func (ts *IncrementalPollTests) TestQueryPrepared() {
                ts.Run(name, func() {
                        stmt, err := ts.cnxn.NewStatement()
                        ts.NoError(err)
-                       defer stmt.Close()
+                       defer validation.CheckedClose(ts.T(), stmt)
 
                        ts.NoError(stmt.SetOption(adbc.OptionKeyIncremental, 
adbc.OptionValueEnabled))
 
@@ -1392,7 +1397,7 @@ func (ts *IncrementalPollTests) 
TestQueryPreparedTransaction() {
                        
ts.NoError(ts.cnxn.(adbc.PostInitOptions).SetOption(adbc.OptionKeyAutoCommit, 
adbc.OptionValueDisabled))
                        stmt, err := ts.cnxn.NewStatement()
                        ts.NoError(err)
-                       defer stmt.Close()
+                       defer validation.CheckedClose(ts.T(), stmt)
 
                        ts.NoError(stmt.SetOption(adbc.OptionKeyIncremental, 
adbc.OptionValueEnabled))
 
@@ -1413,7 +1418,7 @@ func (ts *IncrementalPollTests) TestQueryTransaction() {
                        
ts.NoError(ts.cnxn.(adbc.PostInitOptions).SetOption(adbc.OptionKeyAutoCommit, 
adbc.OptionValueDisabled))
                        stmt, err := ts.cnxn.NewStatement()
                        ts.NoError(err)
-                       defer stmt.Close()
+                       defer validation.CheckedClose(ts.T(), stmt)
 
                        ts.NoError(stmt.SetOption(adbc.OptionKeyIncremental, 
adbc.OptionValueEnabled))
 
@@ -1590,7 +1595,7 @@ func (ts *TimeoutTests) TestGetSet() {
        }
        stmt, err := ts.cnxn.NewStatement()
        ts.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        for _, v := range []interface{}{ts.db, ts.cnxn, stmt} {
                getset := v.(adbc.GetSetOptions)
@@ -1649,7 +1654,7 @@ func (ts *TimeoutTests) TestDoActionTimeout() {
 
        stmt, err := ts.cnxn.NewStatement()
        ts.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.Require().NoError(stmt.SetSqlQuery("fetch"))
        var adbcErr adbc.Error
@@ -1665,7 +1670,7 @@ func (ts *TimeoutTests) TestDoGetTimeout() {
 
        stmt, err := ts.cnxn.NewStatement()
        ts.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.Require().NoError(stmt.SetSqlQuery("fetch"))
        var adbcErr adbc.Error
@@ -1680,7 +1685,7 @@ func (ts *TimeoutTests) TestDoPutTimeout() {
 
        stmt, err := ts.cnxn.NewStatement()
        ts.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.Require().NoError(stmt.SetSqlQuery("timeout"))
        var adbcErr adbc.Error
@@ -1695,7 +1700,7 @@ func (ts *TimeoutTests) TestGetFlightInfoTimeout() {
 
        stmt, err := ts.cnxn.NewStatement()
        ts.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.Require().NoError(stmt.SetSqlQuery("timeout"))
        var adbcErr adbc.Error
@@ -1712,7 +1717,7 @@ func (ts *TimeoutTests) TestDontTimeout() {
 
        stmt, err := ts.cnxn.NewStatement()
        ts.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
 
        ts.Require().NoError(stmt.SetSqlQuery("notimeout"))
        // GetFlightInfo will sleep for one second and DoGet will also
@@ -1735,7 +1740,7 @@ func (ts *TimeoutTests) TestDontTimeout() {
 func (ts *TimeoutTests) TestBadAddress() {
        stmt, err := ts.cnxn.NewStatement()
        ts.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(ts.T(), stmt)
        ts.Require().NoError(stmt.SetSqlQuery("bad endpoint"))
 
        
ts.Require().NoError(ts.db.(adbc.GetSetOptions).SetOptionDouble(driver.OptionTimeoutConnect,
 5))
@@ -1869,7 +1874,7 @@ func (suite *CookieTests) SetupSuite() {
 func (suite *CookieTests) TestCookieUsage() {
        stmt, err := suite.cnxn.NewStatement()
        suite.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        suite.Require().NoError(stmt.SetSqlQuery("timeout"))
        reader, _, err := stmt.ExecuteQuery(context.Background())
@@ -1951,7 +1956,7 @@ func (suite *DataTypeTests) SetupSuite() {
 func (suite *DataTypeTests) DoTestCase(name string, schema *arrow.Schema) {
        stmt, err := suite.cnxn.NewStatement()
        suite.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        suite.NoError(stmt.SetSqlQuery(name))
        reader, _, err := stmt.ExecuteQuery(context.Background())
diff --git a/go/adbc/driver/flightsql/flightsql_adbc_test.go 
b/go/adbc/driver/flightsql/flightsql_adbc_test.go
index c47e1e934..17fc59c4e 100644
--- a/go/adbc/driver/flightsql/flightsql_adbc_test.go
+++ b/go/adbc/driver/flightsql/flightsql_adbc_test.go
@@ -29,8 +29,10 @@ import (
        "crypto/x509/pkix"
        "database/sql"
        "encoding/pem"
+       "errors"
        "fmt"
        "io"
+       "log"
        "math/big"
        "net"
        "os"
@@ -147,27 +149,27 @@ func (s srvQuery) GetTransactionId() []byte { return nil }
 func writeTo(arr arrow.Array, idx int, w io.Writer) {
        switch arr := arr.(type) {
        case *array.Int8:
-               fmt.Fprint(w, arr.Value(idx))
+               _, _ = fmt.Fprint(w, arr.Value(idx))
        case *array.Uint8:
-               fmt.Fprint(w, arr.Value(idx))
+               _, _ = fmt.Fprint(w, arr.Value(idx))
        case *array.Int16:
-               fmt.Fprint(w, arr.Value(idx))
+               _, _ = fmt.Fprint(w, arr.Value(idx))
        case *array.Uint16:
-               fmt.Fprint(w, arr.Value(idx))
+               _, _ = fmt.Fprint(w, arr.Value(idx))
        case *array.Int32:
-               fmt.Fprint(w, arr.Value(idx))
+               _, _ = fmt.Fprint(w, arr.Value(idx))
        case *array.Uint32:
-               fmt.Fprint(w, arr.Value(idx))
+               _, _ = fmt.Fprint(w, arr.Value(idx))
        case *array.Int64:
-               fmt.Fprint(w, arr.Value(idx))
+               _, _ = fmt.Fprint(w, arr.Value(idx))
        case *array.Uint64:
-               fmt.Fprint(w, arr.Value(idx))
+               _, _ = fmt.Fprint(w, arr.Value(idx))
        case *array.Float32:
-               fmt.Fprint(w, arr.Value(idx))
+               _, _ = fmt.Fprint(w, arr.Value(idx))
        case *array.Float64:
-               fmt.Fprint(w, arr.Value(idx))
+               _, _ = fmt.Fprint(w, arr.Value(idx))
        case *array.String:
-               fmt.Fprintf(w, `"%s"`, arr.Value(idx))
+               _, _ = fmt.Fprintf(w, `"%s"`, arr.Value(idx))
        }
 }
 
@@ -216,12 +218,14 @@ func (s *FlightSQLQuirks) CreateSampleTable(tableName 
string, r arrow.Record) er
        return nil
 }
 
-func (s *FlightSQLQuirks) DropTable(cnxn adbc.Connection, tblname string) 
error {
+func (s *FlightSQLQuirks) DropTable(cnxn adbc.Connection, tblname string) (err 
error) {
        stmt, err := cnxn.NewStatement()
        if err != nil {
                return err
        }
-       defer stmt.Close()
+       defer func() {
+               err = errors.Join(err, stmt.Close())
+       }()
 
        if err = stmt.SetSqlQuery(`DROP TABLE IF EXISTS ` + tblname); err != 
nil {
                return err
@@ -290,7 +294,7 @@ func (s *FlightSQLQuirks) DBSchema() string { return "" }
 func TestADBCFlightSQL(t *testing.T) {
        db, err := example.CreateDB()
        require.NoError(t, err)
-       defer db.Close()
+       defer validation.CheckedClose(t, db)
 
        q := &FlightSQLQuirks{db: db}
        suite.Run(t, &validation.DatabaseTests{Quirks: q})
@@ -368,7 +372,7 @@ func TestADBCFlightSQLWithHeader(t *testing.T) {
        // XXX: arrow-go uses a shared DB so CreateDB can't be called more than 
once in a process
        db, err := sql.Open("sqlite", 
"file:adbcwithheader?mode=memory&cache=private")
        require.NoError(t, err)
-       defer db.Close()
+       defer validation.CheckedClose(t, db)
 
        q := &FlightSQLWithHeaderQuirks{FlightSQLQuirks{db: db}}
        suite.Run(t, &validation.DatabaseTests{Quirks: q})
@@ -401,11 +405,11 @@ func (suite *DefaultDialOptionsTests) SetupSuite() {
 
        cnxn, err := suite.DB.Open(suite.ctx)
        suite.NoError(err)
-       defer cnxn.Close()
+       defer validation.CheckedClose(suite.T(), cnxn)
 
        stmt, err := cnxn.NewStatement()
        suite.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        // Construct huge table
        suite.NoError(stmt.SetSqlQuery("CREATE TABLE huge (str)"))
@@ -437,15 +441,15 @@ func (suite *DefaultDialOptionsTests) 
TestMaxIncomingMessageSizeDefault() {
        opts["adbc.flight.sql.client_option.with_max_msg_size"] = "1000000"
        db, err := suite.Driver.NewDatabase(opts)
        suite.NoError(err)
-       defer suite.NoError(db.Close())
+       defer validation.CheckedClose(suite.T(), db)
 
        cnxn, err := db.Open(suite.ctx)
        suite.NoError(err)
-       defer cnxn.Close()
+       defer validation.CheckedClose(suite.T(), cnxn)
 
        stmt, err := cnxn.NewStatement()
        suite.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        suite.NoError(stmt.SetSqlQuery("SELECT * FROM huge"))
        reader, _, err := stmt.ExecuteQuery(suite.ctx)
@@ -460,11 +464,11 @@ func (suite *DefaultDialOptionsTests) 
TestMaxIncomingMessageSizeDefault() {
 func (suite *DefaultDialOptionsTests) TestMaxIncomingMessageSizeLow() {
        cnxn, err := suite.DB.Open(suite.ctx)
        suite.NoError(err)
-       defer cnxn.Close()
+       defer validation.CheckedClose(suite.T(), cnxn)
 
        stmt, err := cnxn.NewStatement()
        suite.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        suite.NoError(stmt.SetSqlQuery("SELECT * FROM huge"))
        reader, _, err := stmt.ExecuteQuery(suite.ctx)
@@ -590,7 +594,7 @@ func (suite *PartitionTests) TearDownTest() {
 func (suite *PartitionTests) TestIntrospectPartitions() {
        stmt, err := suite.Cnxn.NewStatement()
        suite.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        suite.Require().NoError(stmt.SetSqlQuery("SELECT 42"))
 
@@ -726,7 +730,7 @@ func (suite *HeaderTests) TearDownTest() {
 func (suite *HeaderTests) TestDatabaseOptAuthorization() {
        stmt, err := suite.Cnxn.NewStatement()
        suite.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        suite.Require().NoError(stmt.SetSqlQuery("timeout"))
        _, _, err = stmt.ExecuteQuery(suite.ctx)
@@ -738,9 +742,7 @@ func (suite *HeaderTests) TestDatabaseOptAuthorization() {
 func (suite *HeaderTests) TestUserAgent() {
        stmt, err := suite.Cnxn.NewStatement()
        suite.Require().NoError(err)
-       defer func() {
-               suite.Require().NoError(stmt.Close())
-       }()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        suite.Require().NoError(stmt.SetSqlQuery("timeout"))
        _, _, err = stmt.ExecuteQuery(suite.ctx)
@@ -764,7 +766,7 @@ func (suite *HeaderTests) TestConnection() {
 
        stmt, err := suite.Cnxn.NewStatement()
        suite.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        suite.Require().NoError(suite.Cnxn.(adbc.PostInitOptions).
                SetOption("adbc.flight.sql.rpc.call_header.x-user-agent", 
"Flight SQL ADBC"))
@@ -788,7 +790,7 @@ func (suite *HeaderTests) TestStatement() {
 
        stmt, err := suite.Cnxn.NewStatement()
        suite.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        // changes do not propagate to previously created statements
        suite.Require().NoError(suite.Cnxn.(adbc.PostInitOptions).
@@ -823,7 +825,7 @@ func (suite *HeaderTests) TestCombined() {
 
        stmt, err := suite.Cnxn.NewStatement()
        suite.Require().NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(suite.T(), stmt)
 
        suite.Require().NoError(stmt.(adbc.PostInitOptions).
                SetOption("adbc.flight.sql.rpc.call_header.x-header-three", 
"value 3"))
@@ -944,7 +946,7 @@ func (suite *TLSTests) TestInvalidOptions() {
                "adbc.flight.sql.client_option.tls_skip_verify": "false",
        })
        suite.Require().NoError(err)
-       defer suite.NoError(db.Close())
+       defer validation.CheckedClose(suite.T(), db)
 
        cnxn, err := db.Open(suite.ctx)
        suite.Require().NoError(err)
@@ -1067,7 +1069,12 @@ func (suite *DomainSocketTests) SetupSuite() {
 
        tempDir, err := os.MkdirTemp("", "adbc-flight-sql-tests-*")
        suite.NoError(err)
-       defer os.RemoveAll(tempDir)
+       defer func() {
+               err := os.RemoveAll(tempDir)
+               if err != nil {
+                       log.Printf("Failed to remove temp dir: %v", err)
+               }
+       }()
 
        listenSocket := filepath.Join(tempDir, "adbc.sock")
 
diff --git a/go/adbc/driver/flightsql/flightsql_connection.go 
b/go/adbc/driver/flightsql/flightsql_connection.go
index 99c0ccda0..e70c2a54d 100644
--- a/go/adbc/driver/flightsql/flightsql_connection.go
+++ b/go/adbc/driver/flightsql/flightsql_connection.go
@@ -608,7 +608,7 @@ func (c *connectionImpl) SetOptionDouble(key string, value 
float64) error {
 }
 
 func (c *connectionImpl) PrepareDriverInfo(ctx context.Context, infoCodes 
[]adbc.InfoCode) error {
-       driverInfo := c.ConnectionImplBase.DriverInfo
+       driverInfo := c.DriverInfo
 
        if len(infoCodes) == 0 {
                infoCodes = driverInfo.InfoSupportedCodes()
diff --git a/go/adbc/driver/flightsql/flightsql_database.go 
b/go/adbc/driver/flightsql/flightsql_database.go
index e45eb4d5d..9ff89d5f5 100644
--- a/go/adbc/driver/flightsql/flightsql_database.go
+++ b/go/adbc/driver/flightsql/flightsql_database.go
@@ -115,11 +115,12 @@ func (d *databaseImpl) SetOptions(cnOptions 
map[string]string) error {
        }
 
        if val, ok := cnOptions[OptionSSLSkipVerify]; ok {
-               if val == adbc.OptionValueEnabled {
+               switch val {
+               case adbc.OptionValueEnabled:
                        tlsConfig.InsecureSkipVerify = true
-               } else if val == adbc.OptionValueDisabled {
+               case adbc.OptionValueDisabled:
                        tlsConfig.InsecureSkipVerify = false
-               } else {
+               default:
                        return adbc.Error{
                                Msg:  fmt.Sprintf("Invalid value for database 
option '%s': '%s'", OptionSSLSkipVerify, val),
                                Code: adbc.StatusInvalidArgument,
@@ -250,11 +251,12 @@ func (d *databaseImpl) SetOptions(cnOptions 
map[string]string) error {
        d.dialOpts.rebuild()
 
        if val, ok := cnOptions[OptionCookieMiddleware]; ok {
-               if val == adbc.OptionValueEnabled {
+               switch val {
+               case adbc.OptionValueEnabled:
                        d.enableCookies = true
-               } else if val == adbc.OptionValueDisabled {
+               case adbc.OptionValueDisabled:
                        d.enableCookies = false
-               } else {
+               default:
                        return d.ErrorHelper.Errorf(adbc.StatusInvalidArgument, 
"Invalid value for database option '%s': '%s'", OptionCookieMiddleware, val)
                }
                delete(cnOptions, OptionCookieMiddleware)
@@ -392,14 +394,15 @@ func getFlightClient(ctx context.Context, loc string, d 
*databaseImpl, authMiddl
        creds := d.creds
 
        target := uri.Host
-       if uri.Scheme == "grpc" || uri.Scheme == "grpc+tcp" {
+       switch uri.Scheme {
+       case "grpc", "grpc+tcp":
                creds = insecure.NewCredentials()
-       } else if uri.Scheme == "grpc+unix" {
+       case "grpc+unix":
                creds = insecure.NewCredentials()
                target = "unix:" + uri.Path
        }
 
-       dv, _ := 
d.DatabaseImplBase.DriverInfo.GetInfoForInfoCode(adbc.InfoDriverVersion)
+       dv, _ := d.DriverInfo.GetInfoForInfoCode(adbc.InfoDriverVersion)
        driverVersion := dv.(string)
        dialOpts := append(d.dialOpts.opts, 
grpc.WithConnectParams(d.timeout.connectParams()), 
grpc.WithTransportCredentials(creds), grpc.WithUserAgent("ADBC Flight SQL 
Driver "+driverVersion))
        dialOpts = append(dialOpts, d.userDialOpts...)
@@ -487,7 +490,10 @@ func (d *databaseImpl) Open(ctx context.Context) 
(adbc.Connection, error) {
                }).
                EvictedFunc(func(_, client interface{}) {
                        conn := client.(*flightsql.Client)
-                       conn.Close()
+                       err := conn.Close()
+                       if err != nil {
+                               d.Logger.Debug("failed to close client", 
"error", err.Error())
+                       }
                }).Build()
 
        var cnxnSupport support
diff --git a/go/adbc/driver/flightsql/record_reader_test.go 
b/go/adbc/driver/flightsql/record_reader_test.go
index 89845ff81..9607bc549 100644
--- a/go/adbc/driver/flightsql/record_reader_test.go
+++ b/go/adbc/driver/flightsql/record_reader_test.go
@@ -19,6 +19,7 @@ package flightsql
 
 import (
        "context"
+       "errors"
        "fmt"
        "net/url"
        "testing"
@@ -49,7 +50,7 @@ type testFlightService struct {
        failureCount int
 }
 
-func (f *testFlightService) DoGet(request *flight.Ticket, stream 
flight.FlightService_DoGetServer) error {
+func (f *testFlightService) DoGet(request *flight.Ticket, stream 
flight.FlightService_DoGetServer) (err error) {
        // Crude way to make requests fail until retried enough times
        if f.failureCount > 0 {
                f.failureCount--
@@ -58,7 +59,9 @@ func (f *testFlightService) DoGet(request *flight.Ticket, 
stream flight.FlightSe
 
        schema := orderingSchema()
        wr := flight.NewRecordWriter(stream, ipc.WithSchema(schema))
-       defer wr.Close()
+       defer func() {
+               err = errors.Join(err, wr.Close())
+       }()
 
        builder := array.NewRecordBuilder(f.alloc, schema)
        defer builder.Release()
@@ -133,12 +136,12 @@ func (suite *RecordReaderTests) SetupSuite() {
                }).
                EvictedFunc(func(_, client interface{}) {
                        conn := client.(*flightsql.Client)
-                       conn.Close()
+                       suite.NoError(conn.Close())
                }).Build()
 }
 
 func (suite *RecordReaderTests) TearDownSuite() {
-       suite.cl.Close()
+       suite.NoError(suite.cl.Close())
        suite.clCache.Purge()
        suite.server.Shutdown()
        suite.alloc.AssertSize(suite.T(), 0)
diff --git a/go/adbc/driver/internal/driverbase/driver_test.go 
b/go/adbc/driver/internal/driverbase/driver_test.go
index 2a69ce91c..ba5104f6f 100644
--- a/go/adbc/driver/internal/driverbase/driver_test.go
+++ b/go/adbc/driver/internal/driverbase/driver_test.go
@@ -28,6 +28,7 @@ import (
 
        "github.com/apache/arrow-adbc/go/adbc"
        "github.com/apache/arrow-adbc/go/adbc/driver/internal/driverbase"
+       "github.com/apache/arrow-adbc/go/adbc/validation"
        "github.com/apache/arrow-go/v18/arrow"
        "github.com/apache/arrow-go/v18/arrow/array"
        "github.com/apache/arrow-go/v18/arrow/memory"
@@ -62,7 +63,7 @@ func TestDefaultDriver(t *testing.T) {
 
        db, err := drv.NewDatabase(nil)
        require.NoError(t, err)
-       defer db.Close()
+       defer validation.CheckedClose(t, db)
 
        require.NoError(t, db.SetOptions(map[string]string{OptionKeyRecognized: 
"should-pass"}))
 
@@ -193,7 +194,7 @@ func TestCustomizedDriver(t *testing.T) {
 
        db, err := drv.NewDatabase(nil)
        require.NoError(t, err)
-       defer db.Close()
+       defer validation.CheckedClose(t, db)
 
        require.NoError(t, db.SetOptions(map[string]string{OptionKeyRecognized: 
"should-pass"}))
 
@@ -203,7 +204,7 @@ func TestCustomizedDriver(t *testing.T) {
 
        cnxn, err := db.Open(ctx)
        require.NoError(t, err)
-       defer cnxn.Close()
+       defer validation.CheckedClose(t, cnxn)
 
        err = cnxn.Commit(ctx)
        require.Error(t, err)
@@ -482,7 +483,7 @@ func (d *databaseImpl) SetOption(key, value string) error {
 }
 
 func (db *databaseImpl) Open(ctx context.Context) (adbc.Connection, error) {
-       db.DatabaseImplBase.Logger.Info("Opening a new connection", 
"withHelpers", db.useHelpers)
+       db.Logger.Info("Opening a new connection", "withHelpers", db.useHelpers)
        cnxn := &connectionImpl{ConnectionImplBase: 
driverbase.NewConnectionImplBase(&db.DatabaseImplBase), db: db}
        bldr := driverbase.NewConnectionBuilder(cnxn)
        if db.useHelpers { // this toggles between the NewDefaultDriver and 
NewCustomizedDriver scenarios
@@ -637,13 +638,13 @@ func (c *connectionImpl) ListTableTypes(ctx 
context.Context) ([]string, error) {
 }
 
 func (c *connectionImpl) PrepareDriverInfo(ctx context.Context, infoCodes 
[]adbc.InfoCode) error {
-       if err := 
c.ConnectionImplBase.DriverInfo.RegisterInfoCode(adbc.InfoVendorSql, true); err 
!= nil {
+       if err := c.DriverInfo.RegisterInfoCode(adbc.InfoVendorSql, true); err 
!= nil {
                return err
        }
-       if err := 
c.ConnectionImplBase.DriverInfo.RegisterInfoCode(adbc.InfoVendorSubstrait, 
false); err != nil {
+       if err := c.DriverInfo.RegisterInfoCode(adbc.InfoVendorSubstrait, 
false); err != nil {
                return err
        }
-       return 
c.ConnectionImplBase.DriverInfo.RegisterInfoCode(adbc.InfoCode(10_002), "this 
was fetched dynamically")
+       return c.DriverInfo.RegisterInfoCode(adbc.InfoCode(10_002), "this was 
fetched dynamically")
 }
 
 // MockedHandler is a mock.Mock that implements the slog.Handler interface.
diff --git a/go/adbc/driver/snowflake/bulk_ingestion.go 
b/go/adbc/driver/snowflake/bulk_ingestion.go
index cdce01461..49081486e 100644
--- a/go/adbc/driver/snowflake/bulk_ingestion.go
+++ b/go/adbc/driver/snowflake/bulk_ingestion.go
@@ -158,9 +158,10 @@ func (st *statement) ingestRecord(ctx context.Context) 
(nrows int64, err error)
        schema := st.bound.Schema()
        r, w := io.Pipe()
        bw := bufio.NewWriter(w)
-       g.Go(func() error {
-               defer w.Close()
-               defer bw.Flush()
+       g.Go(func() (err error) {
+               defer func() {
+                       err = errors.Join(err, bw.Flush(), w.Close())
+               }()
 
                err = writeParquet(schema, bw, recordCh, 0, parquetProps, 
arrowProps)
                if err != io.EOF {
@@ -346,12 +347,21 @@ func writeParquet(
        targetSize int,
        parquetProps *parquet.WriterProperties,
        arrowProps pqarrow.ArrowWriterProperties,
-) error {
+) (err error) {
        pqWriter, err := pqarrow.NewFileWriter(schema, w, parquetProps, 
arrowProps)
        if err != nil {
                return err
        }
-       defer pqWriter.Close()
+       defer func() {
+               writerErr := pqWriter.Close()
+               if writerErr != nil {
+                       if err == io.EOF {
+                               err = writerErr
+                       } else {
+                               err = errors.Join(err, writerErr)
+                       }
+               }
+       }()
 
        var bytesWritten int64
        for rec := range in {
@@ -497,12 +507,14 @@ func uploadAllStreams(
        return g.Wait()
 }
 
-func executeCopyQuery(ctx context.Context, cn snowflakeConn, tableName string, 
filesToCopy *fileSet) error {
+func executeCopyQuery(ctx context.Context, cn snowflakeConn, tableName string, 
filesToCopy *fileSet) (err error) {
        rows, err := cn.QueryContext(ctx, copyQuery, 
[]driver.NamedValue{{Value: tableName}})
        if err != nil {
                return err
        }
-       defer rows.Close()
+       defer func() {
+               err = errors.Join(err, rows.Close())
+       }()
 
        fileColIdx := slices.Index(rows.Columns(), "file")
        if fileColIdx < 0 {
@@ -638,12 +650,14 @@ func runCopyTasks(ctx context.Context, cn snowflakeConn, 
tableName string, concu
        return readyFn, stopFn, cancelFn
 }
 
-func countRowsInTable(ctx context.Context, db snowflakeConn, tableName string) 
(int64, error) {
+func countRowsInTable(ctx context.Context, db snowflakeConn, tableName string) 
(rowCount int64, err error) {
        rows, err := db.QueryContext(ctx, countQuery, 
[]driver.NamedValue{{Value: tableName}})
        if err != nil {
                return 0, errToAdbcErr(adbc.StatusIO, err)
        }
-       defer rows.Close()
+       defer func() {
+               err = errors.Join(err, rows.Close())
+       }()
 
        dest := make([]driver.Value, 1)
        if err := rows.Next(dest); err != nil {
@@ -673,12 +687,12 @@ type bufferPool struct {
 }
 
 func (bp *bufferPool) GetBuffer() *bytes.Buffer {
-       return bp.Pool.Get().(*bytes.Buffer)
+       return bp.Get().(*bytes.Buffer)
 }
 
 func (bp *bufferPool) PutBuffer(buf *bytes.Buffer) {
        buf.Reset()
-       bp.Pool.Put(buf)
+       bp.Put(buf)
 }
 
 type fileSet sync.Map
diff --git a/go/adbc/driver/snowflake/connection.go 
b/go/adbc/driver/snowflake/connection.go
index 170c501c2..cf3f6d372 100644
--- a/go/adbc/driver/snowflake/connection.go
+++ b/go/adbc/driver/snowflake/connection.go
@@ -169,7 +169,7 @@ func isWildcardStr(ident string) bool {
        return strings.ContainsAny(ident, "_%")
 }
 
-func (c *connectionImpl) GetObjects(ctx context.Context, depth 
adbc.ObjectDepth, catalog, dbSchema, tableName, columnName *string, tableType 
[]string) (array.RecordReader, error) {
+func (c *connectionImpl) GetObjects(ctx context.Context, depth 
adbc.ObjectDepth, catalog, dbSchema, tableName, columnName *string, tableType 
[]string) (rdr array.RecordReader, err error) {
        var (
                pkQueryID, fkQueryID, uniqueQueryID, terseDbQueryID string
                showSchemaQueryID, tableQueryID                     string
@@ -320,7 +320,9 @@ func (c *connectionImpl) GetObjects(ctx context.Context, 
depth adbc.ObjectDepth,
        if err != nil {
                return nil, errToAdbcErr(adbc.StatusIO, err)
        }
-       defer rows.Close()
+       defer func() {
+               err = errors.Join(err, rows.Close())
+       }()
 
        catalogCh := make(chan driverbase.GetObjectsInfo, runtime.NumCPU())
        errCh := make(chan error)
@@ -367,10 +369,10 @@ func (c *connectionImpl) GetObjects(ctx context.Context, 
depth adbc.ObjectDepth,
 
 // PrepareDriverInfo implements driverbase.DriverInfoPreparer.
 func (c *connectionImpl) PrepareDriverInfo(ctx context.Context, infoCodes 
[]adbc.InfoCode) error {
-       if err := 
c.ConnectionImplBase.DriverInfo.RegisterInfoCode(adbc.InfoVendorSql, true); err 
!= nil {
+       if err := c.DriverInfo.RegisterInfoCode(adbc.InfoVendorSql, true); err 
!= nil {
                return err
        }
-       return 
c.ConnectionImplBase.DriverInfo.RegisterInfoCode(adbc.InfoVendorSubstrait, 
false)
+       return c.DriverInfo.RegisterInfoCode(adbc.InfoVendorSubstrait, false)
 }
 
 // ListTableTypes implements driverbase.TableTypeLister.
@@ -572,12 +574,14 @@ func descToField(name, typ, isnull, primary string, 
comment sql.NullString) (fie
        return
 }
 
-func (c *connectionImpl) getStringQuery(query string) (string, error) {
+func (c *connectionImpl) getStringQuery(query string) (value string, err 
error) {
        result, err := c.cn.QueryContext(context.Background(), query, nil)
        if err != nil {
                return "", errToAdbcErr(adbc.StatusInternal, err)
        }
-       defer result.Close()
+       defer func() {
+               err = errors.Join(err, result.Close())
+       }()
 
        if len(result.Columns()) != 1 {
                return "", adbc.Error{
@@ -608,7 +612,7 @@ func (c *connectionImpl) getStringQuery(query string) 
(string, error) {
        return value, nil
 }
 
-func (c *connectionImpl) GetTableSchema(ctx context.Context, catalog *string, 
dbSchema *string, tableName string) (*arrow.Schema, error) {
+func (c *connectionImpl) GetTableSchema(ctx context.Context, catalog *string, 
dbSchema *string, tableName string) (sc *arrow.Schema, err error) {
        tblParts := make([]string, 0, 3)
        if catalog != nil {
                tblParts = append(tblParts, quoteTblName(*catalog))
@@ -623,7 +627,9 @@ func (c *connectionImpl) GetTableSchema(ctx 
context.Context, catalog *string, db
        if err != nil {
                return nil, errToAdbcErr(adbc.StatusIO, err)
        }
-       defer rows.Close()
+       defer func() {
+               err = errors.Join(err, rows.Close())
+       }()
 
        var (
                name, typ, isnull, primary string
@@ -657,7 +663,7 @@ func (c *connectionImpl) GetTableSchema(ctx 
context.Context, catalog *string, db
                fields = append(fields, f)
        }
 
-       sc := arrow.NewSchema(fields, nil)
+       sc = arrow.NewSchema(fields, nil)
        return sc, nil
 }
 
diff --git a/go/adbc/driver/snowflake/driver.go 
b/go/adbc/driver/snowflake/driver.go
index 7dbe01232..8e33e4035 100644
--- a/go/adbc/driver/snowflake/driver.go
+++ b/go/adbc/driver/snowflake/driver.go
@@ -125,8 +125,8 @@ var (
 func init() {
        if info, ok := debug.ReadBuildInfo(); ok {
                for _, dep := range info.Deps {
-                       switch {
-                       case dep.Path == "github.com/snowflakedb/gosnowflake":
+                       switch dep.Path {
+                       case "github.com/snowflakedb/gosnowflake":
                                infoVendorVersion = dep.Version
                        }
                }
diff --git a/go/adbc/driver/snowflake/driver_test.go 
b/go/adbc/driver/snowflake/driver_test.go
index b4b3ba5da..df8e14d89 100644
--- a/go/adbc/driver/snowflake/driver_test.go
+++ b/go/adbc/driver/snowflake/driver_test.go
@@ -28,6 +28,7 @@ import (
        "encoding/base64"
        "encoding/json"
        "encoding/pem"
+       "errors"
        "fmt"
        "math"
        "net/http"
@@ -148,7 +149,7 @@ func quoteTblName(name string) string {
        return "\"" + strings.ReplaceAll(name, "\"", "\"\"") + "\""
 }
 
-func (s *SnowflakeQuirks) CreateSampleTable(tableName string, r arrow.Record) 
error {
+func (s *SnowflakeQuirks) CreateSampleTable(tableName string, r arrow.Record) 
(err error) {
        var b strings.Builder
        b.WriteString("CREATE OR REPLACE TABLE ")
        b.WriteString(quoteTblName(tableName))
@@ -166,7 +167,9 @@ func (s *SnowflakeQuirks) CreateSampleTable(tableName 
string, r arrow.Record) er
 
        b.WriteString(")")
        db := sql.OpenDB(s.connector)
-       defer db.Close()
+       defer func() {
+               err = errors.Join(err, db.Close())
+       }()
 
        if _, err := db.Exec(b.String()); err != nil {
                return err
@@ -181,7 +184,7 @@ func (s *SnowflakeQuirks) CreateSampleTable(tableName 
string, r arrow.Record) er
                args = append(args, getArr(col))
        }
 
-       _, err := db.Exec(insertQuery, args...)
+       _, err = db.Exec(insertQuery, args...)
        return err
 }
 
@@ -190,7 +193,11 @@ func (s *SnowflakeQuirks) DropTable(cnxn adbc.Connection, 
tblname string) error
        if err != nil {
                return err
        }
-       defer stmt.Close()
+       defer func() {
+               if err = stmt.Close(); err != nil {
+                       panic(err)
+               }
+       }()
 
        if err = stmt.SetSqlQuery(`DROP TABLE IF EXISTS ` + 
quoteTblName(tblname)); err != nil {
                return err
@@ -257,7 +264,12 @@ func createTempSchema(database string, uri string) string {
        if err != nil {
                panic(err)
        }
-       defer db.Close()
+       defer func() {
+               err := db.Close()
+               if err != nil {
+                       panic(err)
+               }
+       }()
 
        schemaName := strings.ToUpper("ADBC_TESTING_" + 
strings.ReplaceAll(uuid.New().String(), "-", "_"))
        _, err = db.Exec(`CREATE SCHEMA ` + database + `.` + schemaName)
@@ -273,7 +285,11 @@ func dropTempSchema(uri, schema string) {
        if err != nil {
                panic(err)
        }
-       defer db.Close()
+       defer func() {
+               if err = db.Close(); err != nil {
+                       panic(err)
+               }
+       }()
 
        _, err = db.Exec(`DROP SCHEMA ` + schema)
        if err != nil {
@@ -1440,7 +1456,7 @@ func (suite *SnowflakeTests) 
TestMetadataGetObjectsColumnsXdbc() {
        suite.Require().NoError(suite.Quirks.CreateSampleTable("bulk_ingest2", 
rec))
 
        db := sql.OpenDB(suite.Quirks.connector)
-       defer db.Close()
+       defer validation.CheckedClose(suite.T(), db)
 
        _, err = db.ExecContext(suite.ctx, `ALTER TABLE "bulk_ingest2" ADD 
CONSTRAINT bulk_ingest2_pk PRIMARY KEY (int64s, strings)`)
        suite.Require().NoError(err)
@@ -1615,7 +1631,7 @@ func (suite *SnowflakeTests) 
TestNewDatabaseGetSetOptions() {
        })
        suite.NoError(err)
        suite.NotNil(db)
-       defer suite.NoError(db.Close())
+       defer validation.CheckedClose(suite.T(), db)
 
        getSetDB, ok := db.(adbc.GetSetOptions)
        suite.True(ok)
@@ -1844,7 +1860,7 @@ func TestJwtAuthenticationUnencryptedValue(t *testing.T) {
                t.Skip("Cannot find the `SNOWFLAKE_TEST_PKCS8_VALUE` value")
        }
 
-       ConnectWithJwt(uri, keyValue, "")
+       ConnectWithJwt(t, uri, keyValue, "")
 }
 
 func TestJwtAuthenticationEncryptedValue(t *testing.T) {
@@ -1865,10 +1881,10 @@ func TestJwtAuthenticationEncryptedValue(t *testing.T) {
                t.Skip("Cannot find the `SNOWFLAKE_TEST_PKCS8_PASS` value")
        }
 
-       ConnectWithJwt(uri, keyValue, passcode)
+       ConnectWithJwt(t, uri, keyValue, passcode)
 }
 
-func ConnectWithJwt(uri, keyValue, passcode string) {
+func ConnectWithJwt(t *testing.T, uri, keyValue, passcode string) {
 
        // Windows funkiness
        if runtime.GOOS == "windows" {
@@ -1877,9 +1893,7 @@ func ConnectWithJwt(uri, keyValue, passcode string) {
        }
 
        cfg, err := gosnowflake.ParseDSN(uri)
-       if err != nil {
-               panic(err)
-       }
+       assert.NoError(t, err)
 
        opts := map[string]string{
                driver.OptionAccount:                 cfg.Account,
@@ -1906,16 +1920,12 @@ func ConnectWithJwt(uri, keyValue, passcode string) {
        mem := memory.NewCheckedAllocator(memory.DefaultAllocator)
        adbcDriver := driver.NewDriver(mem)
        db, err := adbcDriver.NewDatabase(opts)
-       if err != nil {
-               panic(err)
-       }
-       defer db.Close()
+       assert.NoError(t, err)
+       defer validation.CheckedClose(t, db)
 
        cnxn, err := db.Open(context.Background())
-       if err != nil {
-               panic(err)
-       }
-       defer cnxn.Close()
+       assert.NoError(t, err)
+       defer validation.CheckedClose(t, cnxn)
 }
 
 func (suite *SnowflakeTests) TestJwtPrivateKey() {
@@ -1960,13 +1970,13 @@ func (suite *SnowflakeTests) TestJwtPrivateKey() {
                opts[driver.OptionJwtPrivateKey] = keyFile
                db, err := suite.driver.NewDatabase(opts)
                suite.NoError(err)
-               defer db.Close()
+               defer validation.CheckedClose(suite.T(), db)
                cnxn, err := db.Open(suite.ctx)
                suite.NoError(err)
-               defer cnxn.Close()
+               defer validation.CheckedClose(suite.T(), cnxn)
                stmt, err := cnxn.NewStatement()
                suite.NoError(err)
-               defer stmt.Close()
+               defer validation.CheckedClose(suite.T(), stmt)
 
                suite.NoError(stmt.SetSqlQuery("SELECT 1"))
                rdr, _, err := stmt.ExecuteQuery(suite.ctx)
@@ -1987,7 +1997,9 @@ func (suite *SnowflakeTests) TestJwtPrivateKey() {
                Bytes: x509.MarshalPKCS1PrivateKey(rsaKey),
        })
        pkcs1Key := writeKey("key.pem", rsaKeyPem)
-       defer os.Remove(pkcs1Key)
+       defer validation.CheckedCleanup(suite.T(), func() error {
+               return os.Remove(pkcs1Key)
+       })
        verifyKey(pkcs1Key)
 
        // PKCS8 key
@@ -1997,13 +2009,17 @@ func (suite *SnowflakeTests) TestJwtPrivateKey() {
                Bytes: rsaKeyP8Bytes,
        })
        pkcs8Key := writeKey("key.p8", rsaKeyP8)
-       defer os.Remove(pkcs8Key)
+       defer validation.CheckedCleanup(suite.T(), func() error {
+               return os.Remove(pkcs8Key)
+       })
        verifyKey(pkcs8Key)
 
        // binary key
        block, _ := pem.Decode([]byte(rsaKeyPem))
        binKey := writeKey("key.bin", block.Bytes)
-       defer os.Remove(binKey)
+       defer validation.CheckedCleanup(suite.T(), func() error {
+               return os.Remove(binKey)
+       })
        verifyKey(binKey)
 }
 
diff --git a/go/adbc/driver/snowflake/record_reader.go 
b/go/adbc/driver/snowflake/record_reader.go
index 810d791bc..1f5d06604 100644
--- a/go/adbc/driver/snowflake/record_reader.go
+++ b/go/adbc/driver/snowflake/record_reader.go
@@ -22,6 +22,7 @@ import (
        "context"
        "encoding/hex"
        "encoding/json"
+       "errors"
        "fmt"
        "io"
        "math"
@@ -510,18 +511,20 @@ func newRecordReader(ctx context.Context, alloc 
memory.Allocator, ld gosnowflake
                                        Code: adbc.StatusInternal,
                                }
                        }
-                       defer rdr.Close()
 
                        // the "JSON" data returned isn't valid JSON. Instead 
it is a list of
                        // comma-delimited JSON lists containing every value as 
a string, except
                        // for a JSON null to represent nulls. Thus we can't 
just use the existing
                        // JSON parsing code in Arrow.
                        data, err := io.ReadAll(rdr)
+                       rdrErr := rdr.Close()
                        if err != nil {
                                return nil, adbc.Error{
                                        Msg:  err.Error(),
                                        Code: adbc.StatusInternal,
                                }
+                       } else if rdrErr != nil {
+                               return nil, rdrErr
                        }
 
                        if cap(rawData) >= int(b.NumRows()) {
@@ -616,9 +619,11 @@ func newRecordReader(ctx context.Context, alloc 
memory.Allocator, ld gosnowflake
        var recTransform recordTransformer
        rdr.schema, recTransform = getTransformer(rr.Schema(), ld, 
useHighPrecision)
 
-       group.Go(func() error {
+       group.Go(func() (err error) {
                defer rr.Release()
-               defer r.Close()
+               defer func() {
+                       err = errors.Join(err, r.Close())
+               }()
                if len(batches) > 1 {
                        defer close(ch)
                }
@@ -641,7 +646,7 @@ func newRecordReader(ctx context.Context, alloc 
memory.Allocator, ld gosnowflake
                for i, b := range batches[1:] {
                        batch, batchIdx := b, i+1
                        chs[batchIdx] = make(chan arrow.Record, bufferSize)
-                       group.Go(func() error {
+                       group.Go(func() (err error) {
                                // close channels (except the last) so that 
Next can move on to the next channel properly
                                if batchIdx != lastChannelIndex {
                                        defer close(chs[batchIdx])
@@ -651,7 +656,9 @@ func newRecordReader(ctx context.Context, alloc 
memory.Allocator, ld gosnowflake
                                if err != nil {
                                        return err
                                }
-                               defer rdr.Close()
+                               defer func() {
+                                       err = errors.Join(err, rdr.Close())
+                               }()
 
                                rr, err := ipc.NewReader(rdr, 
ipc.WithAllocator(alloc))
                                if err != nil {
diff --git a/go/adbc/driver/snowflake/snowflake_database.go 
b/go/adbc/driver/snowflake/snowflake_database.go
index a0548558f..c006378aa 100644
--- a/go/adbc/driver/snowflake/snowflake_database.go
+++ b/go/adbc/driver/snowflake/snowflake_database.go
@@ -156,7 +156,7 @@ func (d *databaseImpl) SetOptions(cnOptions 
map[string]string) error {
                }
        }
 
-       dv, _ := 
d.DatabaseImplBase.DriverInfo.GetInfoForInfoCode(adbc.InfoDriverVersion)
+       dv, _ := d.DriverInfo.GetInfoForInfoCode(adbc.InfoDriverVersion)
        driverVersion := dv.(string)
        defaultAppName := "[ADBC][Go-" + driverVersion + "]"
        // set default application name to track
@@ -362,7 +362,8 @@ func (d *databaseImpl) SetOptions(cnOptions 
map[string]string) error {
 
                        var parsedKey any
 
-                       if block.Type == "ENCRYPTED PRIVATE KEY" {
+                       switch block.Type {
+                       case "ENCRYPTED PRIVATE KEY":
                                passcode, ok := 
cnOptions[OptionJwtPrivateKeyPkcs8Password]
                                if ok {
                                        parsedKey, err = 
pkcs8.ParsePKCS8PrivateKey(block.Bytes, []byte(passcode))
@@ -372,9 +373,9 @@ func (d *databaseImpl) SetOptions(cnOptions 
map[string]string) error {
                                                Code: 
adbc.StatusInvalidArgument,
                                        }
                                }
-                       } else if block.Type == "PRIVATE KEY" {
+                       case "PRIVATE KEY":
                                parsedKey, err = 
pkcs8.ParsePKCS8PrivateKey(block.Bytes)
-                       } else {
+                       default:
                                return adbc.Error{
                                        Msg:  block.Type + " is not supported",
                                        Code: adbc.StatusInvalidArgument,
diff --git a/go/adbc/drivermgr/wrapper_sqlite_test.go 
b/go/adbc/drivermgr/wrapper_sqlite_test.go
index 7536719e7..2eb601c58 100644
--- a/go/adbc/drivermgr/wrapper_sqlite_test.go
+++ b/go/adbc/drivermgr/wrapper_sqlite_test.go
@@ -27,6 +27,7 @@ import (
 
        "github.com/apache/arrow-adbc/go/adbc"
        "github.com/apache/arrow-adbc/go/adbc/drivermgr"
+       "github.com/apache/arrow-adbc/go/adbc/validation"
        "github.com/apache/arrow-go/v18/arrow"
        "github.com/apache/arrow-go/v18/arrow/array"
        "github.com/apache/arrow-go/v18/arrow/memory"
@@ -55,11 +56,11 @@ func (dm *DriverMgrSuite) SetupSuite() {
 
        cnxn, err := dm.db.Open(dm.ctx)
        dm.NoError(err)
-       defer cnxn.Close()
+       defer validation.CheckedClose(dm.T(), cnxn)
 
        stmt, err := cnxn.NewStatement()
        dm.NoError(err)
-       defer stmt.Close()
+       defer validation.CheckedClose(dm.T(), stmt)
 
        dm.NoError(stmt.SetSqlQuery("CREATE TABLE test_table (id INTEGER 
PRIMARY KEY, name TEXT)"))
 
@@ -425,7 +426,7 @@ func (dm *DriverMgrSuite) TestSqlExecute() {
        st, err := dm.conn.NewStatement()
        dm.Require().NoError(err)
        dm.Require().NoError(st.SetSqlQuery(query))
-       defer st.Close()
+       defer validation.CheckedClose(dm.T(), st)
 
        rdr, _, err := st.ExecuteQuery(dm.ctx)
        dm.NoError(err)
@@ -446,7 +447,7 @@ func (dm *DriverMgrSuite) TestSqlExecuteInvalid() {
        query := "INVALID"
        st, err := dm.conn.NewStatement()
        dm.Require().NoError(err)
-       defer st.Close()
+       defer validation.CheckedClose(dm.T(), st)
 
        dm.Require().NoError(st.SetSqlQuery(query))
 
@@ -465,7 +466,7 @@ func (dm *DriverMgrSuite) TestSqlPrepare() {
        st, err := dm.conn.NewStatement()
        dm.Require().NoError(err)
        dm.Require().NoError(st.SetSqlQuery(query))
-       defer st.Close()
+       defer validation.CheckedClose(dm.T(), st)
 
        dm.Require().NoError(st.Prepare(dm.ctx))
        rdr, _, err := st.ExecuteQuery(dm.ctx)
@@ -500,7 +501,7 @@ func (dm *DriverMgrSuite) TestSqlPrepareMultipleParams() {
        st, err := dm.conn.NewStatement()
        dm.Require().NoError(err)
        dm.Require().NoError(st.SetSqlQuery(query))
-       defer st.Close()
+       defer validation.CheckedClose(dm.T(), st)
 
        dm.NoError(st.Prepare(dm.ctx))
        dm.NoError(st.Bind(dm.ctx, params))
@@ -520,7 +521,7 @@ func (dm *DriverMgrSuite) TestGetParameterSchema() {
        st, err := dm.conn.NewStatement()
        dm.Require().NoError(err)
        dm.Require().NoError(st.SetSqlQuery(query))
-       defer st.Close()
+       defer validation.CheckedClose(dm.T(), st)
        dm.Require().NoError(st.Prepare(context.Background()))
 
        expSchema := arrow.NewSchema([]arrow.Field{
@@ -539,7 +540,7 @@ func (dm *DriverMgrSuite) TestBindStream() {
        st, err := dm.conn.NewStatement()
        dm.Require().NoError(err)
        dm.Require().NoError(st.SetSqlQuery(query))
-       defer st.Close()
+       defer validation.CheckedClose(dm.T(), st)
 
        schema := arrow.NewSchema([]arrow.Field{
                {Name: "1", Type: arrow.PrimitiveTypes.Int64, Nullable: true},
diff --git a/go/adbc/go.mod b/go/adbc/go.mod
index 93a2544ad..96337999d 100644
--- a/go/adbc/go.mod
+++ b/go/adbc/go.mod
@@ -19,6 +19,8 @@ module github.com/apache/arrow-adbc/go/adbc
 
 go 1.23.0
 
+toolchain go1.24.1
+
 require (
        cloud.google.com/go/bigquery v1.67.0
        github.com/apache/arrow-go/v18 v18.2.0
@@ -32,7 +34,7 @@ require (
        golang.org/x/oauth2 v0.29.0
        golang.org/x/sync v0.13.0
        golang.org/x/tools v0.32.0
-       google.golang.org/api v0.227.0
+       google.golang.org/api v0.228.0
        google.golang.org/grpc v1.71.1
        google.golang.org/protobuf v1.36.6
        modernc.org/sqlite v1.37.0
@@ -41,7 +43,7 @@ require (
 require (
        cloud.google.com/go v0.118.3 // indirect
        cloud.google.com/go/auth v0.15.0 // indirect
-       cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect
+       cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
        cloud.google.com/go/compute/metadata v0.6.0 // indirect
        cloud.google.com/go/iam v1.4.1 // indirect
        github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // 
indirect
diff --git a/go/adbc/go.sum b/go/adbc/go.sum
index 4c01de4ae..310d0111a 100644
--- a/go/adbc/go.sum
+++ b/go/adbc/go.sum
@@ -4,8 +4,8 @@ cloud.google.com/go v0.118.3 
h1:jsypSnrE/w4mJysioGdMBg4MiW/hHx/sArFpaBWHdME=
 cloud.google.com/go v0.118.3/go.mod 
h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc=
 cloud.google.com/go/auth v0.15.0 
h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps=
 cloud.google.com/go/auth v0.15.0/go.mod 
h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8=
-cloud.google.com/go/auth/oauth2adapt v0.2.7 
h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M=
-cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod 
h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc=
+cloud.google.com/go/auth/oauth2adapt v0.2.8 
h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
+cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod 
h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
 cloud.google.com/go/bigquery v1.67.0 
h1:GXleMyn/cu5+DPLy9Rz5f5IULWTLrepwbQnP/5qrVbY=
 cloud.google.com/go/bigquery v1.67.0/go.mod 
h1:HQeP1AHFuAz0Y55heDSb0cjZIhnEkuwFRBGo6EEKHug=
 cloud.google.com/go/compute/metadata v0.6.0 
h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
@@ -255,8 +255,8 @@ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da 
h1:noIWHXmPHxILtqtCOPIhS
 golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod 
h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
 gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0=
 gonum.org/v1/gonum v0.15.1/go.mod 
h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o=
-google.golang.org/api v0.227.0 h1:QvIHF9IuyG6d6ReE+BNd11kIB8hZvjN8Z5xY5t21zYc=
-google.golang.org/api v0.227.0/go.mod 
h1:EIpaG6MbTgQarWF5xJvX0eOJPK9n/5D4Bynb9j2HXvQ=
+google.golang.org/api v0.228.0 h1:X2DJ/uoWGnY5obVjewbp8icSL5U4FzuCfy9OjbLSnLs=
+google.golang.org/api v0.228.0/go.mod 
h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4=
 google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb 
h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE=
 google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod 
h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE=
 google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb 
h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950=
diff --git a/go/adbc/sqldriver/driver.go b/go/adbc/sqldriver/driver.go
index 1ba505296..9515fda6e 100644
--- a/go/adbc/sqldriver/driver.go
+++ b/go/adbc/sqldriver/driver.go
@@ -195,8 +195,7 @@ func (c *conn) QueryContext(ctx context.Context, query 
string, args []driver.Nam
        }
 
        if err = s.SetSqlQuery(query); err != nil {
-               s.Close()
-               return nil, err
+               return nil, errors.Join(err, s.Close())
        }
 
        return (&stmt{stmt: s}).QueryContext(ctx, args)
@@ -250,13 +249,11 @@ func (c *conn) PrepareContext(ctx context.Context, query 
string) (driver.Stmt, e
        }
 
        if err := s.SetSqlQuery(query); err != nil {
-               s.Close()
-               return nil, err
+               return nil, errors.Join(err, s.Close())
        }
 
        if err := s.Prepare(ctx); err != nil {
-               s.Close()
-               return nil, err
+               return nil, errors.Join(err, s.Close())
        }
 
        paramSchema, err := s.GetParameterSchema()
diff --git a/go/adbc/sqldriver/driver_test.go b/go/adbc/sqldriver/driver_test.go
index 511ce9c92..60d10c6de 100644
--- a/go/adbc/sqldriver/driver_test.go
+++ b/go/adbc/sqldriver/driver_test.go
@@ -42,7 +42,11 @@ func Example() {
        if err != nil {
                panic(err)
        }
-       defer rows.Close()
+       defer func() {
+               if err := rows.Close(); err != nil {
+                       panic(err)
+               }
+       }()
 
        colNames, err := rows.Columns()
        if err != nil {
diff --git a/go/adbc/sqldriver/flightsql/flightsql_test.go 
b/go/adbc/sqldriver/flightsql/flightsql_test.go
index 8cb00e392..eafa178fb 100644
--- a/go/adbc/sqldriver/flightsql/flightsql_test.go
+++ b/go/adbc/sqldriver/flightsql/flightsql_test.go
@@ -23,6 +23,7 @@ import (
        "testing"
 
        _ "github.com/apache/arrow-adbc/go/adbc/sqldriver/flightsql"
+       "github.com/apache/arrow-adbc/go/adbc/validation"
        "github.com/apache/arrow-go/v18/arrow/flight"
        "github.com/apache/arrow-go/v18/arrow/flight/flightsql"
        "github.com/apache/arrow-go/v18/arrow/flight/flightsql/example"
@@ -100,7 +101,7 @@ func (suite *SQLDriverFlightSQLSuite) dsn() string {
 func (suite *SQLDriverFlightSQLSuite) TestQuery() {
        db, err := sql.Open("flightsql", suite.dsn())
        suite.Require().NoError(err)
-       defer db.Close()
+       defer validation.CheckedClose(suite.T(), db)
 
        _, err = db.Exec("CREATE TABLE t (k, v)")
        suite.Require().NoError(err)
@@ -111,7 +112,7 @@ func (suite *SQLDriverFlightSQLSuite) TestQuery() {
        suite.Require().NoError(err)
        suite.EqualValues(2, n)
 
-       var expected int = 2
+       var expected = 2
        var actual int
        row := db.QueryRow("SELECT count(*) FROM t")
        err = row.Scan(&actual)
diff --git a/go/adbc/validation/validation.go b/go/adbc/validation/validation.go
index 32a83c608..75a337bf5 100644
--- a/go/adbc/validation/validation.go
+++ b/go/adbc/validation/validation.go
@@ -23,6 +23,7 @@ package validation
 
 import (
        "context"
+       "io"
        "strings"
        "testing"
 
@@ -31,6 +32,7 @@ import (
        "github.com/apache/arrow-go/v18/arrow"
        "github.com/apache/arrow-go/v18/arrow/array"
        "github.com/apache/arrow-go/v18/arrow/memory"
+       "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/suite"
 )
 
@@ -187,7 +189,7 @@ func (c *ConnectionTests) TestAutocommitDefault() {
        // is enabled, and return INVALID_STATE if the client tries to
        // commit or rollback
        cnxn, _ := c.DB.Open(ctx)
-       defer cnxn.Close()
+       defer CheckedClose(c.T(), cnxn)
 
        if getset, ok := cnxn.(adbc.GetSetOptions); ok {
                value, err := getset.GetOption(adbc.OptionKeyAutoCommit)
@@ -214,7 +216,7 @@ func (c *ConnectionTests) TestAutocommitDefault() {
 func (c *ConnectionTests) TestAutocommitToggle() {
        ctx := context.Background()
        cnxn, _ := c.DB.Open(ctx)
-       defer cnxn.Close()
+       defer CheckedClose(c.T(), cnxn)
 
        if !c.Quirks.SupportsTransactions() {
                return
@@ -250,7 +252,7 @@ func (c *ConnectionTests) TestAutocommitToggle() {
 func (c *ConnectionTests) TestMetadataCurrentCatalog() {
        ctx := context.Background()
        cnxn, _ := c.DB.Open(ctx)
-       defer cnxn.Close()
+       defer CheckedClose(c.T(), cnxn)
        getset, ok := cnxn.(adbc.GetSetOptions)
 
        if !c.Quirks.SupportsGetSetOptions() {
@@ -270,7 +272,7 @@ func (c *ConnectionTests) TestMetadataCurrentCatalog() {
 func (c *ConnectionTests) TestMetadataCurrentDbSchema() {
        ctx := context.Background()
        cnxn, _ := c.DB.Open(ctx)
-       defer cnxn.Close()
+       defer CheckedClose(c.T(), cnxn)
        getset, ok := cnxn.(adbc.GetSetOptions)
 
        if !c.Quirks.SupportsGetSetOptions() {
@@ -290,7 +292,7 @@ func (c *ConnectionTests) TestMetadataCurrentDbSchema() {
 func (c *ConnectionTests) TestMetadataGetInfo() {
        ctx := context.Background()
        cnxn, _ := c.DB.Open(ctx)
-       defer cnxn.Close()
+       defer CheckedClose(c.T(), cnxn)
 
        info := []adbc.InfoCode{
                adbc.InfoDriverName,
@@ -348,7 +350,7 @@ func (c *ConnectionTests) TestMetadataGetInfo() {
 func (c *ConnectionTests) TestMetadataGetStatistics() {
        ctx := context.Background()
        cnxn, _ := c.DB.Open(ctx)
-       defer cnxn.Close()
+       defer CheckedClose(c.T(), cnxn)
 
        if c.Quirks.SupportsStatistics() {
                stats, ok := cnxn.(adbc.ConnectionGetStatistics)
@@ -382,7 +384,7 @@ func (c *ConnectionTests) TestMetadataGetTableSchema() {
 
        ctx := context.Background()
        cnxn, _ := c.DB.Open(ctx)
-       defer cnxn.Close()
+       defer CheckedClose(c.T(), cnxn)
 
        c.Require().NoError(c.Quirks.CreateSampleTable("sample_test", rec))
 
@@ -402,7 +404,7 @@ func (c *ConnectionTests) TestMetadataGetTableSchema() {
 func (c *ConnectionTests) TestMetadataGetTableTypes() {
        ctx := context.Background()
        cnxn, _ := c.DB.Open(ctx)
-       defer cnxn.Close()
+       defer CheckedClose(c.T(), cnxn)
 
        rdr, err := cnxn.GetTableTypes(ctx)
        c.Require().NoError(err)
@@ -415,7 +417,7 @@ func (c *ConnectionTests) TestMetadataGetTableTypes() {
 func (c *ConnectionTests) TestMetadataGetObjectsColumns() {
        ctx := context.Background()
        cnxn, _ := c.DB.Open(ctx)
-       defer cnxn.Close()
+       defer CheckedClose(c.T(), cnxn)
 
        ingestCatalogName := c.Quirks.Catalog()
        ingestSchemaName := c.Quirks.DBSchema()
@@ -667,7 +669,7 @@ func (s *StatementTests) TestSqlExecuteSchema() {
 
        stmt, err := s.Cnxn.NewStatement()
        s.Require().NoError(err)
-       defer stmt.Close()
+       defer CheckedClose(s.T(), stmt)
 
        es, ok := stmt.(adbc.StatementExecuteSchema)
        s.Require().True(ok, "%#v does not support ExecuteSchema", es)
@@ -706,7 +708,7 @@ func (s *StatementTests) TestSqlExecuteSchema() {
 func (s *StatementTests) TestSqlPartitionedInts() {
        stmt, err := s.Cnxn.NewStatement()
        s.Require().NoError(err)
-       defer stmt.Close()
+       defer CheckedClose(s.T(), stmt)
 
        s.NoError(stmt.SetSqlQuery("SELECT 42"))
 
@@ -731,7 +733,7 @@ func (s *StatementTests) TestSqlPartitionedInts() {
 
        cxn, err := s.DB.Open(s.ctx)
        s.Require().NoError(err)
-       defer cxn.Close()
+       defer CheckedClose(s.T(), cxn)
 
        rdr, err := cxn.ReadPartition(s.ctx, part.PartitionIDs[0])
        s.Require().NoError(err)
@@ -759,7 +761,7 @@ func (s *StatementTests) TestSqlPartitionedInts() {
 func (s *StatementTests) TestSQLPrepareGetParameterSchema() {
        stmt, err := s.Cnxn.NewStatement()
        s.NoError(err)
-       defer stmt.Close()
+       defer CheckedClose(s.T(), stmt)
 
        query := "SELECT " + s.Quirks.BindParameter(0) + ", " + 
s.Quirks.BindParameter(1)
        s.NoError(stmt.SetSqlQuery(query))
@@ -787,7 +789,7 @@ func (s *StatementTests) TestSQLPrepareSelectParams() {
 
        stmt, err := s.Cnxn.NewStatement()
        s.NoError(err)
-       defer stmt.Close()
+       defer CheckedClose(s.T(), stmt)
 
        query := "SELECT " + s.Quirks.BindParameter(0) + ", " + 
s.Quirks.BindParameter(1)
        s.Require().NoError(stmt.SetSqlQuery(query))
@@ -836,7 +838,7 @@ func (s *StatementTests) TestSQLPrepareSelectParams() {
 func (s *StatementTests) TestSQLPrepareSelectNoParams() {
        stmt, err := s.Cnxn.NewStatement()
        s.NoError(err)
-       defer stmt.Close()
+       defer CheckedClose(s.T(), stmt)
 
        s.NoError(stmt.SetSqlQuery("SELECT 1"))
        s.NoError(stmt.Prepare(s.ctx))
@@ -873,7 +875,7 @@ func (s *StatementTests) 
TestSqlPrepareErrorParamCountMismatch() {
        query := "SELECT " + s.Quirks.BindParameter(0) + ", " + 
s.Quirks.BindParameter(1)
        stmt, err := s.Cnxn.NewStatement()
        s.NoError(err)
-       defer stmt.Close()
+       defer CheckedClose(s.T(), stmt)
 
        s.NoError(stmt.SetSqlQuery(query))
        s.NoError(stmt.Prepare(s.ctx))
@@ -910,7 +912,7 @@ func (s *StatementTests) TestSqlIngestInts() {
 
        stmt, err := s.Cnxn.NewStatement()
        s.Require().NoError(err)
-       defer stmt.Close()
+       defer CheckedClose(s.T(), stmt)
 
        s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestTargetTable, 
"bulk_ingest"))
        s.Require().NoError(stmt.Bind(s.ctx, batch))
@@ -962,7 +964,7 @@ func (s *StatementTests) TestSqlIngestAppend() {
        // ingest and create table
        stmt, err := s.Cnxn.NewStatement()
        s.Require().NoError(err)
-       defer stmt.Close()
+       defer CheckedClose(s.T(), stmt)
 
        s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestTargetTable, 
"bulk_ingest"))
        s.Require().NoError(stmt.Bind(s.ctx, batch))
@@ -1036,7 +1038,7 @@ func (s *StatementTests) TestSqlIngestReplace() {
        // ingest and create table
        stmt, err := s.Cnxn.NewStatement()
        s.Require().NoError(err)
-       defer stmt.Close()
+       defer CheckedClose(s.T(), stmt)
 
        s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestTargetTable, 
"bulk_ingest"))
        s.Require().NoError(stmt.Bind(s.ctx, batch))
@@ -1108,7 +1110,7 @@ func (s *StatementTests) TestSqlIngestCreateAppend() {
        // ingest and create table
        stmt, err := s.Cnxn.NewStatement()
        s.Require().NoError(err)
-       defer stmt.Close()
+       defer CheckedClose(s.T(), stmt)
 
        s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestTargetTable, 
"bulk_ingest"))
        s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestMode, 
adbc.OptionValueIngestModeCreateAppend))
@@ -1163,7 +1165,7 @@ func (s *StatementTests) TestSqlIngestErrors() {
 
        stmt, err := s.Cnxn.NewStatement()
        s.Require().NoError(err)
-       defer stmt.Close()
+       defer CheckedClose(s.T(), stmt)
 
        s.Run("ingest without bind", func() {
                var e adbc.Error
@@ -1256,3 +1258,15 @@ func (s *StatementTests) TestSqlIngestErrors() {
                s.NotEqual(adbc.StatusOK, e.Code)
        })
 }
+
+// CheckedClose is a helper for deferring Close() with a potential error in a 
test.
+// For example: `defer CheckedClose(suite.T(), stmt)`
+func CheckedClose(t *testing.T, c io.Closer) {
+       assert.NoError(t, c.Close())
+}
+
+// CheckedClose is a helper for deferring a function with a potential error in 
a test.
+// For example: `defer CheckedCleanup(suite.T(), func() error { return 
os.Remove(path) })`
+func CheckedCleanup(t *testing.T, c func() error) {
+       assert.NoError(t, c())
+}

Reply via email to