Linux(GCCでコンパイルされたC)でfirebird用の簡単なUDFを作成しようとしています。問題は、「リターンメカニズム」を「参照」に設定すると、関数を呼び出すとサーバーがクラッシュすることです。「値渡し」の場合は問題ありません。
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';
私は2番目の関数を次のように呼び出します:
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