cockroachdb / cockroachdb/cockroach
Sentry: catch.go:24: runtime error: index out of range [0] with length 0 (1) while executing: SELECT array_agg(_ ORDER BY _) FROM _@_ WHERE st_coveredby(_, '_'::GEOMETRY) Wraps: (2) assertion failure ...
- Dominant language
- Go
- Stars
- 32.5k
- Forks
- 4.1k
- PR merge metrics
- PR metrics pending
Description
This issue was auto filed by Sentry. It represents a crash or reported error on a live cluster with telemetry enabled.
Sentry Link: [https://cockroach-labs.sentry.io/issues/7695118447/?referrer=webhooks_plugin](https://cockroach-labs.sentry.io/issues/7695118447/?referrer=webhooks_plugin)
Panic Message:
```
catch.go:24: runtime error: index out of range [0] with length 0
(1) while executing: SELECT array_agg(_ ORDER BY _) FROM _@_ WHERE st_coveredby(_, '_'::GEOMETRY)
Wraps: (2) assertion failure
Wraps: (3) attached stack trace
-- stack trace:
| github.com/cockroachdb/cockroach/pkg/util/errorutil.shouldCatch
| pkg/util/errorutil/catch.go:24
| github.com/cockroachdb/cockroach/pkg/util/errorutil.MaybeCatchPanic
| pkg/util/errorutil/catch.go:38
| runtime.gopanic
| GOROOT/src/runtime/panic.go:783
| runtime.goPanicIndex
| GOROOT/src/runtime/panic.go:115
| github.com/twpayne/go-geom.(*Point).X
| external/com_github_twpayne_go_geom/point.go:96
| github.com/cockroachdb/cockroach/pkg/geo/geoindex.(*s2GeometryIndex).geomExceedsBounds
| pkg/geo/geoindex/s2_geometry_index.go:336
| github.com/cockroachdb/cockroach/pkg/geo/geoindex.(*s2GeometryIndex).geomExceedsBounds
| pkg/geo/geoindex/s2_geometry_index.go:355
| github.com/cockroachdb/cockroach/pkg/geo/geoindex.(*s2GeometryIndex).convertToGeomTAndTryClip
| pkg/geo/geoindex/s2_geometry_index.go:293
| github.com/cockroachdb/cockroach/pkg/geo/geoindex.(*s2GeometryIndex).Intersects
| pkg/geo/geoindex/s2_geometry_index.go:236
| github.com/cockroachdb/cockroach/pkg/geo/geoindex.(*s2GeometryIndex).Covers
| pkg/geo/geoindex/s2_geometry_index.go:206
| github.com/cockroachdb/cockroach/pkg/sql/opt/invertedidx.getSpanExprForGeometryIndex
| pkg/sql/opt/invertedidx/geo.go:167
| github.com/cockroachdb/cockroach/pkg/sql/opt/invertedidx.extractGeoFilterCondition
| pkg/sql/opt/invertedidx/geo.go:633
| github.com/cockroachdb/cockroach/pkg/sql/opt/invertedidx.(*geoFilterPlanner).extractInvertedFilterConditionFromLeaf
| pkg/sql/opt/invertedidx/geo.go:591
| github.com/cockroachdb/cockroach/pkg/sql/opt/invertedidx.extractInvertedFilterCondition
| pkg/sql/opt/invertedidx/inverted_index_expr.go:708
| github.com/cockroachdb/cockroach/pkg/sql/opt/invertedidx.TryFilterInvertedIndex
| pkg/sql/opt/invertedidx/inverted_index_expr.go:156
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*CustomFuncs).generateInvertedIndexScansImpl.func1
| pkg/sql/opt/xform/select_funcs.go:919
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*scanIndexIter).ForEachStartingAfter
| pkg/sql/opt/xform/scan_index_iter.go:317
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*scanIndexIter).ForEach
| pkg/sql/opt/xform/scan_index_iter.go:209
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*CustomFuncs).generateInvertedIndexScansImpl
| pkg/sql/opt/xform/select_funcs.go:908
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*CustomFuncs).GenerateInvertedIndexScans
| pkg/sql/opt/xform/select_funcs.go:853
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*explorer).exploreSelect
| bazel-out/k8-opt/bin/pkg/sql/opt/xform/explorer.og.go:399
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*explorer).exploreGroupMember
| bazel-out/k8-opt/bin/pkg/sql/opt/xform/explorer.og.go:25
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*explorer).exploreGroup
| pkg/sql/opt/xform/explorer.go:180
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*Optimizer).optimizeGroup
| pkg/sql/opt/xform/optimizer.go:560
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*Optimizer).optimizeEnforcer
| pkg/sql/opt/xform/optimizer.go:733
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*Optimizer).enforceProps
| pkg/sql/opt/xform/optimizer.go:695
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*Optimizer).optimizeGroupMember
| pkg/sql/opt/xform/optimizer.go:590
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*Optimizer).optimizeGroup
| pkg/sql/opt/xform/optimizer.go:547
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*Optimizer).optimizeExpr
| pkg/sql/opt/xform/optimizer.go:297
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*Optimizer).optimizeGroupMember
| pkg/sql/opt/xform/optimizer.go:605
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*Optimizer).optimizeGroup
| pkg/sql/opt/xform/optimizer.go:547
| github.com/cockroachdb/cockroach/pkg/sql/opt/xform.(*Optimizer).Optimize
| pkg/sql/opt/xform/optimizer.go:267
Wraps: (4) runtime error: index out of range [0] with length 0
| -- cause hidden behind barrier
| runtime error: index out of range [0] with length 0
| (1) runtime error: index out of range [0] with length 0
| Error types: (1) runtime.boundsError
Error types: (1) *safedetails.withSafeDetails (2) *assert.withAssertionFailure (3) *withstack.withStack (4) *barriers.barrierErr
-- report composition:
*barriers.barrierErr: masked error: runtime error: index out of range [0] with length 0
catch.go:24: *withstack.withStack (top exception)
*assert.withAssertionFailure
*safedetails.withSafeDetails: while executing: SELECT array_agg(_ ORDER BY _) FROM _@_ WHERE st_coveredby(_, '_'::GEOMETRY)
```
Stacktrace (expand for inline code snippets):
[pkg/sql/opt/xform/optimizer.go#L266-L268](pkg/sql/opt/xform/optimizer.go#L266-L268)
[pkg/sql/opt/xform/optimizer.go#L546-L548](pkg/sql/opt/xform/optimizer.go#L546-L548)
[pkg/sql/opt/xform/optimizer.go#L604-L606](pkg/sql/opt/xform/optimizer.go#L604-L606)
[pkg/sql/opt/xform/optimizer.go#L296-L298](pkg/sql/opt/xform/optimizer.go#L296-L298)
[pkg/sql/opt/xform/optimizer.go#L546-L548](pkg/sql/opt/xform/optimizer.go#L546-L548)
[pkg/sql/opt/xform/optimizer.go#L589-L591](pkg/sql/opt/xform/optimizer.go#L589-L591)
[pkg/sql/opt/xform/optimizer.go#L694-L696](pkg/sql/opt/xform/optimizer.go#L694-L696)
[pkg/sql/opt/xform/optimizer.go#L732-L734](pkg/sql/opt/xform/optimizer.go#L732-L734)
[pkg/sql/opt/xform/optimizer.go#L559-L561](pkg/sql/opt/xform/optimizer.go#L559-L561)
[pkg/sql/opt/xform/explorer.go#L179-L181](pkg/sql/opt/xform/explorer.go#L179-L181)
[bazel-out/k8-opt/bin/pkg/sql/opt/xform/explorer.og.go#L24-L26](bazel-out/k8-opt/bin/pkg/sql/opt/xform/explorer.og.go#L24-L26)
[bazel-out/k8-opt/bin/pkg/sql/opt/xform/explorer.og.go#L398-L400](bazel-out/k8-opt/bin/pkg/sql/opt/xform/explorer.og.go#L398-L400)
[pkg/sql/opt/xform/select_funcs.go#L852-L854](pkg/sql/opt/xform/select_funcs.go#L852-L854)
[pkg/sql/opt/xform/select_funcs.go#L907-L909](pkg/sql/opt/xform/select_funcs.go#L907-L909)
[pkg/sql/opt/xform/scan_index_iter.go#L208-L210](pkg/sql/opt/xform/scan_index_iter.go#L208-L210)
[pkg/sql/opt/xform/scan_index_iter.go#L316-L318](pkg/sql/opt/xform/scan_index_iter.go#L316-L318)
[pkg/sql/opt/xform/select_funcs.go#L918-L920](pkg/sql/opt/xform/select_funcs.go#L918-L920)
[pkg/sql/opt/invertedidx/inverted_index_expr.go#L155-L157](pkg/sql/opt/invertedidx/inverted_index_expr.go#L155-L157)
[pkg/sql/opt/invertedidx/inverted_index_expr.go#L707-L709](pkg/sql/opt/invertedidx/inverted_index_expr.go#L707-L709)
[pkg/sql/opt/invertedidx/geo.go#L590-L592](pkg/sql/opt/invertedidx/geo.go#L590-L592)
[pkg/sql/opt/invertedidx/geo.go#L632-L634](pkg/sql/opt/invertedidx/geo.go#L632-L634)
[pkg/sql/opt/invertedidx/geo.go#L166-L168](pkg/sql/opt/invertedidx/geo.go#L166-L168)
[pkg/geo/geoindex/s2_geometry_index.go#L205-L207](pkg/geo/geoindex/s2_geometry_index.go#L205-L207)
[pkg/geo/geoindex/s2_geometry_index.go#L235-L237](pkg/geo/geoindex/s2_geometry_index.go#L235-L237)
[pkg/geo/geoindex/s2_geometry_index.go#L292-L294](pkg/geo/geoindex/s2_geometry_index.go#L292-L294)
[pkg/geo/geoindex/s2_geometry_index.go#L354-L356](pkg/geo/geoindex/s2_geometry_index.go#L354-L356)
[pkg/geo/geoindex/s2_geometry_index.go#L335-L337](pkg/geo/geoindex/s2_geometry_index.go#L335-L337)
[external/com_github_twpayne_go_geom/point.go#L95-L97](external/com_github_twpayne_go_geom/point.go#L95-L97)
[GOROOT/src/runtime/panic.go#L114-L116](GOROOT/src/runtime/panic.go#L114-L116)
[GOROOT/src/runtime/panic.go#L782-L784](GOROOT/src/runtime/panic.go#L782-L784)
[pkg/util/errorutil/catch.go#L37-L39](pkg/util/errorutil/catch.go#L37-L39)
[pkg/util/errorutil/catch.go#L23-L25](pkg/util/errorutil/catch.go#L23-L25)
```
pkg/sql/opt/xform/optimizer.go in pkg/sql/opt/xform.(*Optimizer).Optimize at line 267
pkg/sql/opt/xform/optimizer.go in pkg/sql/opt/xform.(*Optimizer).optimizeGroup at line 547
pkg/sql/opt/xform/optimizer.go in pkg/sql/opt/xform.(*Optimizer).optimizeGroupMember at line 605
pkg/sql/opt/xform/optimizer.go in pkg/sql/opt/xform.(*Optimizer).optimizeExpr at line 297
pkg/sql/opt/xform/optimizer.go in pkg/sql/opt/xform.(*Optimizer).optimizeGroup at line 547
pkg/sql/opt/xform/optimizer.go in pkg/sql/opt/xform.(*Optimizer).optimizeGroupMember at line 590
pkg/sql/opt/xform/optimizer.go in pkg/sql/opt/xform.(*Optimizer).enforceProps at line 695
pkg/sql/opt/xform/optimizer.go in pkg/sql/opt/xform.(*Optimizer).optimizeEnforcer at line 733
pkg/sql/opt/xform/optimizer.go in pkg/sql/opt/xform.(*Optimizer).optimizeGroup at line 560
pkg/sql/opt/xform/explorer.go in pkg/sql/opt/xform.(*explorer).exploreGroup at line 180
bazel-out/k8-opt/bin/pkg/sql/opt/xform/explorer.og.go in pkg/sql/opt/xform.(*explorer).exploreGroupMember at line 25
bazel-out/k8-opt/bin/pkg/sql/opt/xform/explorer.og.go in pkg/sql/opt/xform.(*explorer).exploreSelect at line 399
pkg/sql/opt/xform/select_funcs.go in pkg/sql/opt/xform.(*CustomFuncs).GenerateInvertedIndexScans at line 853
pkg/sql/opt/xform/select_funcs.go in pkg/sql/opt/xform.(*CustomFuncs).generateInvertedIndexScansImpl at line 908
pkg/sql/opt/xform/scan_index_iter.go in pkg/sql/opt/xform.(*scanIndexIter).ForEach at line 209
pkg/sql/opt/xform/scan_index_iter.go in pkg/sql/opt/xform.(*scanIndexIter).ForEachStartingAfter at line 317
pkg/sql/opt/xform/select_funcs.go in pkg/sql/opt/xform.(*CustomFuncs).generateInvertedIndexScansImpl.func1 at line 919
pkg/sql/opt/invertedidx/inverted_index_expr.go in pkg/sql/opt/invertedidx.TryFilterInvertedIndex at line 156
pkg/sql/opt/invertedidx/inverted_index_expr.go in pkg/sql/opt/invertedidx.extractInvertedFilterCondition at line 708
pkg/sql/opt/invertedidx/geo.go in pkg/sql/opt/invertedidx.(*geoFilterPlanner).extractInvertedFilterConditionFromLeaf at line 591
pkg/sql/opt/invertedidx/geo.go in pkg/sql/opt/invertedidx.extractGeoFilterCondition at line 633
pkg/sql/opt/invertedidx/geo.go in pkg/sql/opt/invertedidx.getSpanExprForGeometryIndex at line 167
pkg/geo/geoindex/s2_geometry_index.go in pkg/geo/geoindex.(*s2GeometryIndex).Covers at line 206
pkg/geo/geoindex/s2_geometry_index.go in pkg/geo/geoindex.(*s2GeometryIndex).Intersects at line 236
pkg/geo/geoindex/s2_geometry_index.go in pkg/geo/geoindex.(*s2GeometryIndex).convertToGeomTAndTryClip at line 293
pkg/geo/geoindex/s2_geometry_index.go in pkg/geo/geoindex.(*s2GeometryIndex).geomExceedsBounds at line 355
pkg/geo/geoindex/s2_geometry_index.go in pkg/geo/geoindex.(*s2GeometryIndex).geomExceedsBounds at line 336
external/com_github_twpayne_go_geom/point.go in github.com/twpayne/go-geom.(*Point).X at line 96
GOROOT/src/runtime/panic.go in runtime.goPanicIndex at line 115
GOROOT/src/runtime/panic.go in runtime.gopanic at line 783
pkg/util/errorutil/catch.go in pkg/util/errorutil.MaybeCatchPanic at line 38
pkg/util/errorutil/catch.go in pkg/util/errorutil.shouldCatch at line 24
```
### Tags
| Tag | Value |
| --- | --- |
| Command | start-single-node |
| Environment | v26.2.1 |
| Go Version | go1.25.5 |
| Platform | darwin arm64 |
| Distribution | CCL |
| Cockroach Release | v26.2.1 |
| Cockroach SHA | b398a6e1fde74a915daf8e9841303c8ee39c2abe |
| # of CPUs | 16 |
| # of Goroutines | 631 |
Jira issue: CRDB-67399
Contributor guide
Research direction
Start in pkg/geo/geoindex/s2_geometry_index.go around geomExceedsBounds at lines 336 and 355, then inspect the go-geom Point.X call shown in the stack trace. Use the reported ST_CoveredBy query and a reproducible spatial-index fixture if available. Done means the query no longer panics on the empty point data and the regression is covered by an appropriate test.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go, sql
- Domain
- databases
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100