Skip to content

Commit b812fe7

Browse files
committed
SQL: Fix metadata handling in to_semver_no_prerelease() function
1 parent 5dbf567 commit b812fe7

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
create or replace function to_semver_no_prerelease(text) returns semver_triple
2+
immutable
3+
language sql
4+
as
5+
$$
6+
SELECT (
7+
split_part($1, '.', 1)::numeric,
8+
split_part($1, '.', 2)::numeric,
9+
split_part(split_part($1, '+', 1), '.', 3)::numeric
10+
)::semver_triple
11+
WHERE strpos($1, '-') = 0
12+
$$;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
create or replace function to_semver_no_prerelease(text) returns semver_triple
2+
immutable
3+
language sql
4+
as
5+
$$
6+
SELECT (
7+
-- 2) then, we extract the major, minor and patch numbers
8+
-- (dropping the prerelease part to avoid number conversion errors)
9+
split_part(version_without_metadata, '.', 1)::numeric,
10+
split_part(version_without_metadata, '.', 2)::numeric,
11+
split_part(split_part(version_without_metadata, '-', 1), '.', 3)::numeric
12+
)::semver_triple
13+
FROM (
14+
-- 1) first, we split off the release metadata, if it exists
15+
SELECT split_part($1, '+', 1) as version_without_metadata
16+
) as vwm
17+
-- 3) finally, we only return the result if there is no prerelease part
18+
WHERE strpos(version_without_metadata, '-') = 0
19+
$$;

src/tests/sql/custom_functions.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,7 @@ fn to_semver_no_prerelease_works() {
3232
test(&conn, "1.2.4", Some((1, 2, 4)));
3333
test(&conn, "1.2.4+metadata", Some((1, 2, 4)));
3434
test(&conn, "1.2.4-beta.3", None);
35+
36+
// see https://github.com/rust-lang/crates.io/issues/3882
37+
test(&conn, "0.4.45+curl-7.78.0", Some((0, 4, 45)));
3538
}

0 commit comments

Comments
 (0)