Должен ли я освободить указатель, возвращенный функциями DirectFunctionCall при написании UDF для PostgreSQL? - PullRequest
0 голосов
/ 31 августа 2018

Как описано в заголовке, я пишу UDF на языке C PostgreSQL. Я вызываю некоторые функции с помощью DirectFunctionCall1, DirectFunctionCall2, ... Некоторые из этих функций возвращают POD (например, interval_finite, timestamp_in), в то время как некоторые из них возвращают указатели (например, interval_in, int4_to_char ).

Q1: После того, как я вызову эти функции, возвращающие указатели, я должен вызвать pfree, чтобы освободить эти указатели?

Q2: Если ответом на вопрос Q1 является «да», следует ли мне освобождать эти указатели в Q1 после передачи указателей на другие функции DirectFunctionCall1 в качестве параметров?

Interval       *real_interval = NULL;

real_interval = DatumGetIntervalP(DirectFunctionCall2(
                                    timestamp_mi,
                                    TimestampTzGetDatum(timestamp_floor_small_period),
                                    TimestampTzGetDatum(timestamp_floor_big_period)));
// Q1: should I call pfree(real_interval)?

result = DatumGetInt32(
            DirectFunctionCall1(  // Q2: Should I free the returned pointer of DirectFunctionCall?
                numeric_int4,
                DirectFunctionCall2(  // Q2: Should I free the returned pointer of DirectFunctionCall?
                    numeric_div,
                    NumericGetDatum(
                        DatumGetNumeric(
                            DirectFunctionCall1(  // Q2: Should I free the returned pointer of DirectFunctionCall?
                                intervaltonum,
                                IntervalPGetDatum(real_interval)
                            )
                        )
                    ),
                    NumericGetDatum(
                        DatumGetNumeric(
                            DirectFunctionCall1(  // Q2: Should I free the returned pointer of DirectFunctionCall?
                                intervaltonum,
                                IntervalPGetDatum(&small_interval)
                            )
                        )
                    )
                )
            )
        );
...