Приложение C. Типы данных в pgpro_axe

pgpro_axe может читать множество типов данных, существующих как в Postgres Pro, так и в DuckDB. В настоящий момент в запросах можно использовать следующие типы данных:

  • целочисленные типы (например, integer, bigint)

  • типы с плавающей точкой (например, real, double precision)

  • numeric

    Внутри может быть конвертирован в double precision. За подробной информацией обратитесь к Подразделу C.1).

  • text/varchar/bpchar

  • bit-типы, включая битовые массивы фиксированных и переменных размеров

  • bytea/blob

  • timestamp/timestamptz/date/interval/timestamp_ns/timestamp_ms/timestamp_s

  • boolean

  • uuid

  • json/jsonb

  • domain

  • arrays для всех типов выше

    За подробной информацией об ограничениях, связанных с многомерными массивами, обратитесь к Подразделу C.1.

C.1. Известные ограничения #

В настоящее время pgpro_axe не поддерживает все типы данных. Вы можете столкнуться со следующими проблемами:

  • Типы данных enum не поддерживаются.

  • Тип данных DuckDB decimal не поддерживает широкий диапазон значений, поддерживаемый типом данных Postgres Pro numeric.

    Чтобы избежать ошибок при конвертации между этими двумя типами данных, внутри numeric конвертируется в double precision, если DuckDB не поддерживает требуемый уровень точности. Это может привести к потере точности значений.

  • Тип данных DuckDB timestamp_ns усекается до микросекунд при конвертации в тип данных Postgres Pro timestamp, что приводит к потере точности в выводе. Операции над значением timestamp_ns, например сортировка/группировка/сравнение, будут выполняться с полной точностью.

  • Столбцы jsonb конвертируются в столбцы json при чтении из DuckDB, так как в DuckDB отсутствует тип данных jsonb.

  • Многие функции и операторы Postgres Pro json и jsonb не реализованы в DuckDB. Вместо них можно использовать функции и операции DuckDB json.

    За подробной информацией об этих функциях обратитесь к официальной документации DuckDB.

  • В Postgres Pro тип данных DuckDB tinyint конвертируется в char. Это объясняется тем, что Postgres Pro не поддерживает тип данных tinyint. В результате вместо стандартного числа отображается hex-код.

  • Могут возникать проблемы при преобразовании между многомерными массивами Postgres Pro и вложенными списками DuckDB (LIST) в DuckDB, так как функциональности, поддерживаемые базами данных, не совпадают полностью.

    В частности, в Postgres Pro массивы в столбце могут иметь разное количество измерений, например [1] и [[1], [2]] могут встретиться в одном столбце. Это запрещено в DuckDB, и степень вложенности не может изменяться. С другой стороны, в DuckDB разные списки на одном уровне вложенности могут содержать разное количество элементов, например [[1], [1, 2]]. Это запрещено в Postgres Pro. Таким образом, преобразование между этими типами возможно, только если массивы следуют за подмножеством.

    Другой возможной проблемой может быть то, что pgpro_axe использует метаданные столбцов Postgres Pro для определения количества измерений массива. Так как Postgres Pro не выдаёт ошибку, когда вы добавляете массивы с разными измерениями, возможна ситуация, при которой количество измерений в столбце метаданных не соответствует реальному количеству измерений. Чтобы избежать этого, вам нужно изменить тип данных столбца:

      -- преобразует столбец в трёхмерную текстовую строку --
      ALTER TABLE s ALTER COLUMN a SET DATA TYPE text[][][];
      
  • Для типа domain при выполнении операции INSERT проверка domain проводится Postgres Pro, а не DuckDB. Если выполняется операция SELECT и запрашиваемое поле имеет тип данных domain, его потребуется преобразовать в соответствующий базовый тип и обработать с помощью DuckDB.