select后的列字段使用函数后重命名为同一字段名导致执行计划异常

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:V3.0.3
  • 【问题描述】:在mysql正常查询的sql迁移到tidb后出现执行计划异常,经确认异常规则如下

1: select 某函数(字段名t1) as 字段名t1 from 表名 … 执行计划会出现异常

2: select 某函数(字段名t1) 字段名t1 from 表名 … 执行计划会出现异常

3: select 某函数(字段名t1) as 其他任意字符串 from 表名 … 执行计划不会出现异常

4: select 某函数(字段名t1) 其他任意字符串 from 表名 … 执行计划会不出现异常

5: select 某函数(字段名t1) from 表名 … 执行计划会不出现异常

6: select 字段名t1 from 表名 … 执行计划会不出现异常

出问题的时候业务里使用的是unix_timestamp(create_at) as create_at , 测试的时候发现别的函数比如length也有该问题,帮确认下该问题是已知bug吗?可以通过升级版本来解决吗,谢谢

这是预期的行为。

select 某函数(字段名t1) as 字段名t1 from表名force index(字段名t1) order by 字段名t1 limit 1

等价于

select 某函数(字段名t1) as 字段名t1 from表名force index(某函数(字段名t1)) order by 某函数(字段名t1) limit 1

如果想要走 字段名 t1 上的索引,并对其 order by,建议将 as 换一个名字

下面附上 MySQL 的例子:

mysql> create table t(a int, key(a));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t values(1), (-1), (2), (-2);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select abs(a) a from t use index(a) order by a limit 1;
+------+
| a    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select abs(a)  from t use index(a) order by a limit 1;
+--------+
| abs(a) |
+--------+
|      2 |
+--------+
1 row in set (0.00 sec)
1赞

明白问题原因了,多谢大佬解惑

:+1: