{"record":{"id":"0b89ce605fe186be","repo":"apache/flink","slug":"a-predicate-on-a-float-column-requires-a-floating","errorCode":null,"errorMessage":"A predicate on a FLOAT column requires a floating literal, i.e., Float or Double.","messagePattern":"A predicate on a FLOAT column requires a floating literal, i\\.e\\., Float or Double\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"flink-formats/flink-orc/src/main/java/org/apache/flink/orc/OrcFilters.java","lineNumber":437,"sourceCode":"                        return new Long((Short) literal);\n                    } else if (literal instanceof Integer) {\n                        return new Long((Integer) literal);\n                    } else if (literal instanceof Long) {\n                        return literal;\n                    } else {\n                        throw new IllegalArgumentException(\n                                \"A predicate on a LONG column requires an integer \"\n                                        + \"literal, i.e., Byte, Short, Integer, or Long.\");\n                    }\n                case FLOAT:\n                    if (literal instanceof Float) {\n                        return new Double((Float) literal);\n                    } else if (literal instanceof Double) {\n                        return literal;\n                    } else if (literal instanceof BigDecimal) {\n                        return ((BigDecimal) literal).doubleValue();\n                    } else {\n                        throw new IllegalArgumentException(\n                                \"A predicate on a FLOAT column requires a floating \"\n                                        + \"literal, i.e., Float or Double.\");\n                    }\n                case STRING:\n                    if (literal instanceof String) {\n                        return literal;\n                    } else {\n                        throw new IllegalArgumentException(\n                                \"A predicate on a STRING column requires a floating \"\n                                        + \"literal, i.e., Float or Double.\");\n                    }\n                case BOOLEAN:\n                    if (literal instanceof Boolean) {\n                        return literal;\n                    } else {\n                        throw new IllegalArgumentException(\n                                \"A predicate on a BOOLEAN column requires a Boolean literal.\");\n                    }","sourceCodeStart":419,"sourceCodeEnd":455,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-formats/flink-orc/src/main/java/org/apache/flink/orc/OrcFilters.java#L419-L455","documentation":"For an ORC FLOAT-typed column (FLOAT/DOUBLE in the schema), the pushed-down literal must be Float, Double, or BigDecimal (BigDecimal is converted via doubleValue()). Any other Java type — String, integer box types like Integer/Long — triggers IllegalArgumentException because SearchArgument needs a Double.","triggerScenarios":"A predicate on a FLOAT/DOUBLE ORC column where the literal deserializes as String (e.g. from a string-typed filter parameter) or where an integral literal is not widened; e.g. where price = '9.99' with price DOUBLE.","commonSituations":"Passing filter values as strings from configuration/REST parameters into a legacy OrcTableSource; queries comparing doubles to quoted literals; programmatic predicate building with Integer values for double columns.","solutions":["Convert the literal to Double/Float/BigDecimal before building the predicate.","Write the SQL literal unquoted (9.99 not '9.99') so the planner types it as DECIMAL/DOUBLE.","Route to the modern ORC connector pushdown if you cannot control literal typing."],"exampleFix":"// before\nDouble d = Double.valueOf((String) value);\n// ensure predicate literal is Double, not String:\npredicate = new OrcFilters.Predicate(\"price\", PredicateLeaf.Type.FLOAT, \"9.99\");\n// after\npredicate = new OrcFilters.Predicate(\"price\", PredicateLeaf.Type.FLOAT, Double.parseDouble(\"9.99\"));","handlingStrategy":"type-guard","validationCode":"Object lit;\nif (value instanceof Float || value instanceof Double || value instanceof BigDecimal) {\n    lit = (value instanceof BigDecimal) ? ((BigDecimal) value).doubleValue() : value;\n} else if (value instanceof Number) {\n    lit = ((Number) value).doubleValue();\n} else {\n    throw new IllegalArgumentException(\"FLOAT column needs a numeric literal\");\n}","typeGuard":"static boolean isFloatPushable(Object v) {\n    return v instanceof Float || v instanceof Double || v instanceof BigDecimal;\n}","tryCatchPattern":null,"preventionTips":["Unquote numeric literals in SQL against FLOAT/DOUBLE columns.","Parse string-sourced filter values to Double before building predicates."],"tags":["flink","orc","predicate-pushdown","type-mismatch","double"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}