| From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
|---|---|
| To: | David Kamholz <lautgesetz(at)gmail(dot)com> |
| Cc: | Robert Haas <robertmhaas(at)gmail(dot)com>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
| Subject: | Re: domain cast in parameterized vs. non-parameterized query |
| Date: | 2017-12-20 22:41:18 |
| Message-ID: | 2932.1513809678@sss.pgh.pa.us |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
I wrote:
> You might consider whether you can write 'spa-000'::uid explicitly in your
> query; that results in immediate application of the domain coercion, so
> that the planner no longer sees that as a run-time operation it has to
> avoid.
Hm, scratch that --- experimentation shows that the parser still produces
a CoerceToDomain node in that case, not a literal of the domain type.
regression=# create domain foo as text;
CREATE DOMAIN
regression=# explain verbose select 'x'::foo;
QUERY PLAN
-------------------------------------------
Result (cost=0.00..0.01 rows=1 width=32)
Output: ('x'::text)::foo
(2 rows)
You could force the issue with an immutable function:
regression=# create function forcefoo(text) returns foo as
regression-# 'begin return $1::foo; end' language plpgsql immutable;
CREATE FUNCTION
regression=# explain verbose select forcefoo('x');
QUERY PLAN
-------------------------------------------
Result (cost=0.00..0.01 rows=1 width=32)
Output: 'x'::foo
(2 rows)
Marking this function as immutable is sort of a lie, because it
is effectively telling the planner that you don't expect any
failure from pre-evaluation of the function. But it'd get the
job done, and in most situations there's no practical difference
because any failure would have happened anyway at runtime.
regards, tom lane
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Robert Haas | 2017-12-20 22:45:37 | Re: vacuum vs heap_update_tuple() and multixactids |
| Previous Message | Robert Haas | 2017-12-20 22:35:03 | Re: Tracking of page changes for backup purposes. PTRACK [POC] |