override fun setValue()

in exposed-r2dbc/src/main/kotlin/org/jetbrains/exposed/v1/r2dbc/mappers/ArrayTypeMapper.kt [27:73]


    override fun setValue(
        statement: Statement,
        dialect: DatabaseDialect,
        typeMapping: R2dbcTypeMapping,
        columnType: IColumnType<*>,
        value: Any?,
        index: Int
    ): Boolean {
        if (columnType !is ArrayColumnType<*, *>) return false

        if (value == null) {
            statement.bindNull(index - 1, columnType.arrayDeclaration())
            return true
        }

        if (value !is Array<*>) return false

        // Special handling for arrays containing date/time types
        if (columnType.delegate is IDateColumnType && dialect !is PostgreSQLDialect) {
            // Convert java.sql.Date and java.sql.Timestamp to LocalDate/LocalDateTime/String
            // as R2DBC drivers may not support these types directly in arrays
            val convertedArray = value.map { element ->
                when (element) {
                    is java.sql.Date -> element.toLocalDate()
                    is java.sql.Timestamp -> element.toLocalDateTime()
                    else -> element
                }
            }.toTypedArray()

            val convertedValue = Parameters.`in`(R2dbcType.COLLECTION, convertedArray)
            statement.bind(index - 1, convertedValue)
            return true
        }

        if (dialect !is PostgreSQLDialect) {
            val convertedValue = Parameters.`in`(R2dbcType.COLLECTION, value)
            statement.bind(index - 1, convertedValue)
            return true
        }

        val result = when (val dimension = columnType.dimensions) {
            1 -> mapPgArray(dialect, typeMapping, columnType, value)
            else -> error("Unsupported array dimension: $dimension. https://github.com/pgjdbc/r2dbc-postgresql#data-type-mapping")
        }
        statement.bind(index - 1, result)
        return true
    }