diff --git a/mockdriver/src/main/java/org/jaydebeapi/mockdriver/MockConnection.java b/mockdriver/src/main/java/org/jaydebeapi/mockdriver/MockConnection.java index 2468344a..6cf0d8f9 100644 --- a/mockdriver/src/main/java/org/jaydebeapi/mockdriver/MockConnection.java +++ b/mockdriver/src/main/java/org/jaydebeapi/mockdriver/MockConnection.java @@ -360,6 +360,12 @@ public final void mockType(String sqlTypesName) throws SQLException { Mockito.when(mockResultSet.getObject(1, LocalDateTime.class)).thenReturn(localDateTime); Mockito.when(mockResultSet.getTimestamp(1)).thenReturn(timestamp); break; + case Types.ARRAY: + // ExplicitTypeMapper remaps ARRAY to VARCHAR (toString fallback). + // Mock getString() so the Arrow adapter can read the degraded value. + object = "{1,2,3}"; + Mockito.when(mockResultSet.getString(1)).thenReturn((String) object); + break; default: object = "DummyObject"; break; diff --git a/test/test_hsqldb.py b/test/test_hsqldb.py index 5968c861..8e6ca72d 100644 --- a/test/test_hsqldb.py +++ b/test/test_hsqldb.py @@ -62,3 +62,32 @@ def test_multiple_simultaneous_connections(self): for conn in connections: conn.close() + + +class HsqldbArrayTypeTest(unittest.TestCase): + """Verify ARRAY type handling with HSQLDB (legacy issue baztian/jaydebeapi#159).""" + + def setUp(self): + driver = 'org.hsqldb.jdbcDriver' + url = 'jdbc:hsqldb:mem:array_test' + self.conn = jaydebeapiarrow.connect(driver, url, ['SA', ''], + experimental={'jvm_args': _SUPPRESS_LOGGING_ARGS}) + + def tearDown(self): + self.conn.close() + + def test_array_column_read(self): + """Verify ARRAY columns are readable as strings via ExplicitTypeMapper + VARCHAR fallback. Regression test for legacy issue baztian/jaydebeapi#159.""" + with self.conn.cursor() as cursor: + cursor.execute("CREATE TABLE test_array_type (id INT, data INTEGER ARRAY)") + try: + cursor.execute( + "INSERT INTO test_array_type (id, data) VALUES (1, ARRAY[1,2,3])" + ) + cursor.execute("SELECT data FROM test_array_type WHERE id = 1") + result = cursor.fetchone() + self.assertIsInstance(result[0], str) + self.assertIs(cursor.description[0][1], jaydebeapiarrow.ARRAY) + finally: + cursor.execute("DROP TABLE IF EXISTS test_array_type") diff --git a/test/test_mock.py b/test/test_mock.py index e87ea152..1acd278f 100644 --- a/test/test_mock.py +++ b/test/test_mock.py @@ -43,7 +43,7 @@ def tearDown(self): self.conn.close() # JDBC types not supported by the Arrow data path (no Arrow type mapping) - _ARROW_UNSUPPORTED_TYPES = {'OTHER', 'NCLOB', 'SQLXML', 'ROWID', 'ARRAY', + _ARROW_UNSUPPORTED_TYPES = {'OTHER', 'NCLOB', 'SQLXML', 'ROWID', 'TIME_WITH_TIMEZONE', 'TIMESTAMP_WITH_TIMEZONE'} def test_all_db_api_type_objects_have_valid_mapping(self): @@ -1150,3 +1150,15 @@ def test_lastrowid_none_after_insert(self): def test_lastrowid_none_after_executemany(self): """lastrowid should be None after executemany (mock driver limitation: skip).""" self.skipTest("Mock driver executeBatch returns None; covered by integration test") + + # --- ARRAY type tests (legacy issue #159) --- + + def test_array_column_returns_string_via_varchar_fallback(self): + """ARRAY columns are degraded to VARCHAR by ExplicitTypeMapper and + returned as Python strings (toString representation).""" + self.conn.jconn.mockType("ARRAY") + with self.conn.cursor() as cursor: + cursor.execute("dummy stmt") + result = cursor.fetchone() + self.assertIsInstance(result[0], str) + self.assertEqual(result[0], "{1,2,3}")