Errors
Trino

Trino: Presto/Trino - static date and timestamp in where clause

Раньше работало. Сейчас нет. Ты уверен, что ничего не менял, но запрос, который отлично бегал на Presto, теперь на Trino плюётся ошибкой про несовместимость тип

Раньше работало. Сейчас нет. Ты уверен, что ничего не менял, но запрос, который отлично бегал на Presto, теперь на Trino плюётся ошибкой про несовместимость типов. Знакомо? Добро пожаловать в мир строгой типизации.

Ты пишешь date = '2016-06-23' и ожидаешь, что движок догадается. В некоторых СУББД он и правда догадается — неявно приведёт строку к дате. Trino (и современные версии Presto) так не делают. Он видит, что слева — колонка типа DATE, а справа — строка (VARCHAR). Это разные вещи, и он отказывается их сравнивать. Требует явного указания.

Отсюда и ошибка: Cannot apply operator: date = varchar. Не “не хочет”, а “не может”. Это принципиально.

Грязное, но работающее решение

Первое, что приходит в голову — обернуть всё в CAST. Заклинание cast('2016-06-23' as date) прямо говорит движку: “это не просто текст, это дата, обработай её соответственно”. И оно работает.

where date = cast('2016-06-23' as date)
and count_time between cast('2016-06-23 14:00:00.000' as TIMESTAMP)
                   and cast('2016-06-23 14:59:59.000' as TIMESTAMP)

Но это громоздко. Каждый раз писать cast — это как проходить через рамку металлоискателя каждый раз, когда ты уже на виду у охраны. Работает, но есть способ проще.

Правильный путь: конструкторы типов

Trino предоставляет элегантный синтаксис для литералов дат и временных меток. Это не функция, это часть языка.

where segment = '2557172'
  and date = date '2016-06-23'
  and count_time between timestamp '2016-06-23 14:00:00.000'
                     and timestamp '2016-06-23 14:59:59.000'

Видишь разницу? date '2016-06-23'. Это литерал типа DATE. С самого момента написания он является датой, а не становится ею после долгих уговоров. То же самое с timestamp '...'.

Это чище, короче и соответствует философии Trino — явное указание намерений. Движку не нужно гадать, а тебе не нужно вспоминать синтаксис каста. Просто пишешь тип перед значением в кавычках.

Почему так?

Раньше Presto был более снисходительным. Со временем разработчики стали убирать неявные приведения, чтобы избежать неоднозначностей и скрытых ошибок в вычислениях. Что если в строке опечатка? Неявное приведение может проглотить это и вернуть NULL или, что хуже, неверный результат. Явное указание типа — это контроль.

Если твой запрос перестал работать после обновления — вот причина. Он всегда был некорректен с точки зрения типов, но старая версия закрывала на это глаза. Теперь глаза открыты.

Запомни: для чисел, дат и времени в Trino всегда используй конструкторы типов. Для даты — date, для времени — time, для временной метки — timestamp. Это не грязно, это правильно.

В следующий раз, когда увидишь ошибку про varchar и date, не судорожно оборачивай всё в cast. Просто поставь перед значением нужный тип. И всё заработает.