Я получаю доступ к массиву составных значений следующим образом:
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, но я не могу использовать эти типы данных без значительных изменений структуры базы данных, поэтому я искал другое решение.
language sql
. Они намного быстрее, чемplpgsql
. - person pozs   schedule 28.02.2017