{"record":{"id":"b2b4bd4a62611757","repo":"apache/druid","slug":"limit-must-be-greater-than-zero-if-set","errorCode":null,"errorMessage":"Limit must be greater than zero if set","messagePattern":"Limit must be greater than zero if set","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"warning","filePath":"server/src/main/java/org/apache/druid/metadata/SQLMetadataSupervisorManager.java","lineNumber":144,"sourceCode":"                  try {\n                    String specId = pair.lhs;\n                    retVal.computeIfAbsent(specId, sId -> new ArrayList<>()).add(pair.rhs);\n                    return retVal;\n                  }\n                  catch (Exception e) {\n                    throw new RuntimeException(e);\n                  }\n                }\n            )\n        )\n    );\n  }\n\n  @Override\n  public List<VersionedSupervisorSpec> getAllForId(String id, @Nullable Integer limit) throws IllegalArgumentException\n  {\n    if (limit != null && limit <= 0) {\n      throw new IllegalArgumentException(\"Limit must be greater than zero if set\");\n    }\n\n    return ImmutableList.copyOf(\n        dbi.withHandle(\n            (HandleCallback<List<VersionedSupervisorSpec>>) handle -> {\n              String query = StringUtils.format(\n                  \"SELECT id, spec_id, created_date, payload FROM %1$s WHERE spec_id = :spec_id ORDER BY id DESC\",\n                  getSupervisorsTable()\n              );\n              \n              if (limit != null) {\n                query += \" \" + connector.limitClause(limit);\n              }\n              \n              return handle.createQuery(query)\n                           .bind(\"spec_id\", id)\n                           .map((index, r, ctx) -> createVersionSupervisorSpecFromResponse(r))\n                           .list();","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/server/src/main/java/org/apache/druid/metadata/SQLMetadataSupervisorManager.java#L126-L162","documentation":"SQLMetadataSupervisorManager.getAllForId() returns the versioned history of supervisor specs for a given id. It validates the optional limit parameter and throws IllegalArgumentException when a limit is provided that is zero or negative, since a non-positive page size is meaningless for a query row limit.","triggerScenarios":"Calling getAllForId(id, 0) or getAllForId(id, -n); REST endpoints that forward an unvalidated limit query parameter straight through (e.g. ?limit=0).","commonSituations":"UI pagination code computing limit as (page-1)*size with page=0; API clients treating limit=0 as 'unlimited' when the API requires omitting the parameter for unlimited.","solutions":["Omit the limit parameter (pass null) when you want all versions instead of passing 0.","Clamp the caller-supplied limit to a positive value before calling getAllForId.","Fix the REST/UI layer to validate that limit > 0 before forwarding it."],"exampleFix":"// before\nsupervisorManager.getAllForId(id, limit); // limit may be 0 or negative\n// after\nInteger safeLimit = (limit == null || limit <= 0) ? null : limit;\nsupervisorManager.getAllForId(id, safeLimit);","handlingStrategy":"validation","validationCode":"if (limit != null && limit <= 0) {\n  limit = null; // treat as unlimited\n}","typeGuard":"Integer positiveOrNull(Integer limit) { return (limit != null && limit > 0) ? limit : null; }","tryCatchPattern":"try {\n  supervisorManager.getAllForId(id, limit);\n} catch (IllegalArgumentException e) {\n  log.warn(\"Invalid limit supplied: %s\", e.getMessage());\n}","preventionTips":["Validate limit query parameters server-side before calling the manager","Use 'omit for unlimited' semantics in API clients, not limit=0","Guard pagination math against page=0 producing non-positive limits"],"tags":["supervisor","validation","query-parameter"],"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"}