Доступ к столбцу из массива составных типов в Postgres C API

Я получаю доступ к массиву составных значений следующим образом:

PG_GETARG_ARRAYTYPE_P(0)
/* Then I deconstruct it into C array */
deconstruct_array()
/* Later I iterate thru values and attempt to access columns of my composite type */
GetAttributeByName(input_data1[i], "keyColumnName", &isnull[0])

Вот как это выглядит в SQL:

SELECT * FROM my_c_function(array[(44, 1)::comp_type, (43, 0)::comp_type], array[(42, 1)::comp_type, (43, 1)::comp_type]);

Ожидаемый результат:

array[(44, 1)::comp_type, (42, 1)::comp_type, (43, 1)::comp_type] /*order doesn't matter*/

Но это не работает, потому что GetAttributeByName() работает только с HeapTupleHeader, к сожалению, у меня есть массив Datum. Обычно вы получаете HeapTupleHeader, обращаясь к атрибуту функции следующим образом: PG_GETARG_HEAPTUPLEHEADER(0), но это не предназначено для массивов (или я ошибаюсь?).

Итак, есть ли какая-то функция/макрос для получения столбцов из Datum составного типа или для преобразования составного типа Datum в HeapTuple? Я зашел так глубоко, как heap_getattr(), но не могу найти ничего полезного. Не могу вспомнить, есть ли уже какая-то функция, которая бы аналогичным образом обращалась к составному массиву и показывала бы мне, как это сделать.

Для контекста: у меня есть 2 массива составного типа, и я хочу написать функцию C для их быстрой конкатенации. Однако я не могу просто добавить правый аргумент к левому, потому что они могут использовать общий «ключевой» столбец, и в этом случае я хотел бы, чтобы результат имел только значения с правой стороны.

Это простая задача в plpgSQL (не вложенность, полное соединение, array_agg), но она очень медленная. Я тестировал одну и ту же задачу в hstore и json, и оба они намного быстрее, чем unnest+array_agg, но я не могу использовать эти типы данных без значительных изменений структуры базы данных, поэтому я искал другое решение.


person Łukasz Kamiński    schedule 28.02.2017    source источник
comment
Примечание: вы также можете попробовать функцию language sql. Они намного быстрее, чем plpgsql.   -  person pozs    schedule 28.02.2017
comment
@pozs да, я забыл упомянуть - я пробовал, и ничего не изменилось   -  person Łukasz Kamiński    schedule 28.02.2017


Ответы (1)


Я думаю, все, что вам нужно, это макрос DatumGetHeapTupleHeader, определенный в fmgr.h.

person Laurenz Albe    schedule 28.02.2017