diff --git a/src/parser/insert-values-parser.ts b/src/parser/insert-values-parser.ts index 758b8cffd..f52f8e495 100644 --- a/src/parser/insert-values-parser.ts +++ b/src/parser/insert-values-parser.ts @@ -100,11 +100,13 @@ function parseRowValues( }) let hasUndefinedOrComplexColumns = false + let indexedRowColumns = rowColumns.length for (const col of rowColumns) { const columnIdx = columns.get(col) if (isUndefined(columnIdx)) { + indexedRowColumns-- continue } @@ -117,7 +119,7 @@ function parseRowValues( rowValues[columnIdx] = value } - const hasMissingColumns = rowColumns.length < columns.size + const hasMissingColumns = indexedRowColumns < columns.size if (hasMissingColumns || hasUndefinedOrComplexColumns) { const defaultValue = DefaultInsertValueNode.create() diff --git a/test/node/src/insert.test.ts b/test/node/src/insert.test.ts index 2d8069784..9be13a1d7 100644 --- a/test/node/src/insert.test.ts +++ b/test/node/src/insert.test.ts @@ -762,6 +762,42 @@ for (const dialect of DIALECTS) { await query.execute() }) + // https://github.com/kysely-org/kysely/issues/1310 + it('should insert multiple rows while falling back to default values in partial rows - different shapes edge case issue - issue #1310', async () => { + const query = ctx.db.insertInto('person').values([ + { + gender: 'female', + marital_status: 'divorced', // <--- only exists here. + children: undefined, // <--- always undefined explicitly. + }, + { + gender: 'female', + children: undefined, // <--- always undefined explicitly. + }, + ]) + + testSql(query, dialect, { + postgres: { + sql: `insert into "person" ("gender", "marital_status") values ($1, $2), ($3, default)`, + parameters: ['female', 'divorced', 'female'], + }, + mysql: { + sql: `insert into \`person\` (\`gender\`, \`marital_status\`) values (?, ?), (?, default)`, + parameters: ['female', 'divorced', 'female'], + }, + mssql: { + sql: `insert into "person" ("gender", "marital_status") values (@1, @2), (@3, default)`, + parameters: ['female', 'divorced', 'female'], + }, + sqlite: { + sql: `insert into "person" ("gender", "marital_status") values (?, ?), (?, null)`, + parameters: ['female', 'divorced', 'female'], + }, + }) + + await query.execute() + }) + it('should insert multiple rows while falling back to default values in partial rows - undefined/missing columns', async () => { const query = ctx.db.insertInto('person').values([ {