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