**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. 
arg = argv[arg_num];
                external_tables_arguments.back().emplace_back(arg
            }
            else
                break;
        }
        else
        {
            in_external_group = false;
            /// Parameter arg after underline.
            )
            {
                const char * param_continuation = arg + strlen("--param_"
                const char * equal_pos = strchr(param_continuation, '='
                if (equal_pos == param_continuation)
                    throw Exception("Parameter name cannot be empty", ErrorCodes::BAD_ARGUMENTS
                if (equal_pos)
                {
                    /// param_name=value
                    quee(String(param_continuation, equal_pos), String(equal_pos + 1)
                }
                else
                {
                    /// param_name value
                    ++a
                    if (arg_num >= argc)
                        throw Exception("Parameter requires value", ErrorCodes::BAD_ARGUMENTS
                    arg = argv[arg_num];
                    quee(String(param_continuation), String(arg)
                }