Spec-Zone.ru › DuckDB

Ключевые слова и идентификаторы

Идентификаторы

Аналогично другим диалектам SQL и языкам программирования, идентификаторы в SQL DuckDB подчиняются нескольким правилам.

  • Необрамлённые идентификаторы должны соответствовать ряду правил:
    • Они не должны быть зарезервированным ключевым словом (см. duckdb_keywords()), например, SELECT 123 AS SELECT будет отклонено.
    • Они не должны начинаться с цифры или специального символа, например, SELECT 123 AS 1col — некорректно.
    • Они не могут содержать пробелы (включая табуляции и символы новой строки).
  • Идентификаторы могут быть обрамлены двойными кавычками ("). Обрамлённые идентификаторы могут использовать любые ключевые слова, пробелы или специальные символы, например, "SELECT" и " § 🦆 ¶ " — допустимые идентификаторы.
  • Двойные кавычки могут быть экранированы, повторив символ кавычки, например, чтобы создать идентификатор с именем IDENTIFIER "X", используйте "IDENTIFIER ""X""".

Уникализация идентификаторов

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

  • Для столбца с именем ⟨name⟩, первый экземпляр не переименовывается.
  • Последующие экземпляры переименовываются в ⟨name⟩_⟨count⟩, где ⟨count⟩ начинается с 1.

Например:

SELECT *
FROM (SELECT UNNEST({'a': 42, 'b': {'a': 88, 'b': 99}}, recursive := true));
a a_1 b
42 88 99

Имена баз данных

Имена баз данных подчиняются правилам для идентификаторов.

Кроме того, рекомендуется избегать двух внутренних схем имён баз данных DuckDB, system и temp. По умолчанию постоянные базы данных именуются по имени файла без расширения. Поэтому, файлы system.db и temp.db (а также system.duckdb и temp.duckdb) приводят к именам баз данных system и temp соответственно. Если вам нужно подключиться к базе данных с одним из этих имён, используйте псевдоним, например:

ATTACH 'temp.db' AS temp2;
USE temp2;

Правила для чувствительности к регистру

Ключевые слова и имена функций

Ключевые слова SQL и имена функций в DuckDB нечувствительны к регистру.

Например, следующие два запроса эквивалентны:

select COS(Pi()) as CosineOfPi;
SELECT cos(pi()) AS CosineOfPi;
CosineOfPi
-1.0

Чувствительность к регистру идентификаторов

Идентификаторы в DuckDB всегда нечувствительны к регистру, подобно PostgreSQL. Однако, в отличие от PostgreSQL (и некоторых других основных реализаций SQL), DuckDB также обрабатывает обрамлённые идентификаторы как нечувствительные к регистру.

Несмотря на то, что идентификаторы обрабатываются как нечувствительные к регистру, регистр каждого символа (заглавные/строчные буквы) сохраняется, как указано пользователем, даже если запрос использует различные регистры при ссылке на идентификатор. Например:

CREATE TABLE tbl AS SELECT cos(pi()) AS CosineOfPi;
SELECT cosineofpi FROM tbl;
CosineOfPi
-1.0

Чтобы изменить это поведение, установите параметр конфигурации preserve_identifier_case параметр конфигурации в false.

Обработка конфликтов

В случае конфликта, когда один и тот же идентификатор написан с разными регистрами, один из них будет выбран случайным образом. Например:

CREATE TABLE t1 (idfield INTEGER, x INTEGER);
CREATE TABLE t2 (IdField INTEGER, y INTEGER);
INSERT INTO t1 VALUES (1, 123);
INSERT INTO t2 VALUES (1, 456);
SELECT * FROM t1 NATURAL JOIN t2;
idfield x y
1 123 456

Отключение сохранения регистров

При установке параметра конфигурации preserve_identifier_case параметр конфигурации на значение false, все идентификаторы преобразуются в нижний регистр:

SET preserve_identifier_case = false;
CREATE TABLE tbl AS SELECT cos(pi()) AS CosineOfPi;
SELECT CosineOfPi FROM tbl;
cosineofpi
-1.0

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/dialect/keywords_and_identifiers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API