-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sql
More file actions
164 lines (144 loc) · 4.7 KB
/
Copy pathinstall.sql
File metadata and controls
164 lines (144 loc) · 4.7 KB
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
-- PostgreSQL Software Version Extension
-- Installation Script
--
-- This script creates a custom software_version domain type with
-- comparison operators that properly handle semantic versioning.
--
-- Prerequisites:
-- 1. PostgreSQL with plpython3u extension enabled
-- 2. Python with packaging library
-- 3. Superuser privileges
-- Enable required extensions
CREATE EXTENSION IF NOT EXISTS plpython3u;
-- Create the software_version domain
CREATE DOMAIN software_version AS varchar(255);
-- Create comparison functions
CREATE OR REPLACE FUNCTION software_version_lt(v1 software_version, v2 software_version)
RETURNS bool
AS $$
from packaging import version
return version.parse(v1) < version.parse(v2)
$$ LANGUAGE plpython3u IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION software_version_lte(v1 software_version, v2 software_version)
RETURNS bool
AS $$
from packaging import version
return version.parse(v1) <= version.parse(v2)
$$ LANGUAGE plpython3u IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION software_version_eq(v1 software_version, v2 software_version)
RETURNS bool
AS $$
from packaging import version
return version.parse(v1) == version.parse(v2)
$$ LANGUAGE plpython3u IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION software_version_gte(v1 software_version, v2 software_version)
RETURNS bool
AS $$
from packaging import version
return version.parse(v1) >= version.parse(v2)
$$ LANGUAGE plpython3u IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION software_version_gt(v1 software_version, v2 software_version)
RETURNS bool
AS $$
from packaging import version
return version.parse(v1) > version.parse(v2)
$$ LANGUAGE plpython3u IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION software_version_neq(v1 software_version, v2 software_version)
RETURNS bool
AS $$
from packaging import version
return version.parse(v1) != version.parse(v2)
$$ LANGUAGE plpython3u IMMUTABLE STRICT;
-- Create comparison function for B-tree operations
CREATE OR REPLACE FUNCTION software_version_cmp(version_1 software_version, version_2 software_version)
RETURNS integer AS $$
from packaging import version
v1 = version.parse(version_1)
v2 = version.parse(version_2)
if v1 > v2:
return 1
if v2 > v1:
return -1
return 0
$$ LANGUAGE plpython3u IMMUTABLE STRICT;
-- Create operators
CREATE OPERATOR < (
leftarg = software_version,
rightarg = software_version,
function = software_version_lt,
commutator = >,
negator = >=,
restrict = scalargtsel,
join = scalargtjoinsel
);
CREATE OPERATOR <= (
leftarg = software_version,
rightarg = software_version,
function = software_version_lte,
commutator = >=,
negator = >,
restrict = scalargtsel,
join = scalargtjoinsel
);
CREATE OPERATOR = (
leftarg = software_version,
rightarg = software_version,
function = software_version_eq,
commutator = =,
negator = !=,
restrict = scalargtsel,
join = scalargtjoinsel
);
CREATE OPERATOR >= (
leftarg = software_version,
rightarg = software_version,
function = software_version_gte,
commutator = <=,
negator = <,
restrict = scalargtsel,
join = scalargtjoinsel
);
CREATE OPERATOR > (
leftarg = software_version,
rightarg = software_version,
function = software_version_gt,
commutator = <,
negator = <=,
restrict = scalargtsel,
join = scalargtjoinsel
);
CREATE OPERATOR != (
leftarg = software_version,
rightarg = software_version,
function = software_version_neq,
commutator = !=,
negator = =,
restrict = neqsel,
join = neqjoinsel
);
-- Create B-tree operator class
CREATE OPERATOR CLASS software_version_ops
DEFAULT FOR TYPE software_version USING btree AS
OPERATOR 1 <,
OPERATOR 2 <=,
OPERATOR 3 =,
OPERATOR 4 >=,
OPERATOR 5 >,
FUNCTION 1 software_version_cmp(software_version, software_version);
-- Create convenience function for explicit parsing
CREATE OR REPLACE FUNCTION software_version_parse(version_str text)
RETURNS software_version AS $$
from packaging import version
# Validate the version string
parsed = version.parse(version_str)
return str(parsed)
$$ LANGUAGE plpython3u IMMUTABLE STRICT;
-- Grant permissions (adjust as needed)
GRANT USAGE ON DOMAIN software_version TO PUBLIC;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO PUBLIC;
-- Create a comment on the domain
COMMENT ON DOMAIN software_version IS 'A domain for software version strings with semantic versioning comparison support';
DO $$
BEGIN
RAISE NOTICE 'Software Version Extension installed successfully!';
END $$;