有没有办法可以覆盖 Postgresql 中 bytea 的内置运算符?

Is there a way I can override the built-in operator for bytea in Postgresql?

我已经创建了运算符来覆盖内置 (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
    );

您当然可以定义这些运算符,但是您需要设置 search_path 以便包含您创建运算符的模式 before pg_catalog,例如像这样:

SET search_path = operatorschema, pg_catalog, appschema;

请注意,这不会对您想要的任何地方都有效。例如,如果您计划在 bytea 上使用 B 树索引(奇怪的想法),那将使用原始运算符。您必须为此定义自定义运算符 class。

与其滥用bytea,不如定义自己的数据类型更清晰、更好。