@qt4cg statuses

This page displays recent status updates about the QT4CG project.

The are also captured in an RSS feed.

By year: 2026, 2025, 2024, 2023, 2022, 2021, 2020

QT4 CG meeting 186 draft agenda #agenda-10-27

25 Oct at 08:50:00 GMT

Draft agenda published.

Pull request #3013 created #created-3013

23 Oct at 10:59:31 GMT
PR #2985 rebased (by hand) on top of PR #3009

This resolves the merge conflicts between my reworking of the build scripts for Gradle 9.x and @ChristianGruen 's updates for serialization parameters.

Close #2985 Close #2984

Per the description in #2985, #2981 will have to be rebased. It’s not immediately clear to me how straightforward that will be

Pull request #3012 created #created-3012

23 Oct at 08:36:48 GMT
3011 Reinstate handling of NaN in order by clause

Fix #3011

Changes the handling of NaN in XQuery order by clauses to be sensitive to "empty greatest", as it was in 3.1.

Issue #3011 created #created-3011

22 Oct at 22:40:22 GMT
Effect of "empty greatest" on ordering of NaN

A number of new tests have been committed in test set EmptyOrderDecl demonstrating that XQuery 4.0 produces different sort results from 3.1 in the case of a sequence that includes NaN values. These changes are attributed to a change in the spec consequent on PR #2256.

When I wrote that PR, and when we reviewed it, I don't think we were conscious that we were introducing an incompatible change, and the change is not highlighted in the list of incompatibilities. I'm therefore raising the issue for discussion: do we actually want to make this incompatible change?

To be clear: Sorting the values (), NaN, 1, 4, 7

  • In 3.1 with empty least, the result is (), NaN, 1, 4, 7
  • In 3.1 with empty greatest, the result is 1, 4, 7, NaN, ()
  • In 4.0 with empty least, the result is (), NaN, 1, 4, 7
  • In 4.0 with empty greatest, the result is NaN, 1, 4, 7, ()

