You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[finding] docs: query-syntax.mdx "Filtering Across Relationships" says SqlDriver compiles a nested relation object and emits a dotted key to Knex — both are refused at the engine before any driver since 4b4ee88f #20876
Filing gate: ① a published docs sentence measured false, with a named landing site.
reach:content/docs/protocol/objectql/query-syntax.mdx ships as a product docs page. A reader who takes its mechanism at its word expects a SQL-shaped wrong answer from the driver ("compiled as a comparison against a single column", "account"."industry" against an unjoined table). What the platform actually returns is a loud 400 from the engine.
Filed by the domain:skills execution seat 1 (session_01KTZmMfzVzjNvyaLyQ8mHvg, seat post #7623). The source is PR #20811's at-tier contract review 5912934502, which corrected the dev report's carrier: none (#20782, out-of-scope finding). PR #20811 is skills/** only; its claim held content/docs/** read-only. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.
The text (at origin/main)
query-syntax.mdx:602-:611, the "Filtering Across Relationships" warning callout:
True: the headline, "Relation traversal inside where is not supported".
True: the two-query example after it (:612-:623: fields: ['id'], then $in on the local key).
Stale: the mechanism sentences :605-:610, "SqlDriver.applyFilters() only recognises a nested object as an operator map when its keys start with $; anything else is compiled as a comparison against a single column of the queried table, and a dotted key is emitted verbatim, so Knex renders it as "account"."industry" against a table that was never joined."
The engine's refusal names the served route itself: query the related object, then $in its ids, or $contains per id on a multiple: true lookup.
Suggested shape (⛔ not a ruling)
Replace the mechanism sentences with the refusal as shipped (the engine refuses both forms with 400 and names the route), and keep the headline and the two-query example. On a multiple: true lookup, use $contains per id. That matches skills/objectstack-query after PR #20811.
Decision #20802 (v18 serves the nested form, letter A) will change this page again when its card lands. Until then the page states 17.x behaviour.
Dedupe: semantic issue search in this repo, open and closed, for "query-syntax.mdx Filtering Across Relationships callout nested relation dotted path SqlDriver applyFilters stale": 30 hits.
Filing gate: ① a published docs sentence measured false, with a named landing site.
reach:content/docs/protocol/objectql/query-syntax.mdxships as a product docs page. A reader who takes its mechanism at its word expects a SQL-shaped wrong answer from the driver ("compiled as a comparison against a single column","account"."industry"against an unjoined table). What the platform actually returns is a loud 400 from the engine.Filed by the
domain:skillsexecution seat 1 (session_01KTZmMfzVzjNvyaLyQ8mHvg, seat post #7623). The source is PR #20811's at-tier contract review 5912934502, which corrected the dev report'scarrier: none(#20782, out-of-scope finding). PR #20811 isskills/**only; its claim heldcontent/docs/**read-only. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.The text (at
origin/main)query-syntax.mdx:602-:611, the "Filtering Across Relationships" warning callout:whereis not supported".:612-:623:fields: ['id'], then$inon the local key).:605-:610, "SqlDriver.applyFilters()only recognises a nested object as an operator map when its keys start with$; anything else is compiled as a comparison against a single column of the queried table, and a dotted key is emitted verbatim, so Knex renders it as"account"."industry"against a table that was never joined."What is true at the code
lookup,master_detail,user,tree) is refused by the engine before any driver is resolved, withINVALID_FILTER/ 400 on every driver. The code ispackages/objectql/src/no-operator-object-door.ts, since4b4ee88f(PR fix(objectql)!: a no-operator object beneath a relation, structured-JSON or undeclared id column is refused INVALID_FILTER / 400 on every driver (#20745) #20781). It is pinned inpackages/objectql/src/engine-nested-object-door.test.tsandpackages/rest/src/data-nested-object-door.test.ts.wherepath is refused earlier still, withINVALID_FIELD/ 400 (classifyDottedFilterHead, the [finding] The FILTER axis has no DOTTED-path verdict —where: { project_id.name: 'x' }rides its head segment past both doors, where SORT refuses the same spelling (#4256) #8371 door).$inits ids, or$containsper id on amultiple: truelookup.Suggested shape (⛔ not a ruling)
Replace the mechanism sentences with the refusal as shipped (the engine refuses both forms with 400 and names the route), and keep the headline and the two-query example. On a
multiple: truelookup, use$containsper id. That matchesskills/objectstack-queryafter PR #20811.Decision #20802 (v18 serves the nested form, letter A) will change this page again when its card lands. Until then the page states 17.x behaviour.
Dedupe: semantic issue search in this repo, open and closed, for "query-syntax.mdx Filtering Across Relationships callout nested relation dotted path SqlDriver applyFilters stale": 30 hits.
skills/objectstack-queryteaches the nested relation filter{ relation: { field: value } }as a working form; no data-path driver serves it, and PR #20781 makes the engine refuse it #20782 (the skill half) and [finding] a no-operator object under a lookup, master_detail or json field answers per driver: the declared nested-relation filter returns no rows on memory and a 400 on SQL, and a json object comparand deep-equals on memory and is refused on SQL #20745 (the engine refusal, closed) are the same family.Dedupe words:
query-syntax.mdx relation traversal callout·nested form dotted path refused engine·Filtering Across RelationshipsGenerated by Claude Code