我正在尝试评估MonetDB对于包含大量浮点计算的分析工作负载的性能。
我正在尝试在MonetDB中实现基于C的UDF来实现这一点并遇到错误。我不确定如何根据我所需的签名
正确实现该功能double f(double,double);
首先,我使用的是在Ubuntu 13.04上从源代码构建的MonetDB-11.15.17。
我已添加到./sql/backends/monet5/UDF目录中的以下文件中,如下所示:
udf.c:
str UDFtest(flt *ret,flt *_p1,flt *_p2)
{
*ret = *_p1+*_p2;
return MAL_SUCCEED;
}
udf.h:
udf_export str UDFtest(flt *,flt*,flt*);
udf.mal:
module udf;
command calc_test(one:flt,two:flt):flt
address UDFtest
comment "udf floating point test";
80_udf.sql:
create function calc_test(one double,two double)
returns double external name udf.calc_test;
然后我跑了,引导;使; sudo make install;并在mclient提示符下键入以下内容:
declare f1 float;
declare f2 float;
set f1=0.1;
set f2=0.2;
select calc_test(f1,f2);
这会导致以下错误:
TypeException:user.s1_1[6]:'udf.calc_test' undefined in: _9:any := udf.calc_test(_5:dbl, _8:dbl)
program contains errors
我试图将文件和来源中的内容拼凑起来但现在卡住了。 我在这个过程中哪里出错?
答案 0 :(得分:0)
我解决了这个问题。我混淆了我的数据类型,假设在SQL中,typedef flt等于double = float === double。
C中的flt类型等同于“真正的”SQL类型。 它应该是这样的:
udf.c
str UDFtest(dbl *ret,dbl *_p1,dbl *_p2)
{
*ret = *_p1+*_p2;
return MAL_SUCCEED;
}
udf.h
udf_export str UDFtest(dbl *,dbl*,dbl*);
udf.mal
module udf;
command calc_test(one:dbl,two:dbl):dbl
address UDFtest
comment "udf floating point test";
80_udf.sql
create function calc_test(one double,two double)
returns double external name udf.calc_test;