有没有办法可以覆盖 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
,不如定义自己的数据类型更清晰、更好。
我已经创建了运算符来覆盖内置 (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
,不如定义自己的数据类型更清晰、更好。