Comments 11
У Firebird есть несколько интересных приколов с датами.
1. Вместо функции
2.
1. Вместо функции
now()
есть строковый литерал 'NOW'
, который при преобразовании в дату дает текущий момент. Также есть упрощенный CAST в C-стиле: TIMESTAMP'строковое представление даты'
, который вычисляется в момент синтаксического разбора. Веселье начинается при их объединении: TIMESTAMP'NOW'
. Для простых запросов это не критично, а для хранимых процедур дата вычисляется лишь раз и не меняется. В 4.0 обещали запретить эту конструкцию.2.
TIMESTAMP'01.02.03'
— 1 февраля 2003, а TIMESTAMP'01/02/03'
— 2 января 2003В PostgreSQL тоже нужно быть особенно внимательными с константами типа now (не путать с функцией now()!). К примеру, конструкция TIMESTAMP 'now' в качестве параметра для DEFAULT при создании таблицы будет всегда возвращать дату/время создания таблицы вместо текущего значения, и об этом в документации даже есть специальное предупреждение
В дополнение к досье номер три еще одни потенциальные грабельки:
База сама решает, к каком порядке сформировать JSONB
SELECT '{"foo": "bar", "baz": "qux"}'::jsonb
jsonb |
----------------------------|
{"baz": "qux", "foo": "bar"}|
База сама решает, к каком порядке сформировать JSONB
Да, вообще говоря, когда мы работаем с jsonb, мы работаем с индексированной внутри базы структурой, в которой порядок не обязательно будет соблюден. И хотя логично предположить, что сортировка будет по текстовому ключу, закладываться на это не стоит, так как в документации ничего об этом не говорится
С последним примером для меня большей неожиданностью оказалось то, что NULL приводится к пустому массиву.
ARRAY[1,2] || 3 => 1,2,3
ARRAY[1,2] || NULL => 1,2
ARRAY[1,2] || [NULL] => 1,2,NULL
Взял на заметку, что если хочу явно приклеивать в том числе NULL, то нужно явно указывать массив.
ARRAY[1,2] || 3 => 1,2,3
ARRAY[1,2] || NULL => 1,2
ARRAY[1,2] || [NULL] => 1,2,NULL
Взял на заметку, что если хочу явно приклеивать в том числе NULL, то нужно явно указывать массив.
Это не странности, это некоторая определенна реализация функционала, покрытая юнит-тестами (и потому стабильная). Могла бы быть и другая реализация, но какая разница? Сделали, как проще и как по дефолту, как меньше ифов в коде и краевых случаев.
Sign up to leave a comment.
Подозрительные типы