`PRIMARY KEY (key1,key2,key3)` VS `PRIMARY KEY key1,key2,key3`

```
create database test;
use test;

create table dict_table ( key1 UInt64, key2 String, key3 String, S String)
Engine MergeTree order by (key1, key2, key3);

CREATE DICTIONARY item_dict ( key1 UInt64, key2 String, key3 String, S String ) 
PRIMARY KEY (key1,key2,key3) 
SOURCE(CLICKHOUSE(TABLE dict_table DB 'test' USER 'default')) 
LAYOUT(complex_key_direct());

Expected one of: list of elements, identifier

CREATE DICTIONARY item_dict ( key1 UInt64, key2 String, key3 String, S String ) 
PRIMARY KEY key1,key2,key3
SOURCE(CLICKHOUSE(TABLE dict_table DB 'test' USER 'default')) 
LAYOUT(complex_key_direct());
Ok.

0 rows in set. Elapsed: 0.007 sec.
```
return false;
    const ASTExpressionList & expr_list = ast_lifetime->as<const ASTExpressionList &>();
    if (expr_list.children.size() != 2)
        return false;
    bool initialized_max = false;
    
    for (const auto & elem : expr_list.children)
    {
        const ASTPair & pair = elem->as<const ASTPair &>();
        const ASTLiteral * literal = pair.second->as<ASTLiteral>();
        if (literal == nullptr)
            return false;
        if (literal->value.getType() != Field::Types::UInt64)
            return false;
        if (pair.first == "min")
            res->min_sec = literal->value.get<UInt64>();
        else if (pair.first == "max")
        {
            res->max_sec = literal->value.get<UInt64>();
            initialized_max = true;
        }
        else
            return false;
    }
    if (!initialized_max)
        return false;
    node = res;
    return true;
}
bool ParserDictionaryRange::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)