--- Debian version type and operators -*- sql -*- --- --- Copyright © 2008 Roger Leigh --- Copyright © 2017 Christoph Berg --- --- This program is free software: you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation, either version 2 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, but --- WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program. If not, see --- . CREATE TYPE debversion; CREATE OR REPLACE FUNCTION debversionin(cstring) RETURNS debversion AS 'textin' LANGUAGE internal IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION debversionout(debversion) RETURNS cstring AS 'textout' LANGUAGE internal IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION debversionrecv(internal) RETURNS debversion AS 'textrecv' LANGUAGE internal STABLE STRICT; CREATE OR REPLACE FUNCTION debversionsend(debversion) RETURNS bytea AS 'textsend' LANGUAGE internal STABLE STRICT; CREATE TYPE debversion ( LIKE = text, INPUT = debversionin, OUTPUT = debversionout, RECEIVE = debversionrecv, SEND = debversionsend, -- make it a non-preferred member of string type category CATEGORY = 'S', PREFERRED = false ); COMMENT ON TYPE debversion IS 'Debian package version number'; CREATE OR REPLACE FUNCTION debversion(bpchar) RETURNS debversion AS 'rtrim1' LANGUAGE internal IMMUTABLE STRICT; CREATE CAST (debversion AS text) WITHOUT FUNCTION AS IMPLICIT; CREATE CAST (debversion AS varchar) WITHOUT FUNCTION AS IMPLICIT; CREATE CAST (debversion AS bpchar) WITHOUT FUNCTION AS ASSIGNMENT; CREATE CAST (text AS debversion) WITHOUT FUNCTION AS ASSIGNMENT; CREATE CAST (varchar AS debversion) WITHOUT FUNCTION AS ASSIGNMENT; CREATE CAST (bpchar AS debversion) WITH FUNCTION debversion(bpchar); CREATE OR REPLACE FUNCTION debversion_cmp (version1 debversion, version2 debversion) RETURNS integer AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; COMMENT ON FUNCTION debversion_cmp (debversion, debversion) IS 'Compare Debian versions'; CREATE OR REPLACE FUNCTION debversion_eq (version1 debversion, version2 debversion) RETURNS boolean AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; COMMENT ON FUNCTION debversion_eq (debversion, debversion) IS 'debversion equal'; CREATE OR REPLACE FUNCTION debversion_ne (version1 debversion, version2 debversion) RETURNS boolean AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; COMMENT ON FUNCTION debversion_ne (debversion, debversion) IS 'debversion not equal'; CREATE OR REPLACE FUNCTION debversion_lt (version1 debversion, version2 debversion) RETURNS boolean AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; COMMENT ON FUNCTION debversion_lt (debversion, debversion) IS 'debversion less-than'; CREATE OR REPLACE FUNCTION debversion_gt (version1 debversion, version2 debversion) RETURNS boolean AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; COMMENT ON FUNCTION debversion_gt (debversion, debversion) IS 'debversion greater-than'; CREATE OR REPLACE FUNCTION debversion_le (version1 debversion, version2 debversion) RETURNS boolean AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; COMMENT ON FUNCTION debversion_le (debversion, debversion) IS 'debversion less-than-or-equal'; CREATE OR REPLACE FUNCTION debversion_ge (version1 debversion, version2 debversion) RETURNS boolean AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; COMMENT ON FUNCTION debversion_ge (debversion, debversion) IS 'debversion greater-than-or-equal'; CREATE OPERATOR = ( PROCEDURE = debversion_eq, LEFTARG = debversion, RIGHTARG = debversion, COMMUTATOR = =, NEGATOR = !=, RESTRICT = eqsel, JOIN = eqjoinsel ); COMMENT ON OPERATOR = (debversion, debversion) IS 'debversion equal'; CREATE OPERATOR != ( PROCEDURE = debversion_ne, LEFTARG = debversion, RIGHTARG = debversion, COMMUTATOR = !=, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); COMMENT ON OPERATOR != (debversion, debversion) IS 'debversion not equal'; CREATE OPERATOR < ( PROCEDURE = debversion_lt, LEFTARG = debversion, RIGHTARG = debversion, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); COMMENT ON OPERATOR < (debversion, debversion) IS 'debversion less-than'; CREATE OPERATOR > ( PROCEDURE = debversion_gt, LEFTARG = debversion, RIGHTARG = debversion, COMMUTATOR = <, NEGATOR = >=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); COMMENT ON OPERATOR > (debversion, debversion) IS 'debversion greater-than'; CREATE OPERATOR <= ( PROCEDURE = debversion_le, LEFTARG = debversion, RIGHTARG = debversion, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); COMMENT ON OPERATOR <= (debversion, debversion) IS 'debversion less-than-or-equal'; CREATE OPERATOR >= ( PROCEDURE = debversion_ge, LEFTARG = debversion, RIGHTARG = debversion, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); COMMENT ON OPERATOR >= (debversion, debversion) IS 'debversion greater-than-or-equal'; CREATE OPERATOR CLASS debversion_ops DEFAULT FOR TYPE debversion USING btree AS OPERATOR 1 < (debversion, debversion), OPERATOR 2 <= (debversion, debversion), OPERATOR 3 = (debversion, debversion), OPERATOR 4 >= (debversion, debversion), OPERATOR 5 > (debversion, debversion), FUNCTION 1 debversion_cmp(debversion, debversion); CREATE OR REPLACE FUNCTION debversion_hash(debversion) RETURNS int4 AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; CREATE OPERATOR CLASS debversion_ops DEFAULT FOR TYPE debversion USING hash AS OPERATOR 1 = (debversion, debversion), FUNCTION 1 debversion_hash(debversion); CREATE OR REPLACE FUNCTION debversion_smaller(version1 debversion, version2 debversion) RETURNS debversion AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION debversion_larger(version1 debversion, version2 debversion) RETURNS debversion AS 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT; CREATE AGGREGATE min(debversion) ( SFUNC = debversion_smaller, STYPE = debversion, SORTOP = < ); CREATE AGGREGATE max(debversion) ( SFUNC = debversion_larger, STYPE = debversion, SORTOP = > );