Re: domain cast in parameterized vs. non-parameterized query
| От | Pavel Stehule |
|---|---|
| Тема | Re: domain cast in parameterized vs. non-parameterized query |
| Дата | |
| Msg-id | CAFj8pRC8c58FS3dYrAHHN3T=xznSnBpS4FLJ_kxnhEQAoBkEDA@mail.gmail.com обсуждение исходный текст |
| Ответ на | Re: domain cast in parameterized vs. non-parameterized query (Tom Lane <tgl@sss.pgh.pa.us>) |
| Ответы |
Re: domain cast in parameterized vs. non-parameterized query
|
| Список | pgsql-hackers |
Hi
2017-12-20 23:41 GMT+01:00 Tom Lane <tgl@sss.pgh.pa.us>:
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:
Why the rewrite doesn't reduce it? Or why parser does it?
Regards
Pavel
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
В списке pgsql-hackers по дате отправления: