TGViewer
There will be no singularity There will be no singularity @nosingularity · 1.96K subscribers
Post #602 1.15K
​Пятничный SQL-WTF
Понедельничный SQL-TIL #6

Последние недели я с головой погружен в написание парсера для 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 10

2) Неявное именование подзапросов
Если в качестве источника данных используется подзапрос, для него должен быть задан псевдоним. Так работает в 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?
More from @nosingularity
  1. Sep 19, 2026fixupx.com/KaiLentit/status/2100629518784328013/video/1
  2. Sep 18, 2026fixupx.com/iam_zachi/status/2100679300756435135
  3. Aug 30, 2026photo post
  4. Aug 25, 2026fixupx.com/meganreyno/status/2091918430374957416
  5. Aug 3, 2026Вышла новость, что Andy Pavlo приняли на борт Clickhouse Inc. Энди довольно известная фигу…
  6. Jul 23, 2026fixupx.com/unclebobmartin/status/2080257779395154409
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →