override suspend fun columns()

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
    }