Open
Show file tree
Hide file tree
Changes from 1 commit
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Failed to load files.
Next commit
feat: add rowserr linter
Add rowserr a linter which checks for missing sql Rows.Err() calls
that supports generics.
  • Loading branch information
@stevenh
stevenh committedDec 17, 2022
commit 450301f44ad25c77459eec0f2ce3989eaf227140
Original file line numberDiff line numberDiff line change
Expand Up@@ -1636,6 +1636,14 @@ linters-settings:
severity: warning
disabled: false

rowserr:
# packages sets additional packages to check.
# The following know sql packages are always checked:
# - database/sql
# - .com/jmoiron/sqlx
# Default: []
packages: []

rowserrcheck:
# database/sql is always checked
# Default: []
Expand DownExpand Up@@ -2039,6 +2047,7 @@ linters:
- promlinter
- reassign
- revive
- rowserr
- rowserrcheck
- scopelint
- sqlclosecheck
Expand DownExpand Up@@ -2146,6 +2155,7 @@ linters:
- promlinter
- reassign
- revive
- rowserr
- rowserrcheck
- scopelint
- sqlclosecheck
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -93,6 +93,7 @@ require (
.com/spf13/viper v1.12.0
.com/ssgreg/nlreturn/v2 v2.2.1
.com/stbenjam/no-sprintf-host-port v0.1.1
.com/stevenh/go-rowserr v0.2.0
.com/stretchr/testify v1.8.1
.com/tdakkota/asciicheck v0.1.1
.com/tetafro/godot v1.4.11
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -190,6 +190,7 @@ type LintersSettings struct {
Promlinter PromlinterSettings
Reassign ReassignSettings
Revive ReviveSettings
RowsErr RowsErrSettings
RowsErrCheck RowsErrCheckSettings
Staticcheck StaticCheckSettings
Structcheck StructCheckSettings
Expand DownExpand Up@@ -600,6 +601,9 @@ type ReviveSettings struct {
Severity string
}
}
type RowsErrSettings struct {
Packages []string
}

type RowsErrCheckSettings struct {
Packages []string
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
package golinters

import (
".com/stevenh/go-rowserr/pkg/rowserr"
"golang.org/x/tools/go/analysis"

".com/golangci/golangci-lint/pkg/config"
".com/golangci/golangci-lint/pkg/golinters/goanalysis"
)

func NewRowsErr(settings *config.RowsErrSettings) *goanalysis.Linter {
a := rowserr.NewAnalyzer(settings.Packages...)
return goanalysis.NewLinter(
a.Name,
a.Doc,
[]*analysis.Analyzer{a},
nil,
).WithLoadMode(goanalysis.LoadModeTypesInfo)
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -158,6 +158,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
promlinterCfg *config.PromlinterSettings
reassignCfg *config.ReassignSettings
reviveCfg *config.ReviveSettings
rowserrCfg *config.RowsErrSettings
rowserrcheckCfg *config.RowsErrCheckSettings
staticcheckCfg *config.StaticCheckSettings
structcheckCfg *config.StructCheckSettings
Expand DownExpand Up@@ -234,6 +235,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
promlinterCfg = &m.cfg.LintersSettings.Promlinter
reassignCfg = &m.cfg.LintersSettings.Reassign
reviveCfg = &m.cfg.LintersSettings.Revive
rowserrCfg = &m.cfg.LintersSettings.RowsErr
rowserrcheckCfg = &m.cfg.LintersSettings.RowsErrCheck
staticcheckCfg = &m.cfg.LintersSettings.Staticcheck
structcheckCfg = &m.cfg.LintersSettings.Structcheck
Expand DownExpand Up@@ -707,6 +709,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
ConsiderSlow().
WithURL("https://.com/mgechev/revive"),

linter.NewConfig(golinters.NewRowsErr(rowserrCfg)).
WithSince("v1.51.0").
WithLoadForGoAnalysis().
WithPresets(linter.PresetBugs, linter.PresetSQL).
WithURL("https://.com/stevenh/go-rowserr"),

linter.NewConfig(golinters.NewRowsErrCheck(rowserrcheckCfg)).
WithSince("v1.23.0").
WithLoadForGoAnalysis().
Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
//golangcitest:args -Erowserr
package testdata

import (
"database/sql"
)

func RowsErrNotChecked(db *sql.DB) {
rows, err := db.Query("select id from tb") // want "rows.Err\\(\\) must be checked"
if err != nil {
// Handle error.
}

for rows.Next() {
// Handle row.
}
}