pá 22. 1. 2021 v 15:10 odesílatel <easter...@verfriemelt.org> napsal:

> > Probably the fix is not hard, but it is almost the same situation as the
> > UNION case. The result of your code is not deterministic
> >
> > If there are more different ti_resource_id then some values can be
> randomly
> > ignored - when hash agg is used.
> >
> > The safe fix should be
> >
> > _resource_id := (SELECT ti_resource_id
> >        FROM tabk.resource_timeline
> >       WHERE ti_a2_id = _ab2_id
> >         AND ti_type = 'task');
> >
> > and you get an exception if some values are ignored. Or if you want to
> > ignore some values, then you can write
> >
> > _resource_id := (SELECT MIN(ti_resource_id) -- or MAX
> >        FROM tabk.resource_timeline
> >       WHERE ti_a2_id = _ab2_id
> >         AND ti_type = 'task');
> >
> > Using DISTINCT is not a good solution.
> >
>
> in my usecase it was perfectly fine, because there is a constraint
> ensuring that here can never be more than on ti_resource_id at any given
> time for a given _ab2_id.
> also, whenever there would be more data ( for example if the constraint
> trigger would have a bug ) you will get an error like this:
>
>
>   create table a ( t int );
>   insert into a values (1),(2);
>
>   do $$
>   declare _t int;
>   begin
>     _t := distinct t from a;
>   end $$;
>
>   Query failed: ERROR:  query "SELECT distinct t from a" returned more
> than one row
>   CONTEXT:  PL/pgSQL function inline_code_block line 4 at assignment
>
> no doubt, that this piece of code might not look optimal at first glance,
> but i like my code to fail fast. because with the min() approach, you will
> not notice, that the constraint trigger is not doing its job, until you get
> other strange sideeffects down the road.
>

ok

then you don't need to use group by or DISTINCT

just use

_t := (SELECT ...);

The performance will be same and less obfuscate and you will not use
undocumented feature

Regards

Pavel




> richard
>

Reply via email to