Now, I think the 3.1 rules are pretty bizarre (the rationale is probably that SQL has a similar capability if you equate () with SQL's null). I can't imagine that many people use "empty greatest", but if they do, I see no particular reason to impose an incompatible change on them. The bar for an incompatible change should be very high (the fact that we think the new rules are better is not a strong enough reason), and I don't think the justification here is strong enough.

Issue #2302 closed #closed-2302

22 Oct at 14:18:14 GMT

Bad links in EXPath binary spec

Issue #3008 closed #closed-3008

22 Oct at 14:18:12 GMT

2302b - Stylesheeet change, Fix bad EXPath error links

Pull request #3010 created #created-3010

22 Oct at 10:27:06 GMT

Add change metadata (PR numbers and dates)

Pull request #3009 created #created-3009

22 Oct at 09:09:32 GMT
Upgrade to Gradle 9.8.2

This should resolve some warnings and support modern versions of Java. This PR also switches from Groovy to Kotlin for the build scripts. A few plugins have been added and there’s been a small amount of reorganization to simplify the tasks. Using plugins required "unpacking" some multi-step tasks into several top level tasks. These new tasks have names that begin with "_" in an attempt to indicate that they’re "internal".

(I have no idea if this will build successfully as a PR. The PR certainly isn't going to test the new build scripts.)

I've tried to carefully check that the build produces the same output. It appears to:

Screenshot 2026-10-22 at 10 04 55
  • The index.html file in grammar-explorer is different because I added a meta charset element to it.
  • The top-level index file is different because I added a link to the grammar explorer.
  • The xslt-streaming.xml file present in the old build was an accident, I think.

(If you try to reproduce this comparison, set the Saxon version in gradle.properties to 12.9. I've updated to 12.10, but that changes all of the HTML files by a few bytes in the comment at the end.)

@Arithmeticus if you pull this branch you should be able to build with Java 25.

@michaelhkay and/or @ChristianGruen I'd appreciate it if you could smoke test this before we merge it and confirm that it "works for you".

Pull request #3008 created #created-3008

22 Oct at 08:43:56 GMT
2302b - Stylesheeet change, Fix bad EXPath error links

#Fix 2302

Issue #3007 closed #closed-3007

22 Oct at 08:39:11 GMT

2302 Stylesheet change to fix bad expath errorref links

Pull request #3007 created #created-3007

22 Oct at 08:38:18 GMT
2302 Stylesheet change to fix bad expath errorref links

Fix #2302

Issue #2787 closed #closed-2787

21 Oct at 13:26:42 GMT

Constructor functions for record types

Pull request #3006 created #created-3006

21 Oct at 12:08:17 GMT
2973 Clarify effect of minimal match

Adds notes to substring-(before|after)[-last] explaining the effect of the "minimal match" rule when the collation includes ignorable characters.

Fix #2973

Issue #3005 created #created-3005

21 Oct at 12:04:19 GMT
`fn:build-uri`: UNCs

The URI functions currently break the UNC round trip:

let $options := { 'unc-path': true() }
return 'file:////uncname/path' => parse-uri($options) => build-uri($options)

…returns file://////uncname/path.

A plain :// already gives the right URI, so maybe it suffices to drop the ://// rule?

Issue #3004 created #created-3004

21 Oct at 10:17:58 GMT
`fn:rename`: renaming nodes

With the just added fn:update function it is tedious to rename nodes: existing entries need to rebuilt. We could simplify with an fn:rename function, which could also be used standalone:

fn:rename(
  $node  as gnode(),
  $name  as xs:anyAtomicType
) as gnode()

Examples:

rename(<item id="1">A</item>, 'entry')
rename(<a b="1"/>/@b, QName('urn:x', 'x:b'))

(: XNodes today :)
update($doc, fn { //item }, fn($item) { element entry { $item/@*, $item/node() } })

(: XNodes with rename :)
update($doc, fn { //item }, rename(?, 'entry'))
update($doc, fn { //@class }, rename(?, 'role'))

(: JNodes today :)
update($json, fn { //customer-id }, fn { { 'customerId': jvalue() } })

(: JNodes with rename :)
update($json, fn { //customer-id }, rename(?, 'customerId'))

Issue #3003 closed #closed-3003

21 Oct at 10:14:35 GMT

Fixed paths for generating tests from specs

Pull request #3003 created #created-3003

21 Oct at 10:14:24 GMT
Fixed paths for generating tests from specs

Moving the EXPath specs broke generating tests. It's not at all clear to me how or why but this seems to fix it.

Pull request #3002 created #created-3002

21 Oct at 09:58:22 GMT
2994 File Module: editorial, minor revisions

Some more minor changes (some of them made explicit):

  • file:resolve-path: normalizes all paths (native separators, ./.. removed) and keeps a trailing separator. $base counts as a directory only if it ends with a separator.
  • file:write-binary: $offset now defaults to (). Without it, the file is replaced; with an explicit 0, bytes are overwritten in place.
  • file:base-dir: returns the base URI itself if it points to a directory.
  • file:copy/file:move: missing parent directories are created, and copying or moving into the source's own directory does nothing.
  • Renamed parameters: file:write-text-lines($values) is now $lines; file:children/file:descendants $path is now $dir.

…and editorial trivia.

Issue #2473 closed #closed-2473

21 Oct at 09:05:16 GMT

Rearrange the EXPath specifications

Issue #3001 closed #closed-3001

21 Oct at 09:05:15 GMT

Refactor specs out of EXPath/

Pull request #3001 created #created-3001

21 Oct at 08:30:44 GMT
Refactor specs out of EXPath/

Fix #2473

I'm pretty sure they still build correctly. It's possible some links will need fixing on qt4cg.org; I'll look at those in a few minutes. I'm also working on a more substantial update to the Gradle build scripts to account for modern versions of Java. That should be coming today as well, so I'm going to wait until after that to look at tidying qt4cg.org.

(This is a "build-only" PR so I'm just going to merge it optimistically.)

Pull request #3000 created #created-3000

20 Oct at 23:21:11 GMT
2982 Updated Unicode references for case folding

Fix #2982

Issue #2999 created #created-2999

20 Oct at 21:49:07 GMT
Update: $replacement argument

As I commented during the review of fn:update, I feel the rules for fn:update handling of the $replacement argument are rather complex and not very intuitive. I propose to experiment with an alternative in which $replacement is always a function that returns a record consisting of an action such as "delete", "replace", "rename" etc, and a value whose interpretation depends on the action.

Pull request #2998 created #created-2998

20 Oct at 18:24:58 GMT

2991 Rules for Untrusted Functions

QT4 CG meeting 185 draft minutes #minutes-10-20

20 Oct at 16:30:00 GMT

Draft minutes published.

Issue #2993 closed #closed-2993

20 Oct at 16:35:34 GMT

2991 Rules for Untrusted Functions (part 1)

Issue #2849 closed #closed-2849

20 Oct at 16:20:49 GMT

xs:integer vs. restricted subtypes

Issue #2885 closed #closed-2885

20 Oct at 16:20:47 GMT

2849 xs:integer vs. restricted subtypes

Issue #77 closed #closed-77

20 Oct at 16:17:21 GMT

Allow manipulation of maps and arrays

Issue #2873 closed #closed-2873

20 Oct at 16:17:20 GMT

`fn:update`: another attempt

See 6230 more statuses in yearly archives.