**Use case**

This works:

```
SELECT * FROM hits_100m_obfuscated INTO OUTFILE 'hits.csv' FORMAT CSV
```

But I want this:

```
SELECT * FROM hits_100m_obfuscated INTO OUTFILE 'hits.csv'
```

**Describe the solution you'd like**

Every format can register file extension(s) in format factory.
If format is not specified explicitly, we can detect it automatically by file extension.
It should work for compressed files `hits.csv.gz` as well.

The following extensions should be supported at least:
csv, tsv, parquet, orc, native, json, ndjson, xml, md, avro

**Addition details**

Let's also support omitting the format argument for `file`, `url`, `s3`, `hdfs` table functions. 
const auto & host_names = typeid_cast<const ColumnString &>(*block.getByName("host_name").column
        const auto & array_values = typeid_cast<const ColumnInt64 &>(*block.getByName("value").column).getData(
        const auto * user_time_name = ProfileEvents::getName(ProfileEvents::UserTimeMicroseconds
        const auto * system_time_name = ProfileEvents::getName(ProfileEvents::SystemTimeMicroseconds
        HostToThreadTimesMap thread_times;
        for (size_t i = 0; i < rows; ++i)
        {
            auto thread_id = array_thread_id[i];
            auto host_name = host_names.getDataAt(i).toString(
            if (thread_id != 0)
                progress_indication.addThreadIdToList(host_name, thread_id
            auto event_name = names.getDataAt(i
            auto value = array_values[i];
            if (event_name == user_time_name)
            {
                thread_times[host_name][thread_id].user_ms = value;
            }
            else if (event_name == system_time_name)
            {
                thread_times[host_name][thread_id].system_ms = value;
            }
            else if (event_name == MemoryTracker::USAGE_EVENT_NAME)
            {
                thread_times[host_name][thread_id].memory_usage = value;
            }
        }
        auto elapsed_time = profile_events.watch.elapsedMicroseconds(
        progress_indication.updateThreadEventData(thread_times, elapsed_time
        if (profile_events.print)
        {