{"record":{"id":"7bc071514d86da19","repo":"gatsbyjs/gatsby","slug":"range-filter-predicate-should-not-have-array-va","errorCode":null,"errorMessage":"Range filter ${predicate} should not have array value","messagePattern":"Range filter (.+?) should not have array value","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/gatsby/src/datastore/lmdb/query/filter-using-index.ts","lineNumber":647,"sourceCode":"function resolveRangeEdge(\n  context: IFilterContext,\n  indexField: string,\n  predicate: DbComparator,\n  edge: ValueEdges = ValueEdges.EQ\n): IndexFieldValue | RangeEdgeBefore | RangeEdgeAfter | undefined {\n  const fieldQueries = getFieldQueries(context.dbQueries, indexField)\n  for (const dbQuery of fieldQueries) {\n    if (context.usedQueries.has(dbQuery)) {\n      continue\n    }\n    const filterStatement = getFilterStatement(dbQuery)\n    if (filterStatement.comparator !== predicate) {\n      continue\n    }\n    context.usedQueries.add(dbQuery)\n    const value = filterStatement.value\n    if (Array.isArray(value)) {\n      throw new Error(`Range filter ${predicate} should not have array value`)\n    }\n    if (typeof value === `object` && value !== null) {\n      throw new Error(\n        `Range filter ${predicate} should not have value of type ${typeof value}`\n      )\n    }\n    if (edge === 0) {\n      return value\n    }\n    return edge < 0 ? getValueEdgeBefore(value) : getValueEdgeAfter(value)\n  }\n  return undefined\n}\n\n/**\n * Returns the edge after the given value, suitable for lmdb range queries.\n *\n * Example:","sourceCodeStart":629,"sourceCodeEnd":665,"githubUrl":"https://github.com/gatsbyjs/gatsby/blob/8b06340921ffdf23125a365b9c9923690cb62ce6/packages/gatsby/src/datastore/lmdb/query/filter-using-index.ts#L629-L665","documentation":"While resolving a complementary range edge (e.g. looking up a `gt` when planning an `lt`), `resolveRangeEdge` finds an unused filter statement for the same predicate whose value is an Array. Range predicates require scalar values, so it throws with the predicate name.","triggerScenarios":"Combining range filters where one of them carries an array value, e.g. `{ age: { lt: 30 }, age: { gt: [10, 20] } }`.","commonSituations":"Programmatic filter construction producing arrays for range operators.","solutions":["Make every range predicate (`gt`/`gte`/`lt`/`lte`) a scalar.","Audit the filter object literal for stray array values."],"exampleFix":"// before\nfilter: { age: { lt: 30 }, age: { gt: [10, 20] } }\n// after\nfilter: { age: { lt: 30 }, age: { gt: 10 } }","handlingStrategy":"validation","validationCode":"const RANGE = new Set([\"lt\", \"lte\", \"gt\", \"gte\"])\nfunction validateRangeFilters(filter) {\n  for (const ops of Object.values(filter)) {\n  for (const [op, value] of Object.entries(ops)) {\n  if (RANGE.has(op) && Array.isArray(value)) throw new Error(`Range ${op} must be scalar`)\n  }\n  }\n}\n","typeGuard":"function isRangeScalar(v: unknown): v is string | number | boolean | null {\n  return v === null || [\"string\", \"number\", \"boolean\"].includes(typeof v)\n}\n","tryCatchPattern":null,"preventionTips":["Audit combined range filters for stray arrays.","Use a typed filter builder that forbids arrays on range operators."],"tags":["graphql","query","filter","lmdb","indexing","datastore"],"backgroundTag":null,"analyzedSha":"8b06340921ffdf23125a365b9c9923690cb62ce6","analyzedAt":"2026-08-13T02:36:21.405Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}