Я наблюдаю странное поведение двух функций Postgres, возвращающих одно значение bigint. Первый возвращает правильное значение, а второй выдает ошибку:
ERROR: integer out of range
Разница лишь в том, что первый возвращает постоянное значение времени в нс, а второй вычисляет его на основе постоянных значений, для удобства заданных в с:
Этот работает нормально:
CREATE OR REPLACE FUNCTION c_getTime1()
RETURNS bigint AS $$
BEGIN
RETURN 12000000000; --12s in ns
END; $$
LANGUAGE plpgsql IMMUTABLE parallel safe;
Этот выдает ошибку.
CREATE OR REPLACE FUNCTION c_getTime2()
RETURNS bigint AS $$
BEGIN
RETURN 12*1000*1000*1000; --12s in ns
END; $$
LANGUAGE plpgsql IMMUTABLE parallel safe;
Просто интересно, есть ли большая разница? Должен ли я как-то ввести возврат второй функции? Обе функции вызываются прямым способом:
select c_getTime1();
select c_getTime2();
Версия базы данных Postgresql — 13.3.
Спасибо заранее за любые предложения.
выберите pg_typeof(100);
вернуться integer
.RETURN 12*1000*1000*1000;
сначала вычисляется как целое число, а затем преобразуется в bigint.
https://www.postgresql.org/docs/current/datatype-numeric.html
сначала вычислил потом узнал ERROR: 22003: integer out of range
поэтому вы должны изменить на
RETURN 12 ::bigint * 1000 ::bigint * 1000::bigint * 1000::bigint;
Все, что вам нужно сделать, это:
select 12*1000*1000*1000::bigint; 12000000000