Re: BUG #16325: Assert failure on partitioning by int for a textvalue with a collation

Поиск
Список
Период
Сортировка
От Michael Paquier
Тема Re: BUG #16325: Assert failure on partitioning by int for a textvalue with a collation
Дата
Msg-id 20200401070842.GD142683@paquier.xyz
обсуждение исходный текст
Ответ на Re: BUG #16325: Assert failure on partitioning by int for a textvalue with a collation  (Dmitry Dolgov <9erthalion6@gmail.com>)
Ответы Re: BUG #16325: Assert failure on partitioning by int for a textvalue with a collation
Список pgsql-bugs
On Sat, Mar 28, 2020 at 01:53:03PM +0100, Dmitry Dolgov wrote:
> Thanks for reporting! Looks like transformPartitionBoundValue needs to
> check that the source collumn is collatable, then we get more expected
> result:
>
>     =# create table part_coll partition of parted for values in ('1' collate "POSIX");
>     ERROR:  42804: collations are not supported by type integer

We have here a side effect of 7c079d74, that has given the possibility
to pass down general expressions for partition bounds.

> +        if (type_is_collatable(colType))
> +        {
> +            if (!OidIsValid(exprCollOid))
> +                ereport(ERROR,
> +                        (errcode(ERRCODE_INDETERMINATE_COLLATION),
> +                         errmsg("could not determine which collation to use for partition expression"),
> +                         errhint("Use the COLLATE clause to set the collation explicitly.")));
> +        }
> +        else
> +        {
> +            if (OidIsValid(exprCollOid))
> +                ereport(ERROR,
> +                        (errcode(ERRCODE_DATATYPE_MISMATCH),
> +                         errmsg("collations are not supported by type %s",
> +                                format_type_be(colType))));
> +        }
> +

It seems to me that the first error cannot happen, and should not
happen.  When the expression is transformed, there is a lookup at the
collation used via transformCollateClause() -> LookupCollation() ->
get_collation_oid() which would never return an invalid OID if the
collation exists, throwing an error instead.  The reason why a similar
check exists in tablecmds.c is that there can be a collation override,
no?
--
Michael

Вложения

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Fan Liu
Дата:
Сообщение: RE: why wal_max_size does not work?
Следующее
От: Fujii Masao
Дата:
Сообщение: Re: [BUG] non archived WAL removed during production crash recovery