¿Cómo evitar múltiples evals de función con la sintaxis (func ()). * En una consulta SQL?

Contexto

Cuando una función devuelve unTABLE o unSETOF composite-type, como esta función de muestra:

CREATE FUNCTION func(n int) returns table(i int, j bigint) as $
BEGIN
  RETURN QUERY select 1,n::bigint 
      union all select 2,n*n::bigint
      union all select 3,n*n*n::bigint;
END
$ language plpgsql;

Se puede acceder a los resultados por varios métodos:

1)select * from func(3) producirá estas columnas de salida:

 i | j 
---+---
 1 |  3
 2 |  9
 3 | 27

2)select func(3) producirá solo una columna de salida de tipo ROW.

 func  
-------
 (1,3)
 (2,9)
 (3,27)

3)select (func(3)).* producirá como # 1:

 i | j 
---+---
 1 |  3
 2 |  9
 3 | 27

Cuando el argumento de la función proviene de una tabla o subconsulta, la sintaxis # 3 es la única posible, como en:

select N, (func(N)).* from (select 2 as N union select 3 as N) s;

o como en este relacionadoresponder. Si tuvieramosLATERAL JOIN podríamos usar eso, pero hasta que PostgreSQL 9.3 no esté disponible, no es compatible y las versiones anteriores se seguirán utilizando durante años.

Problema

Ahora el problema con la sintaxis # 3 es que la función se llama tantas veces como haya columnas en el resultado. No hay una razón aparente para eso, pero sucede. Podemos verlo en la versión 9.2 añadiendo unRAISE NOTICE 'called for %', n en la funcion Con la consulta anterior, produce:

NOTICE:  called for 2
NOTICE:  called for 2
NOTICE:  called for 3
NOTICE:  called for 3

Ahora si la función se cambia para devolver 4 columnas, así:

CREATE FUNCTION func(n int) returns table(i int, j bigint,k int, l int) as $
BEGIN
  raise notice 'called for %', n;
  RETURN QUERY select 1,n::bigint,1,1 
      union all select 2,n*n::bigint,1,1
      union all select 3,n*n*n::bigint,1,1;
END                                        
$ language plpgsql stable;

entonces los mismos resultados de consulta:

NOTICE:  called for 2
NOTICE:  called for 2
NOTICE:  called for 2
NOTICE:  called for 2
NOTICE:  called for 3
NOTICE:  called for 3
NOTICE:  called for 3
NOTICE:  called for 3

Se necesitaron 2 llamadas de función, se hicieron 8 realmente. La relación es el número de columnas de salida.

Con la sintaxis # 2 que produce el mismo resultado, excepto por el diseño de las columnas de salida, estas múltiples llamadas no ocurren:

select N,func(N) from (select 2 as N union select 3 as N) s;

da:

NOTICE:  called for 2
NOTICE:  called for 3

seguido de las 6 filas resultantes:

 n |    func    
---+------------
 2 | (1,2,1,1)
 2 | (2,4,1,1)
 2 | (3,8,1,1)
 3 | (1,3,1,1)
 3 | (2,9,1,1)
 3 | (3,27,1,1)
Preguntas

¿Existe una sintaxis o una construcción con 9.2 que logre el resultado esperado al hacer solo las llamadas de función mínimas requeridas?

Pregunta extra: ¿por qué ocurren las evaluaciones múltiples?

Respuestas a la pregunta(1)

Su respuesta a la pregunta