Fix ignored deferred error with database/sql QueryRow

fixes #958
pull/962/head
Jack Christensen 2021-03-13 06:52:58 -06:00
parent 38ab93613b
commit e93da6c744
2 changed files with 40 additions and 1 deletions

View File

@ -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 {

View File

@ -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)
})
}