Последние недели я с головой погружен в написание парсера для SnowflakeDB и все SQL-WTF касаются именно этой базы. Я понимаю, что эта база в русскоязычном сегменте интернета мало кого интересует, но других вотсдефаков у меня для вас нет :)
1) LIMIT - не ключевое слово
Источникам данных и колонкам можно задавать псевдонимы:
SELECT t.* FROM table1 AS tили без AS
SELECT t.* FROM table1 tНо на этом запросы обычно не заканчиваются. После списка источников данных может идти union, where, group by, having, order by.
Ни одно из этих ключевых слов не может быть использовано в качестве псевдонима. Кроме LIMIT:
SELECT limit.* FROM table1 limit LIMIT 102) Неявное именование подзапросов
Если в качестве источника данных используется подзапрос, для него должен быть задан псевдоним. Так работает в PostgreSQL, так работает в MySQL:
SELECT * FROM (SELECT * FROM table1) tНо в SnowflakeDB это совершенно необязательно. Так же как и в SQLite... :)
Но что будет, если у нас два подзапроса?
SELECT * FROM (SELECT * FROM table1), (SELECT * FROM table1)В SQLite будет магия - CROSS JOIN с колонками только из первой таблицы... Но, справедливости ради в SQLite даже с заданными псевдонимами и прописанным CROSS JOIN будет такой же результат... B как выяснилось, там нет RIGHT JOIN и FULL JOIN... Пользуясь случаям - привет всем фанатам этой базы :)
Но черт с SQLite, что там у SnowflakeDB?
> SQL compilation error: duplicate alias 'values'Чего? Какой values?
Оказывается, что SnowflakeDB сам дописывает один и тот же псевдоним к каждому подзапросу:
SELECT values.* FROM (SELECT * FROM table1)3) Нестрогие значения параметров
В SnowflakeDB есть такая функция для работы с датой:
SELECT next_day(current_date(), 'Friday')которая вернет дату следующей пятницы. Удобно. Молодцы. Но:
SELECT next_day(current_date(), 'Friday I am in love')даст такой же результат.
Как минимум, неплохо бы было описать это поведение в документации.
4) ISO? Какой ISO?
Правила сортировки (сollation) описываются в формате language[_country][-specifier ...]
И все бы было ок - возьми ISO639-1 для языков, ISO3166-1 для стран. Да, но кого интересуют эти мелочи?
SELECT 'foo' COLLATE 'trololo'Как я об этом узнал? Случайно, потратив час на поиск того, как узнать доступный список collation.
----
Есть версия, что все эти странности связаны с тем, что основные пользователи SnowflakeDB - дата аналитики и грузить их всякими мелочами типа правильного названия стран и языков это лишнее. Мне сложно сказать что-то по этому поводу, но тем, кто перейдет на SnowflakeDB с мейнстрим баз, гарантированно будет некоторое время больно.
И уже сейчас понятно сколько невалидных отчетов из-за этого было построено, but who cares?