left join + ifnull重命名导致的重命名字段不被识别

Bug 反馈
清晰准确地描述您发现的问题,提供任何可能复现问题的步骤有助于研发同学及时处理问题
【 Bug 的影响】
查询报错,ERROR 1105 (HY000): Can’t find column Column#5 in schema Column: [test_db1.test_ifnull.id,test_db1.test_ifnull.create_at,test_db1.test_ifnull_2.id,test_db1.test_ifnull_2.update_at] Unique key: []
【可能的问题复现步骤】
CREATE TABLE test_ifnull (
id bigint(18) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘主键’,
create_at datetime DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

CREATE TABLE test_ifnull_2 (
id bigint(18) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘主键’,
update_at datetime DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

mysql> select * from test_ifnull;
±—±--------------------+
| id | create_at |
±—±--------------------+
| 1 | 2022-02-06 00:03:35 |
| 2 | 2022-02-07 00:03:35 |
±—±--------------------+

mysql> select * from test_ifnull_2;
±—±--------------------+
| id | update_at |
±—±--------------------+
| 1 | 2021-02-06 00:03:35 |
| 3 | 2021-02-07 00:03:35 |
±—±--------------------+
2 rows in set (0.37 sec)

将上述数据插入到对应的表后进行查询
select * from( select m2.id,m2.create_at,m3.update_at,ifnull(m3.update_at,m2.create_at) abc from test_ifnull m2 left join test_ifnull_2 m3 on m3.id=m2.id) a where a.abc >=‘2022-02-07 00:00:00’;

可以规避的查询办法有:
1.
select * from( select m2.id,m2.create_at,m3.update_at,ifnull(m3.update_at,m2.create_at) abc from test_ifnull m2 left join test_ifnull_2 m3 on m3.id=m2.id) a where ifnull(a.update_at,a.create_at) >=‘2022-02-07 00:00:00’;

select * from( select m2.id,m2.create_at,m3.update_at,coalesce(m3.update_at,m2.create_at) abc from test_ifnull m2 left join test_ifnull_2 m3 on m3.id=m2.id) a where a.abc >=‘2022-02-07 00:00:00’;

【看到的非预期行为】
报错:ERROR 1105 (HY000): Can’t find column Column#5 in schema Column: [test_db1.test_ifnull.id,test_db1.test_ifnull.create_at,test_db1.test_ifnull_2.id,test_db1.test_ifnull_2.update_at] Unique key: []
【期望看到的行为】
正常查询出结果
【相关组件及具体版本】
4.0.14
【其他背景信息或者截图】
如集群拓扑,系统和内核版本,应用 app 信息等;如果问题跟 SQL 有关,请提供 SQL 语句和相关表的 Schema 信息;如果节点日志存在关键报错,请提供相关节点的日志内容或文件;如果一些业务敏感信息不便提供,请留下联系方式,我们与您私下沟通。

在 v4.0.14 测试了一下,没有复现成功。测试步骤如下(试着用auto_increment 自动填充 id 也一样)

mysql> CREATE TABLE test_ifnull (
-> id bigint(18) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘主键’,
-> create_at datetime DEFAULT NULL,
-> PRIMARY KEY (id)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Query OK, 0 rows affected (0.09 sec)

mysql> CREATE TABLE test_ifnull_2 (
-> id bigint(18) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘主键’,
-> update_at datetime DEFAULT NULL,
-> PRIMARY KEY (id)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Query OK, 0 rows affected (0.13 sec)

mysql> insert into test_ifnull values(1,‘2022-02-06 00:03:35’);
Query OK, 1 row affected (0.02 sec)

mysql> insert into test_ifnull values(2,‘2022-02-07 00:03:35’);
Query OK, 1 row affected (0.01 sec)

mysql> insert into test_ifnull_2 values(1,‘2021-02-06 00:03:35’);
Query OK, 1 row affected (0.02 sec)

mysql> insert into test_ifnull_2 values(3,‘2021-02-07 00:03:35’);
Query OK, 1 row affected (0.01 sec)

mysql> select * from( select m2.id,m2.create_at,m3.update_at,ifnull(m3.update_at,m2.create_at) abc from test_ifnull m2 left join test_ifnull_2 m3 on m3.id=m2.id) a where a.abc >=‘2022-02-07 00:00:00’;
±—±--------------------±----------±--------------------+
| id | create_at | update_at | abc |
±—±--------------------±----------±--------------------+
| 2 | 2022-02-07 00:03:35 | NULL | 2022-02-07 00:03:35 |
±—±--------------------±----------±--------------------+
1 row in set (0.00 sec)

麻烦帮忙看下您的配置参数,有没有什么特殊设置,比如:
show config where name like ‘new_collations_enabled_on_first_bootstrap’;
show config where name like ‘%feedback-probability’;

image

感谢大佬回复,我这看起来配置都正常

看日志也确实是bug的报错,但是你那不能复现,感觉好奇怪,是不是跟我这空region太多有关,看起来是执行计划走的不对

我在我另一套4.0.13的环境也复现了,两套环境基本上都是默认配置,大佬可以让我看下你的表结构和里面的数据么

这是我的完整步骤
mysql> CREATE TABLE test_ifnull (
-> id bigint(18) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘主键’,
-> create_at datetime DEFAULT NULL,
-> PRIMARY KEY (id)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Query OK, 0 rows affected (0.19 sec)

mysql> CREATE TABLE test_ifnull_2 (
-> id bigint(18) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘主键’,
-> update_at datetime DEFAULT NULL,
-> PRIMARY KEY (id)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Query OK, 0 rows affected (0.20 sec)

mysql> insert into test_ifnull values(1,‘2022-02-06 00:03:35’),(2,‘2022-02-07 00:03:35’);
Query OK, 2 rows affected (0.11 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> insert into test_ifnull_2 values(1,‘2021-02-06 00:03:35’),(3,‘2021-02-07 00:03:35’);
Query OK, 2 rows affected (0.16 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from( select m2.id,m2.create_at,m3.update_at,ifnull(m3.update_at,m2.create_at) abc from test_ifnull m2 left join test_ifnull_2 m3 on m3.id=m2.id) a where a.abc >=‘2022-02-07 00:00:00’;
ERROR 1105 (HY000): Can’t find column Column#5 in schema Column: [zzz_wd.test_ifnull.id,zzz_wd.test_ifnull.create_at,zzz_wd.test_ifnull_2.update_at] Unique key: []

多谢,复现了,区别在于,第一次我的环境中 new_collations_enabled_on_first_bootstrap 参数是 false。我们先查一下。

好的,感谢

感谢反馈,并非已知问题,创建了 Github Issue https://github.com/pingcap/tidb/issues/32160 ,可以关注,当前还是要按照您的方法规避处理。

好的,收到:+1: