Skip to content

Instantly share code, notes, and snippets.

@Teggy
Last active November 3, 2020 21:20
Show Gist options
  • Save Teggy/d81fe5a58184a168f397a62a0dc1e805 to your computer and use it in GitHub Desktop.
Save Teggy/d81fe5a58184a168f397a62a0dc1e805 to your computer and use it in GitHub Desktop.
-- A custom base type 'wildcard' that returns true on < comparisons,
-- no matter what. Otherwise acts like a 4-byte integer.
DROP TYPE IF EXISTS wildcard CASCADE;
CREATE TYPE wildcard;
CREATE FUNCTION wildcard_in(s cstring) RETURNS wildcard
LANGUAGE internal IMMUTABLE AS 'int4in';
CREATE FUNCTION wildcard_out(d wildcard) RETURNS cstring
LANGUAGE internal IMMUTABLE AS 'int4out';
CREATE TYPE wildcard (
INPUT = wildcard_in,
OUTPUT = wildcard_out,
LIKE = integer
);
CREATE FUNCTION wildcard_eq(wildcard, wildcard)
RETURNS boolean LANGUAGE internal IMMUTABLE AS 'int4eq';
CREATE FUNCTION wildcard_ne(wildcard, wildcard)
RETURNS boolean LANGUAGE internal IMMUTABLE AS 'int4ne';
-- ⚠️
CREATE FUNCTION wildcard_lt(wildcard, wildcard) RETURNS boolean AS
$$
SELECT true;
$$ LANGUAGE SQL IMMUTABLE STRICT;
CREATE FUNCTION wildcard_le(wildcard, wildcard)
RETURNS boolean LANGUAGE internal IMMUTABLE AS 'int4le';
CREATE FUNCTION wildcard_gt(wildcard, wildcard)
RETURNS boolean LANGUAGE internal IMMUTABLE AS 'int4gt';
CREATE FUNCTION wildcard_ge(wildcard, wildcard)
RETURNS boolean LANGUAGE internal IMMUTABLE AS 'int4ge';
-- ⚠️
CREATE FUNCTION wildcard_cmp(wildcard, wildcard) RETURNS integer AS
$$
SELECT -1;
$$ LANGUAGE SQL IMMUTABLE STRICT;
CREATE OPERATOR = (
LEFTARG = wildcard,
RIGHTARG = wildcard,
PROCEDURE = wildcard_eq,
COMMUTATOR = '=',
NEGATOR = '<>',
RESTRICT = eqsel,
JOIN = eqjoinsel,
HASHES, MERGES
);
CREATE OPERATOR <> (
LEFTARG = wildcard,
RIGHTARG = wildcard,
PROCEDURE = wildcard_ne,
COMMUTATOR = '<>',
NEGATOR = '=',
RESTRICT = neqsel,
JOIN = neqjoinsel
);
CREATE OPERATOR < (
LEFTARG = wildcard,
RIGHTARG = wildcard,
PROCEDURE = wildcard_lt,
COMMUTATOR = > ,
NEGATOR = >= ,
RESTRICT = scalarltsel,
JOIN = scalarltjoinsel
);
CREATE OPERATOR <= (
LEFTARG = wildcard,
RIGHTARG = wildcard,
PROCEDURE = wildcard_le,
COMMUTATOR = >= ,
NEGATOR = > ,
RESTRICT = scalarltsel,
JOIN = scalarltjoinsel
);
CREATE OPERATOR > (
LEFTARG = wildcard,
RIGHTARG = wildcard,
PROCEDURE = wildcard_gt,
COMMUTATOR = < ,
NEGATOR = <= ,
RESTRICT = scalargtsel,
JOIN = scalargtjoinsel
);
CREATE OPERATOR >= (
LEFTARG = wildcard,
RIGHTARG = wildcard,
PROCEDURE = wildcard_ge,
COMMUTATOR = <= ,
NEGATOR = < ,
RESTRICT = scalargtsel,
JOIN = scalargtjoinsel
);
CREATE OPERATOR CLASS btree_wildcard_ops
DEFAULT FOR TYPE wildcard USING btree
AS
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 wildcard_cmp(wildcard, wildcard);
CREATE OPERATOR CLASS hash_wildcard_ops
DEFAULT FOR TYPE wildcard USING hash AS
OPERATOR 1 = ,
FUNCTION 1 hashint4;
CREATE CAST (integer AS wildcard) WITHOUT FUNCTION AS IMPLICIT;
CREATE CAST (wildcard AS integer) WITHOUT FUNCTION AS IMPLICIT;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment