{"record":{"id":"0f62f2642821db47","repo":"apache/seatunnel","slug":"unsupported-like-keyword","errorCode":null,"errorMessage":"Unsupported like keyword: ","messagePattern":"Unsupported like keyword: ","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-iceberg/src/main/java/org/apache/seatunnel/connectors/seatunnel/iceberg/utils/ExpressionUtils.java","lineNumber":246,"sourceCode":"            return Expressions.in(column.getColumnName(), values);\n        }\n        if (condition instanceof IsBooleanExpression) {\n            IsBooleanExpression booleanExpression = (IsBooleanExpression) condition;\n            Column column = (Column) booleanExpression.getLeftExpression();\n            if (booleanExpression.isNot()) {\n                return Expressions.notEqual(column.getColumnName(), booleanExpression.isTrue());\n            }\n            return Expressions.equal(column.getColumnName(), booleanExpression.isTrue());\n        }\n        if (condition instanceof LikeExpression) {\n            LikeExpression expr = (LikeExpression) condition;\n            String columnName = ((Column) expr.getLeftExpression()).getColumnName();\n            String value = ((StringValue) expr.getRightExpression()).getValue();\n            LikeExpression.KeyWord keyWord = expr.getLikeKeyWord();\n            if (keyWord == LikeExpression.KeyWord.LIKE) {\n                return Expressions.startsWith(columnName, value);\n            } else {\n                throw new UnsupportedOperationException(\"Unsupported like keyword: \" + keyWord);\n            }\n        }\n\n        throw new UnsupportedOperationException(\n                \"Unsupported condition: \" + condition.getClass().getName());\n    }\n\n    @SneakyThrows\n    private static Object convertValueExpression(\n            net.sf.jsqlparser.expression.Expression valueExpression,\n            Types.NestedField icebergColumn) {\n        switch (icebergColumn.type().typeId()) {\n            case DECIMAL:\n                return new BigDecimal(valueExpression.toString());\n            case DATE:\n                if (valueExpression instanceof StringValue) {\n                    LocalDate date =\n                            LocalDate.parse(","sourceCodeStart":228,"sourceCodeEnd":264,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-iceberg/src/main/java/org/apache/seatunnel/connectors/seatunnel/iceberg/utils/ExpressionUtils.java#L228-L264","documentation":"ExpressionUtils.convert() translates SQL LIKE-family conditions into Iceberg expressions. Only plain LIKE is supported (mapped to Expressions.startsWith); other LIKE keywords (ILIKE, NOT LIKE, RLIKE) hit the else branch and throw UnsupportedOperationException. Case-insensitive and negated matching are not translated.","triggerScenarios":"A WHERE clause in delete-SQL or pushdown filter contains ILIKE / NOT LIKE / RLIKE instead of plain LIKE, reaching the LIKE branch of convert().","commonSituations":"Users writing case-insensitive pattern filters (ILIKE) in delete SQL; negated pattern deletes (NOT LIKE); migrating Postgres-style queries (RLIKE) into iceberg delete statements.","solutions":["Replace ILIKE with LIKE plus case handling (e.g. filter on UPPER(col) = UPPER('abc%')) if semantics allow, or filter client-side","Express NOT LIKE differently, e.g. delete only matching rows explicitly, or use NOT-related comparison supported by the converter","Pre-filter rows before issuing the delete so the connector only receives supported conditions","Extend convert() to map ILIKE to an Expression with lower()/upper() and NOT LIKE via not(startsWith(...)) if you control the code"],"exampleFix":"// before\nDELETE FROM tbl WHERE col NOT LIKE 'abc%'\n// after\nDELETE FROM tbl WHERE col LIKE 'abc%' -- negation unsupported; invert selection logic instead","handlingStrategy":"validation","validationCode":"// Reject unsupported LIKE keywords before conversion\nif (sql.matches(\"(?i).*(ILIKE|NOT\\\\s+LIKE|RLIKE).*\")) throw new IllegalArgumentException(\"only plain LIKE is supported\");","typeGuard":null,"tryCatchPattern":"try { expr = convert(condition); } catch (UnsupportedOperationException e) { if (e.getMessage().startsWith(\"Unsupported like keyword\")) { /* rewrite condition with plain LIKE or filter client-side */ } throw e; }","preventionTips":["Use only plain LIKE in delete-SQL and pushdown filters","Handle case-insensitivity outside the connector (e.g. normalize case in data)","Document supported WHERE operators for users of delete-SQL flows"],"tags":["sql","expression","iceberg"],"backgroundTag":"unsupported-operation","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"}