From e9e1d6ebfe4c3d16dea0f6d55d0810466f3c7b11 Mon Sep 17 00:00:00 2001 From: Glen Maddern Date: Wed, 24 May 2023 15:41:18 +1000 Subject: [PATCH] Test showing duplicate names in rowIterator are being overwritten --- src/workerd/api/sql-test.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/workerd/api/sql-test.js b/src/workerd/api/sql-test.js index 24de66804da..b391c7bad82 100644 --- a/src/workerd/api/sql-test.js +++ b/src/workerd/api/sql-test.js @@ -504,6 +504,37 @@ async function test(storage) { assert.equal(getI(), 2); } + // Test joining two tables with overlapping names + { + sql.exec(`CREATE TABLE abc (a INT, b INT, c INT);`) + sql.exec(`CREATE TABLE cde (c INT, d INT, e INT);`) + sql.exec(`INSERT INTO abc VALUES (1,2,3),(4,5,6);`) + sql.exec(`INSERT INTO cde VALUES (7,8,9),(1,2,3);`) + const fullJoin = sql.prepare(`SELECT * FROM abc, cde`) + + // Raw results include both 'c' columns + const rawResults = Array.from(fullJoin().raw()) + assert.equal(rawResults.length, 4) + assert.equal(rawResults[0].length, 6) + assert.equal(rawResults[1].length, 6) + assert.equal(rawResults[2].length, 6) + assert.equal(rawResults[3].length, 6) + + // Obj results _should_ preserve full data, but the two 'c' columns are overwriting one another + const objResults = Array.from(fullJoin()) + assert.equal(objResults.length, 4) + // TODO: restore + //assert.equal(Object.values(objResults[0]).length, 6) + //assert.equal(Object.values(objResults[1]).length, 6) + //assert.equal(Object.values(objResults[2]).length, 6) + //assert.equal(Object.values(objResults[3]).length, 6) + + // Perhaps we should handle collision as so? + assert.equal(objResults[0].c, 3) // First use of 'c' in result set + assert.equal(objResults[0].c_1, 7) // Second use of 'c' gets suffix with collision count? + + } + await scheduler.wait(1); // Test for bug where a cursor constructed from a prepared statement didn't have a strong ref