De afhandeling van anyelement
als een retourtype wordt beschreven in Polymorfe typen
:
Dit argument is in jouw geval relation_name
getypt als anyelement
, en door NULL::table1
. door te geven , dit vertelt de planner inderdaad dat deze specifieke aanroep van function1
zou SETOF table1
moeten teruggeven . Tot zover goed.
Het probleem is nu dat de functie, eenmaal uitgevoerd, SETOF table1
niet teruggeeft maar iets anders. Dit is niet wat de uitvoerder verwachtte, vandaar de fout.
Ondanks dat de titel van de vraag Hoe dynamische rijen te retourneren... . is , wat u lijkt te willen zijn dynamische kolommen of polymorfe resultatensets.
En dit is een zware strijd met SQL, want om het uitvoeringsplan van een query te bouwen, moet de planner elke kolom met zijn type kennen voor elk tussenresultaat. Als u uw query ontwerpt met een functie die moet worden uitgevoerd om de structuur van de uitvoer te vinden, ontstaat er een kip-en-ei-probleem:planning moet voorafgaan aan uitvoering, het kan er niet van afhangen.
Met zijn dynamische type-afleidende techniek toegepast op anyelement
, PostgreSQL is al druk bezig met het implementeren van zoveel mogelijk polymorfisme gezien deze beperking.