Last active
November 3, 2020 21:20
-
-
Save Teggy/d81fe5a58184a168f397a62a0dc1e805 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 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