Skip to content

Commit 75600c5

Browse files
committed
ref: add new utility functions, improve errors, sql scripts
1 parent 1095edb commit 75600c5

File tree

6 files changed

+1166
-50
lines changed

6 files changed

+1166
-50
lines changed

sql/typeid--0.1.0--0.2.0.sql

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
/*─────────────────────────────────────────────────────────────────────────────
2+
typeid 0.1.0 → 0.2.0 upgrade
3+
* preserves camel-case TypeID identifier *
4+
─────────────────────────────────────────────────────────────────────────────*/
5+
BEGIN;
6+
7+
-- 1 ── binary protocol -------------------------------------------------------
8+
CREATE FUNCTION typeid_recv(internal)
9+
RETURNS TypeID
10+
IMMUTABLE STRICT PARALLEL SAFE
11+
LANGUAGE c
12+
AS 'MODULE_PATHNAME', 'typeid_recv_wrapper';
13+
14+
CREATE FUNCTION typeid_send(TypeID)
15+
RETURNS bytea
16+
IMMUTABLE STRICT PARALLEL SAFE
17+
LANGUAGE c
18+
AS 'MODULE_PATHNAME', 'typeid_send_wrapper';
19+
20+
ALTER TYPE TypeID
21+
SET (RECEIVE = typeid_recv, SEND = typeid_send);
22+
23+
-- 2 ── helper: prefix as text ------------------------------------------------
24+
CREATE FUNCTION typeid_prefix("typeid" TypeID)
25+
RETURNS text
26+
IMMUTABLE STRICT PARALLEL SAFE
27+
LANGUAGE c
28+
AS 'MODULE_PATHNAME', 'typeid_prefix_wrapper';
29+
30+
-- 3 ── implicit cast text → TypeID -----------------------------------------
31+
CREATE CAST (text AS TypeID)
32+
WITH INOUT
33+
AS IMPLICIT;
34+
35+
-- 4 ── parallel-safe aggregates ---------------------------------------------
36+
CREATE FUNCTION type_id_min_type_id_min_combine(this TypeID, v TypeID)
37+
RETURNS TypeID
38+
LANGUAGE c
39+
AS 'MODULE_PATHNAME', 'type_id_min_type_id_min_combine_wrapper';
40+
41+
CREATE FUNCTION type_id_max_type_id_max_combine(this TypeID, v TypeID)
42+
RETURNS TypeID
43+
LANGUAGE c
44+
AS 'MODULE_PATHNAME', 'type_id_max_type_id_max_combine_wrapper';
45+
46+
DROP AGGREGATE IF EXISTS min(TypeID);
47+
CREATE AGGREGATE min (TypeID)
48+
(
49+
SFUNC = type_id_min_type_id_min_state,
50+
STYPE = TypeID,
51+
COMBINEFUNC = type_id_min_type_id_min_combine,
52+
PARALLEL = SAFE
53+
);
54+
55+
DROP AGGREGATE IF EXISTS max(TypeID);
56+
CREATE AGGREGATE max (TypeID)
57+
(
58+
SFUNC = type_id_max_type_id_max_state,
59+
STYPE = TypeID,
60+
COMBINEFUNC = type_id_max_type_id_max_combine,
61+
PARALLEL = SAFE
62+
);
63+
64+
-- 5 ── mark helpers IMMUTABLE & PARALLEL SAFE --------------------------------
65+
ALTER FUNCTION typeid_cmp(TypeID,TypeID) IMMUTABLE PARALLEL SAFE;
66+
ALTER FUNCTION typeid_lt(TypeID,TypeID) IMMUTABLE PARALLEL SAFE;
67+
ALTER FUNCTION typeid_le(TypeID,TypeID) IMMUTABLE PARALLEL SAFE;
68+
ALTER FUNCTION typeid_eq(TypeID,TypeID) IMMUTABLE PARALLEL SAFE;
69+
ALTER FUNCTION typeid_ge(TypeID,TypeID) IMMUTABLE PARALLEL SAFE;
70+
ALTER FUNCTION typeid_gt(TypeID,TypeID) IMMUTABLE PARALLEL SAFE;
71+
ALTER FUNCTION typeid_ne(TypeID,TypeID) IMMUTABLE PARALLEL SAFE;
72+
ALTER FUNCTION typeid_hash(TypeID) IMMUTABLE PARALLEL SAFE;
73+
ALTER FUNCTION typeid_hash_extended(TypeID,bigint) IMMUTABLE PARALLEL SAFE;
74+
ALTER FUNCTION uuid_to_typeid(text,uuid) IMMUTABLE PARALLEL SAFE;
75+
ALTER FUNCTION typeid_to_uuid(TypeID) IMMUTABLE PARALLEL SAFE;
76+
77+
-- 6 ── NEW v0.2.0 utility functions ------------------------------------------
78+
79+
-- Generate TypeID with empty prefix (UUID-only format)
80+
CREATE FUNCTION typeid_generate_nil()
81+
RETURNS TypeID
82+
STRICT VOLATILE PARALLEL SAFE
83+
LANGUAGE c
84+
AS 'MODULE_PATHNAME', 'typeid_generate_nil_wrapper';
85+
86+
-- Validate TypeID format without parsing
87+
CREATE FUNCTION typeid_is_valid("input" TEXT)
88+
RETURNS bool
89+
IMMUTABLE STRICT PARALLEL SAFE
90+
LANGUAGE c
91+
AS 'MODULE_PATHNAME', 'typeid_is_valid_wrapper';
92+
93+
-- Check if TypeID has a specific prefix
94+
CREATE FUNCTION typeid_has_prefix("typeid" TypeID, "prefix" TEXT)
95+
RETURNS bool
96+
IMMUTABLE STRICT PARALLEL SAFE
97+
LANGUAGE c
98+
AS 'MODULE_PATHNAME', 'typeid_has_prefix_wrapper';
99+
100+
-- Check if TypeID has empty prefix
101+
CREATE FUNCTION typeid_is_nil_prefix("typeid" TypeID)
102+
RETURNS bool
103+
IMMUTABLE STRICT PARALLEL SAFE
104+
LANGUAGE c
105+
AS 'MODULE_PATHNAME', 'typeid_is_nil_prefix_wrapper';
106+
107+
108+
109+
-- Generate multiple TypeIDs efficiently
110+
CREATE FUNCTION typeid_generate_batch("prefix" TEXT, "count" INT)
111+
RETURNS TypeID[]
112+
STRICT VOLATILE PARALLEL SAFE
113+
LANGUAGE c
114+
AS 'MODULE_PATHNAME', 'typeid_generate_batch_wrapper';
115+
116+
-- 7 ── NEW v0.2.0 operators and documentation --------------------------------
117+
118+
-- Create prefix matching operator (follows PostgreSQL "contains" semantics)
119+
CREATE OPERATOR @> (
120+
LEFTARG = typeid,
121+
RIGHTARG = text,
122+
PROCEDURE = typeid_has_prefix,
123+
COMMUTATOR = '@<'
124+
);
125+
126+
-- Add function documentation
127+
COMMENT ON FUNCTION typeid_prefix(typeid) IS 'Extract the prefix from a TypeID for indexing and filtering';
128+
COMMENT ON FUNCTION typeid_has_prefix(typeid, text) IS 'Check if TypeID has a specific prefix - useful for filtering';
129+
COMMENT ON FUNCTION typeid_is_valid(text) IS 'Validate TypeID format without parsing - useful for constraints';
130+
COMMENT ON FUNCTION typeid_generate_nil() IS 'Generate TypeID with empty prefix (UUID-only format)';
131+
COMMENT ON FUNCTION typeid_generate_batch(text, int) IS 'Generate multiple TypeIDs with the same prefix efficiently';
132+
133+
COMMIT;

