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 />
[](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())
+}