18.07.2013
Список изменений в СУБД ЛИНТЕР за 1-е полугодие 2013 года

Группа компаний РЕЛЭКС опубликовала отчёт об изменениях и дополнениях, внесённых во все базовые версии СУБД ЛИНТЕР за 4 квартал 2012 года – первую половину 2013 года. Основная часть модификаций затрагивает возможности системы, взаимодействие с отдельными платформами, работу ядра СУБД и компилятора SQL, различных утилит, программных интерфейсов и вспомогательных библиотек.

 

Новые возможности СУБД:

  • Реализованы согласно стандарту SQL (кроме рекурсивных) табличные выражения (CTE).
  • Разрешено создание в БД схем с именами, отличными от имен пользователей.
  • Реализована поддержка хранения комментариев к различным объектам базы данных.
  • В конструкцию FETCH FIRST добавлены новые возможности стандарта SQL - выдать указанный процент от всех записей с начала выборки; выдать указанное число или указанный процент отсортированных записей с начала выборки, включая все записи, равные в сортировке последней. Общий синтаксис FETCH FIRST теперь такой: FETCH FIRST n [PERCENT] [WITH TIES].
  • Разрешены конструкции ORDER BY и LIMIT в любых подзапросах.
  • В хранимых процедурах реализованы конструкции break и continue в циклах, поведение аналогично C/C++.
  • Разрешено в хранимых процедурах выполнение конструкций EXECUTE [DIRECT] [<параметры>][INTO <переменные>] и EXECUTE [DIRECT] [USING < параметры >] [INTO <переменные>]: в случае direct без параметров поведение прежнее (exec direct); в случае direct с параметрами в execute-time - сначала компиляция выражения, затем bind и exec; в случае не-direct компиляция выражения в compile-time, затем в execute-time bind и exec.
  • Разрешены внешние ссылки в SELECT-списке. Кроме того, при проверке наличия столбцов под агрегатными функциями и без них эти внешние ссылки не учитываются (т.е. рассматриваются как константы).
  • Добавлена возможность не привязывать значения для параметров. Если выражение для нового значения столбца в запросах INSERT/UPDATE/MERGE состоит только из одного параметра (INSERT ... VALUES(..., ?, ...) или UPDATE ... SET ... = ?, ...), то этот столбец пропускается, т.е. для него берется значение по умолчанию или старое значение. Для более сложных выражений (например, для операторов вида SET ... = ? + ...) столбец не пропускается, и значение параметра будет NULL.
  • Произведен отказ от дополнительных ограничений на диапазоны значений типов REAL и DOUBLE (накладывавшихся ранее СУБД по сравнению со стандартом IEEE754).
  • Доработан механизм работы с BLOB-значениями для полноценной поддержки многобайтных кодировок, в первую очередь UTF-8.
  • Добавлено автоматическое прерывание выполнения запросов, блокирующих работу ядра более чем на заданное время.
  • Добавлен ключ запуска ядра /C (/CONSOLE) – для упрощения встраивания в приложение.
  • Разрешено выполнение UNION CORRESPONDING для совместимых строковых типов.
  • Разрешено задание значения для DECIMAL в экспоненциальном виде.
  • Разрешено использование типа FLOAT(N) в CAST.
  • Разрешен альтернативный синтаксис СREATE TABLE IF NOT EXISTS в дополнение к СREATE IF NOT EXISTS TABLE.
  • Реализован синтаксис CREATE IF NOT EXISTS для CREATE GROUP и CREATE LEVEL.
  • Разрешено указание имени пользователя в CREATE SEQUENCE, CREATE SYNONYM.
  • Расширен класс строковых выражений, для которых работает преобразование в дату через CAST AS DATE.
  • Увеличено число аргументов скалярных функций, для которых разрешены нетипизированные параметры в качестве значений.
  • Добавлена скалярная функция REVERSE, которая принимает один аргумент - символьную строку (CHAR, VARCHAR, NCHAR, NVARCHAR) и возвращает результат того же типа. Результат имеет обратный порядок символов.
  • Реализована поддержка работы с AUTOINC-столбцами в операторе MERGE.
  • Частично разрешено совпадение имен параметров с ключевыми словами SQL.
  • Добавлен вывод информации о параметрах подсистемы фразовых индексов при старте ядра.

Платформы:

Android

  • Теперь Android диагностируется для приложения как отдельная платформа, а не как вариант Linux.
  • Расширены возможности управляющего приложения.

UNIX-платформы

  • Добавлена поддержка флагов запуска ядра /MBX и /NAME аналогично существующим для WINDOWS-платформ.
  • Поправлен случай потери значения errno до момента диагностики.
  • Исправлена сборка gcc на платформах без поддержки atomic-операций.
  • Исправлены проблемы с несовместимостью версий библиотеки libc при сборке gcc.

SunOS

  • Поправлен конфигуратор процесса сборки. Флаги типа -misalign теперь добавляются в список флагов компилятора, только если они поддерживаются соответствующим компилятором.
  • Устранены случаи сбоя компонент СУБД при нарушении выравнивания на длинное целое.
  • Исправлено несколько проблем, специфичных для MSBF-платформ.

QNX

  • Устранена проблема перезапуска процесса sql.
  • Устранено возможное прерывание операции fwrite сигналом.
  • Устранена проблема повторной пересылки сообщения.

ИНТРОС ВМ 5.4

  • Скорректирована конфигурация сборки.

Ядро СУБД, компилятор SQL и компилятор хранимых процедур:

Оптимизация: разрешение правильных и запрет ошибочных оптимизаций

  • Проведена оптимизация для исключения случая избыточной сортировки.
  • Запрещена оптимизация OUTER JOIN для случая, когда хотябы одна из соединяемых таблиц имеет константный столбец (во избежание неверного ответа).
  • Добавлено ограничение оптимизации PRIMARY KEY/NOT NULL для OUTER JOIN, которая могла приводить к неверным ответам.
  • Добавлено квантование некоторых процессов, устраняющее задержки отдачи управления планировщику ядра, преимущественно для версии ядра 6.1 и запросов типа SELECT * и SELECT COUNT(*).
  • Устранен конфликт оптимизаций в случае замены внешнего ключа на соответствующий первичный ключ.
  • Исправлены случаи некорректной оптимизации запроса с COUNT(*).

Стандартизация и унификация поведения СУБД

  • Поправлена обработка псевдонимов таблиц со списками столбцов в JOIN-запросах.
  • Добавлено использование заданных списков имен столбцов для сопоставления имен в NATURAL JOIN.
  • Поведение NATURAL JOIN без общих столбцов сделано аналогичным CROSS JOIN.
  • Скорректирована интерпретация концевых пробелов в функции REPEAT_STRING.
  • Скорректирована кодировка результата для функции SOUNDEX.
  • Исправлено поведение внешних ссылок с модификатором MATCH PARTIAL, ссылающихся на ту же самую таблицу.
  • Скорректировано выставление типа BLOB-значения при различных операциях с BLOB.
  • Сделана одинаковой работа конструкций <CAST ? AS тип> и <?(тип)>.
  • Добавлено преобразование по умолчанию конструкции CAST AS VARCHAR в дату (для поддержки .NET-провайдера).
  • Исправлена проверка соответствия типов для предиката IN (подзапрос).
  • Исправлен расчет длины строки, для которой произведено преобразование к char при помощи CAST.
  • Исправлена обработка функций LPAD/RPAD для корректной работы с многобайтовыми кодировками.
  • Исправлено вычисление длины геометрических значений, заданных в WKB-формате.
  • Убран ошибочный запрет расширения временных таблиц.
  • Скорректирована работа процедурной функции OUTOFCURSOR.
  • Добавлены проверки для игнорирования записей с NULL-значениями для ограничения целостности и предиката UNIQUE.
  • Исправлено поведение скалярной функции INSTR, процедурных функций SLEEP, RANDOMIZE.
  • Реализовано корректное выполнение функции RAWTOHEX в процедурах.

Дополнительные и скорректированные проверки для предотвращения ошибочных ситуаций

  • Добавлена для версии ядра 6.1 ранняя проверка, что обрабатываемый ROWID не изменен другой транзакцией (ранее эта проверка производилась только при завершении транзакции), что позволяет избежать избыточных вычислений.
  • Запрещено изменение индексов для глобальных временных таблиц в процессе работы с ними.
  • Запрещена ошибочно разрешенная вставка списка значений в столбец.
  • Запрещено одновременное существование PRIMARY KEY и UNIQUE с одним и тем же набором столбцов.
  • Запрещено дублирование столбцов в списке DROP COLUMN.
  • Запрещено дублирование имен столбцов в списке USING.
  • Запрещено сравнение для нескольких комбинаций типов сравниваемых выражений, например, BYTE и CHAR, для которых оно ранее было ошибочно разрешено.
  • Добавлена проверка совместимости запросов, соединяемых по UNION.
  • В синтаксисе оператора MERGE добавлен запрет на конструкции для INSERT, которые запрещены в обычном INSERT.
  • Запрещено использование неоднозначных ссылок на столбцы в ORDER BY.
  • Запрещены ссылки одного и того же внешнего ключа на разные первичные ключи.
  • Исправлены проверки максимальной длины SQL-выражения.
  • Добавлена проверка для выдачи ошибки в случае неправильной комбинации OUTER JOIN в стиле ORACLE.
  • Добавлена проверка максимального количества столбцов в запросе.
  • Исправлен размер выходного буфера при подаче запроса из процедуры.
  • Увеличен размер пула транслятора хранимых процедур во избежание ошибок с нехваткой памяти.
  • Увеличен лимит на число элементов выражений в трансляторе SQL.

Существенные переработки кода для устранения обнаруженных проблем

  • Исправлена работа с контрольными точками в BLOB-транзакциях.
  • Исправлена работа с контрольными точками в режиме OPTIMISTIC.
  • Выполнение LOGON/LOGOFF триггеров теперь производится в автокоммите.
  • Для версии ядра 6.1 вместо блокирования цепочки версий теперь выполняется только блокировка логического ROWID, что приводит к увеличению производительности работы.
  • Скорректирована очистка контекста канала при возникновении ошибки.
  • Исправлена проблема, возникавшая при работе с BLOB нескольких каналов в одной транзакции.
  • Исправлен сдвиг конвертера при расширении bitmap файлов старого формата.
  • Добавлена корректная обработка случая блокировки для циклических таблиц (также как это делается для триггеров и ссылочной целостности).

Устранённые проблемы

  • с целостностью очереди каналов после выполнения процедур, инициированных событиями.
  • c поиском записи для файлов данных большого размера с новым форматом битовых карт.
  • с длительным сканированием журнала при рестарте базы.
  • с нарушением ссылочной целостности в optimistic-режиме для версии ядра 6.1.
  • c работой циклических таблиц в режиме optimistic.
  • с обработкой ограничений целостности CHECK из-за неверной установки типов результатов.
  • с проверкой таймаута кванта обработки запроса сразу после старта ядра.
  • с каскадным удалением пользователя, имеющего последовательность.
  • с неверной сортировкой иерархических запросов при работе через некоторые интерфейсы.
  • с влиянием переполнения буферов подсистемы хранимых процедур на выполнение последующих процедур.
  • со сбоями ядра/транслятора SQL после ошибок.
  • с потерей точности при конвертации между типами DECIMAL и DOUBLE.
  • cо сравнением значений NCHAR и NVARCHAR.
  • c потерей NULL-флага значения при CAST.
  • с обработкой типизированных NULL-значений в CASE.
  • с вычислением функций NULLIF и COALSECE.
  • с конвертацией второго аргумента функции RIGHT_SUBSTR.
  • с пересчетом длины строкового значения после его перекодировки.
  • с памятью каналов на сложных комбинациях триггеров и ссылочной целостности.
  • с параллельной работой нескольких каналов в режиме optimistic.
  • c падением ядра при выполнении триггера для таблицы со столбцом типа extfile.
  • с пустым ответом на запрос к глобальной временной таблице с использованием индекса.
  • с ростом журнала на slave-базе в режиме горячего резервирования.
  • с ошибкой 501 на выполнении команды RBAC при попытке чтения файла журнала, уже переименованного к тому времени.
  • с поиском минимума и максимума по простому индексу в случае квантования.
  • с "запилом" памяти при работе с маленьким пулом сортировки.
  • с зацикливанием обработки функции COUNTBLOB со вторым аргументом UNICODE.
  • c порчей индексов при заполнении циклической таблицы.
  • c поведением в случае ошибки таймаута кванта обработки запроса (реализовано корректное освобождение ресурсов).
  • с глобальными событиями в режиме optimistic с контрольными точками.
  • с отсутствием преобразования DEFAULT-значения, которое задано выражением, тип которого отличается от типа столбца.
  • c неосвобождением ресурсов, занятых явно закрытыми принудительно (по KILL) каналами, в случае наличия системных триггеров (на LOGON/LOGOFF).
  • с автоматическим преобразованием REAL/DOUBLE к DECIMAL в хранимых процедурах (должно быть наоборот).
  • с некорректным кэшированием значений последовательностей.
  • со сравнением данных геометрических типов (для них отменено преобразование >= и <= в BETWEEN).
  • с вычислением максимальной длины результата функции REPLACE.
  • с работой команды CORRECT INDEX PAGE.
  • с работой оператора MERGE с подзапросом в правой части.
  • с работой оператора CREATE TABLE AS SELECT со сложными подзапросами.
  • с откатом выполнения оператора CREATE TABLE AS SELECT.
  • c неполным откатом при rollback добавления BLOB через INL.
  • с работой функции замены подстроки для случая перекодировки.
  • c обработкой ситуации отсутствия поддержки in-memory таблиц.
  • с преобразованием в предикате IN второго операнда к типу первого с потерей информации.
  • с изменением значений группы и уровня мандатного доступа в операторе UPDATE для записи в целом, когда они явно не заданы.
  • с проверкой группы мандатного доступа для отдельных полей записи.
  • c выполнением запросов в случае наличия LOGON/LOGOFF-триггеров.
  • c преобразованием VARCHAR в UNICODE.
  • с откатом изменений, относящихся к уже удаленным таблицам.
  • c работой составного индекса в граничных ситуациях в версии ядра 6.1.
  • со сбоем ядра СУБД при вычислении внешнего соединения, в котором сравниваемое значение является выражением от нескольких столбцов.
  • с поддержкой журнала на устройстве, отличном от SY00, для inc dbonly режима.
  • с отрицательными начальными значениями для autoinc smаllint.
  • с каскадным удалением при сложных зависимостях между таблицами и представлениями.
  • cо сбоем компилятора SQL при неудачном поиске столбца.
  • с выдачей на консоль ошибки 707 при тестировании таблицы с пустым индексом.
  • c работой команды SET DATABASE QUANTUM.
  • с проверкой предиката [NOT] SIMILAR без использования индексов при работе в кодировке UTF-8.
  • с резервированием недостаточного места для значения параметра.
  • с удалением charset-ов, состоящих из нескольких кодовых страниц.
  • с использованием русских символов в полях для OLD- и NEW-значений в триггерах.
  • c повторным удваиванием длины UNICODE-параметров в хранимых процедурах.
  • с обработкой функций TOCHAR, TONCHAR в хранимых процедурах.
  • с кодировками при выполнении SELECT из курсорной процедуры.
  • с работой функции DEFTEXT для аргумента типа DOUBLE.
  • c длительными задержками работы ядра при выполнении функций ROUND и TRUNC.
  • с длиной результата CAST VARCHAR.
  • с путаницей выбираемых столбцов в SELECT из UNION.
  • c получением NULL-значений из первой записи процедурного курсора.
  • с выполнением CREATE OR REPLACE для синонима или VIEW, одноименного с существующей таблицей.
  • c пропуском проверки соответствия индексов и ключей после удаления ключа.
  • с обработкой агрегатной функции DEFAULT при использовании индексов.
  • с поиском по индексу после переконвертации искомого значения из кодировки UTF-8.
  • с работой нового формата bitmap в граничном случае.
  • с записью в файл журнала в граничном случае.
  • с работой autorowid-столбцов в режиме optimistic.

Клиентские утилиты работы с СУБД:

Сервер горячего резервирования hserver

  • Поддержка режима сравнения (diff) для lhb и системы резервирования. В этом режиме производится скачивание только изменившихся блоков данных. Изменившиеся блоки определяются сравнением контрольных сумм. Данный режим позволяет ускорить выход системы резервирования в режим готовности.
  • Введена возможность работы системы резервирования с базой на нескольких устройствах. Командная строка принимает аргумент, в котором указывается, какие переменные среды окружения должны быть выставлены в случае работы с главной базой и какие с резервной. Предполагается, что эти переменные являются устройствами и указывают на каталоги БД. Работа с одним каталогом заменена на работу со списком каталогов.
  • Реализовано отложенное удаление контрольной точки в системе резервирования, которое позволяет быстро выйти в режим готовности после останова.
  • Обеспечено получение контрольной точки в режиме сравнения по контрольным суммам.
  • Скорректировано поведение в случае попытки использования инкрементного режима (во избежание случаев ненужного скачивания всей базы). Оптимизировано взаимодействие журнальной подсистемы ядра и lhb для корректного определения возможности инкрементного режима.
  • Поправлено поведение в случае ожидания решения о новом главном сервере (отказ от перезапуска lhb, исправление отсчета таймаута рестарта).
  • Устранено зависание горячего резерва при включенной трассировке.
  • Обеспечено сохранение предыдущего лог-файла работы lhb.
  • При активной опции /mklhbarc теперь производится не удаление, а переименование lhb-файла.

lhb

  • Реализован отложенный ответ на commit (изменение базы в autocommit) до отсылки пакета измененных данных lhb. Таким образом гарантируется сохранение данных lhb до получения ответа на запрос изменения базы клиентом. Отложенный ответ на запросы изменения данных нужен, чтобы данные гарантированно передались от ядра к lhb во время архивирования в wait режиме. В этом режиме пользователь не получает ответ на commit операцию (или на запрос на изменение данных в случае autocommit) до тех пор, пока измененные данные не будут сохранены lhb.
  • Добавлен diff-режим - скачивание только различий. Работает аналогично -dbonly режиму, но не скачивает все данные, а производит предварительное сравнение контрольных сумм локальной и удаленных баз. Скачиваются только различающиеся блоки.
  • Устранена ошибка при продолжении архива в dbonly-режиме.
  • Поправлена обработка обратных слэшей в сценариях.
  • Исправлена проблема с возможным нарушением порядка столбцов при сохранении и восстановлении таблицы.
  • Скорректирован вывод сообщений, добавлена недостающая информация в help.

lindesk + библиотека RELAPI

  • Реализован панельный (MDI) интерфейс.
  • Переделана система сигналов и слотов.
  • Существенно оптимизирована работа с соединением функций обработчиков событий UI и событиями элементов дерева инспектора.
  • Значительно доработан интерфейс утилиты (сохранение и восстановление настроек, цветовое выделение объектов, множественное сохранение файлов, контекстное меню вкладок).
  • Доработаны отладчик SQL для linsesk и редактор RelAPI.
  • Добавлено соответствие стандарту X Free Desktop.
  • Улучшено отображение информации о доступе к объектам базы.
  • В инспектор SQL добавлена возможность экспорта в SQL из меню для синонимов, процедур, триггеров.
  • Проверены и исправлены функции работы с максимизацией окна для Windows, Gnome, KDE.
  • Исправлена сортировка и фильтр в форме просмотра таблиц.
  • Устранена проблема с просмотром ролей для пользователя, отличного от владельца базы.
  • Устранены сбои отладки процедур при просмотре больших переменных и исполнении запросов с большими параметрами.
  • Исправлено значительное число других проблем.

inl

  • Добавлен вывод номера параметра для ошибки 1052 (параметр не привязан).
  • Скорректирован показ информации об индексах и индексированных столбцах.
  • Увеличена допустимая длина имени файла для команды outfil.
  • Добавлен параметр типа BLOB-значения в команды работы с BLOB.
  • Добавлены проверки длины параметров командной строки.
  • Скорректировано поведение в случае слишком длинной входной строки.
  • Поправлен размер буфера текстового представления ответа.
  • Убрано частичное приведение комментариев к нижнему регистру при их выводе.

