-
Notifications
You must be signed in to change notification settings - Fork 12
/
unit--6--7.sql.in
114 lines (96 loc) · 3.32 KB
/
unit--6--7.sql.in
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
-- add recv/send functions
CREATE FUNCTION unit_recv(internal)
RETURNS unit
AS '$libdir/unit'
LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION unit_send(unit)
RETURNS bytea
AS '$libdir/unit'
LANGUAGE C IMMUTABLE STRICT;
UPDATE pg_type SET typreceive = 'unit_recv', typsend = 'unit_send'
WHERE typname = 'unit' AND typnamespace = '@extschema@'::regnamespace;
INSERT INTO pg_depend (classid, objid, objsubid, refclassid, refobjid, refobjsubid, deptype)
VALUES
('pg_type'::regclass, 'unit'::regtype, 0, 'pg_proc'::regclass, 'unit_recv'::regproc, 0, 'n'),
('pg_type'::regclass, 'unit'::regtype, 0, 'pg_proc'::regclass, 'unit_send'::regproc, 0, 'n');
-- convert @ from (unit, text)->cstring to (unit, text)->text
DROP OPERATOR @ (unit, text);
DROP FUNCTION unit_at(unit, text);
CREATE FUNCTION unit_at(unit, text)
RETURNS text
SET search_path = @extschema@
AS '$libdir/unit', 'unit_at_text2'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR @ (
leftarg = unit,
rightarg = text,
procedure = unit_at
);
-- strict comparisons
CREATE FUNCTION unit_strict_lt(unit, unit) RETURNS bool
AS '$libdir/unit' LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION unit_strict_le(unit, unit) RETURNS bool
AS '$libdir/unit' LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION unit_strict_eq(unit, unit) RETURNS bool
AS '$libdir/unit' LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION unit_strict_ne(unit, unit) RETURNS bool
AS '$libdir/unit' LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION unit_strict_ge(unit, unit) RETURNS bool
AS '$libdir/unit' LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION unit_strict_gt(unit, unit) RETURNS bool
AS '$libdir/unit' LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR << (
leftarg = unit, rightarg = unit, procedure = unit_strict_lt,
commutator = >> , negator = >>= ,
restrict = scalarltsel, join = scalarltjoinsel
);
CREATE OPERATOR <<= (
leftarg = unit, rightarg = unit, procedure = unit_strict_le,
commutator = >>= , negator = >> ,
restrict = scalarltsel, join = scalarltjoinsel
);
CREATE OPERATOR == (
leftarg = unit, rightarg = unit, procedure = unit_strict_eq,
commutator = == , negator = <<>> ,
restrict = eqsel, join = eqjoinsel
);
CREATE OPERATOR <<>> (
leftarg = unit, rightarg = unit, procedure = unit_strict_ne,
commutator = <<>> , negator = == ,
restrict = neqsel, join = neqjoinsel
);
CREATE OPERATOR >>= (
leftarg = unit, rightarg = unit, procedure = unit_strict_ge,
commutator = <<= , negator = << ,
restrict = scalargtsel, join = scalargtjoinsel
);
CREATE OPERATOR >> (
leftarg = unit, rightarg = unit, procedure = unit_strict_gt,
commutator = << , negator = <<= ,
restrict = scalargtsel, join = scalargtjoinsel
);
CREATE FUNCTION unit_strict_cmp(unit, unit)
RETURNS int4
AS '$libdir/unit'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR CLASS unit_strict_ops
FOR TYPE unit USING btree AS
OPERATOR 1 << ,
OPERATOR 2 <<= ,
OPERATOR 3 == ,
OPERATOR 4 >>= ,
OPERATOR 5 >> ,
FUNCTION 1 unit_strict_cmp(unit, unit);
-- range type
CREATE FUNCTION unit_diff(unit, unit)
RETURNS float8
AS '$libdir/unit'
LANGUAGE C IMMUTABLE STRICT;
COMMENT ON FUNCTION unit_diff(unit, unit) IS 'returns difference of two units as float8 for use in the unitrange type';
CREATE TYPE unitrange AS RANGE (
SUBTYPE = unit,
SUBTYPE_OPCLASS = unit_strict_ops,
SUBTYPE_DIFF = unit_diff
);
-- load prefixes and units tables
SELECT unit_load();