`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.
```
{
    ParserToken s_comma(TokenType::Comma);
    SettingsChanges changes;
    while (true)
    {
        if (!changes.empty() && !s_comma.ignore(pos))
            break;
        changes.push_back(SettingChange{});
        if (!ParserSetQuery::parseNameValuePair(changes.back(), pos, expected))
            return false;
    }
    auto query = std::make_shared<ASTDictionarySettings>();
    query->changes = std::move(changes);
    node = query;
    return true;
}
bool ParserDictionary::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
{
    ParserKeyword primary_key_keyword("PRIMARY KEY");
    ParserKeyword source_keyword("SOURCE");
    ParserKeyword lifetime_keyword("LIFETIME");
    ParserKeyword range_keyword("RANGE");
    ParserKeyword layout_keyword("LAYOUT");
    ParserKeyword settings_keyword("SETTINGS");