{"record":{"id":"3690d4a4ea0d6672","repo":"apache/druid","slug":"argument-must-be-a-long-constant","errorCode":null,"errorMessage":"argument must be a LONG constant","messagePattern":"argument must be a LONG constant","errorType":"validation","errorClass":"ExpressionValidationException","httpStatus":null,"severity":"error","filePath":"extensions-core/druid-bloom-filter/src/main/java/org/apache/druid/query/expressions/BloomFilterExpressions.java","lineNumber":62,"sourceCode":"  public static class CreateExprMacro implements ExprMacroTable.ExprMacro\n  {\n    public static final String FN_NAME = \"bloom_filter\";\n\n    @Override\n    public String name()\n    {\n      return FN_NAME;\n    }\n\n    @Override\n    public Expr apply(List<Expr> args)\n    {\n      validationHelperCheckArgumentCount(args, 1);\n\n      final Expr expectedSizeArg = args.get(0);\n\n      if (!expectedSizeArg.isLiteral() || expectedSizeArg.getLiteralValue() == null) {\n        throw validationFailed(\"argument must be a LONG constant\");\n      }\n\n      class BloomExpr extends ExprMacroTable.BaseScalarMacroFunctionExpr\n      {\n        final int expectedSize;\n\n        public BloomExpr(List<Expr> args)\n        {\n          super(CreateExprMacro.this, args);\n          this.expectedSize = args.get(0).eval(InputBindings.nilBindings()).asInt();\n        }\n\n        @Override\n        public ExprEval eval(ObjectBinding bindings)\n        {\n          return ExprEval.ofComplex(\n              BLOOM_FILTER_TYPE,\n              new BloomKFilter(expectedSize)","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-core/druid-bloom-filter/src/main/java/org/apache/druid/query/expressions/BloomFilterExpressions.java#L44-L80","documentation":"The bloom_filter_expr / bloom_filter_operand macro requires its single argument (the expected filter size) to be a literal LONG constant. If the argument is not a literal or has a null literal value, expression validation fails with 'argument must be a LONG constant'.","triggerScenarios":"Calling BLOOM_FILTER_EXPECTED_SIZE-like macros with a non-literal expression (e.g., a column reference or computed expression) or a null literal as the size argument.","commonSituations":"Passing a column or query parameter instead of a constant integer; forgetting the argument defaults expectation; using a string literal instead of a number.","solutions":["Pass a constant integer literal, e.g. bloom_filter_expr(1000).","Remove any dynamic (non-literal) expression from the argument.","Ensure the literal is a number, not a string, and not NULL."],"exampleFix":"// before\nSELECT bloom_filter_expr(col_size) FROM t\n// after\nSELECT bloom_filter_expr(1000) FROM t","handlingStrategy":"validation","validationCode":"// validate args before building the expression\nif (args.size() != 1 || !args.get(0).isLiteral() || !(args.get(0).getLiteralValue() instanceof Number)) {\n  throw new IllegalArgumentException(\"expected a LONG literal, e.g. bloom_filter_expr(1000)\");\n}","typeGuard":"boolean isValidSizeArg(Expr e) { return e != null && e.isLiteral() && e.getLiteralValue() != null && e.getLiteralValue() instanceof Number; }","tryCatchPattern":null,"preventionTips":["Always pass a numeric constant as the expected size","Do not substitute columns or session parameters for the size","Document macro signature in SQL builder wrappers"],"tags":["expression","bloom-filter","sql"],"backgroundTag":"missing-required-argument","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"}