【发布时间】:2014-06-30 15:19:25
【问题描述】:
我在 MySQL 5.6 和 UDF 函数中有相当大的 InnoDB 表(~100k 行):
CREATE AGGREGATE FUNCTION collect RETURNS STRING SONAME 'libcollect.so';
当我查询时
SELECT collect('CASES:10,DROP:10', shipment_bucket_code, weight) FROM d_shipments;
"83.140000,2513.910000,4439.710000,1764.100000,7852.960000,98.920000,828.620000,2346.950000,1566.620000,107594.130000" 将是结果,它是正确的。
但是如果我在子查询中调用 UDF
SELECT * FROM (
SELECT collect('CASES:10,DROP:10', shipment_bucket_code, weight) FROM d_shipments
) as sub;
结果将是"83.140000,2513.910000,4439.710000,1764.100000"。字符串被顶级查询截断。通过UDF调试确认。
此外,如果我在小表上使用这些查询,一切正常。使用像CONCAT("83.140000,2513.910000,4439.710000,1764.100000,7852.960000,98.9", "20000,828.620000,2346.950000,1566.620000,107594.130000")这样的内置函数时也是如此
在原因搜索过程中,我遇到了similar old non-fixed bug。 是否有任何解决方法?似乎 MySQL 的子查询字符串结果受到某些缓冲区大小的限制,因为字符串切割总是平等地发生。
UPD:目前找到的解决方法是将子查询重写为 JOIN。
UPD2:...但它并非在所有查询中都有效。很可能,错误会在相当大的表上重现。
【问题讨论】:
标签: mysql sql string subquery user-defined-functions