从Postgres C函数返回数组?

从Postgres C函数返回数组?,c,arrays,postgresql,C,Arrays,Postgresql,此代码编译时不会出错,但不会返回任何内容。有什么想法吗? #包括 #包括 #包括 #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

此代码编译时不会出错,但不会返回任何内容。有什么想法吗? #包括 #包括 #包括

#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);

}
#ifdef PG_模块
PG_模块_魔术;
#恩迪夫
数据my_c_函数(PG_函数参数);
PG_功能_信息_V1(我的c_功能);
基准my_c_函数(PG_函数参数){
浮动4 var1,var2,var3,var4;
基准*VAL;
var1=PG_GETARG_FLOAT8(0);
var2=PG_GETARG_FLOAT8(1);
var3=PG_GETARG_FLOAT8(2);
var4=PG_GETARG_FLOAT8(3);
VAL=palloc(基准尺寸)*4;
if(var1var4){
VAL[0]=(int)-1;
VAL[1]=(int)(0.5+(100*((var2-var1)/(var2-var3));
VAL[2]=(int)(0.5+(100*((var1-var4)/(var2-var3));
VAL[3]=(int)(0.5+(100*((var4-var3)/(var2-var3));
}
else if(var2==var3){
PG_RETURN_NULL();
}
否则{
VAL[0]=(int)0;
VAL[1]=(int)(0.5+(100*((var2-var4)/(var2-var3));
VAL[2]=(int)0;
VAL[3]=(int)(0.5+(100*((var4-var3)/(var2-var3));
}
PG_返回_阵列类型_P(VAL);
}
更正版本:

#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);

}
#包括
#包括
#包括
#包括
#ifdef PG_模块
PG_模块_魔术;
#恩迪夫
基准cget\U bar\U结构2(PG\U功能参数);
PG功能信息V1(cget结构2);
资料
cget\U bar\U结构2(PG\U函数参数){
浮动4 var1,var2,var3,var4;
基准*VAL=(基准*)palloc(基准*4的尺寸);
ArrayType*结果;
var1=PG_GETARG_FLOAT8(0);
var2=PG_GETARG_FLOAT8(1);
var3=PG_GETARG_FLOAT8(2);
var4=PG_GETARG_FLOAT8(3);
if(var1var4){
VAL[0]=Int32GetDatum(-1);
VAL[1]=Int32GetDatum((0.5+(100*((var2-var1)/(var2-var3щщ)));
VAL[2]=Int32GetDatum((0.5+(100*((var1-var4)/(var2-var3ЮЮ)));
VAL[3]=Int32GetDatum((0.5+(100*((var4-var3)/(var2-var3ЮЮ)));
}
else if(var2==var3){
PG_RETURN_NULL();
}
否则{
VAL[0]=Int32GetDatum(0);
VAL[1]=Int32GetDatum((0.5+(100*((var2-var4)/(var2-var3щщ)));
VAL[2]=Int32GetDatum(0);
VAL[3]=Int32GetDatum((0.5+(100*((var4-var3)/(var2-var3ЮЮ)));
}
结果=构造数组(vals,4,INT4OID,sizeof(int4),true,'i');
PG_返回_数组类型_P(结果);
}

事实上,根本问题是PostgreSQL数组与C数组不兼容

好的谷歌关键词是“构造数组”或“构造数组”

我发现了一个应该有帮助的片段

const int *data = array.data(); // C array
Datum *d = (Datum *) palloc(sizeof(Datum) * size);
ArrayType *a;

for (int i = 0; i < size; i++)
     d[i] = Int32GetDatum(data[i]);

a = construct_array(d, size, INT4OID, sizeof(int4), true, 'i');

PG_RETURN_ARRAYTYPE_P(a)
const int*data=array.data();//C数组
基准*d=(基准*)帕洛克(尺寸(基准)*尺寸);
阵列类型*a;
对于(int i=0;i
“不返回任何内容”。嗯?您能否显示用于创建函数的命令,以及调用函数时会发生什么?如果
选择pg_backend_pid()
,将gdb连接到后端,
中断my_c_函数
,然后
c
并运行SQL,那么
gdb
是否真的在函数开始时停止执行?错误:“INT4OID”未声明(此函数中首次使用)我添加了它,删除了未声明的错误。现在工作。谢谢