# [KB]关于 TiDB 的 SQL 包含 HAVING 或 union 时查询报错 index out of range [ 1]

## Issue

执行复杂的 SQL 查询语句遇到报错 ERROR 1105 (HY000): runtime error: index out of range \[ 1]

## Root Cause

BUG Issue: [https://github.com/pingcap/tidb/issues/24045](https://github.com/pingcap/tidb/issues/24045)

在 LogicalAggregation/LogicalJoin 中保存之前，克隆可能的属性中的列，否则如果这些属性通过上层LogicalProjection，下面的列可能被修改，导致panic

可以理解为当查询包含 HAVING 或 UNION 子句时，在构建执行计划的过程中可能导致 Panic 

## Diagnostic Steps

1. 尝试在 sql_mode 中去掉 ONLY_FULL_GROUP_BY 查询仍然报错
2. 错误栈信息，包含关键字 TryToGetChildProp，类似如下信息

```golang
\[err="runtime error: index out of range \[-1]"] 
\[stack="goroutine 45085907 \[running]:\ngithub.com/pingcap/tidb/server.(\*clientConn).Run.func1(0x3ff6060, 0xc036df85d0, 0xc038984a00)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/conn.go:734 +0xee\npanic(0x378df20, 0xc074c3a220)
/usr/local/go/src/runtime/panic.go:679 +0x1b2\ngithub.com/pingcap/tidb/planner/core.(\*LogicalProjection).TryToGetChildProp(0xc02c3937a0, 0xc02ced87e0, 0xc02ceaa1a0, 0xc02cea2310)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/exhaust_physical_plans.go:1927 +0x39a\ngithub.com/pingcap/tidb/planner/core.(\*LogicalProjection).exhaustPhysicalPlans(0xc02c3937a0, 0xc02ced87e0, 0xc074e09500, 0x29, 0x5f84760, 0xc02ced60a0)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/exhaust_physical_plans.go:1939 +0x50\ngithub.com/pingcap/tidb/planner/core.(\*baseLogicalPlan).findBestTask(0xc02c3937c0, 0xc02cea93b0, 0x5978228, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/find_best_task.go:310 +0x1d5\ngithub.com/pingcap/tidb/planner/core.(\*baseLogicalPlan).enumeratePhysicalPlans4Task(0xc02c115a60, 0xc02cea4c60, 0x6, 0x6, 0xc02cea8e00, 0xc02cea2200, 0x5978228, 0x10, 0x36a7b20, 0x0, ...)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/find_best_task.go:213 +0x70d\ngithub.com/pingcap/tidb/planner/core.(\*baseLogicalPlan).findBestTask(0xc02c115a60, 0xc02cea8d90, 0x5978228, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/find_best_task.go:343 +0x32f\ngithub.com/pingcap/tidb/planner/core.(\*baseLogicalPlan).enumeratePhysicalPlans4Task(0xc02c1e7600, 0xc02cea2240, 0x1, 0x1, 0xc02cea8d20, 0xc01aa69500, 0x5978228, 0x20, 0x36a7b20, 0x1, ...)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/find_best_task.go:213 +0x70d\ngithub.com/pingcap/tidb/planner/core.(\*baseLogicalPlan).findBestTask(0xc02c1e7600, 0xc02cea8c40, 0x5978228, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/find_best_task.go:343 +0x32f\ngithub.com/pingcap/tidb/planner/core.(\*baseLogicalPlan).enumeratePhysicalPlans4Task(0xc02c8227a0, 0xc02cea2230, 0x1, 0x1, 0xc02cea8bd0, 0xc02cea2200, 0x5978228, 0x10, 0x36a7b20, 0x2, ...)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/find_best_task.go:213 +0x70d\ngithub.com/pingcap/tidb/planner/core.(\*baseLogicalPlan).findBestTask(0xc02c8227a0, 0xc02cea8b60, 0x5978228, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/find_best_task.go:343 +0x32f\ngithub.com/pingcap/tidb/planner/core.(\*baseLogicalPlan).enumeratePhysicalPlans4Task(0xc02c669ba0, 0xc03b23c330, 0x1, 0x3, 0xc02cea8770, 0xc02cea2100, 0x5978228, 0x10, 0x36a7b20, 0xc02ce959a0, ...)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/find_best_task.go:213 +0x70d\ngithub.com/pingcap/tidb/planner/core.(\*baseLogicalPlan).findBestTask(0xc02c669ba0, 0xc02cea8690, 0x5978228, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/find_best_task.go:343 +0x32f\ngithub.com/pingcap/tidb/planner/core.(\*baseLogicalPlan).enumeratePhysicalPlans4Task(0xc02c669ce0, 0xc03b23c300, 0x2, 0x3, 0xc02cea8380, 0xc02cea2100, 0x5978228, 0x10, 0x36a7b20, 0x0, ...)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/planner/core/find_best_task.go:213 +0x70d\ngithub.com/pingcap/tidb/planner/core.(\*baseLogicalPlan).findBestTask(0xc02c669ce0, 0xc02cea8310, 0x5978228, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/s"]
```

## Resolution

PR [https://github.com/pingcap/tidb/pull/24204](https://github.com/pingcap/tidb/pull/24204)

修复版本 v5.0.2

## Workaround

需要根据具体的 SQL 执行改写