【问题标题】:Is there a way I can override the built-in operator for bytea in Postgresql?有没有办法可以覆盖 Postgresql 中 bytea 的内置运算符?
【发布时间】:2020-05-27 14:10:33
【问题描述】:

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

【问题讨论】:

    标签: sql database postgresql operator-overloading pgadmin-4


    【解决方案1】:

    您当然可以定义这些运算符,但随后您需要设置search_path,以便将您创建运算符的架构包含在之前 pg_catalog,例如像这样:

    SET search_path = operatorschema, pg_catalog, appschema;
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 2018-10-05
      相关资源
      最近更新 更多