0

我正在尝试针对包含大量用于聚合的浮点计算的分析工作负载评估 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;

然后我跑了,引导;制作; 须藤制作安装;并在 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

我试图从文档和源代码中拼凑出我所能做的,但现在卡住了。在这个过程中我哪里出错了?

4

1 回答 1

0

我解决了这个问题。我通过假设 typedef flt 在 SQL 中等同于 double as 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;
于 2013-11-13T11:44:18.097 回答