in exposed-r2dbc/src/main/kotlin/org/jetbrains/exposed/v1/r2dbc/statements/api/R2dbcDatabaseMetadataImpl.kt [162:188]
override suspend fun columns(vararg tables: Table): Map<Table, List<ColumnMetadata>> {
val result = mutableMapOf<Table, List<ColumnMetadata>>()
val useSchemaInsteadOfDatabase = currentDialect is MysqlDialect
val tablesBySchema = tables.groupBy { identifierManager.inProperCase(it.schemaName ?: getCurrentSchema()) }
for ((schema, schemaTables) in tablesBySchema.entries) {
for (table in schemaTables) {
val catalog = if (!useSchemaInsteadOfDatabase || schema == getCurrentSchema()) getDatabaseName() else schema
// TODO is this necessary with R2DBC? Answer is no, because all data is returned by getColumns() query below
// But it is temporarily left in as executeSQL block below needs to be refactored to process & emit 2 different results
val prefetchedColumnTypes = fetchAllColumnTypes(table.nameInDatabaseCase())
val query = metadataProvider.getColumns(catalog, schema, table.nameInDatabaseCaseUnquoted())
@OptIn(InternalApi::class)
val columns = connection.executeSQL(query) { row, _ ->
// Unlike JdbcResult, R2dbcResult is split apart for ResultApi vs RowApi, so a 2nd arg placeholder has to be used
with(ExposedMetadataUtils) {
R2dbcRow(row, R2dbcRegistryTypeMappingImpl()).asColumnMetadata(prefetchedColumnTypes)
}
}.orEmpty()
check(columns.isNotEmpty())
result[table] = columns
}
}
return result
}