{"record":{"id":"5c137d73460cb056","repo":"apache/seatunnel","slug":"unsupported-clause-merge-format","errorCode":null,"errorMessage":"Unsupported clause merge format: ","messagePattern":"Unsupported clause merge format: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-common/src/main/java/org/apache/seatunnel/connectors/seatunnel/common/sql/SqlTableClauseMerger.java","lineNumber":42,"sourceCode":"\n/** Utility for merging key-value table options into SQL CREATE TABLE property clauses. */\npublic final class SqlTableClauseMerger {\n\n    private static final Pattern DOUBLE_QUOTED_ENTRY_PATTERN =\n            Pattern.compile(\"\\\"((?:[^\\\"\\\\\\\\]|\\\\\\\\.)*)\\\"\\\\s*=\\\\s*\\\"((?:[^\\\"\\\\\\\\]|\\\\\\\\.)*)\\\"\");\n\n    private SqlTableClauseMerger() {}\n\n    public static String merge(\n            String sql, ClauseMergeFormat format, Map<String, String> tableOptions) {\n        if (tableOptions == null || tableOptions.isEmpty()) {\n            return sql;\n        }\n        switch (format) {\n            case DOUBLE_QUOTED_PROPERTIES:\n                return mergeDoubleQuotedProperties(sql, format.getKeyword(), tableOptions);\n            default:\n                throw new IllegalArgumentException(\"Unsupported clause merge format: \" + format);\n        }\n    }\n\n    private static String mergeDoubleQuotedProperties(\n            String sql, String keyword, Map<String, String> tableOptions) {\n        int keywordStart = findLastKeywordPosition(sql, keyword);\n        if (keywordStart >= 0) {\n            int openParen = indexOfNonWhitespace(sql, keywordStart + keyword.length());\n            if (openParen >= 0 && sql.charAt(openParen) == '(') {\n                int closeParen = findMatchingCloseParen(sql, openParen);\n                if (closeParen > openParen) {\n                    String clauseBody = sql.substring(openParen + 1, closeParen);\n                    Map<String, String> merged = parseDoubleQuotedEntries(clauseBody);\n                    merged.putAll(tableOptions);\n                    String newClause = renderDoubleQuotedProperties(keyword, merged);\n                    return sql.substring(0, keywordStart)\n                            + newClause\n                            + sql.substring(closeParen + 1);","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-common/src/main/java/org/apache/seatunnel/connectors/seatunnel/common/sql/SqlTableClauseMerger.java#L24-L60","documentation":"SqlTableClauseMerger.merge() merges table options (e.g. 'with' clauses) into a SQL DDL string according to a ClauseMergeFormat enum. Currently only DOUBLE_QUOTED_PROPERTIES is supported; any other enum constant hits the default branch and throws this IllegalArgumentException.","triggerScenarios":"Invoking merge(sql, format, tableOptions) with any ClauseMergeFormat value other than DOUBLE_QUOTED_PROPERTIES (and non-null sql), e.g. future/new enum constants added by upgrades or callers passing a different format constant.","commonSituations":"SeaTunnel version mismatch where a connector requests a newly added merge format but the connector-common jar on the classpath is older; custom connector code choosing a format the merger doesn't implement.","solutions":["Use ClauseMergeFormat.DOUBLE_QUOTED_PROPERTIES, the only currently supported format","Align connector-common dependency version with the connector that supplies the format enum (rebuild/shade correctly)","If you added a new enum constant, implement a corresponding mergeXxx method and switch case in SqlTableClauseMerger","Check for duplicate/old connector-common jars on the classpath shadowing the newer version"],"exampleFix":"// before\nmerger.merge(sql, ClauseMergeFormat.SINGLE_QUOTED_PROPERTIES, options); // unsupported\n// after\nmerger.merge(sql, ClauseMergeFormat.DOUBLE_QUOTED_PROPERTIES, options);","handlingStrategy":"validation","validationCode":"// check supported formats before calling merge\nif (format != ClauseMergeFormat.DOUBLE_QUOTED_PROPERTIES) {\n    throw new UnsupportedOperationException(\"only DOUBLE_QUOTED_PROPERTIES supported\");\n}","typeGuard":"boolean isSupportedFormat(ClauseMergeFormat f) {\n    return f == ClauseMergeFormat.DOUBLE_QUOTED_PROPERTIES;\n}","tryCatchPattern":"try {\n    merged = SqlTableClauseMerger.merge(sql, format, tableOptions);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Unsupported clause merge format\")) {\n        merged = sql; // fall back to unmerged SQL\n    } else {\n        throw e;\n    }\n}","preventionTips":["Only use ClauseMergeFormat.DOUBLE_QUOTED_PROPERTIES until more formats are implemented","Keep connector-common and connector dependency versions aligned","Add a unit test enumerating all enum constants to catch unimplemented branches","If adding a new format, implement its mergeXxx method plus a switch case in the same PR"],"tags":["sql","enum","unsupported-value","ddl"],"backgroundTag":"unsupported-enum-value","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}