diff --git a/pkg/sql/logictest/testdata/logic_test/cursor b/pkg/sql/logictest/testdata/logic_test/cursor index 896b07e5f0e2..dba02eca4620 100644 --- a/pkg/sql/logictest/testdata/logic_test/cursor +++ b/pkg/sql/logictest/testdata/logic_test/cursor @@ -943,3 +943,20 @@ statement ok CLOSE foo; subtest end + +# Regression test for FETCH FIRST on a persisted WITH HOLD cursor over an +# empty result set returning an internal error instead of zero rows (#171238). +subtest regression_171238 + +statement ok +BEGIN; +DECLARE foo_first CURSOR WITH HOLD FOR SELECT * FROM empty; +COMMIT; + +query empty +FETCH FIRST FROM foo_first; + +statement ok +CLOSE foo_first; + +subtest end diff --git a/pkg/sql/sql_cursor.go b/pkg/sql/sql_cursor.go index 4436ed3fdceb..1496e2b552c2 100644 --- a/pkg/sql/sql_cursor.go +++ b/pkg/sql/sql_cursor.go @@ -288,8 +288,8 @@ func (b *fetchMoveNodeBase) nextInternal(ctx context.Context) (bool, error) { case tree.FetchFirst: switch b.cursor.curRow { case 0: - _, err := b.cursor.Next(ctx) - return true, err + more, err := b.cursor.Next(ctx) + return more, err case 1: return true, nil }