{"record":{"id":"7d259f67885d1bcd","repo":"prestodb/presto","slug":"duplicate-column-name-7d259f","errorCode":"DUPLICATE_COLUMN_NAME","errorMessage":"Insert column name is specified more than once: %s","messagePattern":"Insert column name is specified more than once: (.+?)","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/sql/analyzer/StatementAnalyzer.java","lineNumber":563,"sourceCode":"            List<String> tableColumns = columnsMetadata.stream()\n                    .filter(column -> !column.isHidden())\n                    .map(ColumnMetadata::getName)\n                    .collect(toImmutableList());\n\n            List<String> insertColumns;\n            if (insert.getColumns().isPresent()) {\n                insertColumns = insert.getColumns().get().stream()\n                        .map(Identifier::getValue)\n                        .map(column -> metadata.normalizeIdentifier(session, targetTable.getCatalogName(), column))\n                        .collect(toImmutableList());\n\n                Set<String> columnNames = new HashSet<>();\n                for (String insertColumn : insertColumns) {\n                    if (!tableColumns.contains(insertColumn)) {\n                        throw new SemanticException(MISSING_COLUMN, insert, \"Insert column name does not exist in target table: %s\", insertColumn);\n                    }\n                    if (!columnNames.add(insertColumn)) {\n                        throw new SemanticException(DUPLICATE_COLUMN_NAME, insert, \"Insert column name is specified more than once: %s\", insertColumn);\n                    }\n                }\n            }\n            else {\n                insertColumns = tableColumns;\n            }\n\n            List<ColumnMetadata> expectedColumns = insertColumns.stream()\n                    .map(insertColumn -> getColumnMetadata(columnsMetadata, insertColumn))\n                    .collect(toImmutableList());\n\n            checkTypesMatchForInsert(insert, queryScope, expectedColumns);\n\n            Map<String, ColumnHandle> columnHandles = tableColumnsMetadata.getColumnHandles();\n            analysis.setInsert(new Analysis.Insert(\n                    tableColumnsMetadata.getTableHandle().get(),\n                    insertColumns.stream().map(columnHandles::get).collect(toImmutableList())));\n","sourceCodeStart":545,"sourceCodeEnd":581,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/sql/analyzer/StatementAnalyzer.java#L545-L581","documentation":"When an INSERT statement lists its target columns explicitly, Presto requires each column to appear at most once. StatementAnalyzer.visitInsert uses a HashSet while iterating the provided insertColumns; if a name is added twice (columnNames.add returns false), it throws DUPLICATE_COLUMN_NAME.","triggerScenarios":"INSERT INTO t (a, a, b) VALUES (...) — the same column name appears twice in the explicit column list of the INSERT.","commonSituations":"Copy-paste or generated SQL accidentally repeating a column; adding a column to the list without removing the old positional entry; templating bugs in query builders that concatenate column lists.","solutions":["Remove the duplicated name from the INSERT column list so each target column appears exactly once.","If your driver/templating builds the column list, deduplicate or assert uniqueness on the list before rendering the SQL.","Omit the column list entirely to target all table columns in order (values must then match the full table schema)."],"exampleFix":"// before\nINSERT INTO orders (orderkey, custkey, custkey) VALUES (1, 2, 2);\n// after\nINSERT INTO orders (orderkey, custkey) VALUES (1, 2);","handlingStrategy":"validation","validationCode":"// JS-style pre-check on generated column lists:\nconst cols = ['orderkey', 'custkey', 'custkey'];\nconst dupes = cols.filter((c, i) => cols.indexOf(c) !== i);\nif (dupes.length) throw new Error('Duplicate INSERT columns: ' + dupes.join(', '));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Deduplicate column lists in any query-builder/templating code before rendering SQL.","When editing INSERT statements manually, re-read the full column list after additions.","Add a unit test asserting uniqueness of generated INSERT column lists."],"tags":["sql","insert","semantic-analysis","duplicate-column"],"backgroundTag":"duplicate-column-name","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}