Но просто сидеть и ничего не делать не позволяет то, что стартап :) Как говорится, "никто, кроме нас".
Тогда приходится браться за какую-то автоматическую работу, которую можно выполнять без мозга.
К сожалению, и такая тоже есть :(
Например, для компилятора SQL-выражений нужно иметь описания всех операторов и функций в базе.
В PostgreSQL это делается просто - SELECT из information_schema и вот тебе все операторы и функции.
Кстати, в PostgreSQL можно делать свои операторы.
В Snowflake такой халявы не случилось, приходится открывать документацию и по документации создавать описание.
Максимально скучное занятие...
Но иногда приходится "просыпаться"...
Прежде чем приводить какие-то примеры стоит рассказать о системе типов в Snowflake.
Там всего десяток основных типов, а все остальное - производные от них.
Например, числовых всего два - NUMBER (фиксированная точка) и FLOAT (плавающая точка).
И все целые типы это NUMBER(38,0). Хочешь что-то этакого - задавай сам.
Зато даты и времени разных аж 5 штук.
А VARCHAR автоматом превращается в VARCHAR(16777216). Очень сильно надеюсь, что они не выделяют физически по 16 килобайт на каждую ячейку...
К слову, в PostgreSQL ШЕСТЬ разных числовых типов, не считая 3 разных SERIAL.
Как задается сложение в PostgreSQL?
integer + integer -> integer
bigint + bigint -> bigint
Как задается сложение в Snowflake?
При сложении двух NUMBER L1.S1 и L2.S2
Leading digits: L = max(L1, L2) + 1И надо не забыть проверить, чтобы L не превышал 38.
Scale: S = max(S1, S2)
Precision: P = L + S
С.У.К.А.
Ладно, хоть с FLOAT + FLOAT -> FLOAT
Остальные операции задаются в том же духе
Если вдруг операндами будут числа, размерность которых не получится распознать на этапе компиляции (например, числа из JSON, которые имеют динамическую точность), то получится херня :)
На этом месте, я кстати, предвижу очень интересные эффекты в приложениях, которые работают со Snowflake. И скорее всего драйвера для разных языков работают с числами по-разному.
Но это еще не все!
Я же туплю и делаю справочник функций.
Для начала - в описании большей части функций отсутствует описание типов аргументов и результата. Приходится открывать DataGrip и экспериментировать. Собственно так я и обнаружил то странное поведение CEIL и FLOOR
Или вот агрегатные функции MIN и MAX
The data type of the returned value is the same as the data type of the input values.Ага. Щаз!
[22000][2016] SQL compilation error: Function MIN does not support ARRAY argument typeИли еще вот такой лихой ход:
Агрегатная функция, которая параметром принимает только константу.
эээ....
Но это еще не все. Обязательно должна быть использована конструкция
WITHIN GROUP (ORDER BY order_by_expr)и тип результата зависит от типа выражения order_by_expr ... mic drop ...
Я допускаю, что я человек покусанный PostgreSQL и зря быкую. Дайте плз знать, если такое норм.
Вот, кстати, эта красавица
Давайте-ка попробуем что там в качестве константы запихать можно...
select system$typeof(PERCENTILE_CONT(0.11111111111111111111111111111111111111) within group (order by a)) from t;БАДУМС!
[22023][1015] SQL compilation error: argument 0 to function PERCENTILE_CONT needs to be constant, found 'CAST(0.1111111111111111 AS NUMBER(18,0))'Сейчас вот не понял...
Почему, блин AS NUMBER(18,0) ? И почему разрядов после точки в ошибке меньше, чем я указал?
И почему если уменьшить количество разрядов на один, то все работает ?
Подождите расходиться, это еще не все :)
VAR_POP
The data type of the returned value is NUMBER(precision, scale). The scale depends upon the values being processed.спасибо_нахер.jpg
PS: будем считать, что это очередной SQL-TIL :)