Creo que el problema es el typecast
haces un MAX de una cadena de texto... y luego esa cadena la conviertes a entero
Código SQL
[-]MAX(SUBSTR(codigo,4))::integer
tal vez si haces el cast interno, y luego aplicas el max, la respuesta sea otra
Código SQL
[-]MAX(SUBSTR(codigo,4)::integer)