{"record":{"id":"65e060ca6d7fbecb","repo":"apache/druid","slug":"should-only-have-one-interval-got-s-65e060","errorCode":null,"errorMessage":"Should only have one interval, got[%s]","messagePattern":"Should only have one interval, got\\[(.+?)\\]","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/query/search/SearchStrategy.java","lineNumber":54,"sourceCode":"import org.joda.time.Interval;\n\nimport java.util.HashSet;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Set;\n\npublic abstract class SearchStrategy\n{\n  protected final Filter filter;\n  protected final Interval interval;\n\n  protected SearchStrategy(SearchQuery query)\n  {\n    this.filter = Filters.convertToCNFFromQueryContext(query, Filters.toFilter(query.getDimensionsFilter()));\n    final List<Interval> intervals = query.getQuerySegmentSpec().getIntervals();\n    if (intervals.size() != 1) {\n      throw new IAE(\"Should only have one interval, got[%s]\", intervals);\n    }\n    this.interval = intervals.get(0);\n  }\n\n  public abstract List<SearchQueryExecutor> getExecutionPlan(SearchQuery query, Segment segment);\n\n  static List<DimensionSpec> getDimsToSearch(Segment segment, List<DimensionSpec> dimensions)\n  {\n    if (dimensions == null || dimensions.isEmpty()) {\n      final Set<String> dims = new LinkedHashSet<>();\n      final QueryableIndex index = segment.as(QueryableIndex.class);\n      if (index != null) {\n        for (String dim : index.getAvailableDimensions()) {\n          dims.add(dim);\n        }\n      } else {\n        // fallback to RowSignature and Metadata if QueryableIndex not available\n        final Metadata metadata = segment.as(Metadata.class);","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/query/search/SearchStrategy.java#L36-L72","documentation":"SearchStrategy's constructor converts the query filter to CNF and requires the query's querySegmentSpec to contain exactly one interval; otherwise it throws IAE('Should only have one interval, got[...]'). Search strategies index-scan a single segment interval, so multi-interval specs are unsupported there. Multi-interval segment specs on a search query trigger it.","triggerScenarios":"Submitting a search query whose 'intervals' list has zero or multiple entries; programmatic construction of SearchQuery with a multiple-interval QuerySegmentSpec; query rewriting that splits intervals.","commonSituations":"Hand-built search queries with several time ranges; tools generating interval lists generically for all query types; callers translating time-series-style multi-interval specs to search queries.","solutions":["Provide exactly one interval in the query's querySegmentSpec","Split a multi-range request into separate search queries, one per interval","Use the default interval spec (MaxTimeSpec / universal) if you don't need a time bound"],"exampleFix":"// before\nnew MultipleIntervalSegmentSpec(ImmutableList.of(i1, i2))\n// after\nnew MultipleIntervalSegmentSpec(ImmutableList.of(i1)) // or issue one query per interval","handlingStrategy":"validation","validationCode":"List<Interval> intervals = query.getQuerySegmentSpec().getIntervals(); if (intervals.size() != 1) { throw new IllegalArgumentException(\"search query requires exactly one interval, got \" + intervals.size()); }","typeGuard":"boolean hasSingleInterval(SearchQuery q) { return q.getQuerySegmentSpec().getIntervals().size() == 1; }","tryCatchPattern":"try { return strategy.strategize(query).getExecutionPlan(query, segment); } catch (IAE e) { if (e.getMessage().startsWith(\"Should only have one interval\")) { splitAndRetryPerInterval(); } else throw e; }","preventionTips":["Always build search queries with a single-interval spec","Split multi-range requests into separate queries client-side","Validate interval lists before submitting programmatically-built queries"],"tags":["search-query","intervals","segment-spec","validation"],"backgroundTag":"invalid-query-parameter","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}