2014-05-09 3 views
1

이 코드는 오류없이 컴파일되지만 아무 것도 반환하지 않습니다. 누락 된 것에 대한 아이디어가 있습니까?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); 

    } 
+0

는 "아무것도 반환하지 않습니다"도움이되어야 한 조각을 발견 "construct_md_array"또는 "construct_array"

입니다. 응? 'CREATE FUNCTION'에 사용했던 명령을 표시 할 수 있습니까? 호출 할 때 어떤 일이 발생합니까? 'pg_backend_pid()'를 선택했다면, gdb를 백엔드에 연결하고, 'break my_c_function'을 실행 한 후'c'를 실행하여 SQL을 실행하면, gdb는 실제로 함수의 시작에서 실행을 중단합니까? –

답변

1

근본적인 문제는 사실, 그래서 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) 
+0

오류 : 'INT4OID'선언되지 않음 (이 함수에서 처음 사용) –

+0

선언되지 않은 오류를 제거한 을 추가했습니다. 이제 작동합니다. 감사! –

관련 문제