Hanteringen av anyelement
som returtyp beskrivs i Polymorfa typer
:
Detta argument i ditt fall är relation_name
skrivs som anyelement
, och genom att skicka NULL::table1
, detta talar verkligen om för planeraren att just detta anrop av function1
bör returnera SETOF table1
. Så långt har det gått bra.
Nu är problemet att när den väl körs returnerar funktionen inte SETOF table1
men något annat. Detta är inte vad exekutorn förväntade sig, därav felet.
Trots att rubriken på frågan är Hur returnerar du dynamiska rader... , det du verkar vilja ha är dynamiska kolumner eller polymorfa resultatuppsättningar.
Och det här är en uppförsbacke med SQL, för för att kunna bygga utförandeplanen för en fråga måste planeraren känna till varje kolumn med dess typ för varje mellanresultat. Om du designar din fråga med en funktion som måste köras för att hitta strukturen för dess produktion, som skapar ett problem med kyckling och ägg:planering måste föregå exekvering, det kan inte bero på det.
Med dess dynamiska typinfererande teknik applicerad på anyelement
, PostgreSQL driver redan på kuvertet för att implementera så mycket polymorfism som möjligt med tanke på denna begränsning.