【问题标题】:A MonetDB User Defined Function with two double parameters具有两个双参数的 MonetDB 用户定义函数
【发布时间】:2013-11-13 00:45:45
【问题描述】:

我正在尝试评估 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

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

【问题讨论】:

    标签: user-defined-functions monetdb


    【解决方案1】:

    我解决了这个问题。我假设 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      相关资源
      最近更新 更多