From 27685bc7993425e2ca02cf9497b648b9d9a2a453 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Fri, 23 Apr 2021 12:39:44 -0400 Subject: [PATCH] LibSQL: Add Parser::parse_schema_and_table_name helper Another common semantic is parsing an identifier of the form "schema_name.table_name" / "table_name". Add a helper to do this work. This helper does not parse any optional alias after the table name. some syntaxes specify an alias using the AS keyword, some let the AS keyword be optional, and others just parse it as an identifier. So callers to this helper will just continue parsing the alias however they require. --- Userland/Libraries/LibSQL/Parser.cpp | 57 +++++++++------------------- Userland/Libraries/LibSQL/Parser.h | 1 + 2 files changed, 18 insertions(+), 40 deletions(-) diff --git a/Userland/Libraries/LibSQL/Parser.cpp b/Userland/Libraries/LibSQL/Parser.cpp index 7752a62e6a..4e8e813eb6 100644 --- a/Userland/Libraries/LibSQL/Parser.cpp +++ b/Userland/Libraries/LibSQL/Parser.cpp @@ -72,16 +72,9 @@ NonnullRefPtr Parser::parse_create_table_statement() is_error_if_table_exists = false; } - String schema_or_table_name = consume(TokenType::Identifier).value(); String schema_name; String table_name; - - if (consume_if(TokenType::Period)) { - schema_name = move(schema_or_table_name); - table_name = consume(TokenType::Identifier).value(); - } else { - table_name = move(schema_or_table_name); - } + parse_schema_and_table_name(schema_name, table_name); // FIXME: Parse "AS select-stmt". @@ -107,16 +100,9 @@ NonnullRefPtr Parser::parse_drop_table_statement() is_error_if_table_does_not_exist = false; } - String schema_or_table_name = consume(TokenType::Identifier).value(); String schema_name; String table_name; - - if (consume_if(TokenType::Period)) { - schema_name = move(schema_or_table_name); - table_name = consume(TokenType::Identifier).value(); - } else { - table_name = move(schema_or_table_name); - } + parse_schema_and_table_name(schema_name, table_name); consume(TokenType::SemiColon); @@ -633,16 +619,9 @@ Optional> Parser::parse_in_expression(NonnullRefPtr(move(expression), move(chain), invert_expression); } - String schema_or_table_name = consume(TokenType::Identifier).value(); String schema_name; String table_name; - - if (consume_if(TokenType::Period)) { - schema_name = move(schema_or_table_name); - table_name = consume(TokenType::Identifier).value(); - } else { - table_name = move(schema_or_table_name); - } + parse_schema_and_table_name(schema_name, table_name); if (match(TokenType::ParenOpen)) { // FIXME: Parse "table-function". @@ -724,16 +703,9 @@ NonnullRefPtr Parser::parse_common_table_expression() NonnullRefPtr Parser::parse_qualified_table_name() { // https://sqlite.org/syntax/qualified-table-name.html - String schema_or_table_name = consume(TokenType::Identifier).value(); String schema_name; String table_name; - - if (consume_if(TokenType::Period)) { - schema_name = move(schema_or_table_name); - table_name = consume(TokenType::Identifier).value(); - } else { - table_name = move(schema_or_table_name); - } + parse_schema_and_table_name(schema_name, table_name); String alias; if (consume_if(TokenType::As)) @@ -803,16 +775,9 @@ NonnullRefPtr Parser::parse_table_or_subquery() { // https://sqlite.org/syntax/table-or-subquery.html if (match(TokenType::Identifier)) { - String schema_or_table_name = consume().value(); String schema_name; String table_name; - - if (consume_if(TokenType::Period)) { - schema_name = move(schema_or_table_name); - table_name = consume(TokenType::Identifier).value(); - } else { - table_name = move(schema_or_table_name); - } + parse_schema_and_table_name(schema_name, table_name); String table_alias; if (consume_if(TokenType::As) || match(TokenType::Identifier)) @@ -859,6 +824,18 @@ NonnullRefPtr Parser::parse_ordering_term() return create_ast_node(move(expression), move(collation_name), order, nulls); } +void Parser::parse_schema_and_table_name(String& schema_name, String& table_name) +{ + String schema_or_table_name = consume(TokenType::Identifier).value(); + + if (consume_if(TokenType::Period)) { + schema_name = move(schema_or_table_name); + table_name = consume(TokenType::Identifier).value(); + } else { + table_name = move(schema_or_table_name); + } +} + Token Parser::consume() { auto old_token = m_parser_state.m_token; diff --git a/Userland/Libraries/LibSQL/Parser.h b/Userland/Libraries/LibSQL/Parser.h index 827d60c37c..6d6cf91591 100644 --- a/Userland/Libraries/LibSQL/Parser.h +++ b/Userland/Libraries/LibSQL/Parser.h @@ -84,6 +84,7 @@ private: NonnullRefPtr parse_result_column(); NonnullRefPtr parse_table_or_subquery(); NonnullRefPtr parse_ordering_term(); + void parse_schema_and_table_name(String& schema_name, String& table_name); template void parse_comma_separated_list(bool surrounded_by_parentheses, ParseCallback&& parse_callback)