Вы изменили код, который возвращает возвращаемое значение, в отличие от исходного smallint, который он возвращал, чтобы теперь быть строкой. (CONCAT
функция выводит строку - вы можете приводить числа столько раз, сколько хотите, прежде чем передать их в concat, но они будут преобразованы в строки и затем объединены, а concat выведет строку, нет независимо от того, что вы в нее кормите)
CONCAT теперь возвращает вам строку, содержащую слишком много цифр (она слишком велика), чтобы поместиться в smallint - преобразование, которое PG пытается выполнить для вас неявно. Это основная проблема:
CREATE OR REPLACE FUNCTION return_big_number ()
RETURNS smallint AS $$
RETURN '32769'; --string of a number that is too big for a smallint
END; $$
'32769'
- это строка, которую нельзя преобразовать в smallint, потому что она просто слишком велика с точки зрения чисел - smallint ограничивается 32767. Аналогично, используя concat, вы генерирование строки, содержащей цифры, представляющие число, слишком большое для мелкого шрифта
Либо измените объявление функции вверху так, чтобы оно возвращало подходящую строку:
RETURNS smallint AS $$
^^^^^^^^
change this to perhaps "RETURNS text AS $$"
Или если вывод в виде цифр c вам больше подходит, измените функцию, чтобы она объявляла возвращаемый тип данных цифр c, который может представлять больше цифр, чем строчные буквы, и изменяйте вычисление возвращаемого значения, чтобы сохранить его цифрами c (умножьте входное значение на некоторую степень 10 и добавьте контрольную сумму вместо того, чтобы изменять входные данные в строку и объединять контрольную сумму)