**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. 
if (profile_events.watch.elapsedMilliseconds() >= profile_events.delay_ms)
            {
                initLogsOutputStream(
                progress_indication.clearProgressOutput(
                logs_out_stream->writeProfileEvents(block
                logs_out_stream->flush(
                profile_events.last_block = {};
            }
            else
            {
                incrementProfileEventsBlock(profile_events.last_block, block
            }
        }
        profile_events.watch.restart(
    }
}
/// Flush all buffers.
void ClientBase::resetOutput()
{
    output_format.reset(
    logs_out_stream.reset(
    if (pager_cmd)
    {
        pager_cmd->in.close(
        pager_cmd->wait(
    }
    pager_cmd = nullptr;
    if (out_file_buf)
    {
        out_file_buf->next(