Superset 26.800.0: поколения серверов и точные ошибки SQL
Superset 26.800.0 добавляет поколение BI-сервера и признак обязательного протокола в публичное состояние runtime. Ещё одно заметное изменение касается SQL Lab и виртуальных датасетов: ошибки пользовательского запроса теперь отделяются от недоступности BI-сервиса.
Новое
Выдавайте поколение сервера один раз
Новая команда Bitrix\Superset\Public\Commands\Server\IssueServerGenerationCommand принимает ссылку на сервер и строку поколения. Репозиторий записывает только непустое значение в незаполненное поле; для пустой строки команда возвращает generationIssued: false.
Запись защищена условием на уровне SQL. После UPDATE репозиторий заново читает сервер и синхронизирует переданную сущность. Повторный запрос с другим значением не заменит уже выданное поколение.
CreateServerCommand получил необязательный аргумент $generation, поэтому поколение можно передать сразу при создании сервера. Старые вызовы остаются совместимыми. Новый аргумент стоит последним и по умолчанию равен null.
ServerRuntimeStateDto теперь возвращает поколение через getGeneration() и признак обязательного протокола через isProtocolRequired(). Сериализация использует поля generation и protocolRequired, а при чтении DTO также понимает вариант protocol_required. ServerDtoFactory переносит оба значения из серверной сущности в публичный DTO.
Код, который передаёт состояние сервера между своими сервисами, может работать с этими значениями без обращения к внутренней сущности Superset. При разборе ответа старый потребитель продолжит получать прежние поля, а новый сможет отдельно проверить поколение и требование протокола.
Показывайте пользователю причину ошибки SQL
SQL Lab относит отсутствующую колонку, таблицу или схему к INVALID_QUERY. Такая ошибка больше не выглядит как недоступность BI-сервиса. Классификатор понимает прежний формат ответа Trino, строку с префиксом trino error: и новую структуру extra.query_error.
Результат INVALID_QUERY может содержать queryError с причиной отказа. Текст берётся из той же ошибки, по которой выбран итоговый код, поэтому соседняя серверная ошибка не подменит сообщение о запросе. Пустой SQL и локально распознанный отказ тоже заполняют queryError.
VirtualDatasetService преобразует синтаксические ошибки и отсутствующие объекты БД в request_rejected. Даже если BI-сервис вернул для пользовательского SQL HTTP 500, портал отдаст 422. Клиентский код может показать ошибку запроса рядом с редактором SQL и не запускать сценарий восстановления недоступного экземпляра Superset. Ответы 401, 403 и 404, а также ошибки доступа через ActAs продолжают идти по прежним веткам.
Текст отказа ограничен 500 символами. Сообщения с символом <, переводами CR/LF или пустым значением заменяются общей безопасной формулировкой; одиночный > разрешён.
БД
В b_superset_server появились два поля. GENERATION хранит строку длиной до 32 символов и допускает NULL. PROTOCOL_REQUIRED хранит Y или N, по умолчанию N.
Оба поля добавлены в ORM-карту ServerTable и mapper серверной сущности. Собственные запросы к b_superset_server должны учитывать, что GENERATION может оставаться NULL до первой успешной выдачи поколения.
Для PROTOCOL_REQUIRED действует одностороннее сохранение: mapper записывает Y, но не сбрасывает его обратно из устаревшего снимка состояния. Это нужно учитывать коду, который напрямую читает таблицу или сравнивает сохранённое состояние с DTO.