diff --git a/META.json b/META.json index c654c92..04f20ef 100644 --- a/META.json +++ b/META.json @@ -1,15 +1,15 @@ { "name": "currency", "abstract": "Enumerable currency list, stored in a single-byte, fixed-length type.", - "version": "0.0.2", - "maintainer": [ "Chris Travers ", "Manuel Kniep " ], + "version": "0.0.3", + "maintainer": [ "Chris Travers ", "Manuel Kniep " ], "license": { "PostgreSQL": "http://www.postgresql.org/about/licence" }, "provides": { "currency": { "file": "sql/pg-currency.sql", - "version": "0.0.2", + "version": "0.0.3", "abstract": "Enumerable currency list, stored in a single-byte, fixed-length type." } }, diff --git a/currency.control b/currency.control index fbad9c0..09b4727 100644 --- a/currency.control +++ b/currency.control @@ -1,5 +1,5 @@ # currency extension comment = 'Custom PostgreSQL currency type' -default_version = '0.0.2' +default_version = '0.0.3' relocatable = true requires = 'plpgsql' diff --git a/sql/currency--0.0.2--0.0.3.sql b/sql/currency--0.0.2--0.0.3.sql new file mode 100644 index 0000000..78a1203 --- /dev/null +++ b/sql/currency--0.0.2--0.0.3.sql @@ -0,0 +1,22 @@ + +DO $$ +DECLARE version_num integer; +BEGIN + SELECT current_setting('server_version_num') INTO STRICT version_num; + IF version_num > 90600 THEN + EXECUTE $E$ ALTER FUNCTION currency_in(cstring) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_out(currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_recv(internal) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_send(currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_eq(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_neq(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_lt(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_le(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_gt(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_ge(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_cmp(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION hash_currency(currency) PARALLEL SAFE $E$; + END IF; +END; +$$; + diff --git a/sql/currency--0.0.3.sql b/sql/currency--0.0.3.sql new file mode 100644 index 0000000..e149e74 --- /dev/null +++ b/sql/currency--0.0.3.sql @@ -0,0 +1,202 @@ + +CREATE TYPE currency; + +CREATE FUNCTION supported_currencies() + RETURNS SETOF currency + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION currency_in(cstring) + RETURNS currency + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION currency_out(currency) + RETURNS cstring + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION currency_recv(internal) + RETURNS currency + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +CREATE FUNCTION currency_send(currency) + RETURNS bytea + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +CREATE TYPE currency ( + internallength = 1, + input = currency_in, + output = currency_out, + send = currency_send, + receive = currency_recv, + alignment = char, + PASSEDBYVALUE +); + +COMMENT ON TYPE currency + IS '1-byte ISO 4217 Currency Code'; + +CREATE FUNCTION currency_lt(currency, currency) + RETURNS BOOL + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +COMMENT ON FUNCTION currency_lt(currency, currency) IS 'implementation of < operator'; + +CREATE FUNCTION currency_le(currency, currency) + RETURNS BOOL + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +COMMENT ON FUNCTION currency_le(currency, currency) IS 'implementation of <= operator'; + +CREATE FUNCTION currency_eq(currency, currency) + RETURNS BOOL + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +COMMENT ON FUNCTION currency_eq(currency, currency) IS 'implementation of = operator'; + +CREATE FUNCTION currency_neq(currency, currency) + RETURNS BOOL + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +COMMENT ON FUNCTION currency_neq(currency, currency) IS 'implementation of <> operator'; + +CREATE FUNCTION currency_ge(currency, currency) + RETURNS BOOL + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +COMMENT ON FUNCTION currency_ge(currency, currency) IS 'implementation of >= operator'; + +CREATE FUNCTION currency_gt(currency, currency) + RETURNS BOOL + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +COMMENT ON FUNCTION currency_gt(currency, currency) IS 'implementation of > operator'; + +CREATE FUNCTION hash_currency(currency) + RETURNS integer + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +COMMENT ON FUNCTION hash_currency(currency) IS 'hash'; + +DO $$ +DECLARE version_num integer; +BEGIN + SELECT current_setting('server_version_num') INTO STRICT version_num; + IF version_num > 90600 THEN + EXECUTE $E$ ALTER FUNCTION currency_in(cstring) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_out(currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_recv(internal) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_send(currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_eq(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_neq(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_lt(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_le(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_gt(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_ge(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION currency_cmp(currency, currency) PARALLEL SAFE $E$; + EXECUTE $E$ ALTER FUNCTION hash_currency(currency) PARALLEL SAFE $E$; + END IF; +END; +$$; + +CREATE OPERATOR < ( + leftarg = currency, + rightarg = currency, + procedure = currency_lt, + commutator = >, + negator = >=, + restrict = scalarltsel, + join = scalarltjoinsel +); + +COMMENT ON OPERATOR <(currency, currency) IS 'less than'; + +CREATE OPERATOR <= ( + leftarg = currency, + rightarg = currency, + procedure = currency_le, + commutator = >=, + negator = >, + restrict = scalarltsel, + join = scalarltjoinsel +); + +COMMENT ON OPERATOR <=(currency, currency) IS 'less than or equal'; + +CREATE OPERATOR = ( + leftarg = currency, + rightarg = currency, + procedure = currency_eq, + commutator = =, + negator = <>, + restrict = eqsel, + join = eqjoinsel, + HASHES, MERGES +); + +COMMENT ON OPERATOR =(currency, currency) IS 'equal'; + +CREATE OPERATOR >= ( + leftarg = currency, + rightarg = currency, + procedure = currency_ge, + commutator = <=, + negator = <, + restrict = scalargtsel, + join = scalargtjoinsel +); + +COMMENT ON OPERATOR >=(currency, currency) IS 'greater than or equal'; + +CREATE OPERATOR > ( + leftarg = currency, + rightarg = currency, + procedure = currency_gt, + commutator = <, + negator = <=, + restrict = scalargtsel, + join = scalargtjoinsel +); + +COMMENT ON OPERATOR >(currency, currency) IS 'greater than'; + +CREATE OPERATOR <> ( + leftarg = currency, + rightarg = currency, + procedure = currency_neq, + commutator = <>, + negator = =, + restrict = neqsel, + join = neqjoinsel +); + +COMMENT ON OPERATOR <>(currency, currency) IS 'not equal'; + +CREATE FUNCTION currency_cmp(currency, currency) + RETURNS int4 + AS '$libdir/currency.so' + LANGUAGE C IMMUTABLE STRICT; + +CREATE OPERATOR CLASS currency_ops + DEFAULT FOR TYPE currency USING btree AS + OPERATOR 1 < , + OPERATOR 2 <= , + OPERATOR 3 = , + OPERATOR 4 >= , + OPERATOR 5 > , + FUNCTION 1 currency_cmp(currency, currency); + +CREATE OPERATOR CLASS currency_ops + DEFAULT FOR TYPE currency USING hash AS + OPERATOR 1 = , + FUNCTION 1 hash_currency(currency);