@@ -12,7 +12,6 @@ import java.sql.DatabaseMetaData
1212import java.sql.DriverManager
1313import java.sql.PreparedStatement
1414import java.sql.ResultSet
15- import java.sql.ResultSetMetaData
1615import javax.sql.DataSource
1716import kotlin.reflect.KType
1817
@@ -181,7 +180,7 @@ private fun executeQueryAndBuildDataFrame(
181180 configureStatement(statement)
182181 logger.debug { " Executing query: $sqlQuery " }
183182 statement.executeQuery().use { rs ->
184- val tableColumns = getTableColumnsMetadata(rs)
183+ val tableColumns = getTableColumnsMetadata(rs, determinedDbType )
185184 fetchAndConvertDataFromResultSet(tableColumns, rs, determinedDbType, limit, inferNullability)
186185 }
187186 }
@@ -562,7 +561,7 @@ public fun DataFrame.Companion.readResultSet(
562561 inferNullability : Boolean = true,
563562): AnyFrame {
564563 validateLimit(limit)
565- val tableColumns = getTableColumnsMetadata(resultSet)
564+ val tableColumns = getTableColumnsMetadata(resultSet, dbType )
566565 return fetchAndConvertDataFromResultSet(tableColumns, resultSet, dbType, limit, inferNullability)
567566}
568567
@@ -852,71 +851,8 @@ private fun readTableAsDataFrame(
852851 return dataFrame
853852}
854853
855- /* *
856- * Retrieves the metadata of the columns in the result set.
857- *
858- * @param rs the result set
859- * @return a mutable list of [TableColumnMetadata] objects,
860- * where each TableColumnMetadata object contains information such as the column type,
861- * JDBC type, size, and name.
862- */
863- internal fun getTableColumnsMetadata (rs : ResultSet ): MutableList <TableColumnMetadata > {
864- val metaData: ResultSetMetaData = rs.metaData
865- val numberOfColumns: Int = metaData.columnCount
866- val tableColumns = mutableListOf<TableColumnMetadata >()
867- val columnNameCounter = mutableMapOf<String , Int >()
868- val databaseMetaData: DatabaseMetaData = rs.statement.connection.metaData
869- val catalog: String? = rs.statement.connection.catalog.takeUnless { it.isNullOrBlank() }
870- val schema: String? = rs.statement.connection.schema.takeUnless { it.isNullOrBlank() }
871-
872- for (i in 1 until numberOfColumns + 1 ) {
873- val tableName = metaData.getTableName(i)
874- val columnName = metaData.getColumnName(i)
875-
876- // this algorithm works correctly only for SQL Table and ResultSet opened on one SQL table
877- val columnResultSet: ResultSet =
878- databaseMetaData.getColumns(catalog, schema, tableName, columnName)
879- val isNullable = if (columnResultSet.next()) {
880- columnResultSet.getString(" IS_NULLABLE" ) == " YES"
881- } else {
882- true // we assume that it's nullable by default
883- }
884-
885- val name = manageColumnNameDuplication(columnNameCounter, columnName)
886- val size = metaData.getColumnDisplaySize(i)
887- val type = metaData.getColumnTypeName(i)
888- val jdbcType = metaData.getColumnType(i)
889- val javaClassName = metaData.getColumnClassName(i)
890-
891- tableColumns + = TableColumnMetadata (name, type, jdbcType, size, javaClassName, isNullable)
892- }
893- return tableColumns
894- }
895-
896- /* *
897- * Manages the duplication of column names by appending a unique identifier to the original name if necessary.
898- *
899- * @param columnNameCounter a mutable map that keeps track of the count for each column name.
900- * @param originalName the original name of the column to be managed.
901- * @return the modified column name that is free from duplication.
902- */
903- internal fun manageColumnNameDuplication (columnNameCounter : MutableMap <String , Int >, originalName : String ): String {
904- var name = originalName
905- val count = columnNameCounter[originalName]
906-
907- if (count != null ) {
908- var incrementedCount = count + 1
909- while (columnNameCounter.containsKey(" ${originalName} _$incrementedCount " )) {
910- incrementedCount++
911- }
912- columnNameCounter[originalName] = incrementedCount
913- name = " ${originalName} _$incrementedCount "
914- } else {
915- columnNameCounter[originalName] = 0
916- }
917-
918- return name
919- }
854+ internal fun getTableColumnsMetadata (resultSet : ResultSet , dbType : DbType ): MutableList <TableColumnMetadata > =
855+ dbType.getTableColumnsMetadata(resultSet)
920856
921857/* *
922858 * Fetches and converts data from a ResultSet into a mutable map.
0 commit comments