From 73ed00ed32e798f5cab18f1ef551288d5f85f0c1 Mon Sep 17 00:00:00 2001 From: Joe Wicentowski Date: Fri, 20 Feb 2026 11:27:51 -0500 Subject: [PATCH 1/2] [bugfix] Fix semver:eq/3 ignoring \$coerce parameter semver:eq/3 was calling semver:compare/2 instead of semver:compare/3, causing the \$coerce argument to be silently ignored. Also make semver:eq/2 delegate to semver:eq/3 (with false()) for consistency with all other arity-2 comparison functions. Co-Authored-By: Claude Sonnet 4.6 --- src/main/xquery/semver.xqm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/xquery/semver.xqm b/src/main/xquery/semver.xqm index acdc658..7744ccc 100644 --- a/src/main/xquery/semver.xqm +++ b/src/main/xquery/semver.xqm @@ -565,7 +565,7 @@ declare function semver:ge-parsed($parsed-v1 as map(*), $parsed-v2 as map(*)) as : @return true if v1 is equal to v2 :) declare function semver:eq($v1 as xs:string, $v2 as xs:string) as xs:boolean { - semver:compare($v1, $v2) eq 0 + semver:eq($v1, $v2, false()) }; (:~ Test if v1 is equal to v2 (with an option to coerce invalid SemVer strings) @@ -575,7 +575,7 @@ declare function semver:eq($v1 as xs:string, $v2 as xs:string) as xs:boolean { : @return true if v1 is equal to v2 :) declare function semver:eq($v1 as xs:string, $v2 as xs:string, $coerce as xs:boolean) as xs:boolean { - semver:compare($v1, $v2) eq 0 + semver:compare($v1, $v2, $coerce) eq 0 }; (:~ Test if a parsed v1 is equal to a parsed v2 From cc0ae8a1fa495cc3b3b576f30065402a57c2a4a9 Mon Sep 17 00:00:00 2001 From: Joe Wicentowski Date: Fri, 20 Feb 2026 11:30:02 -0500 Subject: [PATCH 2/2] [bugfix] Add regression tests for semver:eq/3 coerce bug Test that semver:eq/3 correctly uses $coerce when comparing non-SemVer strings, covering both the equal and not-equal cases. Co-Authored-By: Claude Sonnet 4.6 --- src/test/xquery/compare.xqm | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/test/xquery/compare.xqm b/src/test/xquery/compare.xqm index 5f364ce..c3f6e5a 100644 --- a/src/test/xquery/compare.xqm +++ b/src/test/xquery/compare.xqm @@ -217,3 +217,18 @@ function stc:compare-lt-parsed() { map{"major":2,"minor":0,"patch":0,"pre-release":[],"build-metadata":[],"identifiers":[2,0,0,[],[]]} ) }; + +(: Regression tests for bug where semver:eq/3 ignored $coerce and called + semver:compare/2 instead of semver:compare/3 :) + +declare + %test:assertTrue +function stc:eq-coerce-non-semver() { + semver:eq("1.0", "1.0.0", true()) +}; + +declare + %test:assertFalse +function stc:eq-coerce-non-semver-not-equal() { + semver:eq("1.0", "2.0.0", true()) +};