powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Без явного приведения типов не подхватывается оператор
3 сообщений из 3, страница 1 из 1
Без явного приведения типов не подхватывается оператор
    #39321571
Фотография Владимир П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть PostgreSQL 9.5. Есть объявление таблицы, в котором типы для всех столбцов организованы через домены:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE DOMAIN d_organization_id AS NUMERIC;
CREATE DOMAIN d_common_date AS DATE;
CREATE DOMAIN d_date_range AS DateRange;

create sequence seq_organizations_id;

create table Organizations
(
   org_id               d_organization_id    not null DEFAULT nextval('seq_organizations_id'),
   org_active_period    d_date_range         DEFAULT daterange(NULL,NULL),
   org_valid_from       d_common_date,
   constraint CHT_Valid_date_in_period
      check ( org_valid_from::date <@ org_active_period::daterange )
)



Проверка на вхождение даты в диапазон работает, если явно приводить типы данных к базовому типу домена:
Код: plaintext
check ( org_valid_from::date <@ org_active_period::daterange )

А без приведения типа
Код: plaintext
check ( org_valid_from <@ org_active_period )
выдаётся ошибка:
Код: plaintext
operator does not exist: <@ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

Хотя документация гласит:
Глава 10.2 в переводе PostgresProЕсли один из аргументов имеет тип домен, далее считать его типом базовый тип домена. Благодаря этому при поиске неоднозначно заданного оператора домены будут подобны свои базовым типам.
Почему же не работает без явного преобразования?
...
Рейтинг: 0 / 0
Без явного приведения типов не подхватывается оператор
    #39321660
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир П.,

"Если один из" - вот по этому скорее всего.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Без явного приведения типов не подхватывается оператор
    #39321775
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

там в оригинале

If any input argument is of a domain type, treat it as being of the domain's base type for all subsequent steps. This ensures that domains act like their base types for purposes of ambiguous-operator resolution.


т.е. по идее не один из, а любой из. я так понял нам этот оператор нужен и других подходящих нет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
\do <@
                                                 List of operators
   Schema   | Name | Left arg type | Right arg type | Result type |                   Description
------------+------+---------------+----------------+-------------+-------------------------------------------------
 pg_catalog | <@   | anyarray      | anyarray       | boolean     | is contained by
 pg_catalog | <@   | anyelement    | anyrange       | boolean     | is contained by
 pg_catalog | <@   | anyrange      | anyrange       | boolean     | is contained by
 pg_catalog | <@   | box           | box            | boolean     | is contained by
 pg_catalog | <@   | circle        | circle         | boolean     | is contained by
 pg_catalog | <@   | jsonb         | jsonb          | boolean     | is contained by
 pg_catalog | <@   | lseg          | box            | boolean     | is contained by
 pg_catalog | <@   | lseg          | line           | boolean     | lseg on line
 pg_catalog | <@   | point         | box            | boolean     | point inside box
 pg_catalog | <@   | point         | circle         | boolean     | is contained by
 pg_catalog | <@   | point         | line           | boolean     | point on line
 pg_catalog | <@   | point         | lseg           | boolean     | is contained by
 pg_catalog | <@   | point         | path           | boolean     | point within closed path, or point on open path
 pg_catalog | <@   | point         | polygon        | boolean     | is contained by
 pg_catalog | <@   | polygon       | polygon        | boolean     | is contained by
 pg_catalog | <@   | tsquery       | tsquery        | boolean     | is contained by
 public     | <@   | hstore        | hstore         | boolean     |
 public     | <@   | integer[]     | integer[]      | boolean     | contained in
(18 rows)



причем если только первый аргумент привести к date - то работает, а если только второй к daterange то нет. я думаю стоит в -bugs написать.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Без явного приведения типов не подхватывается оператор
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]