hasura/graphql-engine · error · Error
Column order by target path did not end in a column field va
Error message
Column order by target path did not end in a column field value
What it means
For a column order-by target, the extracted field value must be a scalar. If the value pulled from the single result row is an object (e.g. a nested record or structured field), the engine refuses to use it as a sort key because raw scalars are the only valid column order-by values.
Source
Thrown at dc-agents/reference/src/query.ts:452
): RawScalarValue => {
const [relationshipName, ...remainingPath] = orderByElement.target_path;
const rows = response.rows ?? [];
const aggregates = response.aggregates ?? {};
if (relationshipName === undefined) {
switch (orderByElement.target.type) {
case 'column':
if (rows.length > 1)
throw new Error(
`Unexpected number of rows (${rows.length}) returned by order by element query`,
);
const fieldValue =
rows.length === 1
? rows[0][getColumnSelector(orderByElement.target.column)]
: null;
if (fieldValue !== null && typeof fieldValue === 'object')
throw new Error(
'Column order by target path did not end in a column field value',
);
return coerceUndefinedToNull(fieldValue) as RawScalarValue;
case 'single_column_aggregate':
return aggregates[orderByElement.target.column];
case 'star_count_aggregate':
return aggregates['count'];
default:
return unreachable(orderByElement.target['type']);
}
} else {
if (rows.length > 1)
throw new Error(
`Unexpected number of rows (${rows.length}) returned by order by element query`,View on GitHub (pinned to 724551b9ae)
Solutions
- Order by a genuinely scalar column instead of a structured/JSON column.
- If the data is wrong, fix the dataset so the column holds scalar values.
- If writing a backend, unwrap field values to raw scalars in the rows you return.
Example fix
// before
order_by: [{ target: { type: 'column', column: 'metadata' }, order: 'asc' }] // metadata holds objects
// after
order_by: [{ target: { type: 'column', column: 'name' }, order: 'asc' }] Defensive patterns
Strategy: type-guard
Validate before calling
const sample = rows[0]?.[columnName];
if (sample !== undefined && typeof sample === 'object') throw new Error('cannot order by structured column'); Type guard
const isRawScalar = (v: unknown): v is RawScalarValue => v === null || ['string', 'number', 'boolean'].includes(typeof v);
Prevention
- Only order by scalar-typed columns
- Unwrap structured field values in custom backends before returning rows
When it happens
Trigger: An order_by element targets a column whose stored/returned value is an object rather than a scalar — e.g. a JSON column containing an object, or a backend that wraps field values in { value: ... } envelopes.
Common situations: Static datasets containing structured/JSON fields used in order_by; connector backends that return nested row objects for fields; schema type mismatches where a column declared scalar actually holds structured data.
Related errors
- Unexpected type of results.aggregates.count (${count}) expec
- Unexpected number of rows (${rows.length}) returned by order
- Found a column field value in the middle of a order by targe
- Cannot perform an order by target of type ${orderByElement.t
- makeGetOrderByElementValue: Only table relationships current
AI-assisted analysis of hasura/graphql-engine@724551b9ae (2026-08-28).
Data as JSON: /api/errors/d2a3e650c5986d45.
Report an issue: GitHub.