aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/Tests/SelectResolverTest
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/Tests/SelectResolverTest')
-rw-r--r--SQLiteStudio3/Tests/SelectResolverTest/SelectResolverTest.pro19
-rw-r--r--SQLiteStudio3/Tests/SelectResolverTest/tst_selectresolvertest.cpp248
2 files changed, 267 insertions, 0 deletions
diff --git a/SQLiteStudio3/Tests/SelectResolverTest/SelectResolverTest.pro b/SQLiteStudio3/Tests/SelectResolverTest/SelectResolverTest.pro
new file mode 100644
index 0000000..d533c7e
--- /dev/null
+++ b/SQLiteStudio3/Tests/SelectResolverTest/SelectResolverTest.pro
@@ -0,0 +1,19 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2013-04-05T00:10:49
+#
+#-------------------------------------------------
+
+include($$PWD/../TestUtils/test_common.pri)
+
+QT += testlib
+QT -= gui
+
+TARGET = tst_selectresolvertest
+CONFIG += console
+CONFIG -= app_bundle
+
+TEMPLATE = app
+
+SOURCES += tst_selectresolvertest.cpp
+DEFINES += SRCDIR=\\\"$$PWD/\\\"
diff --git a/SQLiteStudio3/Tests/SelectResolverTest/tst_selectresolvertest.cpp b/SQLiteStudio3/Tests/SelectResolverTest/tst_selectresolvertest.cpp
new file mode 100644
index 0000000..969ebad
--- /dev/null
+++ b/SQLiteStudio3/Tests/SelectResolverTest/tst_selectresolvertest.cpp
@@ -0,0 +1,248 @@
+#include "selectresolver.h"
+#include "db/db.h"
+#include "parser/keywords.h"
+#include "parser/lexer.h"
+#include "parser/parser.h"
+#include "parser/parser.h"
+#include "dbsqlite3mock.h"
+#include "mocks.h"
+#include "parser/parser.h"
+#include <QString>
+#include <QtTest>
+#include <QSet>
+
+class SelectResolverTest : public QObject
+{
+ Q_OBJECT
+
+ public:
+ SelectResolverTest();
+
+ private:
+ Db* db = nullptr;
+
+ private Q_SLOTS:
+ void initTestCase();
+ void cleanupTestCase();
+ void testTableHash();
+ void testColumnHash();
+ void testWithCommonTableExpression();
+ void testStarWithJoinAndError();
+ void test1();
+};
+
+SelectResolverTest::SelectResolverTest()
+{
+}
+
+void SelectResolverTest::testTableHash()
+{
+ QSet<SelectResolver::Table> tables;
+
+ SelectResolver::Table t1;
+ t1.database = "d1";
+ t1.table = "t1";
+ t1.alias = "a1";
+ tables << t1;
+
+ // different alias and database
+ SelectResolver::Table t2;
+ t2.database = "d2";
+ t2.table = "t1";
+ t2.alias = QString::null;
+ tables << t2;
+
+ // different database
+ SelectResolver::Table t3;
+ t3.database = "d2";
+ t3.table = "t1";
+ t3.alias = "a1";
+ tables << t3;
+
+ // same as t3
+ SelectResolver::Table t4;
+ t4.database = "d2";
+ t4.table = "t1";
+ t4.alias = "a1";
+ tables << t4;
+
+ // all null
+ SelectResolver::Table t5;
+ tables << t5;
+
+ // same as t5
+ SelectResolver::Table t6;
+ tables << t6;
+
+ // similar to t1, but different database
+ SelectResolver::Table t7;
+ t7.database = "x";
+ t7.table = "t1";
+ t7.alias = "a1";
+ tables << t7;
+
+ // similar to t1, but different table
+ SelectResolver::Table t8;
+ t8.database = "d1";
+ t8.table = "x";
+ t8.alias = "a1";
+ tables << t8;
+
+ // similar to t1, but different alias
+ SelectResolver::Table t9;
+ t9.database = "d1";
+ t9.table = "t1";
+ t9.alias = "x";
+ tables << t9;
+
+ QVERIFY(tables.size() == 7);
+}
+
+void SelectResolverTest::testColumnHash()
+{
+ QSet<SelectResolver::Column> columns;
+
+ SelectResolver::Column c1;
+ c1.database = "d1";
+ c1.table = "t1";
+ c1.column = "c1";
+ c1.alias = "a1";
+ c1.tableAlias = "ta1";
+ c1.displayName = "d1";
+ c1.type = SelectResolver::Column::COLUMN;
+ columns << c1;
+
+ // This should be treated as equal to c1.
+ SelectResolver::Column c2;
+ c2.database = "d1";
+ c2.table = "t1";
+ c2.column = "c1";
+ c2.alias = "x";
+ c2.tableAlias = "ta1";
+ c2.displayName = "x";
+ c2.type = SelectResolver::Column::OTHER;
+ columns << c2;
+
+ // Different database
+ SelectResolver::Column c3;
+ c3.database = "x";
+ c3.table = "t1";
+ c3.column = "c1";
+ c3.alias = "x";
+ c3.tableAlias = "ta1";
+ c3.displayName = "x";
+ c3.type = SelectResolver::Column::OTHER;
+ columns << c3;
+
+ // Different table
+ SelectResolver::Column c4;
+ c4.database = "d1";
+ c4.table = "x";
+ c4.column = "c1";
+ c4.alias = "x";
+ c4.tableAlias = "ta1";
+ c4.displayName = "x";
+ c4.type = SelectResolver::Column::OTHER;
+ columns << c4;
+
+ // Different column
+ SelectResolver::Column c5;
+ c5.database = "d1";
+ c5.table = "t1";
+ c5.column = "x";
+ c5.alias = "x";
+ c5.tableAlias = "ta1";
+ c5.displayName = "x";
+ c5.type = SelectResolver::Column::OTHER;
+ columns << c5;
+
+ // Different table alias
+ SelectResolver::Column c6;
+ c6.database = "d1";
+ c6.table = "t1";
+ c6.column = "c1";
+ c6.alias = "x";
+ c6.tableAlias = "x";
+ c6.displayName = "x";
+ c6.type = SelectResolver::Column::OTHER;
+ columns << c6;
+
+ QVERIFY(columns.size() == 5);
+}
+
+void SelectResolverTest::testWithCommonTableExpression()
+{
+ // Test with query from examples from SQLite documentation
+ QString sql = "WITH RECURSIVE works_for_alice(n) AS ("
+ " VALUES('Alice')"
+ " UNION"
+ " SELECT name"
+ " FROM org, works_for_alice"
+ " WHERE org.boss = works_for_alice.n"
+ " )"
+ " SELECT avg(height)"
+ " FROM org"
+ " WHERE org.name IN works_for_alice";
+
+ SelectResolver resolver(db, sql);
+ Parser parser(db->getDialect());
+ 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);
+ QVERIFY(coreColumns[0].type == SelectResolver::Column::OTHER);
+ QVERIFY(coreColumns[0].flags & SelectResolver::Flag::FROM_CTE_SELECT);
+}
+
+void SelectResolverTest::testStarWithJoinAndError()
+{
+ QString sql = "SELECT t1.*, t2.* FROM test t1 JOIN test2 USING (col1)";
+ SelectResolver resolver(db, sql);
+ Parser parser(db->getDialect());
+ QVERIFY(parser.parse(sql));
+
+ QList<QList<SelectResolver::Column> > columns = resolver.resolve(parser.getQueries().first().dynamicCast<SqliteSelect>().data());
+ QVERIFY(columns.first().size() == 3);
+ QVERIFY(resolver.hasErrors());
+}
+
+void SelectResolverTest::test1()
+{
+ QString sql = "SELECT * FROM (SELECT count(col1), col2 FROM test)";
+ SelectResolver resolver(db, sql);
+ Parser parser(db->getDialect());
+ 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[0].type == SelectResolver::Column::OTHER);
+ QVERIFY(coreColumns[1].type == SelectResolver::Column::COLUMN);
+ QVERIFY(coreColumns[1].table == "test");
+ QVERIFY(coreColumns[1].column == "col2");
+}
+
+void SelectResolverTest::initTestCase()
+{
+ initKeywords();
+ Lexer::staticInit();
+ initMocks();
+
+ db = new DbSqlite3Mock("testdb");
+ db->open();
+ 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);");
+ //SqlQueryPtr results = db->exec("SELECT name FROM sqlite_master");
+}
+
+void SelectResolverTest::cleanupTestCase()
+{
+ db->close();
+ delete db;
+ db = nullptr;
+}
+
+QTEST_APPLESS_MAIN(SelectResolverTest)
+
+#include "tst_selectresolvertest.moc"