2014-06-30 32 views
0

我有相當大的InnoDB表(〜100K行)在MySQL 5.6和UDF功能:MySQL的切斷字符串從使用UDF子查詢

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:目前finder解決方法是重寫子查詢作爲聯接。

UPD2:...但它並不適用於所有查詢。可能的話,錯誤會在相當大的表格上重現。

回答

0

於是,我找到了解決辦法:明確的返回值的類型轉換

SELECT * FROM (
    SELECT 
     CAST(collect('CASES:10,DROP:10', shipment_bucket_code, weight) AS CHAR(255)) 
    FROM d_shipments 
) as sub; 

也許,它允許分配爲返回的字符串所需的內存大小。我沒有查看mysql源代碼,但是有些事情提示我UDF返回的字符串(和DECIMAL)的弱類型存在問題。