Лучший способ думать об этом - это то, что типы данных взаимодействуют с приложениями через текстовые интерфейсы. Libpq возвращает строку практически из чего угодно. Программист обязан проанализировать строку и создать из нее тип данных. Я знаю, что автор, вероятно, отказался от вопроса, но я работаю над чем-то похожим, и здесь стоит документировать несколько важных трюков, которые в некоторых случаях полезны.
Очевидно, что если это тип языка Си с собственным представлением входа и выхода, вам придется анализировать строку, как обычно.
Однако для массивов и кортежей запись в основном
[open_type_identifier][csv_string][close_type_identifier]
Например, кортеж может быть представлен как:
(35,65,1111111,f,f,2011-10-06,"2011-10-07 13:11:24.324195",186,chris,f,,,,f)
Это облегчает анализ. Как правило, вы можете использовать существующие процессоры csv после отключения первого и последнего символа. Кроме того, рассмотрим:
select row('test', 'testing, inc', array['test', 'testing, inc']);
row
-------------------------------------------------
(test,"testing, inc","{test,""testing, inc""}")
(1 row)
Поскольку это показывает, что у вас есть стандартный CSV, экранирующий внутри вложенных атрибутов, вы можете фактически определить, что третий атрибут является массивом, а затем (с двойными кавычками) проанализировать его как массив. Таким образом, вложенные структуры данных могут быть обработаны способом, примерно аналогичным тому, который можно ожидать в таком формате, как JSON. Хитрость заключается в том, что это вложенный CSV.