Обработката на anyelement като тип връщане е описано в Полиморфни типове
:
Този аргумент във вашия случай е relation_name въведен като anyelement и чрез предаване на NULL::table1 , това наистина казва на планиращия, че това конкретно извикване на function1 трябва да върне SETOF table1 . Дотук добре.
Сега проблемът е, че веднъж изпълнена, функцията не връща SETOF table1 но нещо друго. Това не е очакваното от изпълнителя, оттук и грешката.
Въпреки че заглавието на въпроса е Как да върна динамични редове... , това, което изглежда искате, са динамични колони или полиморфни набори от резултати.
И това е трудна битка със SQL, защото, за да изгради план за изпълнение на заявка, планиращият трябва да знае всяка колона с нейния тип за всеки междинен резултат. Ако проектирате вашата заявка с функция, която трябва да се изпълни, за да се намери структурата на нейния изход, това създава проблем с кокошката и яйцето:планирането трябва да предхожда изпълнението, то не може да зависи от него.
Със своята динамична техника за извеждане на типа, приложена към anyelement , PostgreSQL вече разширява обвивката, за да приложи възможно най-много полиморфизъм предвид това ограничение.