Я как-то рассказывал об одной неочевидной причине, по которой апгрейд версии посгреса может привести к болям в разных частях тела - после 12 версии изменился формат сообщений об ошибках (
https://t.me/nosingularity/875).
Но сегодня всплыл еще один сюрприз:
тип результата функции
EXTRACT в 14 версии изменился с
double precision на
numeric.
И казалось бы, в чем проблема?
Но дальше все зависит от вашего языка и драйвера.
Pg-promise по умолчанию кастит numeric к строке, и в результате вместо ожидаемого инта вы получаете строку, в которой будет число с 16 нулями после запятой.
Дальше, я думаю, понятно...
И я подумал - почему бы не взять все доступные функции и сравнить их сигнатуры от версии к версии. Благо в посгре это можно сделать одним селектом из таблицы pg-proc.
Сказано - сделано!
https://github.com/antonrevyako/postgresql-functions-changes
Справедливости ради, особых откровений в этом сравнении нет:
- в pg12 выкинули типы abstime and reltime, и соответственно все функции с ними.
- в pg12 добавили параметр к функциям конвертации character encoding.
- в pg14 уточнили типа anyarray и any до anycompatiblearray и anycompatible соответственно.
- ну и всякое по мелочи...
Но EXTRACT в этот список не попал :)
В pg-proc не входят функции со специальным синтаксисом, они захардкожены.
Мне когда-нибудь будет не лень и я сравню и все специальные функции тоже...
Еще в процессе тестирования выяснилось, что pg10 ругается, когда пытаешься скастить json-ноду к простому типу, например BOOLEAN, а все версии выше не ругаются.
Энивей, так делать не надо ни в какой версии, поэтому про это будет соответсвующее правило в
holistic.dev :)