aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/Tests
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/Tests')
-rw-r--r--SQLiteStudio3/Tests/CompletionHelperTest/CompletionHelperTest.pro2
-rw-r--r--SQLiteStudio3/Tests/LexerTest/tst_lexertest.cpp11
-rw-r--r--SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp116
-rw-r--r--SQLiteStudio3/Tests/SelectResolverTest/tst_selectresolvertest.cpp78
-rw-r--r--SQLiteStudio3/Tests/TestUtils/TestUtils.pro2
-rw-r--r--SQLiteStudio3/Tests/TestUtils/configmock.cpp14
-rw-r--r--SQLiteStudio3/Tests/TestUtils/configmock.h3
-rw-r--r--SQLiteStudio3/Tests/TestUtils/extensionmanagermock.cpp5
-rw-r--r--SQLiteStudio3/Tests/TestUtils/extensionmanagermock.h1
-rw-r--r--SQLiteStudio3/Tests/TestUtils/test_common.pri4
-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