Re: operator exclusion constraints

From: Jeff Davis <pgsql(at)j-davis(dot)com>
To: Robert Haas <robertmhaas(at)gmail(dot)com>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Peter Eisentraut <peter_e(at)gmx(dot)net>, Simon Riggs <simon(at)2ndquadrant(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: operator exclusion constraints
Date: 2009-11-28 03:18:20
Message-ID: 1259378300.19289.683.camel@jdavis
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Thu, 2009-11-26 at 01:33 -0800, Jeff Davis wrote:
> Remaining issues:
> * represent operator IDs in catalog, rather than strategy numbers

Done, attached.

> * if someone thinks it's an issue, support search strategies that
> require binary-incompatible casts of the inputs

I've already solved the original problem involving ANYARRAY. If someone
comes up with a good use case, or provides me with a little more
guidance, I'll reconsider this problem again. Otherwise, I feel like I'm
solving a problem that doesn't exist (after all, none of the contrib
modules seem to have a problem with the current assumptions, nor does
postgis, nor does my PERIOD module). So, I'm considering this a
"non-issue" until further notice.

To summarize, the problem as I understand it is this:

You have two types, T1 and T2, and there's an implicit cast (with
function or with inout) from T1 to T2. And you have an opclass like:

CREATE OPERATOR CLASS t1_ops FOR TYPE t1
...
OPERATOR 17 %%(t2, t2)
...

And then you have an exclusion constraint like:
CREATE TABLE foo
(
a t1,
EXCLUDE (a t1_ops WITH %%)
);

What should the behavior be in the following two cases?
1. Only operator %%(t2, t2) exists.
2. Operator %%(t1, t1) and %%(t2, t2) exist.

If left unsolved, #1 results in an error because the operator requires
binary-incompatible coercion. #2 results in an error because %%(t1, t1)
is not in the opclass.

Arguably either one of them could succeed by finding %%(t2, t2) and
performing the appropriate conversion; but I think it's fair to just say
"the opclass is poorly defined".

Note that if the opclass is on type t2, you can simply cast "a" to t2
explicitly in the expression, like so:
EXCLUDE((a::t2) t2_ops WITH %%)

Regards,
Jeff Davis

Attachment Content-Type Size
operator-exclusion-constraints-20091127.context.patch text/x-patch 102.1 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Andrew Dunstan 2009-11-28 14:35:10 Re: Initial refactoring of plperl.c [PATCH]
Previous Message Tom Lane 2009-11-28 01:32:32 Re: Re: [COMMITTERS] pgsql: Rewrite GEQO's gimme_tree function so that it always finds a