Vous n'êtes pas identifié(e).

#2 Re : Général » Bug ou feature ? » 24/02/2017 17:11:40

Merci pour ton retour et tes explications.


cependant, je n'obtient pas le résultat attendu avec ta proposition :



with next as (select testnext())
select now(),(next).* from next;


now                 |testnext      |
--------------------|--------------|
2017-02-24 16:09:45 |(302,303,304) |


et la syntaxe suivante est en erreur :


with next as (select testnext())
select now(),((next).*).* from next;



hmm

#3 Général » Bug ou feature ? » 24/02/2017 16:05:09

linuxprocess
Réponses : 4

Bonjour,

Je en sais pas trop quoi penser de cette observation qui est faite ...
Je suspecte tout de même une forme de bug, parce que ca ne me semble pas optimal du tout ...


Pour résumer : dans le cas de figure qui suit, la fonction est appelée deux fois par le moteur, alors que la requête ne l'appelle qu'une fois.


Le POC, beaucoup plus clair que les explications :


CREATE OR REPLACE FUNCTION testnext(OUT a bigint, OUT b bigint)
RETURNS record
LANGUAGE sql
IMMUTABLE STRICT
AS $function$
select nextval('lieu_id_seq'::regclass) as a, nextval('lieu_id_seq'::regclass) as b
$function$


select now(),testnext();


Retourne le résultat attendu :
now                 |testnext  |
--------------------|----------|
2017-02-24 15:01:17 |(263,264) |


263 et 264 se suivent, tout est ok ...


select now(),(testnext()).*;


Retourne ce résultat :
now                 |a   |b   |
--------------------|----|----|
2017-02-24 15:02:06 |265 |268 |


265 et 268 sont retournés ...
266 et 267 sont perdus, ca correspond tout à fait au fait que comme il y a deux résultats, alors la fonction a été appelée 2 fois.


Avec trois éléments retournés, on retrouve le même problème : la fonction est appelée 3 fois.


Qu'en pensez vous ?
Voyez vous une autre façon de faire qui n'appellerait pas la fonction plusieurs fois ?


Merci

Pied de page des forums

Propulsé par FluxBB