Re: BUG #14301: function in case expression called when it should not be

From: David Fetter <david(at)fetter(dot)org>
To: rikard(at)ngs(dot)hr
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #14301: function in case expression called when it should not be
Date: 2016-08-29 20:44:19
Message-ID: 20160829204419.GF29482@fetter.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On Mon, Aug 29, 2016 at 03:14:33PM +0000, rikard(at)ngs(dot)hr wrote:
> The following bug has been logged on the website:
>
> Bug reference: 14301
> Logged by: Rikard Pavelic
> Email address: rikard(at)ngs(dot)hr
> PostgreSQL version: 9.4.9
> Operating system: CentOS
> Description:
>
> I was investigating some performance issues and stumbled upon this
> behavior:
>
> create function slowFunction() returns int as $$
> begin
> raise notice 'called';
> return 0;
> end;
> $$ language plpgsql volatile;
>
> create table something (i int, doSlow boolean);
> insert into something values(1, false),(2,false);
>
> select case when doSlow then sum(slowFunction()) else sum(1) end as total
> from something group by doSlow
>
> Postgres will correctly evaluate the last query, but it will also call the
> plpgsql volatile function.
>
> Luckly for us, this was read only function, but Postgres will happily
> execute DML commands inside it ;(

This is the expected behavior. You might look into FILTER clauses in
your queries, which might be closer to the behavior you want.

Best,
David.
--
David Fetter <david(at)fetter(dot)org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david(dot)fetter(at)gmail(dot)com

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Rikard Pavelic 2016-08-29 20:53:04 Re: BUG #14301: function in case expression called when it should not be
Previous Message Christy, Jason E 2016-08-29 19:12:23 Re: BUG #14298: service upgrade not setting ports