diff options
| author | 2018-07-27 23:51:12 -0400 | |
|---|---|---|
| committer | 2018-07-27 23:51:12 -0400 | |
| commit | feda8a7db8d1d7c5439aa8f8feef7cc0dd2b59a0 (patch) | |
| tree | 1e50f5f666f419143f510d5ded00fe2006b7bd85 /SQLiteStudio3/Tests/ParserTest | |
| parent | d9aa870e5d509cc7309ab82dd102a937ab58613a (diff) | |
New upstream version 3.2.1+dfsg1upstream/3.2.1+dfsg1
Diffstat (limited to 'SQLiteStudio3/Tests/ParserTest')
| -rw-r--r-- | SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp | 104 |
1 files changed, 101 insertions, 3 deletions
diff --git a/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp b/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp index 7355616..eb2a76f 100644 --- a/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp +++ b/SQLiteStudio3/Tests/ParserTest/tst_parsertest.cpp @@ -1,12 +1,15 @@ #include "parser/parser.h" #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" #include "parser/parsererror.h" +#include "common/utils_sql.h" #include <QString> #include <QtTest> -#include <parser/ast/sqliteinsert.h> class ParserTest : public QObject { @@ -40,6 +43,12 @@ class ParserTest : public QObject void testCommentBeginMultiline(); void testBetween(); void testBigNum(); + void testSelectWith(); + void testInsertWithDoubleQuoteValues(); + void testParseAndRebuildAlias(); + void testRebuildTokensUpdate(); + void testRebuildTokensInsertUpsert(); + void testGetColumnTokensFromInsertUpsert(); void initTestCase(); void cleanupTestCase(); }; @@ -134,7 +143,7 @@ void ParserTest::testGetFullObjects() QList<SqliteStatement::FullObject> fullObjects = query->getContextFullObjects(); QVERIFY(fullObjects.size() == 2); - foreach (const SqliteStatement::FullObject& fullObj, fullObjects) + for (const SqliteStatement::FullObject& fullObj : fullObjects) { switch (fullObj.type) { @@ -162,7 +171,7 @@ void ParserTest::testGetFullObjects2() QList<SqliteStatement::FullObject> fullObjects = query->getContextFullObjects(); QVERIFY(fullObjects.size() == 5); - foreach (const SqliteStatement::FullObject& fullObj, fullObjects) + for (const SqliteStatement::FullObject& fullObj : fullObjects) { switch (fullObj.type) { @@ -401,10 +410,99 @@ void ParserTest::testUniqConflict() QVERIFY(tokens[16]->type == Token::Type::PAR_RIGHT); } +void ParserTest::testSelectWith() +{ + QString sql = "WITH m (c1, c2) AS (VALUES (1, 'a'), (2, 'b')) SELECT * FROM m;"; + bool res = parser3->parse(sql); + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); + + const SqliteQueryPtr query = parser3->getQueries().first(); + query->rebuildTokens(); + QString detokenized = query->detokenize().replace(" ", ""); + QVERIFY(sql.replace(" ", "") == detokenized); +} + +void ParserTest::testInsertWithDoubleQuoteValues() +{ + QString sql = "REPLACE INTO _Variables (Name, TextValue) VALUES (\"varNowTime\", strftime(\"%Y-%m-%dT%H:%M:%S\", \"now\", \"localtime\"));"; + bool res = parser3->parse(sql); + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); + + const SqliteInsertPtr insert = parser3->getQueries().first().dynamicCast<SqliteInsert>(); + insert->rebuildTokens(); + QString detokenized = insert->detokenize().replace(" ", ""); + QVERIFY(sql.replace(" ", "") == detokenized); +} + +void ParserTest::testParseAndRebuildAlias() +{ + QString sql = "SELECT x AS [\"abc\".\"def\"];"; + bool res = parser3->parse(sql); + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); + + SqliteQueryPtr query = parser3->getQueries().first(); + query->rebuildTokens(); + QString newSql = query->detokenize(); + QVERIFY(sql == newSql); +} + +void ParserTest::testRebuildTokensUpdate() +{ + QString sql = "UPDATE tab SET col1 = 1, (col2, col3) = 2 WHERE x = 3;"; + bool res = parser3->parse(sql); + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); + + SqliteUpdatePtr update = parser3->getQueries().first().dynamicCast<SqliteUpdate>(); + QVERIFY(update->keyValueMap.size() == 2); + QVERIFY(update->keyValueMap[1].first.type() == QVariant::StringList); + QStringList set2List = update->keyValueMap[1].first.toStringList(); + QVERIFY(set2List[0] == "col2"); + QVERIFY(set2List[1] == "col3"); + QVERIFY(update->where); + QVERIFY(!update->table.isNull()); + QVERIFY(update->where); + update->rebuildTokens(); + QVERIFY(update->tokens.detokenize() == sql); +} + +void ParserTest::testRebuildTokensInsertUpsert() +{ + QString sql = "INSERT INTO tab (a1, a2) VALUES (123, 456) ON CONFLICT (b1, b2, b3) DO UPDATE SET col1 = 1, (col2, col3) = 2 WHERE x = 3;"; + bool res = parser3->parse(sql); + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); + + SqliteInsertPtr insert = parser3->getQueries().first().dynamicCast<SqliteInsert>(); + QVERIFY(insert->upsert); + + insert->rebuildTokens(); + QVERIFY(insert->tokens.detokenize() == sql); +} + +void ParserTest::testGetColumnTokensFromInsertUpsert() +{ + QString sql = "INSERT INTO tab (a1, a2) VALUES (123, 456) ON CONFLICT (b1, b2, b3) DO UPDATE SET col1 = 1, (col2, col3) = 2 WHERE x = 3;"; + bool res = parser3->parse(sql); + QVERIFY(res); + QVERIFY(parser3->getErrors().isEmpty()); + + SqliteInsertPtr insert = parser3->getQueries().first().dynamicCast<SqliteInsert>(); + QVERIFY(insert->upsert); + + TokenList tk = insert->getContextColumnTokens(); + qSort(tk.begin(), tk.end(), [](const TokenPtr& t1, const TokenPtr& t2) {return t1->start < t2->start;}); + QVERIFY(tk.toValueList().join(" ") == "a1 a2 b1 b2 b3 col1 col2 col3 x"); +} + void ParserTest::initTestCase() { initKeywords(); Lexer::staticInit(); + initUtilsSql(); parser2 = new Parser(Dialect::Sqlite2); parser3 = new Parser(Dialect::Sqlite3); } |
