diff options
Diffstat (limited to 'SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp')
| -rw-r--r-- | SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp | 116 |
1 files changed, 115 insertions, 1 deletions
diff --git a/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp b/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp index 6d537dc..eec1e39 100644 --- a/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp +++ b/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp @@ -2,7 +2,6 @@ #include "parser/ast/sqliteselect.h" #include "parser/ast/sqlitecreatetable.h" #include "parser/ast/sqliteinsert.h" -#include "parser/ast/sqlitewith.h" #include "parser/ast/sqliteupdate.h" #include "parser/keywords.h" #include "parser/lexer.h" @@ -58,9 +57,17 @@ class ParserTest : public QObject void testGetColumnTokensFromInsertUpsert(); void testGeneratedColumn(); void testWindowClause(); + void testWindowKwAsColumn(); void testFilterClause(); + void testFilterAsId(); void testUpdateFrom(); void testStringAsTableId(); + void testJsonPtrOp(); + void testUnfinishedSelectWithAliasForCompleter(); + void testUnfinishedSelectWithAliasStrict(); + void testBlobLiteral(); + void testBigDec(); + void testQuotedFunction(); }; ParserTest::ParserTest() @@ -559,6 +566,15 @@ void ParserTest::testWindowClause() verifyWindowClause(sql, select, ok); } +void ParserTest::testWindowKwAsColumn() +{ + QString sql = "SELECT window FROM test_table;"; + parser3->setLemonDebug(true); + bool res = parser3->parse(sql); + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); +} + void ParserTest::verifyWindowClause(const QString& sql, SqliteSelectPtr& select, bool& ok) { bool res = parser3->parse(sql); @@ -646,6 +662,18 @@ void ParserTest::testFilterClause() QVERIFY(resCol->expr->filterOver->over->window->mode == SqliteWindowDefinition::Window::Mode::ORDER_BY); } +void ParserTest::testFilterAsId() +{ + QString sql = "CREATE TABLE aa2 (sdfsdfdf, filter)"; + bool res = parser3->parse(sql); + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); + + SqliteCreateTablePtr create = parser3->getQueries().first().dynamicCast<SqliteCreateTable>(); + QCOMPARE(create->columns.size(), 2); + QCOMPARE(create->columns[1]->name, "filter"); +} + void ParserTest::testUpdateFrom() { QString sql = "UPDATE inventory" @@ -674,6 +702,92 @@ void ParserTest::testStringAsTableId() QVERIFY(parser3->getErrors().isEmpty()); } +void ParserTest::testJsonPtrOp() +{ + QString sql = "SELECT '[\"a11\", \"a22\", {\"x\":\"a33\"}]' -> 2," + " '[\"a11\", \"a22\", {\"x\":\"a33\"}]' ->> 2"; + bool res = parser3->parse(sql); + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); +} + +void ParserTest::testUnfinishedSelectWithAliasForCompleter() +{ + QString sql = "select * from a1 x where x."; + bool res = parser3->parse(sql, true); + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); +} + +void ParserTest::testUnfinishedSelectWithAliasStrict() +{ + QString sql = "select * from a1 x where x."; + bool res = parser3->parse(sql); + QVERIFY(!res); + QVERIFY(!parser3->getErrors().isEmpty()); +} + +void ParserTest::testBlobLiteral() +{ + QString sql = "insert into tab1 values (X'010e0F', 'string''with''quotes')"; + bool res = parser3->parse(sql); + SqliteQueryPtr query = parser3->getQueries()[0]; + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); + + SqliteInsertPtr insert = parser3->getQueries().first().dynamicCast<SqliteInsert>(); + SqliteSelect::Core* core = insert->select->coreSelects[0]; + QCOMPARE(core->resultColumns.size(), 2); + + QCOMPARE(core->resultColumns[0]->expr->mode, SqliteExpr::Mode::LITERAL_VALUE); + QCOMPARE(core->resultColumns[0]->expr->literalValue.type(), QVariant::ByteArray); + QCOMPARE(core->resultColumns[0]->expr->literalValue.toByteArray().toHex(), "010e0f"); + QCOMPARE(core->resultColumns[1]->expr->mode, SqliteExpr::Mode::LITERAL_VALUE); + QCOMPARE(core->resultColumns[1]->expr->literalValue.type(), QVariant::String); + QCOMPARE(core->resultColumns[1]->expr->literalValue.toString(), "string''with''quotes"); + + core->resultColumns[0]->expr->rebuildTokens(); + QCOMPARE(core->resultColumns[0]->expr->tokens[0]->value, "X'010e0f'"); +} + +void ParserTest::testBigDec() +{ + QString sql = "select 9999999999999999999 + 9999999999999999999, 9999999999999999999.1 + 9999999999999999999.2, 9999.1 + 9999.2;"; + bool res = parser3->parse(sql); + SqliteQueryPtr query = parser3->getQueries()[0]; + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); + SqliteSelectPtr select = parser3->getQueries().first().dynamicCast<SqliteSelect>(); + SqliteSelect::Core* core = select->coreSelects[0]; + QCOMPARE(core->resultColumns[0]->expr->expr1->literalValue.type(), QVariant::Double); + QCOMPARE(core->resultColumns[1]->expr->expr1->literalValue.type(), QVariant::Double); + QCOMPARE(core->resultColumns[2]->expr->expr1->literalValue.type(), QVariant::Double); +} + +void ParserTest::testQuotedFunction() +{ + QString sql = "select \"abs\"(1)"; + bool res = parser3->parse(sql); + QVERIFY(res); + QVERIFY(parser3->getQueries().size() > 0); + + SqliteQueryPtr query = parser3->getQueries().first(); + QVERIFY(query); + + SqliteSelectPtr select = query.dynamicCast<SqliteSelect>(); + QVERIFY(select); + QVERIFY(select->coreSelects.size() > 0); + QVERIFY(select->coreSelects.first()->resultColumns.size() > 0); + + SqliteSelect::Core::ResultColumn* rc = select->coreSelects.first()->resultColumns.first(); + SqliteExpr* e = rc->expr; + QVERIFY(e); + + QVERIFY(e->mode == SqliteExpr::Mode::FUNCTION); + QCOMPARE(e->function, "abs"); +} + + void ParserTest::initTestCase() { initKeywords(); |
