Re: Invalid optimization of VOLATILE function in WHERE clause?

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Florian(dot)Schoppmann(at)emc(dot)com (Florian Schoppmann)
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Invalid optimization of VOLATILE function in WHERE clause?
Date: 2012-09-19 14:30:36
Message-ID: 25382.1348065036@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Florian(dot)Schoppmann(at)emc(dot)com (Florian Schoppmann) writes:
> In PostgreSQL 9.1 and 9.2 (possibly also in earlier versions), the query

> --8<--
> WITH source AS (
> SELECT i FROM generate_series(1,10) AS i
> )
> SELECT
> i
> FROM
> source, (
> SELECT
> count(*) AS _n
> FROM source
> ) AS _stats
> WHERE
> random() < 5::DOUBLE PRECISION/_n;
> -->8--

[ doesn't do what you think it should ]

I can't get excited about this. Any time you put a volatile function
into WHERE, you're playing with fire. The docs warn against it:
http://www.postgresql.org/docs/9.2/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL

To do what you want, I'd suggest wrapping the join into a sub-select
with an "OFFSET 0" clause, which will serve as an optimization fence
that prevents the random() call from being pushed down.

regards, tom lane

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Merlin Moncure 2012-09-19 14:58:04 Re: Invalid optimization of VOLATILE function in WHERE clause?
Previous Message Heikki Linnakangas 2012-09-19 12:32:03 Re: ToDo: allow to get a number of processed rows by COPY statement