performance cross-join bug

tidb 修改参数performance cross-join:false
执行join语句后报错:Cartesian product is unsupported

语句如下:
SELECT
count(*)
FROM
operator_group_menu om
INNER JOIN operator_group og ON om.group_id = og.id
WHERE
om.group_id = 1
AND om.menu_id IN ( 258 )
AND og.STATUS = 0;

官方说明:
cross-join

  • 默认值:true
  • 默认可以执行在做 join 时两边表没有任何条件(where 字段)的语句;如果设置为 false,则有这样的 join 语句出现时,server 会拒绝执行

这里意思是拒绝执行?意思是 Unsupported 吗?这么解释的话好像没毛病。

默认值true:允许量表join时没有where条件的语句
改为false:则join时没有where条件的语句,会被拒绝执行

当前设置成false,并且我的语句join时带有where条件,那么按照理解,是可以执行的。
如果是join时没有带where条件,则是被拒绝的。

所以我认为这是一个bug

  1. 请问这边使用的版本是哪个?
  2. 根据你提供的 SQL,包含了 om 和 og 表两个表的 join on 的字段。应该是可以正常的执行的。
    我这边简单测试了一下不能重现你说的问题。

image

  1. 方便提供一下两个表的结构以及可以复现的数据给我们这边复现问题吗?
  2. 我这边使用 v4.0.5 简单测试了一下,没有重现这个问题。

CREATE TABLE operator_group_menu (
id bigint(20) NOT NULL AUTO_INCREMENT,
group_id bigint(20) NOT NULL COMMENT ‘关联operator_group表ID’,
menu_id bigint(20) NOT NULL,
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘最后修改时间’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=90002 COMMENT=‘xxx’;

CREATE TABLE operator_group (
id bigint(20) NOT NULL AUTO_INCREMENT,
type tinyint(4) NOT NULL DEFAULT 0 COMMENT ‘分组类型 0默认值 1超管级别’,
group_name varchar(50) NOT NULL COMMENT ‘分组名称’,
tenant_code varchar(32) NOT NULL COMMENT ‘租户编码’,
status tinyint(4) NOT NULL DEFAULT 0 COMMENT ‘状态:0: 启用 1:关闭’,
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘最后修改时间’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=90002 COMMENT=‘xxx’

方便给一些用于复现的数据吗?导出成 insert 的标准 SQL 。敏感信息可以去掉。

INSERT INTO operator_group(id, type, group_name, tenant_code, status, create_time, update_time) VALUES (1, 1, ‘平台超管’, ‘system’, 0, ‘2020-08-17 08:35:31’, ‘2020-08-17 08:35:31’);
INSERT INTO operator_group(id, type, group_name, tenant_code, status, create_time, update_time) VALUES (2, 1, ‘测试管理员’, ‘xxxx’, 0, ‘2020-08-21 16:29:15’, ‘2020-08-21 16:29:15’);
INSERT INTO operator_group(id, type, group_name, tenant_code, status, create_time, update_time) VALUES (3, 1, ‘测试管理员’, ‘PTE’, 0, ‘2020-08-24 10:50:13’, ‘2020-08-24 10:50:13’);
INSERT INTO operator_group(id, type, group_name, tenant_code, status, create_time, update_time) VALUES (4, 1, ‘测试管理员’, ‘WOS’, 0, ‘2020-09-07 10:17:47’, ‘2020-09-07 10:17:47’);
INSERT INTO operator_group(id, type, group_name, tenant_code, status, create_time, update_time) VALUES (5, 1, ‘测试管理员’, ‘CptTest’, 0, ‘2020-09-07 18:20:55’, ‘2020-09-07 18:20:55’);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
INSERT INTO operator_group_menu(id, group_id, menu_id, create_time, update_time) VALUES (1, 1, 1, ‘2020-08-17 08:35:31’, ‘2020-08-17 08:35:31’);
INSERT INTO operator_group_menu(id, group_id, menu_id, create_time, update_time) VALUES (2, 1, 11, ‘2020-08-17 08:35:31’, ‘2020-08-17 08:35:31’);
INSERT INTO operator_group_menu(id, group_id, menu_id, create_time, update_time) VALUES (3, 1, 12, ‘2020-08-17 08:35:31’, ‘2020-08-17 08:35:31’);
INSERT INTO operator_group_menu(id, group_id, menu_id, create_time, update_time) VALUES (4, 1, 13, ‘2020-08-17 08:35:31’, ‘2020-08-17 08:35:31’);
INSERT INTO operator_group_menu(id, group_id, menu_id, create_time, update_time) VALUES (5, 1, 14, ‘2020-08-17 08:35:31’, ‘2020-08-17 08:35:31’);
INSERT INTO operator_group_menu(id, group_id, menu_id, create_time, update_time) VALUES (6, 1, 19, ‘2020-08-17 08:35:31’, ‘2020-08-17 08:35:31’);
INSERT INTO operator_group_menu(id, group_id, menu_id, create_time, update_time) VALUES (7, 1, 20, ‘2020-08-17 08:35:31’, ‘2020-08-17 08:35:31’);
INSERT INTO operator_group_menu(id, group_id, menu_id, create_time, update_time) VALUES (8, 1, 21, ‘2020-08-17 08:35:31’, ‘2020-08-17 08:35:31’);
INSERT INTO operator_group_menu(id, group_id, menu_id, create_time, update_time) VALUES (9, 1, 22, ‘2020-08-17 08:35:31’, ‘2020-08-17 08:35:31’);

已经能重现问题。我们这边先内部排查一下原因。感谢反馈。

1赞