-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathksj--1.0.sql
239 lines (194 loc) · 4.14 KB
/
ksj--1.0.sql
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/* contrib/ksj/ksj--1.0.sql */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION ksj" to load this file. \quit
CREATE TYPE ksj;
CREATE FUNCTION ksj_in(cstring)
RETURNS ksj
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
CREATE FUNCTION ksj_out(ksj)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
CREATE TYPE ksj (
INTERNALLENGTH = 4,
INPUT = ksj_in,
OUTPUT = ksj_out,
STORAGE = plain
);
--
-- 四則演算
--
CREATE FUNCTION ksj_add(ksj, ksj)
RETURNS ksj
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR + (
leftarg = ksj,
rightarg = ksj,
procedure = ksj_add,
commutator = +
);
CREATE FUNCTION ksj_sub(ksj, ksj)
RETURNS ksj
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR - (
leftarg = ksj,
rightarg = ksj,
procedure = ksj_sub
);
CREATE FUNCTION ksj_mul(ksj, ksj)
RETURNS ksj
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR * (
leftarg = ksj,
rightarg = ksj,
procedure = ksj_mul
);
CREATE FUNCTION ksj_div(ksj, ksj)
RETURNS ksj
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR / (
leftarg = ksj,
rightarg = ksj,
procedure = ksj_div
);
CREATE FUNCTION ksj_mod(ksj, ksj)
RETURNS ksj
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR % (
leftarg = ksj,
rightarg = ksj,
procedure = ksj_mod
);
--
-- 集約演算
--
-- SUM
CREATE AGGREGATE sum (ksj)
(
sfunc = ksj_add,
stype = ksj,
initcond = '零'
);
-- MAX
CREATE FUNCTION ksj_max(ksj, ksj)
RETURNS ksj
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE AGGREGATE max (ksj)
(
sfunc = ksj_max,
stype = ksj,
initcond = '零'
);
-- MIN
CREATE FUNCTION ksj_min(ksj, ksj)
RETURNS ksj
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE AGGREGATE min (ksj)
(
sfunc = ksj_min,
stype = ksj,
initcond = '九億九千九百九拾九万九千九百九拾九'
);
--
-- 比較演算
--
-- 等しい
CREATE FUNCTION ksj_eq(ksj, ksj)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR = (
leftarg = ksj,
rightarg = ksj,
procedure = ksj_eq,
commutator = =,
RESTRICT = eqsel
);
-- 等しくない
CREATE FUNCTION ksj_ne(ksj, ksj)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR <> (
leftarg = ksj,
rightarg = ksj,
procedure = ksj_ne,
RESTRICT = neqsel
);
-- より小さい
CREATE FUNCTION ksj_lt(ksj, ksj)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR < (
leftarg = ksj,
rightarg = ksj,
procedure = ksj_lt,
RESTRICT = scalarltsel
);
-- より大きい
CREATE FUNCTION ksj_gt(ksj, ksj)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR > (
leftarg = ksj,
rightarg = ksj,
procedure = ksj_gt,
RESTRICT = scalargtsel
);
-- 以下
CREATE FUNCTION ksj_le(ksj, ksj)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR <= (
leftarg = ksj,
rightarg = ksj,
procedure = ksj_le,
RESTRICT = scalarltsel
);
-- 以上
CREATE FUNCTION ksj_ge(ksj, ksj)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR >= (
leftarg = ksj,
rightarg = ksj,
procedure = ksj_ge,
RESTRICT = scalargtsel
);
-- B-treeサポートルーチン
CREATE FUNCTION ksj_cmp(ksj, ksj)
RETURNS integer
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
-- ksj演算子クラス
CREATE OPERATOR CLASS ksj_ops
DEFAULT FOR TYPE ksj USING btree AS
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 ksj_cmp(ksj, ksj);
-- CAST関数とCAST定義
CREATE FUNCTION ksj_to_int32(ksj)
RETURNS integer
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE CAST (ksj AS integer) WITH FUNCTION ksj_to_int32(ksj);
CREATE FUNCTION int32_to_ksj(integer)
RETURNS ksj
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
CREATE CAST (integer AS ksj) WITH FUNCTION int32_to_ksj(integer);