mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 00:30:49 +00:00
Better highlighting of keywords
This commit is contained in:
parent
f7b6a1149a
commit
5a9c5b7d50
@ -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))
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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>();
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user