{"record":{"id":"42be92a29918b78a","repo":"apache/seatunnel","slug":"unsupported-syntax-insertsql","errorCode":null,"errorMessage":"Unsupported syntax: <insertSql>","messagePattern":"Unsupported syntax: <insertSql>","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":391,"sourceCode":"        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(\n                            \"Source table must be specified in SQL: \" + insertSql);\n                }\n                SelectItem<?> selectItem = selectItems.get(0);\n                Column column = (Column) selectItem.getExpression();\n                pluginInputIdentifier = column.getColumnName();\n                pluginOutputIdentifier = pluginInputIdentifier;\n            } else {\n                if (!(plainSelect.getFromItem() instanceof Table)) {\n                    throw new ParserException(\"Unsupported syntax: \" + insertSql);\n                }\n                Table table = (Table) plainSelect.getFromItem();\n                pluginInputIdentifier = table.getName();\n                pluginOutputIdentifier =\n                        pluginInputIdentifier\n                                + TEMP_TABLE_SUFFIX\n                                + tempTableIndex.getAndIncrement();\n                String query = select.toString();\n                transformConfig.setPluginInputIdentifier(pluginInputIdentifier);\n                transformConfig.setPluginOutputIdentifier(pluginOutputIdentifier);\n                transformConfig.setQuery(query);\n                seaTunnelConfig.getTransformConfigs().add(transformConfig);\n            }\n\n            if (!sqlTables.containsKey(pluginInputIdentifier)\n                    || (!OPTION_TABLE_TYPE_SOURCE.equalsIgnoreCase(\n                                    sqlTables.get(pluginInputIdentifier).getType())\n                            && !OPTION_TABLE_TYPE_TRANSFORM.equalsIgnoreCase(","sourceCodeStart":373,"sourceCodeEnd":409,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-config/seatunnel-config-sql/src/main/java/org/apache/seatunnel/config/sql/SqlConfigBuilder.java#L373-L409","documentation":"Thrown by parseInsertSql when the FROM item of the INSERT's SELECT is not a simple table. The parser only supports reading from a named table (Table node); subqueries, joins, functions and other FromItem types are rejected.","triggerScenarios":"INSERT INTO sink_t SELECT * FROM (SELECT ...) subquery; FROM a table-valued function; joins as the FROM item in an INSERT statement.","commonSituations":"Users writing rich queries inline in the INSERT; porting complex Spark/Flink SQL that uses subqueries in FROM.","solutions":["Materialize the subquery into a temp table via CREATE TABLE tmp AS SELECT ... first, then INSERT INTO sink SELECT * FROM tmp","Use only a plain table name in the FROM clause of INSERT statements","Move joins/transformations into a separate CREATE TABLE ... AS SELECT step"],"exampleFix":"// before\nINSERT INTO sink_t SELECT * FROM (SELECT * FROM src) s\n// after\nCREATE TABLE tmp AS SELECT * FROM src;\nINSERT INTO sink_t SELECT * FROM tmp","handlingStrategy":"validation","validationCode":"// FROM item of INSERT SELECT must be a plain table name\nMatcher m = Pattern.compile(\"(?si)INSERT\\\\s+INTO\\\\s+\\\\w+\\\\s+SELECT\\\\s+.*?FROM\\\\s+([^\\\\s;]+)\").matcher(sql);\nif (m.find() && m.group(1).startsWith(\"(\")) {\n    throw new IllegalArgumentException(\"INSERT SELECT FROM must be a plain table, not a subquery\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    SeaTunnelConfig c = SqlConfigBuilder.of(sql);\n} catch (ParserException e) {\n    if (e.getMessage().startsWith(\"Unsupported syntax:\")) {\n        // materialize subquery as a CTAS temp table first\n    }\n}","preventionTips":["Materialize subqueries/joins into CREATE TABLE ... AS SELECT temp tables before INSERT","Use only 'FROM table_name' in INSERT statements","Push complex query logic into the CTAS transform step"],"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"}