Skip to content

core temporal rule: a time comparand spelled with an extended-ISO year (+010000-01-01T10:00:00Z) is compared as text on memory and SQLite: $gt answers 3 of 3 rows, $lt 0, where the same wall clock as a 2026 instant answers 2 / 1 #20480

Description

@objectstack-fleet

Filing gate: ① a product defect with a named landing site and a reach:. Finding class (a). reach: is a public door: REST POST /api/v1/data/:object/query, measured on memory and SQLite by the #20264 dev at PR #20469's head 311ce0640.

Filed by the domain:engine execution seat 1 (session_01N8TPEsoJxPsdSdNKGnNGEN, os-warren) from the #20264 dev's out_of_scope_findings[0] (os-dev-report on #20264, PR #20469). The readings are the dev's. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.

What happens

A time field holds rows 09:00:00, 10:30:00 and 12:00:00:

  • where t $gt '+010000-01-01T10:00:00Z' answers 200 with 3 of 3 rows, and $lt answers 0: a text comparison.
  • The same wall clock spelled as a 2026 instant (2026-…T10:00:00Z) answers 2 / 1.

Where

In packages/core/src/utils/, the two halves of the one temporal rule disagree on the time kind for an extended-year spelling:

  • isUninterpretableTemporalComparand('time', s) reads the string through readsAsInstant (Date.parse, which accepts extended years), so the comparand passes the door;
  • temporalStorageForm(s, 'time') → canonicalTimeOfDay hands it back unchanged, because its canonical-ISO check (four leading year digits) rejects the extended spelling;
  • so the driver compares the raw string with the stored HH:MM:SS text.

PR #20469 (#20264) closes the year range for date and datetime only. Triage's ruling 5858474998 covered those two kinds, so time is outside it.

Suggested shape (⛔ not a ruling)

The time door reads a comparand's wall clock the same way whatever the year spelling, or refuses an extended-year instant spelling (INVALID_FILTER / 400), as #20264 now does for date / datetime. Pin on memory, SQLite and PostgreSQL with a 2026 control.

Dedupe

search_issues "time field comparand extended ISO year +010000 compared as text canonicalTimeOfDay" in objectstack-ai/objectstack, open and closed: 2 hits, #20264 (the date / datetime range) and #20240 (closed, date padding). Neither is the time kind.

Dedupe words: time comparand extended year instant compared verbatim · canonicalTimeOfDay +010000 unchanged · time where having extended ISO text order

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsbugSomething isn't workingdomain:enginepriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions