{"record":{"id":"3da6a2bd3428c415","repo":"apache/seatunnel","slug":"insert-sql-must-not-have-columns","errorCode":null,"errorMessage":"Insert sql must not have columns","messagePattern":"Insert sql must not have columns","errorType":"exception","errorClass":"ParserException","httpStatus":null,"severity":"error","filePath":"seatunnel-config/seatunnel-config-sql/src/main/java/org/apache/seatunnel/config/sql/SqlConfigBuilder.java","lineNumber":364,"sourceCode":"\n            String query = select.toString();\n            transformConfig.setPluginInputIdentifier(pluginInputIdentifier);\n            transformConfig.setPluginOutputIdentifier(pluginOutputIdentifier);\n            transformConfig.setQuery(query);\n\n            return transformConfig;\n        } else {\n            throw new ParserException(String.format(\"Unsupported syntax: %s\", createTable));\n        }\n    }\n\n    private static void parseInsertSql(\n            Insert insertSql,\n            Map<String, BaseConfig> sqlTables,\n            SeaTunnelConfig seaTunnelConfig,\n            AtomicInteger tempTableIndex) {\n        if (insertSql.getColumns() != null && !insertSql.getColumns().isEmpty()) {\n            throw new ParserException(\"Insert sql must not have columns\");\n        }\n        TransformConfig transformConfig = new TransformConfig();\n        Select select = insertSql.getSelect();\n        if (select == null\n                || select.getSelectBody() == null\n                || !(select.getSelectBody() instanceof PlainSelect)) {\n            throw new ParserException(\"Insert sql must have select statement\");\n        }\n        String targetTableName = insertSql.getTable().getName();\n        if (select.getSelectBody() instanceof PlainSelect) {\n            PlainSelect plainSelect = (PlainSelect) select.getSelectBody();\n\n            String pluginInputIdentifier;\n            String pluginOutputIdentifier;\n            if (plainSelect.getFromItem() == null) {\n                List<SelectItem<?>> selectItems = plainSelect.getSelectItems();\n                if (selectItems.size() != 1) {\n                    throw new ParserException(","sourceCodeStart":346,"sourceCodeEnd":382,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-config/seatunnel-config-sql/src/main/java/org/apache/seatunnel/config/sql/SqlConfigBuilder.java#L346-L382","documentation":"Thrown by parseInsertSql when an INSERT INTO statement specifies an explicit column list. The SeaTunnel SQL config dialect only supports 'INSERT INTO sink SELECT ...' without enumerating columns; column mapping must be handled by the SELECT projection.","triggerScenarios":"INSERT INTO sink_t (a, b) SELECT ... — any non-empty column list on the INSERT target triggers this.","commonSituations":"Users porting standard ANSI SQL from Flink/Spark where column lists are common; attempting column reordering via the INSERT clause.","solutions":["Remove the column list and rely on the SELECT item order/projection","Reorder or alias columns inside the SELECT clause to achieve the desired mapping"],"exampleFix":"// before\nINSERT INTO sink_t (a, b) SELECT x, y FROM src\n// after\nINSERT INTO sink_t SELECT x AS a, y AS b FROM src","handlingStrategy":"validation","validationCode":"// reject INSERT column lists before building config\nif (sql.toLowerCase().matches(\".*insert\\\\s+into\\\\s+\\\\w+\\\\s*\\\\(.*\")) {\n    throw new IllegalArgumentException(\"INSERT INTO must not list columns; map columns in the SELECT projection\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    SeaTunnelConfig c = SqlConfigBuilder.of(sql);\n} catch (ParserException e) {\n    if (e.getMessage().equals(\"Insert sql must not have columns\")) {\n        // move column mapping into SELECT aliases\n    }\n}","preventionTips":["Always write INSERT INTO <table> SELECT ... without a column list","Use SELECT aliases (expr AS col) for column mapping/reordering","Lint for the pattern 'INSERT INTO t (' in scripts"],"tags":["sql","parser","insert","unsupported-syntax"],"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"}