Following up on this thread — we've now had meaningful production time on the patch (since April 14) and can share the details. Also flagging a regression in 1.18.4 that reverted (overwrote) our fix.
Root Cause (confirmed)
When a sub-queue filter references a field from Form B, the ORM builds a single shared tpwk_form_entry JOIN (A3) anchoring both form_entry_values joins. A ticket has one form_entry row per attached form, so A3 can only resolve to one form's row at a time. When A3 resolves to a Form B row, Form A values (joined through the same A3) come back NULL and the WHERE filter eliminates those rows entirely. Result: Form A columns always blank on filtered sub-queues.
The Fix — 4 changes to class.queue.php
Change 1 — getOrmPath(): Fork a separate entries!{fieldId} JOIN per field_id, each with the field's form_id added to the JOIN ON clause. Each field resolves independently through its own form_entry row.
Change 2 — mangleQuerySet(): Save $originalName before getOrmPath() rewrites it to the forked path, so the searchable fields lookup (keyed by original name) still succeeds. Normalize the annotation key back to entries__ path so renderBasicValue() can find the value.
Change 3 — QueueColumn::addToQuery(): Annotate using the normalized entries__ key (not the forked entries!N key) so renderBasicValue() can look up the value by original name from the result row.
Change 4 — QueueColumnAnnotation::addToQuery(): Same key normalization applied to the annotation class's addToQuery.
1.18.4 Regression
osTicket 1.18.4 (released June 17, deployed July 6 via auto-update) overwrote our patched class.queue.php. The 1.18.4 version simplified getOrmPath() back to a single shared JOIN ($meta = $root::getMeta()->getByPath($path[1])) — reverting the fix. Additionally, QueueColumnAnnotation::addToQuery() was refactored to a static method in 1.18.4, which conflicted with our Change 4.
We've re-applied Changes 1–3 on top of the 1.18.4 base (skipping Change 4 since the static method in 1.18.4 handles built-in annotations, not custom field paths). Working correctly again.
Happy to share the specific code blocks if that helps get this into the core. The fix is 30 lines across the three locations. The forked JOIN approach also significantly reduces the row scan on the queue counts query (we saw 1.7M rows examined before the fix on a modest dataset).