Есть ли способ переопределить встроенный оператор для bytea в Postgresql? - PullRequest
0 голосов
/ 27 мая 2020

Я создал операторы для переопределения поведения по умолчанию для встроенных (bytea, bytea) операторов. Это вообще разрешено? Мне нужно это, чтобы переопределить сравнение пользовательских закодированных двоичных данных в базе данных.

CREATE OPERATOR = (
    LEFTARG = bytea,
    RIGHTARG = bytea,
    COMMUTATOR = =,
    NEGATOR = !=,
    PROCEDURE = fn_enc_eq,
    HASHES, MERGES
    );

CREATE OPERATOR != (
    LEFTARG = bytea,
    RIGHTARG = bytea,
    COMMUTATOR = =,
    NEGATOR = !=,
    PROCEDURE = fn_enc_neq,
    HASHES, MERGES
    );

CREATE OPERATOR >= (
    LEFTARG = bytea,
    RIGHTARG = bytea,
    PROCEDURE = fn_enc_gte,
    HASHES, MERGES
    );

CREATE OPERATOR > (
    LEFTARG = bytea,
    RIGHTARG = bytea,
    PROCEDURE = fn_enc_gt,
    HASHES, MERGES
    );

CREATE OPERATOR <= (
    LEFTARG = bytea,
    RIGHTARG = bytea,
    PROCEDURE = fn_enc_lte,
    HASHES, MERGES
    );

CREATE OPERATOR < (
    LEFTARG = bytea,
    RIGHTARG = bytea,
    PROCEDURE = fn_enc_lt,
    HASHES, MERGES
    );

1 Ответ

1 голос
/ 27 мая 2020

Вы, конечно, можете определить эти операторы, но тогда вам нужно установить search_path так, чтобы схема, в которой вы создали операторы, была включена перед pg_catalog, например, вот так:

SET search_path = operatorschema, pg_catalog, appschema;

Учтите, что это будет эффективно не везде, где вы хотите. Например, если вы планируете использовать индекс в виде B-дерева на bytea (странная идея), это будет использовать исходные операторы. Для этого вам нужно будет определить собственный класс операторов.

Вместо того, чтобы злоупотреблять bytea, было бы чище и лучше определить свой собственный тип данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...