不正确的BIT_COUNT运算对于TEXT列

使用下面命令部署数据库

docker pull oceanbase/oceanbase-ce:4.3.5-lts
docker run -p 2881:2881 --name oceanbase-ce -d oceanbase/oceanbase-ce:4.3.5-lts
mysql -h127.0.0.1 -P12881 -uroot@test  # Connect with the root account of a general tenant

运行一下测试用例,其中查询语句返回了不正确的结果。

CREATE TABLE t0 (c1 TEXT);
INSERT INTO t0 VALUES (14954857449029110191);
SELECT BIT_COUNT(c1) FROM t0; -- actual:{63}, expected:{37}

在测试用例中,我们尝试存储一个较大的数值,但是符合MySQL中BIGINT UNSIGNED的存储范围。当使用BIT_COUNT进行运算时,该值能够无损转成BIGINT UNSIGNED值,因此返回结果应该是37。
我们可以运行下面的PoC用例得到预期的结果。

CREATE TABLE t0 (c1 TEXT);
INSERT INTO t0 VALUES (14954857449029110191);
SELECT BIT_COUNT(CAST(c1 AS UNSIGNED)) FROM t0; -- 37

问一下 这个案例的链接地址有么?你发一下 我们看看是否符合预期

您好,这个测试用例是我们测试工具自动化生成的

好的 我们先测试看看

我们测试了和mysql保持一致

我在MySQL上又运行了下面的测试用例。

CREATE TABLE t0 (c1 TEXT);
INSERT INTO t0 VALUES (14954857449029110191);
SELECT BIT_COUNT(CAST(c1 AS SIGNED)) FROM t0; -- 37

BIT_COUNT在计算c1列是会按照整数进行处理,因此预期结果应该与手动转化成SIGNED或者UNSIGNED的结果相同。

mysql是相同的 ob转化SELECT BIT_COUNT(CAST(c1 AS SIGNED)) FROM t0; UNSIGNED和SIGNED不相同么?

转化成SIGNED和UNSIGNED结果是相同的,我根据BIT_COUNT的执行过程分析,下面的三个结果应该是相同的。我把这个问题也汇报给了MySQL。

CREATE TABLE t0 (c1 TEXT);
INSERT INTO t0 VALUES (14954857449029110191);
SELECT BIT_COUNT(c1) FROM t0; -- actual:{63}, expected:{37}
CREATE TABLE t0 (c1 TEXT);
INSERT INTO t0 VALUES (14954857449029110191);
SELECT BIT_COUNT(CAST(c1 AS UNSIGNED)) FROM t0; -- 37
CREATE TABLE t0 (c1 TEXT);
INSERT INTO t0 VALUES (14954857449029110191);
SELECT BIT_COUNT(CAST(c1 AS SIGNED)) FROM t0; -- 37

感谢你的反馈 目前ob应该是mysql保持是一致