From: | Fabien COELHO <coelho(at)cri(dot)ensmp(dot)fr> |
---|---|
To: | Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> |
Cc: | PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: why commutator doesn't work? |
Date: | 2018-10-29 06:35:09 |
Message-ID: | alpine.DEB.2.21.1810290723550.5317@lancre |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hello Pavel,
> I try to create operator + for varchar and integer with Oracle behave.
>
> create or replace function sum(varchar, int)
> returns int as $$ select $1::int + $2 $$ language sql;
>
> create operator + (function = sum, leftarg = varchar, rightarg = int, commutator = +);
>
> create table foo2(a varchar);
> insert into foo2 values('10');
> select a + 1 from foo2; -- it is ok
>
> but
>
> select 1 + a from foo2; -- fails
>
> ERROR: operator is only a shell: integer + character varying
> LINE 1: select 1 + a from foo2;
>
> Why? This should be solved by COMMUTATOR = +
Nope. I understand commutator to be an optimization thing declaration for
joins, it does not create another operator per se.
See https://www.postgresql.org/docs/current/static/xoper-optimization.html#id-1.8.3.17.4
Se in particular the end paragraph: you have created a "dummy" because
there is no existing int+varchar operator.
Probably you want to declare another (varchar, int) function and another
operator for varchar + int, which has the initial one as a commutator.
I'm wondering whether you could use varchar to int implicit cast instead.
--
Fabien.
From | Date | Subject | |
---|---|---|---|
Next Message | legrand legrand | 2018-10-29 06:39:19 | RE: [Proposal] Add accumulated statistics for wait event |
Previous Message | Fabien COELHO | 2018-10-29 06:11:35 | Re: Conflicting option checking in pg_restore |