# [KB]关于 TiDB 包含用户自定义变量的 SQL 无法下推，导致其执行计划与直接赋值的 SQL 不一致

## Issue

用户自定义变量的 SQL 执行计划与直接赋值不一致，自定义变量 SQL 无法下推

## Root Cause

目前 TiDB 暂时不支持对 "用户自定义变量" 的谓词下推的逻辑优化 Github Issue [https://github.com/pingcap/tidb/issues/24276](https://github.com/pingcap/tidb/issues/24276)

## Diagnostic Steps

查看使用自定义变量的 SQL 的执行计划，执行计划中无法下推。

举例可以看到 query 1 无法下推

```sql
drop table if exists t; 
create table t (added_time datetime);

 – query 1 
SET @startTime = '2021-04-07 16:00:00'; 
SET @endTime = '2021-04-08 16:00:00'; 
explain select count(1) AS total, 0 AS now from t where added_time >= @startTime and added_time < @endTime; 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| id | estRows | task | access object | operator info | 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| Projection_5 | 1.00 | root | | Column#3, 0>Column#4 | 
| └─HashAgg_6 | 1.00 | root | | funcs:count(1)>Column#3 | 
| └─Selection_8 | 8000.00 | root | | ge(test.t.added_time, cast(getvar("starttime"), datetime(6) BINARY)), lt(test.t.added_time, cast(getvar("endtime"), datetime(6) BINARY)) | 
| └─TableReader_10 | 10000.00 | root | | data:TableFullScan_9 | 
| └─TableFullScan_9 | 10000.00 | cop\[tikv] | table:t | keep order:false, stats:pseudo 
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

– query 2 explain select count(1) AS total, 0 AS now from t where added_time >= '2021-04-07 16:00:00' and added_time < '2021-04-08 16:00:00'; 
---------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| id | estRows | task | access object | operator info 
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| Projection_5 | 1.00 | root | | Column#3, 0>Column#4 | | └─StreamAgg_20 | 1.00 | root | 
| funcs:count(Column#7)>Column#3 | 
| └─TableReader_21 | 1.00 | root | 
| data:StreamAgg_9 | 
| └─StreamAgg_9 | 1.00 | cop\[tikv] | | funcs:count(1)>Column#7 | 
| └─Selection_19 | 250.00 | cop\[tikv] | | ge(test.t.added_time, 2021-04-07 16:00:00.000000), lt(test.t.added_time, 2021-04-08 16:00:00.000000) | 
| └─TableFullScan_18 | 10000.00 | cop\[tikv] | table:t | keep order:false, stats:pseudo 
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------
```

## Resolution

还未明确 feature 的支持计划

## Workaround

可以使用 prepare 语句，而不是使用用户自定义变量的方式，来达到下推的效果。