Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add pg16 compatibility #18

Merged
merged 2 commits into from
Apr 22, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
test:
strategy:
matrix:
pg: [15, 14, 13, 12, 11, 10]
pg: [16, 15, 14, 13, 12, 11, 10]
name: 🐘 PostgreSQL ${{ matrix.pg }}
runs-on: ubuntu-latest
container: pgxn/pgxn-tools
Expand Down
203 changes: 203 additions & 0 deletions sql/currency--0.0.4.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@

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';

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);

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;
$$;

1 change: 1 addition & 0 deletions src/currency.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "currency.h"


PerikAdjust marked this conversation as resolved.
Show resolved Hide resolved
PG_MODULE_MAGIC;

static currency sort_map[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
Expand Down
3 changes: 3 additions & 0 deletions src/currency.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
#include "access/hash.h"
#include "libpq/pqformat.h"
#include "funcapi.h"
#if PG_VERSION_NUM >= 160000
#include "varatt.h"
#endif

typedef unsigned char currency;

Expand Down
9 changes: 8 additions & 1 deletion test/expected/parallel_test.out
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
BEGIN;
SET max_parallel_workers_per_gather=4;
SET force_parallel_mode=on;
DO $$
BEGIN
IF current_setting('server_version_num')::int >= 160000 THEN
EXECUTE 'SET debug_parallel_query = on';
ELSE
EXECUTE 'SET force_parallel_mode = on';
END IF;
END $$;
CREATE TABLE parallel_test(i int, c currency) WITH (parallel_workers = 4);
INSERT INTO parallel_test (i, c)
SELECT i, c.country
Expand Down
9 changes: 8 additions & 1 deletion test/expected/parallel_test_1.out
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
BEGIN;
SET max_parallel_workers_per_gather=4;
SET force_parallel_mode=on;
DO $$
BEGIN
IF current_setting('server_version_num')::int >= 160000 THEN
EXECUTE 'SET debug_parallel_query = on';
ELSE
EXECUTE 'SET force_parallel_mode = on';
END IF;
END $$;
CREATE TABLE parallel_test(i int, c currency) WITH (parallel_workers = 4);
INSERT INTO parallel_test (i, c)
SELECT i, c.country
Expand Down
9 changes: 8 additions & 1 deletion test/sql/parallel_test.sql
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
BEGIN;
SET max_parallel_workers_per_gather=4;
SET force_parallel_mode=on;
DO $$
BEGIN
IF current_setting('server_version_num')::int >= 160000 THEN
EXECUTE 'SET debug_parallel_query = on';
ELSE
EXECUTE 'SET force_parallel_mode = on';
END IF;
END $$;

CREATE TABLE parallel_test(i int, c currency) WITH (parallel_workers = 4);
INSERT INTO parallel_test (i, c)
Expand Down
Loading