diff --git a/stdlib/sql.go b/stdlib/sql.go index 10c104da..59d24c62 100644 --- a/stdlib/sql.go +++ b/stdlib/sql.go @@ -514,7 +514,7 @@ func (r *Rows) ColumnTypeScanType(index int) reflect.Type { func (r *Rows) Close() error { r.rows.Close() - return nil + return r.rows.Err() } func (r *Rows) Next(dest []driver.Value) error { diff --git a/stdlib/sql_test.go b/stdlib/sql_test.go index a053c6cc..38a5ac4c 100644 --- a/stdlib/sql_test.go +++ b/stdlib/sql_test.go @@ -1047,3 +1047,42 @@ func TestRegisterConnConfig(t *testing.T) { assert.Equal(t, "Query", l.msg) assert.Equal(t, "select 1", l.data["sql"]) } + +// https://github.com/jackc/pgx/issues/958 +func TestConnQueryRowConstraintErrors(t *testing.T) { + testWithAndWithoutPreferSimpleProtocol(t, func(t *testing.T, db *sql.DB) { + skipCockroachDB(t, db, "Server does not support deferred constraint (https://github.com/cockroachdb/cockroach/issues/31632)") + + _, err := db.Exec(`create temporary table defer_test ( + id text primary key, + n int not null, unique (n), + unique (n) deferrable initially deferred )`) + require.NoError(t, err) + + _, err = db.Exec(`drop function if exists test_trigger cascade`) + require.NoError(t, err) + + _, err = db.Exec(`create function test_trigger() returns trigger language plpgsql as $$ + begin + if new.n = 4 then + raise exception 'n cant be 4!'; + end if; + return new; + end$$`) + require.NoError(t, err) + + _, err = db.Exec(`create constraint trigger test + after insert or update on defer_test + deferrable initially deferred + for each row + execute function test_trigger()`) + require.NoError(t, err) + + _, err = db.Exec(`insert into defer_test (id, n) values ('a', 1), ('b', 2), ('c', 3)`) + require.NoError(t, err) + + var id string + err = db.QueryRow(`insert into defer_test (id, n) values ('e', 4) returning id`).Scan(&id) + assert.Error(t, err) + }) +}