`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.
```
{
    ParserFunctionWithKeyValueArguments key_value_func_p( true);
    ASTPtr ast_func;
    if (!key_value_func_p.parse(pos, ast_func, expected))
        return false;
    const ASTFunctionWithKeyValueArguments & func = ast_func->as<const ASTFunctionWithKeyValueArguments &>();
    auto res = std::make_shared<ASTDictionaryLayout>();
    
    if (func.children.size() > 1)
        return false;
    res->layout_type = func.name;
    res->has_brackets = func.has_brackets;
    const ASTExpressionList & type_expr_list = func.elements->as<const ASTExpressionList &>();
    
    if (!type_expr_list.children.empty() && !res->has_brackets)
        return false;
    res->set(res->parameters, func.elements);
    node = res;
    return true;
}
bool ParserDictionarySettings::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)