It seems MaterializeMySQL doesn't support Decimal data type when doing replication.
{
        for (const auto idx : ext::range(0, row.size()))
        {
            const auto value = row[idx];
            const auto & sample = description.sample_block.getByPosition(idx);
            if (!value.isNull())
            {
                if (description.types[idx].second)
                {
                    ColumnNullable & column_nullable = assert_cast<ColumnNullable &>(*columns[idx]);
                    const auto & data_type = assert_cast<const DataTypeNullable &>(*sample.type);
                    insertValue(*data_type.getNestedType(), column_nullable.getNestedColumn(), description.types[idx].first, value);
                    column_nullable.getNullMapData().emplace_back(0);
                }
                else
                    insertValue(*sample.type, *columns[idx], description.types[idx].first, value);
            }
            else
                insertDefaultValue(*columns[idx], *sample.column);
        }
        ++num_rows;
        if (num_rows == max_block_size)
            break;
        row = result.fetch();
    }
    return description.sample_block.cloneWithColumns(std::move(columns));
}
}
#endif