Lexer improvements:

- Convert unquoted idents to lowercase.
- Recognize quoted idents.
- Allow all unicode whitespace characters
- Added UnexpectedSymbol token for unexpected input (otherwise it is just ignored)
- Handle mixed case keywords in the lexer file instead of filtering the stream
This commit is contained in:
eelke 2022-04-03 20:09:58 +02:00
parent 81f27a6a18
commit 0da32b916c
6 changed files with 132 additions and 104 deletions

View file

@ -6,6 +6,37 @@
using namespace testing;
using namespace sqlast;
TEST(NewSqlLexer, Select)
{
std::string source = "SELECT";
antlr4::ANTLRInputStream input(source);
PgsqlLexer lexer(&input);
auto token = lexer.nextToken();
ASSERT_EQ(PgsqlLexer::Select, token->getType());
}
TEST(NewSqlLexer, Ident)
{
std::string source = "Abc";
antlr4::ANTLRInputStream input(source);
PgsqlLexer lexer(&input);
auto token = lexer.nextToken();
ASSERT_EQ(PgsqlLexer::Ident, token->getType());
ASSERT_EQ("abc", token->getText());
}
TEST(NewSqlLexer, QuotedIdent)
{
std::string source = "\"Abc\"";
antlr4::ANTLRInputStream input(source);
PgsqlLexer lexer(&input);
auto token = lexer.nextToken();
ASSERT_EQ(PgsqlLexer::Ident, token->getType());
ASSERT_EQ("Abc", token->getText());
}
TEST(NewSqlParser, statementList)
@ -47,3 +78,47 @@ TEST(NewSqlParser, selectList)
StringLiteral& string_literal = dynamic_cast<StringLiteral&>(si.GetExpression());
ASSERT_EQ("Tekst", string_literal.GetValue());
}
TEST(NewSqlParser, selectAliasWithoutAs)
{
std::string input_string = "SELECT 1 a";
Parser parser(input_string);
std::unique_ptr<sqlast::StatementList> program = parser.Parse();
ASSERT_TRUE(program != nullptr);
ASSERT_EQ(1, program->Count());
ASSERT_EQ(0, parser.errorCount());
SelectStatement &s = dynamic_cast<SelectStatement&>(program->Get(0));
SelectList* sl = s.GetSelectList();
SelectItem& si = sl->Get(0);
ASSERT_EQ("a", si.GetAlias());
}
TEST(NewSqlParser, selectAliasWithAs)
{
std::string input_string = "SELECT 1 AS b";
Parser parser(input_string);
std::unique_ptr<sqlast::StatementList> program = parser.Parse();
ASSERT_TRUE(program != nullptr);
ASSERT_EQ(1, program->Count());
ASSERT_EQ(0, parser.errorCount());
SelectStatement &s = dynamic_cast<SelectStatement&>(program->Get(0));
SelectList* sl = s.GetSelectList();
SelectItem& si = sl->Get(0);
ASSERT_EQ("b", si.GetAlias());
}
TEST(NewSqlParser, selectFrom)
{
std::string input_string = "SELECT 1 FROM a";
Parser parser(input_string);
std::unique_ptr<sqlast::StatementList> program = parser.Parse();
ASSERT_TRUE(program != nullptr);
ASSERT_EQ(1, program->Count());
ASSERT_EQ(0, parser.errorCount());
}