{"record":{"id":"15e52a75c0616456","repo":"redis/jedis","slug":"limit-must-be-non-negative-15e52a","errorCode":null,"errorMessage":"LIMIT must be non-negative","messagePattern":"LIMIT must be non-negative","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/main/java/redis/clients/jedis/params/SUnionCardParams.java","lineNumber":46,"sourceCode":"  }\n\n  /**\n   * Return an approximate cardinality using HyperLogLog (standard error ~0.81%).\n   * @return SUnionCardParams\n   */\n  public SUnionCardParams approx() {\n    this.approx = true;\n    return this;\n  }\n\n  /**\n   * Cap the returned cardinality at {@code limit}. {@code LIMIT 0} means no limit.\n   * @param limit non-negative cap\n   * @return SUnionCardParams\n   */\n  public SUnionCardParams limit(long limit) {\n    if (limit < 0) {\n      throw new IllegalArgumentException(\"LIMIT must be non-negative\");\n    }\n    this.limit = limit;\n    return this;\n  }\n\n  @Override\n  public void addParams(CommandArguments args) {\n    if (approx) {\n      args.add(Keyword.APPROX);\n    }\n    if (limit != null) {\n      args.add(Keyword.LIMIT);\n      args.add(limit);\n    }\n  }\n\n  @Override\n  public boolean equals(Object o) {","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/redis/jedis/blob/6dac31d4c224fb3257c216f3985340c6f500cdcb/src/main/java/redis/clients/jedis/params/SUnionCardParams.java#L28-L64","documentation":"SUnionCardParams.limit() validates the cardinality cap client-side before the SUNIONCARD command is built. Jedis throws this IllegalArgumentException when a negative limit is passed, since Redis LIMIT only accepts non-negative values (0 means no cap).","triggerScenarios":"Calling new SUnionCardParams().limit(n) with any n < 0, e.g. limit(-1) or a limit computed from an unvalidated subtraction that underflows.","commonSituations":"Computing a limit as difference of counters (remaining - used) that went negative; passing user-supplied pagination input without clamping; integer arithmetic bugs producing negative caps.","solutions":["Clamp or validate the limit before calling limit(), e.g. Math.max(0, limit).","Omit the limit() call entirely when no cap is intended (LIMIT 0 is the default/no-limit).","Fix the upstream computation that produces a negative value."],"exampleFix":"// before\nSUnionCardParams params = new SUnionCardParams().limit(remaining - used);\n// after\nlong limit = Math.max(0, remaining - used);\nSUnionCardParams params = new SUnionCardParams().limit(limit);","handlingStrategy":"validation","validationCode":"if (limit < 0) throw new IllegalArgumentException(\"limit must be >= 0, got \" + limit);\nSUnionCardParams params = new SUnionCardParams().limit(limit);","typeGuard":"boolean isValidLimit(long limit) { return limit >= 0; }","tryCatchPattern":"try {\n  params = new SUnionCardParams().limit(limit);\n} catch (IllegalArgumentException e) {\n  params = new SUnionCardParams(); // fall back to no limit\n}","preventionTips":["Clamp computed limits with Math.max(0, n).","Validate user-supplied pagination input at the boundary.","Remember LIMIT 0 already means 'no cap' in Redis."],"tags":["jedis","params","validation","redis"],"backgroundTag":"argument-out-of-range","analyzedSha":"6dac31d4c224fb3257c216f3985340c6f500cdcb","analyzedAt":"2026-09-08T04:55:01.204Z","contentChangedAt":"2026-09-08T04:55:01.204Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}