sql/typeid--0.1.0.sql

Lines changed: 257 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,257 @@
1+
/*
2+
This file is auto generated by pgrx.
3+
4+
The ordering of items is not stable, it is driven by a dependency graph.
5+
*/
6+
7+
-- src/lib.rs:147
8+
-- typeid::typeid_uuid_generate_v7
9+
CREATE FUNCTION "typeid_uuid_generate_v7"() RETURNS uuid /* pgrx::datum::uuid::Uuid */
10+
STRICT
11+
LANGUAGE c /* Rust */
12+
AS 'MODULE_PATHNAME', 'typeid_uuid_generate_v7_wrapper';
13+
14+
-- src/typeid.rs:76
15+
-- typeid::typeid::TypeID
16+
CREATE TYPE TypeID;
17+
18+
-- src/typeid.rs:76
19+
-- typeid::typeid::typeid_in
20+
CREATE FUNCTION "typeid_in"(
21+
"input" cstring /* core::option::Option<&core::ffi::c_str::CStr> */
22+
) RETURNS TypeID /* core::option::Option<typeid::typeid::TypeID> */
23+
IMMUTABLE PARALLEL SAFE
24+
LANGUAGE c /* Rust */
25+
AS 'MODULE_PATHNAME', 'typeid_in_wrapper';
26+
27+
-- src/typeid.rs:76
28+
-- typeid::typeid::typeid_out
29+
CREATE FUNCTION "typeid_out"(
30+
"input" TypeID /* typeid::typeid::TypeID */
31+
) RETURNS cstring /* &core::ffi::c_str::CStr */
32+
IMMUTABLE STRICT PARALLEL SAFE
33+
LANGUAGE c /* Rust */
34+
AS 'MODULE_PATHNAME', 'typeid_out_wrapper';
35+
36+
-- src/typeid.rs:76
37+
-- typeid::typeid::TypeID
38+
CREATE TYPE TypeID (
39+
INTERNALLENGTH = variable,
40+
INPUT = typeid_in, /* typeid::typeid::typeid_in */
41+
OUTPUT = typeid_out, /* typeid::typeid::typeid_out */
42+
STORAGE = extended
43+
);
44+
45+
-- src/lib.rs:27
46+
-- typeid::uuid_to_typeid
47+
CREATE FUNCTION "uuid_to_typeid"(
48+
"prefix" TEXT, /* &str */
49+
"uuid" uuid /* pgrx::datum::uuid::Uuid */
50+
) RETURNS TypeID /* typeid::typeid::TypeID */
51+
STRICT
52+
LANGUAGE c /* Rust */
53+
AS 'MODULE_PATHNAME', 'uuid_to_typeid_wrapper';
54+
55+
-- src/lib.rs:45
56+
-- typeid::typeid_le
57+
CREATE FUNCTION "typeid_le"(
58+
"a" TypeID, /* typeid::typeid::TypeID */
59+
"b" TypeID /* typeid::typeid::TypeID */
60+
) RETURNS bool /* bool */
61+
STRICT
62+
LANGUAGE c /* Rust */
63+
AS 'MODULE_PATHNAME', 'typeid_le_wrapper';
64+
65+
-- src/lib.rs:60
66+
-- typeid::typeid_gt
67+
CREATE FUNCTION "typeid_gt"(
68+
"a" TypeID, /* typeid::typeid::TypeID */
69+
"b" TypeID /* typeid::typeid::TypeID */
70+
) RETURNS bool /* bool */
71+
STRICT
72+
LANGUAGE c /* Rust */
73+
AS 'MODULE_PATHNAME', 'typeid_gt_wrapper';
74+
75+
-- src/lib.rs:17
76+
-- typeid::typeid_generate
77+
CREATE FUNCTION "typeid_generate"(
78+
"prefix" TEXT /* &str */
79+
) RETURNS TypeID /* typeid::typeid::TypeID */
80+
STRICT
81+
LANGUAGE c /* Rust */
82+
AS 'MODULE_PATHNAME', 'typeid_generate_wrapper';
83+
84+
-- src/lib.rs:40
85+
-- typeid::typeid_lt
86+
CREATE FUNCTION "typeid_lt"(
87+
"a" TypeID, /* typeid::typeid::TypeID */
88+
"b" TypeID /* typeid::typeid::TypeID */
89+
) RETURNS bool /* bool */
90+
STRICT
91+
LANGUAGE c /* Rust */
92+
AS 'MODULE_PATHNAME', 'typeid_lt_wrapper';
93+
94+
-- src/lib.rs:55
95+
-- typeid::typeid_ge
96+
CREATE FUNCTION "typeid_ge"(
97+
"a" TypeID, /* typeid::typeid::TypeID */
98+
"b" TypeID /* typeid::typeid::TypeID */
99+
) RETURNS bool /* bool */
100+
STRICT
101+
LANGUAGE c /* Rust */
102+
AS 'MODULE_PATHNAME', 'typeid_ge_wrapper';
103+
104+
-- src/aggregate.rs:26
105+
-- typeid::aggregate::type_id_max_state
106+
CREATE FUNCTION "type_id_max_state"(
107+
"this" TypeID, /* core::option::Option<typeid::typeid::TypeID> */
108+
"arg_one" TypeID /* typeid::typeid::TypeID */
109+
) RETURNS TypeID /* core::option::Option<typeid::typeid::TypeID> */
110+
LANGUAGE c /* Rust */
111+
AS 'MODULE_PATHNAME', 'type_id_max_state_wrapper';
112+
113+
-- src/aggregate.rs:26
114+
-- typeid::aggregate::TypeIDMax
115+
CREATE AGGREGATE max (
116+
TypeID /* typeid::typeid::TypeID */
117+
)
118+
(
119+
SFUNC = "type_id_max_state", /* typeid::aggregate::TypeIDMax::state */
120+
STYPE = TypeID /* core::option::Option<typeid::typeid::TypeID> */
121+
);
122+
123+
-- src/lib.rs:70
124+
-- typeid::typeid_hash
125+
CREATE FUNCTION "typeid_hash"(
126+
"typeid" TypeID /* typeid::typeid::TypeID */
127+
) RETURNS INT /* i32 */
128+
STRICT
129+
LANGUAGE c /* Rust */
130+
AS 'MODULE_PATHNAME', 'typeid_hash_wrapper';
131+
132+
-- src/lib.rs:22
133+
-- typeid::typeid_to_uuid
134+
CREATE FUNCTION "typeid_to_uuid"(
135+
"typeid" TypeID /* typeid::typeid::TypeID */
136+
) RETURNS uuid /* pgrx::datum::uuid::Uuid */
137+
STRICT
138+
LANGUAGE c /* Rust */
139+
AS 'MODULE_PATHNAME', 'typeid_to_uuid_wrapper';
140+
141+
-- src/aggregate.rs:8
142+
-- typeid::aggregate::type_id_min_state
143+
CREATE FUNCTION "type_id_min_state"(
144+
"this" TypeID, /* core::option::Option<typeid::typeid::TypeID> */
145+
"arg_one" TypeID /* typeid::typeid::TypeID */
146+
) RETURNS TypeID /* core::option::Option<typeid::typeid::TypeID> */
147+
LANGUAGE c /* Rust */
148+
AS 'MODULE_PATHNAME', 'type_id_min_state_wrapper';
149+
150+
-- src/aggregate.rs:8
151+
-- typeid::aggregate::TypeIDMin
152+
CREATE AGGREGATE min (
153+
TypeID /* typeid::typeid::TypeID */
154+
)
155+
(
156+
SFUNC = "type_id_min_state", /* typeid::aggregate::TypeIDMin::state */
157+
STYPE = TypeID /* core::option::Option<typeid::typeid::TypeID> */
158+
);
159+
160+
-- src/lib.rs:65
161+
-- typeid::typeid_ne
162+
CREATE FUNCTION "typeid_ne"(
163+
"a" TypeID, /* typeid::typeid::TypeID */
164+
"b" TypeID /* typeid::typeid::TypeID */
165+
) RETURNS bool /* bool */
166+
STRICT
167+
LANGUAGE c /* Rust */
168+
AS 'MODULE_PATHNAME', 'typeid_ne_wrapper';
169+
170+
-- src/lib.rs:77
171+
-- typeid::typeid_hash_extended
172+
CREATE FUNCTION "typeid_hash_extended"(
173+
"typeid" TypeID, /* typeid::typeid::TypeID */
174+
"seed" bigint /* i64 */
175+
) RETURNS bigint /* i64 */
176+
STRICT
177+
LANGUAGE c /* Rust */
178+
AS 'MODULE_PATHNAME', 'typeid_hash_extended_wrapper';
179+
180+
-- src/lib.rs:35
181+
-- typeid::typeid_cmp
182+
CREATE FUNCTION "typeid_cmp"(
183+
"a" TypeID, /* typeid::typeid::TypeID */
184+
"b" TypeID /* typeid::typeid::TypeID */
185+
) RETURNS INT /* i32 */
186+
STRICT
187+
LANGUAGE c /* Rust */
188+
AS 'MODULE_PATHNAME', 'typeid_cmp_wrapper';
189+
190+
-- src/lib.rs:50
191+
-- typeid::typeid_eq
192+
CREATE FUNCTION "typeid_eq"(
193+
"a" TypeID, /* typeid::typeid::TypeID */
194+
"b" TypeID /* typeid::typeid::TypeID */
195+
) RETURNS bool /* bool */
196+
STRICT
197+
LANGUAGE c /* Rust */
198+
AS 'MODULE_PATHNAME', 'typeid_eq_wrapper';
199+
200+
-- src/lib.rs:84
201+
-- finalize
202+
203+
CREATE OPERATOR < (
204+
LEFTARG = typeid,
205+
RIGHTARG = typeid,
206+
PROCEDURE = typeid_lt
207+
);
208+
209+
CREATE OPERATOR <= (
210+
LEFTARG = typeid,
211+
RIGHTARG = typeid,
212+
PROCEDURE = typeid_le
213+
);
214+
215+
CREATE OPERATOR = (
216+
LEFTARG = typeid,
217+
RIGHTARG = typeid,
218+
PROCEDURE = typeid_eq,
219+
COMMUTATOR = '=',
220+
NEGATOR = '<>',
221+
HASHES,
222+
MERGES
223+
);
224+
225+
CREATE OPERATOR >= (
226+
LEFTARG = typeid,
227+
RIGHTARG = typeid,
228+
PROCEDURE = typeid_ge
229+
);
230+
231+
CREATE OPERATOR > (
232+
LEFTARG = typeid,
233+
RIGHTARG = typeid,
234+
PROCEDURE = typeid_gt
235+
);
236+
237+
CREATE OPERATOR <> (
238+
LEFTARG = typeid,
239+
RIGHTARG = typeid,
240+
PROCEDURE = typeid_ne
241+
);
242+
243+
CREATE OPERATOR CLASS typeid_ops DEFAULT FOR TYPE typeid USING btree AS
244+
OPERATOR 1 < (typeid, typeid),
245+
OPERATOR 2 <= (typeid, typeid),
246+
OPERATOR 3 = (typeid, typeid),
247+
OPERATOR 4 >= (typeid, typeid),
248+
OPERATOR 5 > (typeid, typeid),
249+
FUNCTION 1 typeid_cmp(typeid, typeid);
250+
251+
CREATE OPERATOR FAMILY typeid_hash_ops USING hash;
252+
253+
CREATE OPERATOR CLASS typeid_hash_ops DEFAULT FOR TYPE typeid USING hash AS
254+
OPERATOR 1 = (typeid, typeid),
255+
FUNCTION 1 typeid_hash(typeid),
256+
FUNCTION 2 typeid_hash_extended(typeid, bigint);
257+

0 commit comments

Comments
 (0)