瀏覽代碼

LibSQL: Fix handling of optional AS keywords

In some syntaxes, using the 'AS' keyword to define an alias is optional.
But if it does appear, an identifier better appear afterwards.
Timothy Flynn 4 年之前
父節點
當前提交
6a69b8efa7
共有 2 個文件被更改,包括 10 次插入11 次删除
  1. 6 11
      Userland/Libraries/LibSQL/Parser.cpp
  2. 4 0
      Userland/Libraries/LibSQL/Tests/TestSqlStatementParser.cpp

+ 6 - 11
Userland/Libraries/LibSQL/Parser.cpp

@@ -822,11 +822,9 @@ NonnullRefPtr<ReturningClause> Parser::parse_returning_clause()
     do {
     do {
         auto expression = parse_expression();
         auto expression = parse_expression();
 
 
-        consume_if(TokenType::As); // 'AS' is optional.
-
         String column_alias;
         String column_alias;
-        if (match(TokenType::Identifier))
-            column_alias = consume().value();
+        if (consume_if(TokenType::As) || match(TokenType::Identifier))
+            column_alias = consume(TokenType::Identifier).value();
 
 
         columns.append({ move(expression), move(column_alias) });
         columns.append({ move(expression), move(column_alias) });
         if (!match(TokenType::Comma))
         if (!match(TokenType::Comma))
@@ -860,11 +858,10 @@ NonnullRefPtr<ResultColumn> Parser::parse_result_column()
     auto expression = table_name.is_null()
     auto expression = table_name.is_null()
         ? parse_expression()
         ? parse_expression()
         : static_cast<NonnullRefPtr<Expression>>(*parse_column_name_expression(move(table_name), parsed_period));
         : static_cast<NonnullRefPtr<Expression>>(*parse_column_name_expression(move(table_name), parsed_period));
-    consume_if(TokenType::As); // 'AS' is optional.
 
 
     String column_alias;
     String column_alias;
-    if (match(TokenType::Identifier))
-        column_alias = consume().value();
+    if (consume_if(TokenType::As) || match(TokenType::Identifier))
+        column_alias = consume(TokenType::Identifier).value();
 
 
     return create_ast_node<ResultColumn>(move(expression), move(column_alias));
     return create_ast_node<ResultColumn>(move(expression), move(column_alias));
 }
 }
@@ -884,11 +881,9 @@ NonnullRefPtr<TableOrSubquery> Parser::parse_table_or_subquery()
             table_name = move(schema_or_table_name);
             table_name = move(schema_or_table_name);
         }
         }
 
 
-        consume_if(TokenType::As); // 'AS' is optional.
-
         String table_alias;
         String table_alias;
-        if (match(TokenType::Identifier))
-            table_alias = consume().value();
+        if (consume_if(TokenType::As) || match(TokenType::Identifier))
+            table_alias = consume(TokenType::Identifier).value();
 
 
         return create_ast_node<TableOrSubquery>(move(schema_name), move(table_name), move(table_alias));
         return create_ast_node<TableOrSubquery>(move(schema_name), move(table_name), move(table_alias));
     }
     }

+ 4 - 0
Userland/Libraries/LibSQL/Tests/TestSqlStatementParser.cpp

@@ -148,6 +148,8 @@ TEST_CASE(delete_)
     EXPECT(parse("DELETE FROM table WHERE 15").is_error());
     EXPECT(parse("DELETE FROM table WHERE 15").is_error());
     EXPECT(parse("DELETE FROM table WHERE 15 RETURNING").is_error());
     EXPECT(parse("DELETE FROM table WHERE 15 RETURNING").is_error());
     EXPECT(parse("DELETE FROM table WHERE 15 RETURNING *").is_error());
     EXPECT(parse("DELETE FROM table WHERE 15 RETURNING *").is_error());
+    EXPECT(parse("DELETE FROM table WHERE 15 RETURNING column").is_error());
+    EXPECT(parse("DELETE FROM table WHERE 15 RETURNING column AS;").is_error());
     EXPECT(parse("DELETE FROM table WHERE (');").is_error());
     EXPECT(parse("DELETE FROM table WHERE (');").is_error());
     EXPECT(parse("WITH DELETE FROM table;").is_error());
     EXPECT(parse("WITH DELETE FROM table;").is_error());
     EXPECT(parse("WITH table DELETE FROM table;").is_error());
     EXPECT(parse("WITH table DELETE FROM table;").is_error());
@@ -243,6 +245,7 @@ TEST_CASE(select)
     EXPECT(parse("SELECT *").is_error());
     EXPECT(parse("SELECT *").is_error());
     EXPECT(parse("SELECT * FROM;").is_error());
     EXPECT(parse("SELECT * FROM;").is_error());
     EXPECT(parse("SELECT table. FROM table;").is_error());
     EXPECT(parse("SELECT table. FROM table;").is_error());
+    EXPECT(parse("SELECT column AS FROM table;").is_error());
     EXPECT(parse("SELECT * FROM (").is_error());
     EXPECT(parse("SELECT * FROM (").is_error());
     EXPECT(parse("SELECT * FROM ()").is_error());
     EXPECT(parse("SELECT * FROM ()").is_error());
     EXPECT(parse("SELECT * FROM ();").is_error());
     EXPECT(parse("SELECT * FROM ();").is_error());
@@ -250,6 +253,7 @@ TEST_CASE(select)
     EXPECT(parse("SELECT * FROM (table1, )").is_error());
     EXPECT(parse("SELECT * FROM (table1, )").is_error());
     EXPECT(parse("SELECT * FROM (table1, table2)").is_error());
     EXPECT(parse("SELECT * FROM (table1, table2)").is_error());
     EXPECT(parse("SELECT * FROM table").is_error());
     EXPECT(parse("SELECT * FROM table").is_error());
+    EXPECT(parse("SELECT * FROM table AS;").is_error());
     EXPECT(parse("SELECT * FROM table WHERE;").is_error());
     EXPECT(parse("SELECT * FROM table WHERE;").is_error());
     EXPECT(parse("SELECT * FROM table WHERE 1 ==1").is_error());
     EXPECT(parse("SELECT * FROM table WHERE 1 ==1").is_error());
     EXPECT(parse("SELECT * FROM table GROUP;").is_error());
     EXPECT(parse("SELECT * FROM table GROUP;").is_error());