{"record":{"id":"2289f5b4e6a79594","repo":"apache/seatunnel","slug":"only-simple-select-statements-are-supported","errorCode":null,"errorMessage":"Only simple SELECT statements are supported.","messagePattern":"Only simple SELECT statements are supported\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/source/converter/SqlToPaimonPredicateConverter.java","lineNumber":97,"sourceCode":"\n    public static PlainSelect convertToPlainSelect(String query) {\n        if (StringUtils.isBlank(query)) {\n            return null;\n        }\n        Statement statement = null;\n        try {\n            statement = CCJSqlParserUtil.parse(query);\n        } catch (JSQLParserException e) {\n            throw new IllegalArgumentException(\"Error parsing SQL.\", e);\n        }\n        // Confirm that the SQL statement is a Select statement\n        if (!(statement instanceof Select)) {\n            throw new IllegalArgumentException(\"Only SELECT statements are supported.\");\n        }\n        Select select = (Select) statement;\n        Select selectBody = select.getSelectBody();\n        if (!(selectBody instanceof PlainSelect)) {\n            throw new IllegalArgumentException(\"Only simple SELECT statements are supported.\");\n        }\n        PlainSelect plainSelect = (PlainSelect) selectBody;\n        if (plainSelect.getHaving() != null\n                || plainSelect.getGroupBy() != null\n                || plainSelect.getOrderByElements() != null\n                || plainSelect.getLimit() != null) {\n            throw new IllegalArgumentException(\n                    \"Only SELECT statements with WHERE clause are supported. The Having, Group By, Order By, Limit clauses are currently unsupported.\");\n        }\n        return plainSelect;\n    }\n\n    public static int[] convertSqlSelectToPaimonProjectionIndex(\n            String[] fieldNames, PlainSelect plainSelect) {\n        int[] projectionIndex = null;\n        List<SelectItem<?>> selectItems = plainSelect.getSelectItems();\n\n        List<String> columnNames = new ArrayList<>();","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/source/converter/SqlToPaimonPredicateConverter.java#L79-L115","documentation":"convertToPlainSelect also requires the parsed Select body to be a PlainSelect; compound constructs like UNION/INTERSECT/SetOperation selects fail the instanceof check and throw IllegalArgumentException('Only simple SELECT statements are supported.').","triggerScenarios":"Passing a UNION/INTERSECT/MINUS (set-operation) query, or another non-plain Select form, to the Paimon predicate converter instead of a single flat SELECT.","commonSituations":"Users trying to express complex filters via UNION of conditions; query templates that join multiple selects; migration from SQL engines that allow set operations in pushdown filters.","solutions":["Rewrite as a single flat SELECT with combined WHERE conditions (e.g. replace UNION with OR where semantics allow)","Split into multiple source queries/jobs if UNION semantics are required","Remove set operations and use simple predicates that Paimon can push down"],"exampleFix":"// before\nString sql = \"SELECT * FROM t WHERE a=1 UNION SELECT * FROM t WHERE b=2\";\n// after\nString sql = \"SELECT * FROM t WHERE a=1 OR b=2\";","handlingStrategy":"validation","validationCode":"if (sql.toUpperCase().matches(\".*(UNION|INTERSECT|MINUS).*\")) throw new IllegalArgumentException(\"Set operations not supported in filter SQL\");","typeGuard":null,"tryCatchPattern":"try { converter.convertToPlainSelect(query); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"simple SELECT\")) { /* rewrite as flat SELECT */ } throw e; }","preventionTips":["Express combined conditions with AND/OR instead of UNION","Keep pushdown predicates to single flat SELECTs","Test filters against the converter in unit tests"],"tags":["sql","paimon","predicate-pushdown","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}