{"record":{"id":"e478eb7af5d6636b","repo":"apache/seatunnel","slug":"only-select-statements-are-supported","errorCode":null,"errorMessage":"Only SELECT statements are supported.","messagePattern":"Only 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":92,"sourceCode":"import java.util.Optional;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class SqlToPaimonPredicateConverter {\n\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(","sourceCodeStart":74,"sourceCodeEnd":110,"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#L74-L110","documentation":"After successfully parsing, convertToPlainSelect verifies the Statement is a Select; anything else (INSERT, UPDATE, DELETE, CREATE, etc.) is rejected with IllegalArgumentException('Only SELECT statements are supported.') because the converter only translates SELECT predicates into Paimon predicates.","triggerScenarios":"Supplying a non-SELECT SQL statement (UPDATE/DELETE/DDL/EXPLAIN) as the predicate/query to the Paimon source predicate converter.","commonSituations":"Users pasting mutation or DDL statements as filter expressions; tools that build query strings dynamically appending '; DELETE ...'; misunderstanding that the converter is for filter predicates, not arbitrary SQL execution.","solutions":["Ensure the SQL string is a SELECT statement","Use only WHERE-based filter expressions, e.g. 'SELECT * FROM table WHERE col = x'","Remove any trailing statements separated by semicolons","Strip comments/DDL prefixes from the query string"],"exampleFix":"// before\nString sql = \"DELETE FROM t WHERE id = 1\";\n// after\nString sql = \"SELECT * FROM t WHERE id = 1\";","handlingStrategy":"validation","validationCode":"String trimmed = sql.trim().toUpperCase(); if (!trimmed.startsWith(\"SELECT\")) throw new IllegalArgumentException(\"Filter SQL must be a SELECT statement\");","typeGuard":null,"tryCatchPattern":"try { converter.convertToPlainSelect(query); } catch (IllegalArgumentException e) { if (\"Only SELECT statements are supported.\".equals(e.getMessage())) { /* fix query to SELECT */ } throw e; }","preventionTips":["Only pass SELECT statements as predicate/query strings","Strip trailing semicolons and extra statements","Document that the converter is for filter pushdown, not DML/DDL"],"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"}