Linux中的Firebird UDF在设置为按引用返回时会崩溃服务器
发布时间:2020-12-14 02:13:17 所属栏目:Linux 来源:网络整理
导读:我正在尝试在 Linux中为firebird创建一些简单的UDF(在使用GCC编译的C中). 问题是,当我将“返回机制”设置为“通过引用”时,当我调用该函数时,服务器崩溃. 当它是“按价值”时,没有问题. 以下是我尝试用C编写的函数: 这个工作: double round(double *); dou
我正在尝试在
Linux中为firebird创建一些简单的UDF(在使用GCC编译的C中).
问题是,当我将“返回机制”设置为“通过引用”时,当我调用该函数时,服务器崩溃. 当它是“按价值”时,没有问题. 以下是我尝试用C编写的函数: 这个工作: double round(double *); double round(val) double *val; { *val = *val * 100; *val = (*val>= 0) ? (long)(*val + 0.5) : (long)(*val - 0.5); *val = *val / 100; return *val; } 但是这个在调用时会崩溃服务器: char * proper_case(str) char * str; { return str; } 这是DDL: DECLARE EXTERNAL FUNCTION "ROUND" DOUBLE PRECISION RETURNS DOUBLE PRECISION BY VALUE ENTRY_POINT 'round' MODULE_NAME 'my_udfs.so'; DECLARE EXTERNAL FUNCTION PROPCASE CSTRING(10000) RETURNS CSTRING(10000) FREE_IT ENTRY_POINT 'proper_case' MODULE_NAME 'my_udfs.so'; 我用第二个函数调用: select propcase('abrakadabra') from rdb$database; firebird服务器崩溃,我得到的唯一错误信息是: Statement failed,SQLSTATE = -902 Error reading data from the connection. 有人可以建议吗?任何帮助将不胜感激! 我忘记提供的唯一信息是我正在编译.so文件的方式(可能是关键在这里): gcc -c -O -fpic my_udf.c ld -G my_udf.o -lm -lc -o my_udf.so cp my_udf.so /usr/lib/firebird/2.1/UDF/my_udfs.so 解决方法
AFAIK,Firebird会在调用后尝试释放参数和返回值(因为它不知道你在函数内部做了什么,并且你已经将返回值声明为FREE_IT),所以你需要为返回值分配空间在回来之前.你必须用ib_util_malloc()调用来分配内存,所以它看起来像(甚至没有尝试编译它,但它应该给你一般的想法):
char * proper_case(str) char * str; { char* ret = (char*)ib_util_malloc(strlen(str) + 1); strcpy(ret,str); // or run the actual logic here return ret; } 编辑:我在UDF lib中构建的Firebird中找到了一个示例: pChar EXPORT IB_UDF_lower(const char *s) { if (!s) return 0; char* buf = (char *) ib_util_malloc(strlen(s) + 1); char* p = buf; while (*s) { if (*s >= 'A' && *s <= 'Z') { *p++ = *s++ - 'A' + 'a'; } else *p++ = *s++; } *p = ' '; return buf; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |