×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

2.7.1. Обзор

SQL является строго типизированным языком. То есть каждый элемент данных имеет связанный с ним тип данных, который определяет его поведение и допустимое использование. Digital Q.DataBase имеет расширяемую систему типов, которая является более общей и гибкой, чем в других SQL реализациях. Следовательно, большая часть механизмов преобразования типов в Digital Q.DataBase регулируется общими правилами, а не специальными эвристиками. Это позволяет использовать выражения со смешанными типами данных даже в сочетании с пользовательскими типами данных.

Компонент Digital Q.DataBase сканер/парсер разделяет лексические элементы на пять основных категорий: целые числа, нецелые числа, строки, идентификаторы и ключевые слова. Константы большинства нечисловых типов данных сначала классифицируются как строки. SQL определение языка позволяет указывать имена типов данных с помощью строк, и этот механизм может использоваться в Digital Q.DataBase для того, чтобы направить парсер по верному пути. Например, запрос:

SELECT text 'Origin' AS "label", point '(0,0)' AS "value";

 label  | value
--------+-------
 Origin | (0,0)
(1 row)

имеет две литеральные константы типа данных text и point. Если для строкового литерала не указан тип данных, то ему изначально присваивается псевдотип unknown для последующего разрешения на более поздних этапах, как описано ниже.

Существует четыре основных SQL конструкции, требующие отдельных правил приведения типов в Digital Q.DataBase парсере:

Вызовы функций

Большая часть Digital Q.DataBase системы типов построена на основе расширенного набора функций. Функции могут иметь один или несколько аргументов. Так как Digital Q.DataBase допускает перегрузку функций, имя функции само по себе не позволяет однозначно определить вызываемую функцию; парсер должен выбрать подходящую функцию на основе типов данных переданных аргументов.

Операторы

Digital Q.DataBase допускает выражения с префиксными (унарными) операторами, а также инфиксными (бинарными) операторами. Как и функции, операторы могут быть перегружены, поэтому возникает аналогичная задача выбора правильного оператора.

Хранение значений

SQL INSERT и UPDATE операторы помещают результаты выражений в таблицу. Выражения в операторе должны быть сопоставлены и, при необходимости, приведены к типам данных целевых столбцов.

UNION, CASE, и связанные с ними конструкции

Так как все результаты запроса в объединенном SELECT операторе должны выводиться в едином наборе столбцов, типы данных результатов каждой SELECT части должны быть сопоставлены и приведены к единообразному набору. Аналогично, результирующие выражения конструкции CASE должны быть приведены к общему типу данных, чтобы CASE выражение в целом имело известный выходной тип данных. Некоторые другие конструкции, такие как ARRAY[] и функции GREATEST и LEAST функции также требуют определения общего типа для нескольких подвыражений.

В системных каталогах хранится информация о том, какие преобразования, или приведения типов, существуют между какими типами данных и как выполнять эти преобразования. Дополнительные приведения типов могут быть добавлены пользователем с помощью CREATE CAST команды. (Обычно это делается одновременно с определением новых типов данных. Набор приведений между встроенными типами был тщательно проработан, и его лучше не изменять.)

Дополнительная эвристика, предоставляемая парсером, позволяет точнее определять правила приведения типов среди групп типов, имеющих неявные приведения. Типы данных разделены на несколько основных категорий типов, включая boolean, тип данных numeric, string, bitstring, datetime, timespan, геометрические типы данных, сетевые типы данных, и пользовательские типы данных. (Список приведен в Таблица 7.2.65; но обратите внимание, что также можно создавать пользовательские категории типов.) В рамках каждой категории могут существовать один или несколько предпочтительные типы данных, которые являются предпочтительными типами данных при наличии выбора среди возможных типов. Тщательный подбор предпочтительных типов данных и доступных механизмов неявного приведения позволяет гарантировать, что неоднозначные выражения (имеющие несколько вариантов разбора) будут разрешены корректным образом.

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

  • Неявное приведение типов никогда не должно приводить к неожиданным или непредсказуемым результатам.

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

  • Кроме того, если для вызова функции в запросе обычно требуется неявное приведение типов, а затем пользователь определяет новую функцию с подходящими типами аргументов, парсер должен использовать эту новую функцию и более не выполнять неявное приведение типов для использования старой функции.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению