**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. 
extern const Event UserTimeMicroseconds;
    extern const Event SystemTimeMicroseconds;
}
namespace DB
{
static void incrementProfileEventsBlock(Block & dst, const Block & src)
{
    if (!dst)
    {
        dst = src;
        return;
    }
    assertBlocksHaveEqualStructure(src, dst, "ProfileEvents"
    std::unordered_map<String, size_t> name_pos;
    for (size_t i = 0; i < dst.columns( ++i)
        name_pos[dst.getByPosition(i).name] = i;
    size_t dst_rows = dst.rows(
    MutableColumns mutable_columns = dst.mutateColumns(
    auto & dst_column_host_name = typeid_cast<ColumnString &>(*mutable_columns[name_pos["host_name"]]
    auto & dst_array_current_time = typeid_cast<ColumnUInt32 &>(*mutable_columns[name_pos["current_time"]]).getData(
    auto & dst_array_thread_id = typeid_cast<ColumnUInt64 &>(*mutable_columns[name_pos["thread_id"]]).getData(
    auto & dst_array_type = typeid_cast<ColumnInt8 &>(*mutable_columns[name_pos["type"]]).getData(
    auto & dst_column_name = typeid_cast<ColumnString &>(*mutable_columns[name_pos["name"]]
    auto & dst_array_value = typeid_cast<ColumnInt64 &>(*mutable_columns[name_pos["value"]]).getData(
    const auto & src_column_host_name = typeid_cast<const ColumnString &>(*src.getByName("host_name").column
    const auto & src_array_current_time = typeid_cast<const ColumnUInt32 &>(*src.getByName("current_time").column).getData(
    const auto & src_array_thread_id = typeid_cast<const ColumnUInt64 &>(*src.getByName("thread_id").column).getData(
    const auto & src_column_name = typeid_cast<const ColumnString &>(*src.getByName("name").column
    const auto & src_array_value = typeid_cast<const ColumnInt64 &>(*src.getByName("value").column).getData(
    struct Id