**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. 
"\n"
                                    "Note that there is no ';' just after format name, "
                                    "you need to put at least one whitespace symbol before the data.", ErrorCodes::SYNTAX_ERROR);
        while (data < end && (*data == ' ' || *data == '\t' || *data == '\f'))
            ++data;
        
        if (data < end && *data == '\r')
            ++data;
        if (data < end && *data == '\n')
            ++data;
    }
    
    auto query = std::make_shared<ASTInsertQuery>();
    node = query;
    if (infile)
    {
        query->infile = infile;
        if (compression)
            query->compression = compression;
    }
    if (table_function)
    {
        query->table_function = table_function;
        query->partition_by = partition_by_expr;
    }
    else
    {
        query->database = database;
        query->table = table;
        if (database)