When user requested single column from the table we still calculating all of them. Calculation of some columns is quite expensive (need to do stat calls / read files etc). 
: query_id(context.getCurrentQueryId()), settings(context.getSettings())
{
    
    
    Block block_to_filter;
    MutableColumnPtr table_column_mut = ColumnString::create();
    MutableColumnPtr engine_column_mut = ColumnString::create();
    MutableColumnPtr active_column_mut = ColumnUInt8::create();
    const auto access = context.getAccess();
    const bool check_access_for_tables = !access->isGranted(AccessType::SHOW_TABLES);
    {
        Databases databases = DatabaseCatalog::instance().getDatabases();
        
        MutableColumnPtr database_column_mut = ColumnString::create();
        for (const auto & database : databases)
        {
            
            
            if (database.second->canContainMergeTreeTables())
                database_column_mut->insert(database.first);
        }
        block_to_filter.insert(ColumnWithTypeAndName(
            std::move(database_column_mut), std::make_shared<DataTypeString>(), "database"));
        
        VirtualColumnUtils::filterBlockWithQuery(query_info.query, block_to_filter, context);
        rows = block_to_filter.rows();
        
        ColumnPtr database_column_for_filter = block_to_filter.getByName("database").column;