{"record":{"id":"96dfc679a3ce5dff","repo":"apache/druid","slug":"distinct-intervals-in-input-segments-may-not-overl","errorCode":null,"errorMessage":"Distinct intervals in input segments may not overlap: [%s] vs [%s]","messagePattern":"Distinct intervals in input segments may not overlap: \\[(.+?)\\] vs \\[(.+?)\\]","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"indexing-service/src/main/java/org/apache/druid/indexing/input/DruidInputSource.java","lineNumber":648,"sourceCode":"          timeline.put(\n              interval,\n              new TimelineObjectHolder<>(\n                  interval,\n                  segment.getInterval(),\n                  segment.getVersion(),\n                  new PartitionHolder<>(segment.getShardSpec().createChunk(segment))\n              )\n          );\n        }\n      }\n    }\n\n    // Validate that none of the given windows overlaps (except for when multiple segments share exactly the\n    // same interval).\n    Interval lastInterval = null;\n    for (Interval interval : timeline.keySet()) {\n      if (lastInterval != null && interval.overlaps(lastInterval)) {\n        throw new IAE(\n            \"Distinct intervals in input segments may not overlap: [%s] vs [%s]\",\n            lastInterval,\n            interval\n        );\n      }\n      lastInterval = interval;\n    }\n\n    return new ArrayList<>(timeline.values());\n  }\n\n  /**\n   * @return Number of segments read by this input source. This value is null until\n   *         the method {@link #fixedFormatReader} has been invoked on this input source.\n   */\n  public int getNumberOfSegmentsRead()\n  {\n    return numSegmentsInTimeline;","sourceCodeStart":630,"sourceCodeEnd":666,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/indexing-service/src/main/java/org/apache/druid/indexing/input/DruidInputSource.java#L630-L666","documentation":"After constructing the timeline from the provided segment IDs, DruidInputSource validates that distinct intervals do not partially overlap. Segments may share an identical interval, but partially overlapping intervals (e.g. from differing segment granularities) cannot form a valid timeline, so it throws IllegalArgumentException.","triggerScenarios":"Supplying a 'segments' list where one segment's interval partially overlaps another's — e.g. mixing hourly and daily segments covering overlapping but unequal windows.","commonSituations":"Combining segments produced before and after a segment-granularity change (hourly vs daily); hand-assembling segment IDs across a compaction that changed granularity.","solutions":["Use segment IDs with consistent, non-overlapping (or exactly equal) intervals.","Align all selected segments to a single segment granularity.","Switch to an 'interval'-based DruidInputSource and let the server timeline resolve overshadowing."],"exampleFix":"// before\nsegments = [\"ds_hourly_2020-01-01T00_2020-01-01T01_v1\", \"ds_daily_2020-01-01_2020-01-02_v1\"]\n// after\nsegments = [\"ds_daily_2020-01-01_2020-01-02_v1\"]","handlingStrategy":"validation","validationCode":"List<Interval> sorted = segments.stream()\n    .map(DataSegment::getInterval)\n    .sorted(Interval::compare)\n    .collect(Collectors.toList());\nfor (int i = 1; i < sorted.size(); i++) {\n  Interval a = sorted.get(i - 1), b = sorted.get(i);\n  if (!a.equals(b) && b.overlaps(a)) {\n    throw new IllegalArgumentException(\"Overlapping intervals: \" + a + \" vs \" + b);\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  List<DataSegment> timeline = inputSource.createTimeline();\n} catch (IllegalArgumentException e) {\n  // select segments with consistent granularity / non-overlapping intervals\n}","preventionTips":["Keep segment granularity uniform across selected segments.","After compaction that changes granularity, regenerate segment lists instead of reusing old ones.","Validate interval overlap client-side before submitting."],"tags":["druid","intervals","overlap","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}