diff options
Diffstat (limited to 'SQLiteStudio3/Tests')
| -rw-r--r-- | SQLiteStudio3/Tests/CompletionHelperTest/CompletionHelperTest.pro | 2 | ||||
| -rw-r--r-- | SQLiteStudio3/Tests/LexerTest/tst_lexertest.cpp | 11 | ||||
| -rw-r--r-- | SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp | 116 | ||||
| -rw-r--r-- | SQLiteStudio3/Tests/SelectResolverTest/tst_selectresolvertest.cpp | 78 | ||||
| -rw-r--r-- | SQLiteStudio3/Tests/TestUtils/TestUtils.pro | 2 | ||||
| -rw-r--r-- | SQLiteStudio3/Tests/TestUtils/configmock.cpp | 14 | ||||
| -rw-r--r-- | SQLiteStudio3/Tests/TestUtils/configmock.h | 3 | ||||
| -rw-r--r-- | SQLiteStudio3/Tests/TestUtils/extensionmanagermock.cpp | 5 | ||||
| -rw-r--r-- | SQLiteStudio3/Tests/TestUtils/extensionmanagermock.h | 1 | ||||
| -rw-r--r-- | SQLiteStudio3/Tests/TestUtils/test_common.pri | 4 | ||||
| -rw-r--r-- | SQLiteStudio3/Tests/testcommon.pri (renamed from SQLiteStudio3/Tests/testdirs.pri) | 0 |
11 files changed, 210 insertions, 26 deletions
diff --git a/SQLiteStudio3/Tests/CompletionHelperTest/CompletionHelperTest.pro b/SQLiteStudio3/Tests/CompletionHelperTest/CompletionHelperTest.pro index d4c1e99..76d4951 100644 --- a/SQLiteStudio3/Tests/CompletionHelperTest/CompletionHelperTest.pro +++ b/SQLiteStudio3/Tests/CompletionHelperTest/CompletionHelperTest.pro @@ -10,7 +10,7 @@ QT += testlib QT -= gui TARGET = tst_completionhelpertest -CONFIG += console +CONFIG += console testcase CONFIG -= app_bundle TEMPLATE = app diff --git a/SQLiteStudio3/Tests/LexerTest/tst_lexertest.cpp b/SQLiteStudio3/Tests/LexerTest/tst_lexertest.cpp index 0e44e7d..abdc76f 100644 --- a/SQLiteStudio3/Tests/LexerTest/tst_lexertest.cpp +++ b/SQLiteStudio3/Tests/LexerTest/tst_lexertest.cpp @@ -16,6 +16,7 @@ class LexerTest : public QObject void testHex1(); void testHex2(); void testBindParam1(); + void testBlobLiteral(); }; LexerTest::LexerTest() @@ -89,6 +90,16 @@ void LexerTest::testBindParam1() QVERIFY(bindTokens[4]->value == "@id"); } +void LexerTest::testBlobLiteral() +{ + QString sql = "SELECT X'010f0E'"; + + Lexer lex; + TokenList tokens = lex.tokenize(sql); + QCOMPARE(tokens.size(), 3); + QCOMPARE(tokens[2]->value, "X'010f0E'"); +} + QTEST_APPLESS_MAIN(LexerTest) #include "tst_lexertest.moc" 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(); diff --git a/SQLiteStudio3/Tests/SelectResolverTest/tst_selectresolvertest.cpp b/SQLiteStudio3/Tests/SelectResolverTest/tst_selectresolvertest.cpp index 78f0b53..bcb142e 100644 --- a/SQLiteStudio3/Tests/SelectResolverTest/tst_selectresolvertest.cpp +++ b/SQLiteStudio3/Tests/SelectResolverTest/tst_selectresolvertest.cpp @@ -29,10 +29,12 @@ class SelectResolverTest : public QObject void testWithCommonTableExpression(); void testWithCte2(); void testWithCte3(); + void testWithCte4(); void testStarWithJoinAndError(); void testTableFunction(); void testSubselect(); void testSubselectWithAlias(); + void testIssue4607(); }; SelectResolverTest::SelectResolverTest() @@ -214,7 +216,7 @@ void SelectResolverTest::testWithCte2() QList<SelectResolver::Column> coreColumns = columns.first(); QVERIFY(coreColumns.size() == 2); - QCOMPARE(coreColumns[0].type, SelectResolver::Column::COLUMN); + QCOMPARE(coreColumns[0].type, SelectResolver::Column::OTHER); QCOMPARE(coreColumns[0].flags, SelectResolver::FROM_CTE_SELECT); QCOMPARE(coreColumns[0].database, "main"); QVERIFY(coreColumns[0].table.isNull()); @@ -222,7 +224,7 @@ void SelectResolverTest::testWithCte2() QVERIFY(coreColumns[0].alias.isNull()); QCOMPARE(coreColumns[0].displayName, "c1"); - QCOMPARE(coreColumns[1].type, SelectResolver::Column::COLUMN); + QCOMPARE(coreColumns[1].type, SelectResolver::Column::OTHER); QCOMPARE(coreColumns[1].flags, SelectResolver::FROM_CTE_SELECT); QCOMPARE(coreColumns[1].database, "main"); QVERIFY(coreColumns[1].table.isNull()); @@ -242,10 +244,11 @@ void SelectResolverTest::testWithCte3() QList<SelectResolver::Column> coreColumns = columns.first(); QCOMPARE(coreColumns.size(), 3); - QCOMPARE(coreColumns[0].type, SelectResolver::Column::COLUMN); + QCOMPARE(coreColumns[0].type, SelectResolver::Column::OTHER); QCOMPARE(coreColumns[0].flags, SelectResolver::FROM_CTE_SELECT); QCOMPARE(coreColumns[0].database, "main"); QVERIFY(coreColumns[0].table.isNull()); + QCOMPARE(coreColumns[0].tableAlias, "t"); QCOMPARE(coreColumns[0].column, "x"); QVERIFY(coreColumns[0].alias.isNull()); QCOMPARE(coreColumns[0].displayName, "x"); @@ -254,19 +257,43 @@ void SelectResolverTest::testWithCte3() QCOMPARE(coreColumns[1].flags, SelectResolver::FROM_CTE_SELECT); QCOMPARE(coreColumns[1].database, "main"); QCOMPARE(coreColumns[1].table, "test2"); + QCOMPARE(coreColumns[1].tableAlias, "t"); QCOMPARE(coreColumns[1].column, "y"); QVERIFY(coreColumns[1].alias.isNull()); QCOMPARE(coreColumns[1].displayName, "y"); - QCOMPARE(coreColumns[2].type, SelectResolver::Column::COLUMN); + QCOMPARE(coreColumns[2].type, SelectResolver::Column::OTHER); QCOMPARE(coreColumns[2].flags, SelectResolver::FROM_CTE_SELECT); QCOMPARE(coreColumns[2].database, "main"); QVERIFY(coreColumns[2].table.isNull()); + QCOMPARE(coreColumns[2].tableAlias, "t"); QCOMPARE(coreColumns[2].column, "'z'"); QVERIFY(coreColumns[2].alias.isNull()); QCOMPARE(coreColumns[2].displayName, "'z'"); } +void SelectResolverTest::testWithCte4() +{ + QString sql = "WITH testcte AS (SELECT 3)" + "SELECT * FROM TESTCTE"; + + SelectResolver resolver(db, sql); + Parser parser; + QVERIFY(parser.parse(sql)); + + QList<QList<SelectResolver::Column>> columns = resolver.resolve(parser.getQueries().first().dynamicCast<SqliteSelect>().data()); + QList<SelectResolver::Column> coreColumns = columns.first(); + QVERIFY(coreColumns.size() == 1); + + QCOMPARE(coreColumns[0].type, SelectResolver::Column::OTHER); + QCOMPARE(coreColumns[0].flags, SelectResolver::FROM_CTE_SELECT); + QCOMPARE(coreColumns[0].database, "main"); + QVERIFY(coreColumns[0].table.isNull()); + QCOMPARE(coreColumns[0].column, "3"); + QVERIFY(coreColumns[0].alias.isNull()); + QCOMPARE(coreColumns[0].displayName, "3"); +} + void SelectResolverTest::testStarWithJoinAndError() { QString sql = "SELECT t1.*, t2.* FROM test t1 JOIN test2 USING (col1)"; @@ -335,6 +362,48 @@ void SelectResolverTest::testSubselectWithAlias() QVERIFY(coreColumns[2].oldTableAliases.first() == "secm"); } +void SelectResolverTest::testIssue4607() +{ + QString sql = "SELECT Trip.TripID AS [Trip Number]," + " P1.PlaceAlternates AS [Origin Alternates]," + " P2.PlaceAlternates AS [Destination Alternates]," + " Trip.ROWID AS ResCol_0" + " FROM Trip" + " INNER JOIN" + " (" + " SELECT 1 AS PlaceID," + " 2 AS PlaceAlternates" + " )" + " P1 ON Trip.TripID = P1.PlaceID" + " INNER JOIN" + " (" + " SELECT 1 AS PlaceID," + " 2 AS PlaceAlternates" + " GROUP BY PlaceID" + " )" + " P2 ON Trip.TripID = P2.PlaceID"; + + SelectResolver resolver(db, sql); + Parser parser; + QVERIFY(parser.parse(sql)); + + QList<QList<SelectResolver::Column> > columns = resolver.resolve(parser.getQueries().first().dynamicCast<SqliteSelect>().data()); + QList<SelectResolver::Column> coreColumns = columns.first(); + QVERIFY(coreColumns.size() == 4); + QVERIFY(coreColumns[0].table == "Trip"); + QVERIFY(coreColumns[0].tableAlias.isNull()); + QVERIFY(coreColumns[0].flags == 0); + QVERIFY(coreColumns[1].table.isNull()); + QVERIFY(coreColumns[1].tableAlias == "P1"); + QVERIFY(coreColumns[1].flags == 0); + QVERIFY(coreColumns[2].table.isNull()); + QVERIFY(coreColumns[2].tableAlias == "P2"); + QVERIFY(coreColumns[2].flags & SelectResolver::FROM_GROUPED_SELECT); + QVERIFY(coreColumns[3].table == "Trip"); + QVERIFY(coreColumns[3].tableAlias.isNull()); + QVERIFY(coreColumns[3].flags == 0); +} + void SelectResolverTest::initTestCase() { initKeywords(); @@ -346,6 +415,7 @@ void SelectResolverTest::initTestCase() db->exec("CREATE TABLE test (col1, col2, col3);"); db->exec("CREATE TABLE org (name TEXT PRIMARY KEY, boss TEXT REFERENCES org, height INT)"); db->exec("CREATE TABLE test2 (col1);"); + db->exec("CREATE TABLE Trip (TripID INTEGER PRIMARY KEY ASC);"); //SqlQueryPtr results = db->exec("SELECT name FROM sqlite_master"); } diff --git a/SQLiteStudio3/Tests/TestUtils/TestUtils.pro b/SQLiteStudio3/Tests/TestUtils/TestUtils.pro index 727fb74..3ea06e6 100644 --- a/SQLiteStudio3/Tests/TestUtils/TestUtils.pro +++ b/SQLiteStudio3/Tests/TestUtils/TestUtils.pro @@ -41,7 +41,7 @@ unix:!symbian { maemo5 {
target.path = /opt/usr/lib
} else {
- target.path = /usr/lib
+ target.path = $$PREFIX/lib
}
INSTALLS += target
}
diff --git a/SQLiteStudio3/Tests/TestUtils/configmock.cpp b/SQLiteStudio3/Tests/TestUtils/configmock.cpp index c52fa1b..f5ce5c5 100644 --- a/SQLiteStudio3/Tests/TestUtils/configmock.cpp +++ b/SQLiteStudio3/Tests/TestUtils/configmock.cpp @@ -4,10 +4,6 @@ void ConfigMock::init() { } -void ConfigMock::cleanUp() -{ -} - const QString& ConfigMock::getConfigDir() { static const QString cfg; @@ -194,16 +190,6 @@ void ConfigMock::rollback() { } -bool ConfigMock::setCollations(const QList<CollationManager::CollationPtr>&) -{ - return true; -} - -QList<CollationManager::CollationPtr> ConfigMock::getCollations() const -{ - return QList<CollationManager::CollationPtr>(); -} - const QString &ConfigMock::getConfigDir() const { static QString s; diff --git a/SQLiteStudio3/Tests/TestUtils/configmock.h b/SQLiteStudio3/Tests/TestUtils/configmock.h index a8a5a2c..620548b 100644 --- a/SQLiteStudio3/Tests/TestUtils/configmock.h +++ b/SQLiteStudio3/Tests/TestUtils/configmock.h @@ -9,7 +9,6 @@ class ConfigMock : public Config { public: void init(); - void cleanUp(); const QString& getConfigDir(); void beginMassSave(); void commitMassSave(); @@ -51,8 +50,6 @@ class ConfigMock : public Config void begin(); void commit(); void rollback(); - bool setCollations(const QList<CollationManager::CollationPtr>&); - QList<CollationManager::CollationPtr> getCollations() const; const QString &getConfigDir() const; QString getConfigFilePath() const; bool isMassSaving() const; diff --git a/SQLiteStudio3/Tests/TestUtils/extensionmanagermock.cpp b/SQLiteStudio3/Tests/TestUtils/extensionmanagermock.cpp index dc4669b..d98fc42 100644 --- a/SQLiteStudio3/Tests/TestUtils/extensionmanagermock.cpp +++ b/SQLiteStudio3/Tests/TestUtils/extensionmanagermock.cpp @@ -17,3 +17,8 @@ QList<SqliteExtensionManager::ExtensionPtr> ExtensionManagerMock::getExtensionFo { return QList<SqliteExtensionManager::ExtensionPtr>(); } + +QStringList ExtensionManagerMock::getExtensionDirs() const +{ + return QStringList(); +} diff --git a/SQLiteStudio3/Tests/TestUtils/extensionmanagermock.h b/SQLiteStudio3/Tests/TestUtils/extensionmanagermock.h index 7a7a1f4..37bd634 100644 --- a/SQLiteStudio3/Tests/TestUtils/extensionmanagermock.h +++ b/SQLiteStudio3/Tests/TestUtils/extensionmanagermock.h @@ -12,6 +12,7 @@ class ExtensionManagerMock : public SqliteExtensionManager void setExtensions(const QList<ExtensionPtr>&); QList<ExtensionPtr> getAllExtensions() const; QList<ExtensionPtr> getExtensionForDatabase(const QString&) const; + QStringList getExtensionDirs() const; }; #endif // EXTENSIONMANAGERMOCK_H diff --git a/SQLiteStudio3/Tests/TestUtils/test_common.pri b/SQLiteStudio3/Tests/TestUtils/test_common.pri index 24d1479..4eb550b 100644 --- a/SQLiteStudio3/Tests/TestUtils/test_common.pri +++ b/SQLiteStudio3/Tests/TestUtils/test_common.pri @@ -1,5 +1,5 @@ -include($$PWD/../../dirs.pri)
-include($$PWD/../testdirs.pri)
+include($$PWD/../../common.pri)
+include($$PWD/../testcommon.pri)
CONFIG += c++17
diff --git a/SQLiteStudio3/Tests/testdirs.pri b/SQLiteStudio3/Tests/testcommon.pri index 131bd4d..131bd4d 100644 --- a/SQLiteStudio3/Tests/testdirs.pri +++ b/SQLiteStudio3/Tests/testcommon.pri |
