diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7782d59..bbc13c3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,8 +19,8 @@ jobs: steps: - name: Download CockroachDB Binary run: | - wget -qO- https://binaries.cockroachdb.com/cockroach-v20.1.3.linux-amd64.tgz | tar xvz - sudo cp -i cockroach-v20.1.3.linux-amd64/cockroach /usr/local/bin/ + wget -qO- https://binaries.cockroachdb.com/cockroach-v23.2.3.linux-amd64.tgz | tar xvz + sudo cp -i cockroach-v23.2.3.linux-amd64/cockroach /usr/local/bin/ - name: Install Go uses: actions/setup-go@v3 @@ -48,12 +48,12 @@ jobs: run: go test -v -race -coverprofile=coverage.txt -covermode=atomic ./... --cockroach-binary cockroach - name: Upload Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: + token: ${{ secrets.CODECOV_TOKEN }} files: ./coverage.txt flags: unittests env_vars: GO name: codecov-umbrella fail_ci_if_error: true - path_to_write_report: ./codecov_report.txt verbose: true diff --git a/dbscan/dbscan_test.go b/dbscan/dbscan_test.go index c2bd918..b088604 100644 --- a/dbscan/dbscan_test.go +++ b/dbscan/dbscan_test.go @@ -374,6 +374,25 @@ func TestScanRow_withAllowUnknownColumns_returnsRow(t *testing.T) { assert.Equal(t, expected, *got) } +func TestScanRow_withAllowUnknownColumns_unknownColumnType(t *testing.T) { + t.Parallel() + rows := queryRows(t, ` + SELECT 'foo val' AS foo, 'test_val_1'::test_enum_type AS bar + `) + defer rows.Close() //nolint: errcheck + rows.Next() + + got := &struct{ Foo string }{} + testAPIWithUnknownColumns, err := getAPI(dbscan.WithAllowUnknownColumns(true)) + require.NoError(t, err) + err = testAPIWithUnknownColumns.ScanRow(got, rows) + require.NoError(t, err) + requireNoRowsErrorsAndClose(t, rows) + + expected := struct{ Foo string }{Foo: "foo val"} + assert.Equal(t, expected, *got) +} + func TestMain(m *testing.M) { exitCode := func() int { flag.Parse() @@ -387,6 +406,10 @@ func TestMain(m *testing.M) { panic(err) } defer testDB.Close() + err = prepareTestDB(testDB) + if err != nil { + panic(err) + } testAPI, err = getAPI() if err != nil { panic(err) @@ -395,3 +418,11 @@ func TestMain(m *testing.M) { }() os.Exit(exitCode) } + +func prepareTestDB(testDB *pgxpool.Pool) (err error) { + _, err = testDB.Exec(ctx, ` + CREATE TYPE test_enum_type AS ENUM ('test_val_1', 'test_val_2'); + `) + + return err +} diff --git a/dbscan/rowscanner.go b/dbscan/rowscanner.go index 0e9f6bf..a1db768 100644 --- a/dbscan/rowscanner.go +++ b/dbscan/rowscanner.go @@ -123,13 +123,19 @@ func startScanner(rs *RowScanner, dstValue reflect.Value) error { ) } +type noOpScanType struct{} + +func (*noOpScanType) Scan(value interface{}) error { + return nil +} + func (rs *RowScanner) scanStruct(structValue reflect.Value) error { scans := make([]interface{}, len(rs.columns)) for i, column := range rs.columns { fieldIndex, ok := rs.columnToFieldIndex[column] if !ok { if rs.api.allowUnknownColumns { - var tmp interface{} + var tmp noOpScanType scans[i] = &tmp continue }