이 코드는 오류없이 컴파일되지만 아무 것도 반환하지 않습니다. 누락 된 것에 대한 아이디어가 있습니까?Postgres C 함수에서 배열을 반환 하시겠습니까?
#include <postgres.h>
#include <fmgr.h>
#include <utils/array.h>
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
Datum my_c_function(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(my_c_function);
Datum
my_c_function(PG_FUNCTION_ARGS)
{
float4 var1, var2, var3, var4;
Datum* vals;
var1 = PG_GETARG_FLOAT8(0);
var2 = PG_GETARG_FLOAT8(1);
var3 = PG_GETARG_FLOAT8(2);
var4 = PG_GETARG_FLOAT8(3);
vals = palloc(sizeof(Datum)*4);
if (var1 < var4) {
vals[0] = (int)1;
vals[1] = (int)(0.5+(100*((var2-var4)/(var2-var3))));
vals[2] = (int)(0.5+(100*((var4-var1)/(var2-var3))));
vals[3] = (int)(0.5+(100*((var1-var3)/(var2-var3))));
} else if (var1 > var4) {
vals[0] = (int)-1;
vals[1] = (int)(0.5+(100*((var2-var1)/(var2-var3))));
vals[2] = (int)(0.5+(100*((var1-var4)/(var2-var3))));
vals[3] = (int)(0.5+(100*((var4-var3)/(var2-var3))));
} else if (var2 == var3) {
PG_RETURN_NULL();
} else {
vals[0] = (int)0;
vals[1] = (int)(0.5+(100*((var2-var4)/(var2-var3))));
vals[2] = (int)0;
vals[3] = (int)(0.5+(100*((var4-var3)/(var2-var3))));
}
PG_RETURN_ARRAYTYPE_P(vals);
}
수정 버전 :
#include <postgres.h>
#include <fmgr.h>
#include <utils/array.h>
#include <catalog/pg_type.h>
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
Datum cget_bar_structure2(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(cget_bar_structure2);
Datum
cget_bar_structure2(PG_FUNCTION_ARGS)
{
float4 var1, var2, var3, var4;
Datum *vals = (Datum *) palloc(sizeof(Datum) * 4);
ArrayType *result;
var1 = PG_GETARG_FLOAT8(0);
var2 = PG_GETARG_FLOAT8(1);
var3 = PG_GETARG_FLOAT8(2);
var4 = PG_GETARG_FLOAT8(3);
if (var1 < var4) {
vals[0] = Int32GetDatum(1);
vals[1] = Int32GetDatum((0.5+(100*((var2-var4)/(var2-var3)))));
vals[2] = Int32GetDatum((0.5+(100*((var4-var1)/(var2-var3)))));
vals[3] = Int32GetDatum((0.5+(100*((var1-var3)/(var2-var3)))));
} else if (var1 > var4) {
vals[0] = Int32GetDatum(-1);
vals[1] = Int32GetDatum((0.5+(100*((var2-var1)/(var2-var3)))));
vals[2] = Int32GetDatum((0.5+(100*((var1-var4)/(var2-var3)))));
vals[3] = Int32GetDatum((0.5+(100*((var4-var3)/(var2-var3)))));
} else if (var2 == var3) {
PG_RETURN_NULL();
} else {
vals[0] = Int32GetDatum(0);
vals[1] = Int32GetDatum((0.5+(100*((var2-var4)/(var2-var3)))));
vals[2] = Int32GetDatum(0);
vals[3] = Int32GetDatum((0.5+(100*((var4-var3)/(var2-var3)))));
}
result = construct_array(vals, 4, INT4OID, sizeof(int4), true, 'i');
PG_RETURN_ARRAYTYPE_P(result);
}
는 "아무것도 반환하지 않습니다"도움이되어야 한 조각을 발견 "construct_md_array"또는 "construct_array"
입니다. 응? 'CREATE FUNCTION'에 사용했던 명령을 표시 할 수 있습니까? 호출 할 때 어떤 일이 발생합니까? 'pg_backend_pid()'를 선택했다면, gdb를 백엔드에 연결하고, 'break my_c_function'을 실행 한 후'c'를 실행하여 SQL을 실행하면, gdb는 실제로 함수의 시작에서 실행을 중단합니까? –