sql查询异常,4.0.10可以执行,升级到5.0.0之后执行异常

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【TiDB 版本】5.0.0

【问题描述】
sql查询异常,4.0.10可以执行,升级到5.0.0之后执行异常
SELECT
M2.field_1 AS field_1,
M2.field_2 AS field_2,
M2.field_3 AS field_3,
M2.field_4 AS field_4,
M2.field_5 AS field_5,
M2.field_6 AS field_6,
M4.field_1 AS field_19
FROM
(
SELECT
M1.id AS field_1,
M1.NAME AS field_2,
M1.creator AS field_3,
M1.field_1 AS field_4,
M1.create_time AS field_5,
M1.update_time AS field_6,
M1.comment_time AS field_7,
M1.data_status AS field_8
FROM
t_data_customer M1
WHERE
(M1.TENANT_KEY = ‘TG2UL3IHCF’)
LIMIT
100
) M2
LEFT JOIN (
SELECT
M3.id AS field_1
FROM
t_data_contact M3
WHERE
(M3.TENANT_KEY = ‘TG2UL3IHCF’)
LIMIT
100
) M4 ON M2.field_1 = M4.field_1
LIMIT


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

建议升级到5.0.1之后验证,已有多个类似问题在5.0.1版本中修复

升级到5.0.1之后还是同样的报错

能给出脱敏的测试脚本么?

INSERT INTO t_data_customer(id, name, creator, field_1, create_time, update_time) VALUES (3571879421192346095, ‘科技股份有限公司(示例)’, 5111879422635328884, ‘5111879422635328884’, ‘2021-04-19 09:03:31’, ‘2021-04-19 09:03:31’);

INSERT INTO t_data_contact(id) VALUES (3571879421283146133);

SELECT
M2.field_1 AS field_1,
M2.field_2 AS field_2,
M2.field_3 AS field_3,
M2.field_4 AS field_4,
M2.field_5 AS field_5,
M2.field_6 AS field_6,
M4.field_1 AS field_19
FROM
(
SELECT
M1.id AS field_1,
M1.NAME AS field_2,
M1.creator AS field_3,
M1.field_1 AS field_4,
M1.create_time AS field_5,
M1.update_time AS field_6
FROM
t_data_customer M1
WHERE
( M1.TENANT_KEY = ‘TG2UL3IHCF’ )
LIMIT 100
) M2
LEFT JOIN (
SELECT
M3.id AS field_1
FROM
t_data_contact M3
WHERE
( M3.TENANT_KEY = ‘TG2UL3IHCF’ )
LIMIT 100
) M4 ON M2.field_1 = M4.field_1 limit 100

上面是两张表的数据,下面是sql语句,你看下是不是要的这个?

建表语句也 发一下吧,我在我本地环境试一下

