c - 从 Postgres C 函数返回一个数组?

标签 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* 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);

}

最佳答案

根本的问题其实是,所以PostgreSQL数组不兼容C数组。

好的 google 关键字是“construct_md_array”或“construct_array”

我找到了一个应该有帮助的片段

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)

关于c - 从 Postgres C 函数返回一个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23557980/

相关文章:

c - 如何向字符串中添加空字符?

javascript - 从对象数组中获取作为对象的最后一个 Item

sql - PostgreSQL:如何替换同一字段中的不同值?

postgresql - Google Cloud SQL Postgres - 来自 Google Compute/Kubernetes 的随机慢查询

c - printf 的神秘行为

c++ - 用于 GPS 系统的 Dijkstra 算法的更快替代方案

c - C 调试功能中的 Visual Studio Code Hello World 不起作用 Programm NullReferenceException :

javascript - 如何在单击按钮时从数组中删除项目

java - 如何使用 JAVA 从 ArrayList 返回输入

node.js - Postgresql 捕获事务错误并回滚