| package a |
| |
| import "database/sql" |
| |
| // |
| // (Ballast comment to make it easier to adjust line numbers when imports change.) |
| // |
| |
| func missingErr(db *sql.DB) { |
| rows, err := db.Query("") // want `sql.Rows "rows" is used in Next loop at line 15 without final check of rows.Err\(\)` |
| if err != nil { |
| return |
| } |
| defer rows.Close() // ignore error |
| for rows.Next() { // L15 |
| println(rows.Scan()) |
| } |
| } |
| |
| func missingErr2(db *sql.DB) { |
| rows, _ := db.QueryContext(nil, "") // want `sql.Rows "rows" is used in Next loop at line 23 without final check of rows.Err\(\)` |
| for { |
| if !rows.Next() { // L23 |
| break |
| } |
| println(rows.Scan()) |
| } |
| } |
| |
| func stmt(stmt *sql.Stmt) { |
| { |
| rows, _ := stmt.QueryContext(nil, "") // want `sql.Rows "rows" is used in Next loop at line 33 without final check of rows.Err\(\)` |
| for rows.Next() { // L33 |
| rows.Scan() |
| } |
| } |
| { |
| rows, _ := stmt.Query("") // want `sql.Rows "rows" is used in Next loop at line .. without final check of rows.Err\(\)` |
| for rows.Next() { |
| rows.Scan() |
| } |
| } |
| } |
| |
| func tx(tx *sql.Tx) { |
| { |
| rows, _ := tx.QueryContext(nil, "") // want `sql.Rows "rows" is used in Next loop at line .. without final check of rows.Err\(\)` |
| for rows.Next() { |
| rows.Scan() |
| } |
| } |
| { |
| rows, _ := tx.Query("") // want `sql.Rows "rows" is used in Next loop at line .. without final check of rows.Err\(\)` |
| for rows.Next() { |
| rows.Scan() |
| } |
| } |
| } |
| |
| func conn(conn *sql.Conn) { |
| rows, _ := conn.QueryContext(nil, "") // want `sql.Rows "rows" is used in Next loop at line .. without final check of rows.Err\(\)` |
| for rows.Next() { |
| rows.Scan() |
| } |
| } |
| |
| func nopeErrIsChecked(db *sql.DB) { |
| rows, _ := db.Query("") |
| for rows.Next() { |
| } |
| if err := rows.Err(); err != nil { |
| panic(err) |
| } |
| } |
| |
| func nopeErrIsCalled(db *sql.DB) { |
| rows, _ := db.Query("") |
| for rows.Next() { |
| println(rows.Scan()) |
| } |
| _ = rows.Err() // ignore error |
| } |
| |
| func nopeRowsIsParam(rows *sql.Rows) { |
| for rows.Next() { |
| } |
| } |
| |
| func nopeRowsEscapes(rows *sql.Rows) { |
| for rows.Next() { |
| } |
| arbitraryEffects(rows) |
| } |
| |
| func arbitraryEffects(any) |