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

  1. Order by a genuinely scalar column instead of a structured/JSON column.
  2. If the data is wrong, fix the dataset so the column holds scalar values.
  3. 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

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


AI-assisted analysis of hasura/graphql-engine@724551b9ae (2026-08-28). Data as JSON: /api/errors/d2a3e650c5986d45. Report an issue: GitHub.