Почему существует различие в поведении между использованием функции возврата набора (SRF) в списке SELECT и использованием SRF в предложении FROM?
Например, для простого SRF, возвращающего 2 строки:
CREATE OR REPLACE FUNCTION gen_series(out integer, out int)
RETURNS SETOF record AS $$
SELECT 1,1
UNION
SELECT 2,2;
$$ LANGUAGE SQL;
SELECT gen_series();
возвращает две строки одного столбца, каждая из которых содержит запись:
=> gen_series
------------
(1,1)
(2,2)
(2 rows)
Принимая во внимание, что SELECT * FROM gen_series();
возвращает две строки с расширенной записью:
=> column1 | column2
---------+---------
1 | 1
2 | 2
(2 rows)
Для сравнения: если SRF возвращает один столбец, то вызов SRF в предложении SELECT или FROM не имеет значения. например:
=> SELECT generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
=> SELECT * FROM generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
Мои вопросы:
Я не совсем понимаю, почему во втором случае поведение SRF отличается от первого случая только потому, что возвращаемая таблица имеет один столбец. Это действительно последовательное поведение с точки зрения типов, кортежей и множеств?
Какая разница между двумя случаями, которая приводит к разному поведению?
SRF можно использовать в качестве таблиц, как показано выше, но можно ли использовать таблицы для замены SRF? например
SELECT my_table;
По-видимому, этого нельзя сделать, но почему это SELECT my_SRF();
возможно, а
SELECT my_table;
не разрешено (с точки зрения отношений и математики)?
SELECT my_table;
недопустимый синтаксис