CREATE TABLE t_data_customer (
id decimal(20,0) NOT NULL,
tenant_key varchar(10) COLLATE utf8_general_ci NOT NULL,
obj_id decimal(20,0) NOT NULL,
name varchar(500) COLLATE utf8_general_ci DEFAULT NULL,
creator decimal(20,0) DEFAULT NULL,
create_time datetime DEFAULT NULL,
update_time datetime DEFAULT NULL,
comment_time datetime DEFAULT NULL,
data_status tinyint(4) DEFAULT NULL,
field_1 varchar(200) COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (id) /*T![clustered_index] NONCLUSTERED */,
KEY index_id (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

CREATE TABLE t_data_contact (
id decimal(20,0) NOT NULL,
tenant_key varchar(10) COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (id) /*T![clustered_index] NONCLUSTERED */,
KEY index_id (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

INSERT INTO t_data_customer(id, tenant_key, obj_id, name, creator, field_1, create_time, update_time) VALUES (3571879421192346095, ‘TG2UL3IHCF’, 1, ‘科技股份有限公司(示例)’, 5111879422635328884, ‘5111879422635328884’, ‘2021-04-19 09:03:31’, ‘2021-04-19 09:03:31’);

INSERT INTO t_data_contact(id, tenant_key) VALUES (3571879421283146133, ‘TG2UL3IHCF’);

查询语句:
SELECT
M2.field_1 AS field_1,
M2.field_2 AS field_2,
M2.field_3 AS field_3,
M2.field_4 AS field_4,
M2.field_5 AS field_5,
M2.field_6 AS field_6,
M4.field_1 AS field_19
FROM
(
SELECT
M1.id AS field_1,
M1.NAME AS field_2,
M1.creator AS field_3,
M1.field_1 AS field_4,
M1.create_time AS field_5,
M1.update_time AS field_6
FROM
t_data_customer M1
WHERE
( M1.TENANT_KEY = ‘TG2UL3IHCF’ )
LIMIT 100
) M2
LEFT JOIN (
SELECT
M3.id AS field_1
FROM
t_data_contact M3
WHERE
( M3.TENANT_KEY = ‘TG2UL3IHCF’ )
LIMIT 100
) M4 ON M2.field_1 = M4.field_1 limit 100

注意一下单引号,貌似论坛会转换成中文的单引号

子查询中去掉limit就不报错了,这是出于什么业务需要?

这个是动态构造出来的sql,但是会限制只预览100条数据。如果去掉子查询的limit,会不会增加内存的消耗,两个子查询查出全部的数据再进行关联,然后再取100条?

麻烦上传tidb.log 包含错误栈信息,多谢。

[2021/05/19 14:32:09.890 +08:00] [ERROR] [conn.go:736] [“connection running loop panic”] [conn=277] [lastSQL=“SELECT\r
\tM2.field_1 AS field_1,\r
\tM2.field_2 AS field_2,\r
\tM2.field_3 AS field_3,\r
\tM2.field_4 AS field_4,\r
\tM2.field_5 AS field_5,\r
\tM2.field_6 AS field_6,\r
\tM4.field_1 AS field_19\r
FROM\r
\t(\r
\tSELECT\r
\t\tM1.id AS field_1,\r
\t\tM1.NAME AS field_2,\r
\t\tM1.creator AS field_3,\r
\t\tM1.field_1 AS field_4,\r
\t\tM1.create_time AS field_5,\r
\t\tM1.update_time AS field_6\r
\tFROM\r
\t\tt_data_customer M1 \r
\tWHERE\r
\t\t( M1.TENANT_KEY = ‘TG2UL3IHCF’ ) \r
\t\tLIMIT 100 \r
\t) M2\r
\tLEFT JOIN (\r
\tSELECT\r
\t\tM3.id AS field_1\r
\tFROM\r
\t\tt_data_contact M3 \r
\tWHERE\r
\t\t( M3.TENANT_KEY = ‘TG2UL3IHCF’ ) \r
\t\tLIMIT 100 \r
\t) M4 ON M2.field_1 = M4.field_1 limit 100”] [err=“runtime error: index out of range [0] with length 0”] [stack="goroutine 2006910 [running]:
github.com/pingcap/tidb/server.(*clientConn).Run.func1(0x4004660, 0xc00cf74270, 0xc022645c00)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/conn.go:734 +0xee
panic(0x3799860, 0xc017cc80e0)
\t/usr/local/go/src/runtime/panic.go:679 +0x1b2
github.com/pingcap/tidb/server.(*clientConn).writeResultset.func1(0xc00d619100, 0x4004660, 0xc00dbb3050, 0xc022645c00)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/conn.go:1749 +0x4e2
panic(0x3799860, 0xc017cc80e0)
\t/usr/local/go/src/runtime/panic.go:679 +0x1b2
github.com/pingcap/tidb/util/chunk.(*Column).GetBytes(...)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/util/chunk/column.go:539
github.com/pingcap/tidb/util/chunk.Row.GetBytes(...)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/util/chunk/row.go:77
github.com/pingcap/tidb/server.dumpTextRow(0xc00cf7a000, 0x4, 0x400, 0xc00dbced00, 0x7, 0x8, 0xc00dc80550, 0x0, 0xc00d619018, 0x135d246, …)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/util.go:327 +0x1896
github.com/pingcap/tidb/server.(*clientConn).writeChunks(0xc022645c00, 0x4004660, 0xc00dbb3050, 0x4024d60, 0xc00dc80500, 0xc000029000, 0x1dfad36, 0x3678a20, 0x0)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/conn.go:1840 +0x427
github.com/pingcap/tidb/server.(*clientConn).writeResultset(0xc022645c00, 0x4004660, 0xc00dbb3050, 0x4024d60, 0xc00dc80500, 0x24d00, 0x0, 0x0, 0x0, 0x0)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/conn.go:1762 +0x201
github.com/pingcap/tidb/server.(*clientConn).handleStmt(0xc022645c00, 0x4004660, 0xc00dbb3050, 0x402b2a0, 0xc011915700, 0x5f96f80, 0x0, 0x0, 0x1, 0x0, …)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/conn.go:1656 +0x242
github.com/pingcap/tidb/server.(*clientConn).handleQuery(0xc022645c00, 0x40045a0, 0xc00dc12000, 0xc01874e281, 0x272, 0x0, 0x0)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/conn.go:1503 +0x44f
github.com/pingcap/tidb/server.(*clientConn).dispatch(0xc022645c00, 0x40045a0, 0xc00dc12000, 0xc01874e280, 0x273, 0x272, 0x0, 0x0)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/conn.go:1037 +0x6f2
github.com/pingcap/tidb/server.(*clientConn).Run(0xc022645c00, 0x4004660, 0xc00cf74270)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/conn.go:795 +0x293
github.com/pingcap/tidb/server.(*Server).onConn(0xc0031d2410, 0xc022645c00)
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/server.go:477 +0xb1b
created by github.com/pingcap/tidb/server.(*Server).Run
\t/home/jenkins/agent/workspace/optimization-build-tidb-linux-amd/go/src/github.com/pingcap/tidb/server/server.go:380 +0x8a5
"]tidb.log (23.6 KB)

执行提供的脚本就能重现,我觉得是tidb的bug,可以提issue了

1 个赞

怎么提?

1 个赞

参考官方文档,建议提交测试脚本,方便开发人员重现
https://docs.pingcap.com/zh/tidb/v4.0/report-issue#提交-issue

1 个赞

看错误栈和这个问题比较匹配,TiDB5.0.0 UNION語法導致ERROR 1105 (HY000): runtime error: index out of range [-1]
目前只有 PR ,还没有修复好像。

TiDB的子查询能够限定记录数这个做的比Oracle好,Oracle只能在最外层加上限定。