Skip to content

Commit 62e9cb8

Browse files
df7cbmsdemlei
authored andcommitted
sum() and intersection() aggregates
1 parent 414095b commit 62e9cb8

File tree

3 files changed

+30
-6
lines changed

3 files changed

+30
-6
lines changed

expected/moc.out

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,12 @@ SELECT '1/1'::smoc || '1/2' AS union;
505505
1/1-2
506506
(1 row)
507507

508+
SELECT sum(moc) FROM (VALUES ('0/1'::smoc), ('0/2'), ('0/4')) sub(moc);
509+
sum
510+
---------
511+
0/1-2,4
512+
(1 row)
513+
508514
SELECT smoc_intersection('1/1,4-6', '1/3-5 2/8');
509515
smoc_intersection
510516
-------------------
@@ -523,3 +529,9 @@ SELECT '1/9,11,13,15'::smoc * '0/1,2' AS intersection;
523529
1/9,11
524530
(1 row)
525531

532+
SELECT intersection(moc) FROM (VALUES ('0/1-4'::smoc), ('0/2-5'), (NULL)) sub(moc);
533+
intersection
534+
--------------
535+
0/2-4
536+
(1 row)
537+

pgs_moc_ops.sql.in

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,30 @@ CREATE FUNCTION smoc_union (smoc, smoc)
44
LANGUAGE C
55
STRICT;
66

7-
CREATE FUNCTION smoc_intersection (smoc, smoc)
8-
RETURNS smoc
9-
AS 'MODULE_PATHNAME'
10-
LANGUAGE C
11-
STRICT;
12-
137
CREATE OPERATOR || (
148
LEFTARG = smoc,
159
RIGHTARG = smoc,
1610
PROCEDURE = smoc_union
1711
);
1812

13+
CREATE AGGREGATE sum (smoc) (
14+
SFUNC = smoc_union,
15+
STYPE = smoc
16+
);
17+
18+
CREATE FUNCTION smoc_intersection (smoc, smoc)
19+
RETURNS smoc
20+
AS 'MODULE_PATHNAME'
21+
LANGUAGE C
22+
STRICT;
23+
1924
CREATE OPERATOR * (
2025
LEFTARG = smoc,
2126
RIGHTARG = smoc,
2227
PROCEDURE = smoc_intersection
2328
);
29+
30+
CREATE AGGREGATE intersection (smoc) (
31+
SFUNC = smoc_intersection,
32+
STYPE = smoc
33+
);

sql/moc.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ SELECT smoc('28/1101-1103');
113113

114114
SELECT smoc_union('1/1,4-6', '1/3-5 2/8');
115115
SELECT '1/1'::smoc || '1/2' AS union;
116+
SELECT sum(moc) FROM (VALUES ('0/1'::smoc), ('0/2'), ('0/4')) sub(moc);
116117

117118
SELECT smoc_intersection('1/1,4-6', '1/3-5 2/8');
118119
SELECT '0/1'::smoc * '1/3,5,7,9' AS intersection;
119120
SELECT '1/9,11,13,15'::smoc * '0/1,2' AS intersection;
121+
SELECT intersection(moc) FROM (VALUES ('0/1-4'::smoc), ('0/2-5'), (NULL)) sub(moc);

0 commit comments

Comments
 (0)