diff --git a/core/SqlLexer.cpp b/core/SqlLexer.cpp index fb40150..55cf892 100644 --- a/core/SqlLexer.cpp +++ b/core/SqlLexer.cpp @@ -255,6 +255,13 @@ bool SqlLexer::parseDoubleQuotedIdentifier(int startpos, int &length, BasicToken bool SqlLexer::parseDollarQuote(int startpos, int &length, BasicTokenType &tokentype, QString &out) { QChar c = nextChar(); + if (c == '$') { + tokentype = BasicTokenType::DollarQuote; + length = m_pos - startpos; + out = m_block.mid(startpos, length); + return true; + } + if (c.isDigit()) { for (;;) { c = peekChar(); diff --git a/tests/pglabtests/tst_SqlLexer.cpp b/tests/pglabtests/tst_SqlLexer.cpp index bcdb03e..0be623d 100644 --- a/tests/pglabtests/tst_SqlLexer.cpp +++ b/tests/pglabtests/tst_SqlLexer.cpp @@ -19,6 +19,36 @@ TEST(SqlLexer, emptyInput) ASSERT_THAT(tokentype, Eq(BasicTokenType::End)); } +TEST(SqlLexer, emptyDollarQuote) +{ + QString input = "$$"; + SqlLexer lexer(input, LexerState::Null); + + int startpos = -1, length = -1; + BasicTokenType tokentype = BasicTokenType::None; + QString out; + lexer.nextBasicToken(startpos, length, tokentype, out); + + ASSERT_THAT(startpos, Eq(0)); + ASSERT_THAT("$$", Eq(out)); + ASSERT_THAT(tokentype, Eq(BasicTokenType::DollarQuote)); +} + +TEST(SqlLexer, filledDollarQuote) +{ + QString input = "$body$"; + SqlLexer lexer(input, LexerState::Null); + + int startpos = -1, length = -1; + BasicTokenType tokentype = BasicTokenType::None; + QString out; + lexer.nextBasicToken(startpos, length, tokentype, out); + + ASSERT_THAT(startpos, Eq(0)); + ASSERT_THAT("$body$", Eq(out)); + ASSERT_THAT(tokentype, Eq(BasicTokenType::DollarQuote)); +} + TEST(SqlLexer, lexer) { QString input = " SELECT ";