[Bizgres-general] constraint exclusion (table partitioning)
not working?
Luke Lonergan
llonergan at greenplum.com
Wed Sep 14 23:12:40 GMT 2005
Bob, Josh,
Thanks for finding this!
- Luke
On 9/14/05 10:34 AM, "Josh Berkus" <jberkus at greenplum.com> wrote:
> Bob,
>
>> If you make the a column bigserial (or bigint), and it'll be busted.
>> Surprisingly, numeric seems to work.
>
> Thanks for finding this. It's a bit of a corner case but a lot of users
> are going to run across it.
>
> What's happening is that, if your constraint is declared without data
> types, default type coercion takes over, i.e.
>
> check a.a between 1 and 3
>
> becomes effectively
>
> check a.a between 1::INT and 3::INT
>
> However, when you run the query, the correct type conversion happens:
>
> where a.a between 5 and 6
>
> becomese effectively
>
> where a.a between 5::BIGINT and 6::BIGINT
>
> which isn't comparable to 5::INT and thus CE does not happen.
>
> The temporary work-around is to make sure to declare your constraints with
> data types:
>
> CHECK a.a BETWEEN 1::BIGINT and 3::BIGINT
>
> and then CE will happen.
>
> Unfortunately, this means that this is actually a bug in PostgreSQL's type
> coercion inside constraints, which makes it harder to fix. We'll see if
> it's possible to get something in before 8.1!
More information about the Bizgres-general
mailing list