Better highlighting of keywords

This commit is contained in:
Alexey Milovidov 2024-04-28 00:19:17 +02:00
parent f7b6a1149a
commit 5a9c5b7d50
10 changed files with 64 additions and 67 deletions

View File

@ -2085,28 +2085,28 @@ bool ParserOrderByElement::parseImpl(Pos & pos, ASTPtr & node, Expected & expect
int direction = 1; int direction = 1;
if (descending.ignore(pos) || desc.ignore(pos)) if (descending.ignore(pos, expected) || desc.ignore(pos, expected))
direction = -1; direction = -1;
else else
ascending.ignore(pos) || asc.ignore(pos); ascending.ignore(pos, expected) || asc.ignore(pos, expected);
int nulls_direction = direction; int nulls_direction = direction;
bool nulls_direction_was_explicitly_specified = false; bool nulls_direction_was_explicitly_specified = false;
if (nulls.ignore(pos)) if (nulls.ignore(pos, expected))
{ {
nulls_direction_was_explicitly_specified = true; nulls_direction_was_explicitly_specified = true;
if (first.ignore(pos)) if (first.ignore(pos, expected))
nulls_direction = -direction; nulls_direction = -direction;
else if (last.ignore(pos)) else if (last.ignore(pos, expected))
; ;
else else
return false; return false;
} }
ASTPtr locale_node; ASTPtr locale_node;
if (collate.ignore(pos)) if (collate.ignore(pos, expected))
{ {
if (!collate_locale_parser.parse(pos, locale_node, expected)) if (!collate_locale_parser.parse(pos, locale_node, expected))
return false; return false;
@ -2117,16 +2117,16 @@ bool ParserOrderByElement::parseImpl(Pos & pos, ASTPtr & node, Expected & expect
ASTPtr fill_from; ASTPtr fill_from;
ASTPtr fill_to; ASTPtr fill_to;
ASTPtr fill_step; ASTPtr fill_step;
if (with_fill.ignore(pos)) if (with_fill.ignore(pos, expected))
{ {
has_with_fill = true; has_with_fill = true;
if (from.ignore(pos) && !exp_parser.parse(pos, fill_from, expected)) if (from.ignore(pos, expected) && !exp_parser.parse(pos, fill_from, expected))
return false; return false;
if (to.ignore(pos) && !exp_parser.parse(pos, fill_to, expected)) if (to.ignore(pos, expected) && !exp_parser.parse(pos, fill_to, expected))
return false; return false;
if (step.ignore(pos) && !exp_parser.parse(pos, fill_step, expected)) if (step.ignore(pos, expected) && !exp_parser.parse(pos, fill_step, expected))
return false; return false;
} }
@ -2254,27 +2254,27 @@ bool ParserTTLElement::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
DataDestinationType destination_type = DataDestinationType::DELETE; DataDestinationType destination_type = DataDestinationType::DELETE;
String destination_name; String destination_name;
if (s_to_disk.ignore(pos)) if (s_to_disk.ignore(pos, expected))
{ {
mode = TTLMode::MOVE; mode = TTLMode::MOVE;
destination_type = DataDestinationType::DISK; destination_type = DataDestinationType::DISK;
} }
else if (s_to_volume.ignore(pos)) else if (s_to_volume.ignore(pos, expected))
{ {
mode = TTLMode::MOVE; mode = TTLMode::MOVE;
destination_type = DataDestinationType::VOLUME; destination_type = DataDestinationType::VOLUME;
} }
else if (s_group_by.ignore(pos)) else if (s_group_by.ignore(pos, expected))
{ {
mode = TTLMode::GROUP_BY; mode = TTLMode::GROUP_BY;
} }
else if (s_recompress.ignore(pos)) else if (s_recompress.ignore(pos, expected))
{ {
mode = TTLMode::RECOMPRESS; mode = TTLMode::RECOMPRESS;
} }
else else
{ {
s_delete.ignore(pos); s_delete.ignore(pos, expected);
mode = TTLMode::DELETE; mode = TTLMode::DELETE;
} }
@ -2286,7 +2286,7 @@ bool ParserTTLElement::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
if (mode == TTLMode::MOVE) if (mode == TTLMode::MOVE)
{ {
if (s_if_exists.ignore(pos)) if (s_if_exists.ignore(pos, expected))
if_exists = true; if_exists = true;
ASTPtr ast_space_name; ASTPtr ast_space_name;
@ -2300,7 +2300,7 @@ bool ParserTTLElement::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
if (!parser_keys_list.parse(pos, group_by_key, expected)) if (!parser_keys_list.parse(pos, group_by_key, expected))
return false; return false;
if (s_set.ignore(pos)) if (s_set.ignore(pos, expected))
{ {
ParserList parser_assignment_list( ParserList parser_assignment_list(
std::make_unique<ParserAssignment>(), std::make_unique<ParserToken>(TokenType::Comma)); std::make_unique<ParserAssignment>(), std::make_unique<ParserToken>(TokenType::Comma));
@ -2309,14 +2309,14 @@ bool ParserTTLElement::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
return false; return false;
} }
} }
else if (mode == TTLMode::DELETE && s_where.ignore(pos)) else if (mode == TTLMode::DELETE && s_where.ignore(pos, expected))
{ {
if (!parser_exp.parse(pos, where_expr, expected)) if (!parser_exp.parse(pos, where_expr, expected))
return false; return false;
} }
else if (mode == TTLMode::RECOMPRESS) else if (mode == TTLMode::RECOMPRESS)
{ {
if (!s_codec.ignore(pos)) if (!s_codec.ignore(pos, expected))
return false; return false;
if (!parser_codec.parse(pos, recompression_codec, expected)) if (!parser_codec.parse(pos, recompression_codec, expected))

View File

@ -416,13 +416,13 @@ bool ParserKeyValuePair::parseImpl(Pos & pos, ASTPtr & node, Expected & expected
ParserToken open(TokenType::OpeningRoundBracket); ParserToken open(TokenType::OpeningRoundBracket);
ParserToken close(TokenType::ClosingRoundBracket); ParserToken close(TokenType::ClosingRoundBracket);
if (!open.ignore(pos)) if (!open.ignore(pos, expected))
return false; return false;
if (!kv_pairs_list.parse(pos, value, expected)) if (!kv_pairs_list.parse(pos, value, expected))
return false; return false;
if (!close.ignore(pos)) if (!close.ignore(pos, expected))
return false; return false;
with_brackets = true; with_brackets = true;

View File

@ -495,11 +495,11 @@ bool ParserAlterCommand::parseImpl(Pos & pos, ASTPtr & node, Expected & expected
command->type = ASTAlterCommand::MOVE_PARTITION; command->type = ASTAlterCommand::MOVE_PARTITION;
command->part = true; command->part = true;
if (s_to_disk.ignore(pos)) if (s_to_disk.ignore(pos, expected))
command->move_destination_type = DataDestinationType::DISK; command->move_destination_type = DataDestinationType::DISK;
else if (s_to_volume.ignore(pos)) else if (s_to_volume.ignore(pos, expected))
command->move_destination_type = DataDestinationType::VOLUME; command->move_destination_type = DataDestinationType::VOLUME;
else if (s_to_shard.ignore(pos)) else if (s_to_shard.ignore(pos, expected))
{ {
command->move_destination_type = DataDestinationType::SHARD; command->move_destination_type = DataDestinationType::SHARD;
} }
@ -519,11 +519,11 @@ bool ParserAlterCommand::parseImpl(Pos & pos, ASTPtr & node, Expected & expected
command->type = ASTAlterCommand::MOVE_PARTITION; command->type = ASTAlterCommand::MOVE_PARTITION;
if (s_to_disk.ignore(pos)) if (s_to_disk.ignore(pos, expected))
command->move_destination_type = DataDestinationType::DISK; command->move_destination_type = DataDestinationType::DISK;
else if (s_to_volume.ignore(pos)) else if (s_to_volume.ignore(pos, expected))
command->move_destination_type = DataDestinationType::VOLUME; command->move_destination_type = DataDestinationType::VOLUME;
else if (s_to_table.ignore(pos)) else if (s_to_table.ignore(pos, expected))
{ {
if (!parseDatabaseAndTableName(pos, expected, command->to_database, command->to_table)) if (!parseDatabaseAndTableName(pos, expected, command->to_database, command->to_table))
return false; return false;
@ -584,7 +584,7 @@ bool ParserAlterCommand::parseImpl(Pos & pos, ASTPtr & node, Expected & expected
if (!parser_partition.parse(pos, command_partition, expected)) if (!parser_partition.parse(pos, command_partition, expected))
return false; return false;
if (s_from.ignore(pos)) if (s_from.ignore(pos, expected))
{ {
if (!parseDatabaseAndTableName(pos, expected, command->from_database, command->from_table)) if (!parseDatabaseAndTableName(pos, expected, command->from_database, command->from_table))
return false; return false;

View File

@ -66,13 +66,13 @@ bool ParserNestedTable::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
if (!name_p.parse(pos, name, expected)) if (!name_p.parse(pos, name, expected))
return false; return false;
if (!open.ignore(pos)) if (!open.ignore(pos, expected))
return false; return false;
if (!columns_p.parse(pos, columns, expected)) if (!columns_p.parse(pos, columns, expected))
return false; return false;
if (!close.ignore(pos)) if (!close.ignore(pos, expected))
return false; return false;
auto func = std::make_shared<ASTFunction>(); auto func = std::make_shared<ASTFunction>();

View File

@ -93,9 +93,9 @@ bool ParserDataType::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
else if (type_name_upper.find("INT") != std::string::npos) else if (type_name_upper.find("INT") != std::string::npos)
{ {
/// Support SIGNED and UNSIGNED integer type modifiers for compatibility with MySQL /// Support SIGNED and UNSIGNED integer type modifiers for compatibility with MySQL
if (ParserKeyword(Keyword::SIGNED).ignore(pos)) if (ParserKeyword(Keyword::SIGNED).ignore(pos, expected))
type_name_suffix = toStringView(Keyword::SIGNED); type_name_suffix = toStringView(Keyword::SIGNED);
else if (ParserKeyword(Keyword::UNSIGNED).ignore(pos)) else if (ParserKeyword(Keyword::UNSIGNED).ignore(pos, expected))
type_name_suffix = toStringView(Keyword::UNSIGNED); type_name_suffix = toStringView(Keyword::UNSIGNED);
else if (pos->type == TokenType::OpeningRoundBracket) else if (pos->type == TokenType::OpeningRoundBracket)
{ {
@ -105,9 +105,9 @@ bool ParserDataType::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
if (pos->type != TokenType::ClosingRoundBracket) if (pos->type != TokenType::ClosingRoundBracket)
return false; return false;
++pos; ++pos;
if (ParserKeyword(Keyword::SIGNED).ignore(pos)) if (ParserKeyword(Keyword::SIGNED).ignore(pos, expected))
type_name_suffix = toStringView(Keyword::SIGNED); type_name_suffix = toStringView(Keyword::SIGNED);
else if (ParserKeyword(Keyword::UNSIGNED).ignore(pos)) else if (ParserKeyword(Keyword::UNSIGNED).ignore(pos, expected))
type_name_suffix = toStringView(Keyword::UNSIGNED); type_name_suffix = toStringView(Keyword::UNSIGNED);
} }

View File

@ -188,7 +188,7 @@ bool ParserDictionary::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
ASTPtr ast_settings; ASTPtr ast_settings;
/// Primary is required to be the first in dictionary definition /// Primary is required to be the first in dictionary definition
if (primary_key_keyword.ignore(pos)) if (primary_key_keyword.ignore(pos, expected))
{ {
bool was_open = false; bool was_open = false;
@ -208,13 +208,13 @@ bool ParserDictionary::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
if (!ast_source && source_keyword.ignore(pos, expected)) if (!ast_source && source_keyword.ignore(pos, expected))
{ {
if (!open.ignore(pos)) if (!open.ignore(pos, expected))
return false; return false;
if (!key_value_pairs_p.parse(pos, ast_source, expected)) if (!key_value_pairs_p.parse(pos, ast_source, expected))
return false; return false;
if (!close.ignore(pos)) if (!close.ignore(pos, expected))
return false; return false;
continue; continue;
@ -222,13 +222,13 @@ bool ParserDictionary::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
if (!ast_lifetime && lifetime_keyword.ignore(pos, expected)) if (!ast_lifetime && lifetime_keyword.ignore(pos, expected))
{ {
if (!open.ignore(pos)) if (!open.ignore(pos, expected))
return false; return false;
if (!lifetime_p.parse(pos, ast_lifetime, expected)) if (!lifetime_p.parse(pos, ast_lifetime, expected))
return false; return false;
if (!close.ignore(pos)) if (!close.ignore(pos, expected))
return false; return false;
continue; continue;
@ -236,13 +236,13 @@ bool ParserDictionary::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
if (!ast_layout && layout_keyword.ignore(pos, expected)) if (!ast_layout && layout_keyword.ignore(pos, expected))
{ {
if (!open.ignore(pos)) if (!open.ignore(pos, expected))
return false; return false;
if (!layout_p.parse(pos, ast_layout, expected)) if (!layout_p.parse(pos, ast_layout, expected))
return false; return false;
if (!close.ignore(pos)) if (!close.ignore(pos, expected))
return false; return false;
continue; continue;
@ -250,13 +250,13 @@ bool ParserDictionary::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
if (!ast_range && range_keyword.ignore(pos, expected)) if (!ast_range && range_keyword.ignore(pos, expected))
{ {
if (!open.ignore(pos)) if (!open.ignore(pos, expected))
return false; return false;
if (!range_p.parse(pos, ast_range, expected)) if (!range_p.parse(pos, ast_range, expected))
return false; return false;
if (!close.ignore(pos)) if (!close.ignore(pos, expected))
return false; return false;
continue; continue;
@ -264,13 +264,13 @@ bool ParserDictionary::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
if (!ast_settings && settings_keyword.ignore(pos, expected)) if (!ast_settings && settings_keyword.ignore(pos, expected))
{ {
if (!open.ignore(pos)) if (!open.ignore(pos, expected))
return false; return false;
if (!settings_p.parse(pos, ast_settings, expected)) if (!settings_p.parse(pos, ast_settings, expected))
return false; return false;
if (!close.ignore(pos)) if (!close.ignore(pos, expected))
return false; return false;
continue; continue;

View File

@ -72,8 +72,7 @@ bool ParserRenameQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
else else
return false; return false;
const auto ignore_delim = [&] { return exchange ? s_and.ignore(pos) : s_to.ignore(pos); }; const auto ignore_delim = [&] { return exchange ? s_and.ignore(pos, expected) : s_to.ignore(pos, expected); };
ASTRenameQuery::Elements elements; ASTRenameQuery::Elements elements;

View File

@ -161,7 +161,7 @@ bool ParserShowTablesQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expec
} }
else else
{ {
if (s_temporary.ignore(pos)) if (s_temporary.ignore(pos, expected))
query->temporary = true; query->temporary = true;
if (!s_tables.ignore(pos, expected)) if (!s_tables.ignore(pos, expected))

View File

@ -109,17 +109,17 @@ bool ParserArrayJoin::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
} }
void ParserTablesInSelectQueryElement::parseJoinStrictness(Pos & pos, ASTTableJoin & table_join) static void parseJoinStrictness(IParser::Pos & pos, ASTTableJoin & table_join, Expected & expected)
{ {
if (ParserKeyword(Keyword::ANY).ignore(pos)) if (ParserKeyword(Keyword::ANY).ignore(pos, expected))
table_join.strictness = JoinStrictness::Any; table_join.strictness = JoinStrictness::Any;
else if (ParserKeyword(Keyword::ALL).ignore(pos)) else if (ParserKeyword(Keyword::ALL).ignore(pos, expected))
table_join.strictness = JoinStrictness::All; table_join.strictness = JoinStrictness::All;
else if (ParserKeyword(Keyword::ASOF).ignore(pos)) else if (ParserKeyword(Keyword::ASOF).ignore(pos, expected))
table_join.strictness = JoinStrictness::Asof; table_join.strictness = JoinStrictness::Asof;
else if (ParserKeyword(Keyword::SEMI).ignore(pos)) else if (ParserKeyword(Keyword::SEMI).ignore(pos, expected))
table_join.strictness = JoinStrictness::Semi; table_join.strictness = JoinStrictness::Semi;
else if (ParserKeyword(Keyword::ANTI).ignore(pos) || ParserKeyword(Keyword::ONLY).ignore(pos)) else if (ParserKeyword(Keyword::ANTI).ignore(pos, expected) || ParserKeyword(Keyword::ONLY).ignore(pos, expected))
table_join.strictness = JoinStrictness::Anti; table_join.strictness = JoinStrictness::Anti;
} }
@ -146,41 +146,41 @@ bool ParserTablesInSelectQueryElement::parseImpl(Pos & pos, ASTPtr & node, Expec
} }
else else
{ {
if (ParserKeyword(Keyword::GLOBAL).ignore(pos)) if (ParserKeyword(Keyword::GLOBAL).ignore(pos, expected))
table_join->locality = JoinLocality::Global; table_join->locality = JoinLocality::Global;
else if (ParserKeyword(Keyword::LOCAL).ignore(pos)) else if (ParserKeyword(Keyword::LOCAL).ignore(pos, expected))
table_join->locality = JoinLocality::Local; table_join->locality = JoinLocality::Local;
table_join->strictness = JoinStrictness::Unspecified; table_join->strictness = JoinStrictness::Unspecified;
/// Legacy: allow JOIN type before JOIN kind /// Legacy: allow JOIN type before JOIN kind
parseJoinStrictness(pos, *table_join); parseJoinStrictness(pos, *table_join, expected);
bool no_kind = false; bool no_kind = false;
if (ParserKeyword(Keyword::INNER).ignore(pos)) if (ParserKeyword(Keyword::INNER).ignore(pos, expected))
table_join->kind = JoinKind::Inner; table_join->kind = JoinKind::Inner;
else if (ParserKeyword(Keyword::LEFT).ignore(pos)) else if (ParserKeyword(Keyword::LEFT).ignore(pos, expected))
table_join->kind = JoinKind::Left; table_join->kind = JoinKind::Left;
else if (ParserKeyword(Keyword::RIGHT).ignore(pos)) else if (ParserKeyword(Keyword::RIGHT).ignore(pos, expected))
table_join->kind = JoinKind::Right; table_join->kind = JoinKind::Right;
else if (ParserKeyword(Keyword::FULL).ignore(pos)) else if (ParserKeyword(Keyword::FULL).ignore(pos, expected))
table_join->kind = JoinKind::Full; table_join->kind = JoinKind::Full;
else if (ParserKeyword(Keyword::CROSS).ignore(pos)) else if (ParserKeyword(Keyword::CROSS).ignore(pos, expected))
table_join->kind = JoinKind::Cross; table_join->kind = JoinKind::Cross;
else if (ParserKeyword(Keyword::PASTE).ignore(pos)) else if (ParserKeyword(Keyword::PASTE).ignore(pos, expected))
table_join->kind = JoinKind::Paste; table_join->kind = JoinKind::Paste;
else else
no_kind = true; no_kind = true;
/// Standard position: JOIN type after JOIN kind /// Standard position: JOIN type after JOIN kind
parseJoinStrictness(pos, *table_join); parseJoinStrictness(pos, *table_join, expected);
/// Optional OUTER keyword for outer joins. /// Optional OUTER keyword for outer joins.
if (table_join->kind == JoinKind::Left if (table_join->kind == JoinKind::Left
|| table_join->kind == JoinKind::Right || table_join->kind == JoinKind::Right
|| table_join->kind == JoinKind::Full) || table_join->kind == JoinKind::Full)
{ {
ParserKeyword(Keyword::OUTER).ignore(pos); ParserKeyword(Keyword::OUTER).ignore(pos, expected);
} }
if (no_kind) if (no_kind)

View File

@ -38,8 +38,6 @@ protected:
private: private:
bool is_first; bool is_first;
bool allow_alias_without_as_keyword; bool allow_alias_without_as_keyword;
static void parseJoinStrictness(Pos & pos, ASTTableJoin & table_join);
}; };