Совместимость с PostgreSQL

Tengri — это аналитическая СУБД с Постгрес-подобным диалектом SQL. Tengri основан на протоколах и грамматике PostgreSQL, но использует собственную реализацию. Для BI- и ETL-инструментов Tengri выглядит так, как если бы это был PostgreSQL.

Ключевой функционал Tengri как аналитической СУБД включает:

  • Основные элементы синтаксиса SQL диалекта PostgreSQL:
    SELECT, INSERT, UPDATE, DELETE, JOIN, WITH, UNION

  • Оконные функции

  • Работа с JSON посредством SQL

  • Принципы ACID

  • Транзакции

  • Транзакционная целостность данных

  • Изоляция данных на уровне Repeatable read (Повторяющееся чтение)

SQL и клиентский протокол

Диалект SQL и клиентский протокол Tengri наследует подмножество диалекта и клиентского протокола PostgreSQL, дополняя их новыми конструкциями. Это позволяет использовать с Tengri клиентские библиотеки от PostgreSQL и привычные подходы к написанию SQL для тех, кто до этого работал с Постгресом.

За счет этого мы обеспечиваем работу таких популярных клиентов, как DBeaver и Superset, библиотек sqlalchemy и psycopg, подключение к Tengri из Excel и прочее. Для клиентских приложений Tengri выглядит как Постгрес. Однако мы тестируем не все клиенты Постгреса на совместимость с Tengri. И мы не стремимся полностью покрывать все особенности PostgreSQL. Ниже приведена таблица с основными поддерживаемыми и не поддерживаемыми компонентами.

Поддерживаем Не поддерживаем

client protocol

  • simple query

  • extended query (parse, bind, execute)

  • pipelined execution

connection settings

Клиенту отправляется минимальный неизменяемый набор настроек, достаточных для нормального функционирования большинства клиентов:

  • client_encoding=UTF8

  • server_encoding=UTF8

  • DateStyle=ISO

  • TimeZone=UTC

  • transaction_isolation

  • search_path

Все настройки, полученные от клиента при открытии соединения, игнорируются

sql dialect

  • ANSI SQL 99 (исключая TEMP TABLES, USER TYPES, RECURSIVE CTE)

  • Оконные функции и операции с JSON

  • TRIGGERS

  • INDEXES

  • PLSQL

  • RETURNING

  • FOR UPDATE

  • COPY

  • CURSOR

schema tables

В части названий схем, таблиц, типов и атрибутов и части дополнительных полей реализованы системные таблицы:

  • pg_class

  • pg_namespace

  • pg_attribute

  • pg_type

Этого достаточно для работы большинства клиентов.

Остальные таблицы pg_catalog замокированы и всегда возвращают пустой результат

Поддерживаемые приложения

Этого уровня совместимости достаточно для работы поддерживаемых клиентских приложений (DBeaver, Superset) или разрабатываемого вами решения на основе библиотек libpq, psqlodbc или pgJDBC. Однако этого может оказаться недостаточно для работы необходимого вам приложения, использующего эти библиотеки, но делающего запросы с неподдерживаемыми конструкциями языка или к неподдерживаемым системным таблицам.

Для особенных клиентских приложений, которые завязаны на специфику Постгреса (DDL, индексы и прочее), пишется своя реализация, специфичная для Tengri. Например, у нас есть плагин для популярного инструмента преобразования данных dbt.

Поддержка Комментарий

psql

Нативная для Постгреса

libpq

DBeaver

Нативная для Постгреса

JDBC

Superset

Нативная для Постгреса

sqlalchemy + psycopg

Power Query (Excel)

Нативная для Постгреса

odbc

dbt

Плагин Tengri

Собственная реализация

Транзакции

В Tengri все запросы выполняются в режиме autocommit независимо от настроек соединения и сессионных настроек. Tengri гарантирует транзакционную целостность данных и атомарность DML-операций. Режимы изоляции транзакций PostgreSQL в режиме autocommit вырождаются в один и не могут быть изменены с помощью SQL.

Для случаев, когда режима autocommit недостаточно и нужны многошаговые транзакции, они реализуются стандартным PostgreSQL-синтаксисом BEGIN/START TRANSATION, COMMIT и ROLLBACK, дополняющим стандартные механики Iceberg сквозной эксклюзивной блокировкой затронутых объектов. (В настоящий момент в стадии тестирования.)

Тестирование совместимости

Тестирование жизненно важно для разработки такой сложной системы, как СУБД. Мы уделяем большое внимание тщательному и регулярному тестированию совместимости Tengri:

  • Мы поддерживаем набор unit-тестов и запускаем их на каждом изменении. Они покрывают отдельно конструкции языка, запросы из общедоступных тест-кейсов TPC-H и TPC-DS и наборы актуальных запросов для поддерживаемых клиентских приложений, которые мы регулярно обновляем.

  • Мы используем SQLsmith для генерации случайных запросов. Это позволяет нам быть уверенными в корректности работы оптимизатора и совместимости с PostgreSQL в части запросов SELECT.

  • Мы поддерживаем набор тестов с данными, чтобы быть уверенными в корректности результатов запросов в целом.