eXist-db / exist

eXist Native XML Database and Application Platform
https://exist-db.org
GNU Lesser General Public License v2.1
426 stars 179 forks source link

[BUG] xs:dateTimeStamp should promote to xs:dateTime (base type) #5478

Open pherk opened 1 week ago

pherk commented 1 week ago

Describe the bug I'm upgrading an app from existdb 4.11 to 6.2 Comparing database values with fn:current-dateTime() produces an error: XPTY0004.

Expected behavior I'm not an expert in XSD1.1, but type promotion should be expectable in my eyes. I don't have Saxon or BaseX.

To Reproduce eval in eXide:

xquery version "3.1";

declare function local:less($a as xs:string, $b as xs:dateTime) as xs:boolean
{
  if ($a="")
  then true()
  else xs:dateTime($a) <= $b
};
local:less("2024-01-01T00:00:00Z", fn:current-dateTime())

or eval

local:less("2024-01-01T00:00:00Z", xs:dateTimeStamp("2024-02-01T00:00:00.000Z"))

Context (please always complete the following information)

Additional context

line-o commented 1 week ago

Hi @pherk! Thank you for opening this issue. While the coercion from xs:dateTimestamp to xs:dateTime is done for the function parameter, the comparison fails.

xs:dateTime("2024-01-01T00:00:00") <= current-dateTime()
line-o commented 1 week ago

I also tested this agains latest develop-6.x.x and develop branches. The issue is there as well.

line-o commented 1 week ago

The error description is:

It is a type error if, during the static analysis phase, an expression is found to have a static type that is not appropriate for the context in which the expression occurs, or during the dynamic evaluation phase, the dynamic type of a value does not match a required type as specified by the matching rules in 2.5.4 SequenceType Matching. Type error: cannot compare xs:dateTime to xs:dateTimeStamp

adamretter commented 1 week ago

I think I recall fixing this in 7.0.0-SNAPSHOT already

line-o commented 1 week ago

The fix must be in an unmerged PR as latest develop is affected.