dbstore

  • Устранена проблема с дублированием вывода информации о процедурах.
  • Скорректирована выгрузка базы без таблицы $$$PROC.

loarel

  • Устранена ситуация, когда при выдаче строки с ошибкой в .err-файл не выводилось значение последнего столбца.

testdb

  • Исправлено тестирование индексов на столбцы геометрических типов.
  • Добавлена дополнительная проверка во избежание падения при удалении таблицы в повреждённой базе.

gendb

  • Добавлен ключ запуска -ci для выбора языка интерфейса.
  • Добавлено автоматическое распознавание языка.

Сетевые утилиты

  • Добавлен ключ консольного запуска /TCPNOGUI для dbs_wnt и dbc_wnt (предназначен для упрощения встраивания в приложение).

.NET-конвертер данных

  • Произведена значительная доработка утилиты.

Программные интерфейсы СУБД:

JDBC

  • Добавлены настройки: поведения (commit/rollback) при close, трактовки пустого BLOB как NULL, параметра autoCommit в JDBC URL. Реализованы тесты для проверки настроек.
  • Добавлена возможность завершения JDBC-сервера при завершении процесса-родителя.
  • В реализации метода DatabaseMetaData.getCatalogs() имя колонки исправлено с "table_cat" на "TABLE_CAT" (в соответствии со спецификацией).
  • Метод ResultSetMetaData.isSigned(int col) раньше всегда возвращал false, вне зависимости от типа данных столбца.
  • Повышена стабильность работы JDBC-сервера на 64-битной архитектуре.

.NET

  • Оптимизирована работа провайдеров ADO.NET, Entity, LINQ, NHibernate, DevExpress, исправлены ошибки.
  • Поправлены проблемы с работой параметров процедур и обработка кода ошибки 1 (запись удалена).
  • Убрана ненужная рекурсия из примера для .NET2, которая могла приводить к утечке памяти.

LinQT

  • Реализована сборка многонитевой версии для Qt 4.0 и выше.
  • Добавлена поддержка QT5.
  • Исправлен случай передачи неверного номера столбца в функции обработки BLOB-значений.
  • Исправлено неверное поведение драйвера при получении ошибки в ответ на вспомогательный запрос.

LinAPI

  • Добавлена поддержка выполнения команды EXECUTE BLOCK.
  • Добавлены функции для автоматической аутентификации по переменным среды окружения.

LinCPPAPI

  • Интерфейс доработан для корректной сборки GCC4 и MinGW.
  • Добавлены функции для автоматической аутентификации по переменным среды окружения.

LINCPP

  • Добавлен пропуск исключения в функции xCLinterStatemen: Open вместо возврата кода ошибки.
  • Добавлены новые средства работы с многобайтовыми кодировками.

ODBC

  • Поправлены возвращаемые драйвером типы некоторых столбцов для соответствия спецификации ODBC 3.

PCL (embedded SQL)

  • Реализована сборка библиотеки с PIC-кодом и разделяемой библиотеки.

PHP

  • Исправлена проблема с привязкой нескольких параметров к одному запросу.

Вспомогательные библиотеки СУБД:

TICK (работа с датой и временем)

  • Добавлены проверки входных аргументов для функций TFORMAT и TICKFSTRLEN.
  • Добавлена поддержка по умолчанию формата времени без даты (дата без времени работала и раньше).

DATETIME (внутренний формат времени)

  • Реализовано округление тиков вместо усечения при преобразовании форматов даты.

DECIMALS (работа с числами фиксированной точности)

  • Исправлен вывод десятичного нуля при малых значениях точности числа.

LINNLS (поддержка кодировок)

  • Исправлена ситуация с неявным усечением входных данных без возврата кода ошибки.
  • Исправлена проблема с некорректной работой функции LINNLS_wstrstr при поиске последнего символа в строке.

LINGEO (геометрические данные)

  • Исправлена обработка функции DIFFERENCE над аргументами типа CIRCLE.
  • Для функции CROSSES в случае пересечения фигуры с линией теперь при необходимости делается перестановка аргументов.

KLIB

  • Добавлена поддержка алгоритма SHA1.