1105 - other error: invalid data type: invalid range,range.start should be smaller than

【 TiDB 使用环境】生产环境 /测试/
【 TiDB 版本】 tidb v6.5
【复现路径】 sql 查询
SELECT
MAX( d_time ) AS d_time,
MAX( CASE WHEN c_time > ‘2011-01-01 00:00:00’ THEN c_time ELSE NULL END ) AS c_time,
MAX( CASE WHEN b_time > ‘2011-01-01 00:00:00’ THEN b_time ELSE NULL END ) AS b_time,
MAX( CASE WHEN a_time > ‘2011-01-01 00:00:00’ THEN a_time ELSE NULL END ) AS a_time
FROM
tab_a AS t
JOIN tab_b AS o ON t._code = o.code
AND o.p_code = ‘99999990’
AND o.valid = 10
AND o.s_code = 20
WHERE
t.e_time >= ‘2023-03-22 16:57:03.0’
AND t.e_time <= ‘2023-03-22 16:57:03.0’

【遇到的问题:问题现象及影响】

1105 - other error: invalid data type: invalid range,range.start should be smaller than range.end, but got [[116, 128, 0, 0, 0, 0, 0, 20, 125, 95, 105, 128, 0, 0, 0, 0, 0, 0, 21, 1, 55, 53, 53, 55, 48, 48, 52, 55, 255, 57, 0, 0, 0, 0, 0, 0, 0, 248, 4, 25, 175, 173, 14, 67, 0, 0, 0],[116, 128, 0, 0, 0, 0, 0, 20, 125, 95, 105, 128, 0, 0, 0, 0, 0, 0, 21, 1, 55, 53, 53, 55, 48, 48, 52, 55, 255, 57, 0, 0, 0, 0, 0, 0, 0, 248, 4, 25, 175, 172, 142, 67, 0, 0, 1])
时间: 0.147s

【资源配置】
【附件:截图/日志/监控】

WHERE
t.e_time >= ‘2023-03-22 16:57:03’
AND t.e_time <= ‘2023-03-22 16:57:03’
改一下条件试试?

这个报错,不是一直都报错,时而可以查询出结果,时而报错

开发规范里建议日期时间比较大小,不用显式增加转换函数么? :sweat_smile:

和这个么有关系,就算加了STR_TO_DATE,还是会报错

我认为是时间timestamp类型的bug问题

方便的话,表结构发一下看看

不方便,表结构太长

  1. 可以反馈 SQL 中用到的表结构,其他列不需要,但是需要其他信息,比如是否 cluster 表,字符集等。
  2. 完整的执行计划和 错误栈信息麻烦上传。

错误信息“invalid data type: invalid range, range.start should be smaller than range.end”通常表示 TiDB 或 TiKV 的范围查询有问题。 范围查询是一种涉及取值范围的查询,例如时间范围,常见于涉及根据取值范围过滤行的SQL语句中。

错误的根本原因可能有多种因素,包括范围值中的数据类型或格式不正确、列和范围值之间的数据类型不匹配,或者查询执行计划有问题。 一个潜在的原因可能与在查询和存储在 TiDB 中的数据中使用不同精度的列类型有关。 例如,如果查询使用了比 TiDB 中存储的数据精度更高的时间列,则可能会导致这样的错误。

要调试此错误,您可以首先查看查询执行计划并确定导致错误的范围查询。 您可以使用 TiDB 中的 EXPLAIN 语句生成查询执行计划并分析它是否存在潜在问题。 此外,您可以检查范围值的数据类型和格式,以确保它们与所查询列的预期数据类型和格式相匹配。

调试此错误的另一种方法是使用 TiDB/TiKV 日志文件来识别查询执行或数据存储的任何潜在问题。 您可以在配置文件中启用 TiDB/TiKV 日志文件,并将日志级别设置为更高级别,以捕获更详细的信息。 然后,您可以在日志文件中搜索可能指示错误根本原因的任何相关错误消息或警告。

下面是一个示例脚本,可以帮助识别 TiDB 集群中的范围查询及其对应的时间范围:

#!/bin/bash

echo "Query ID,Time Range"
echo "-------------------"

for id in $(tidb-server debug zip | grep -Po 'query-id-\d+' | sort -u); do
  query=$(tidb-server debug decode --id "$id" | jq -r .query)
  if [[ "$query" == *"BETWEEN"* ]]; then
    start_time=$(tidb-server debug decode --id "$id" | grep -oP "BETWEEN '\K[0-9:\-\. ]+" | head -1)
    end_time=$(tidb-server debug decode --id "$id" | grep -oP "AND '\K[0-9:\-\. ]+" | head -1)
    echo "$id,$start_time - $end_time"
  fi
done

该脚本使用 TiDB 调试工具识别所有使用范围查询常用的 BETWEEN 运算符的查询,并从查询中提取开始和结束时间值。 然后它将查询 ID 和相应的时间范围打印到控制台。 这有助于识别 TiDB 集群中任何潜在的范围查询问题。