aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2016-06-13 18:42:57 -0400
committerLibravatarUnit 193 <unit193@ubuntu.com>2016-06-13 18:42:57 -0400
commit65d5f68cc6dc81799c5a5d90400a2c1f0dd02547 (patch)
tree6f245ba901b87ef42fed69965aea22f5eea6b590 /SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp
parentaeb6bad01630d325a4e768e798a7a6d44e18fdaf (diff)
parent5d9314f134ddd3dc4c853e398ac90ba247fb2e4f (diff)
Merge tag 'upstream/3.1.0'
Upstream version 3.1.0 # gpg: Signature made Mon 13 Jun 2016 06:42:54 PM EDT using RSA key ID EBE9BD91 # gpg: Good signature from "Unit 193 <unit193@gmail.com>" # gpg: aka "Unit 193 <unit193@ninthfloor.org>" # gpg: aka "Unit 193 <unit193@ubuntu.com>" # gpg: aka "Unit 193 <unit193@ninthfloor.com>"
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp61
1 files changed, 58 insertions, 3 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp b/SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp
index 8107b94..02489ee 100644
--- a/SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp
+++ b/SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp
@@ -28,13 +28,29 @@ SelectResolver::~SelectResolver()
safe_delete(schemaResolver);
}
+QList<SelectResolver::Column> SelectResolver::resolveColumnsFromFirstCore()
+{
+ if (!parseOriginalQuery())
+ return QList<SelectResolver::Column>();
+
+ return resolve(originalQueryParsed->coreSelects.first());
+}
+
+QList<QList<SelectResolver::Column>> SelectResolver::resolveColumns()
+{
+ if (!parseOriginalQuery())
+ return QList<QList<SelectResolver::Column>>();
+
+ return resolve(originalQueryParsed.data());
+}
+
QList<SelectResolver::Column> SelectResolver::resolve(SqliteSelect::Core *selectCore)
{
errors.clear();
return resolveCore(selectCore);
}
-QList<QList<SelectResolver::Column> > SelectResolver::resolve(SqliteSelect *select)
+QList<QList<SelectResolver::Column>> SelectResolver::resolve(SqliteSelect *select)
{
errors.clear();
QList<QList<SelectResolver::Column> > results;
@@ -377,10 +393,16 @@ void SelectResolver::resolveDbAndTable(SqliteSelect::Core::ResultColumn *resCol)
col.tableAlias = matched.tableAlias;
col.flags = matched.flags;
}
+ else if (matched.type == Column::OTHER)
+ {
+ col.type = Column::OTHER;
+ }
else if (!ignoreInvalidNames)
{
- qDebug() << "Source table for column '" << expr->detokenize()
+ QString colStr = expr->detokenize();
+ qDebug() << "Source table for column '" << colStr
<< "' not matched while resolving select: " << query;
+ errors << QObject::tr("Could not resolve table for column '%1'.").arg(colStr);
}
currentCoreResults << col;
@@ -473,7 +495,7 @@ TokenList SelectResolver::getResColTokensWithoutAlias(SqliteSelect::Core::Result
{
depth--;
}
- else if (token->type == Token::KEYWORD && token->value.compare("AS", Qt::CaseInsensitive) && depth <= 0)
+ else if (token->type == Token::KEYWORD && token->value.compare("AS", Qt::CaseInsensitive) == 0 && depth <= 0)
{
idx = idxCandidate;
break;
@@ -534,6 +556,16 @@ QList<SelectResolver::Column> SelectResolver::resolveSingleSourceSubSelect(Sqlit
{
QList<Column> columnSources = resolveSubSelect(joinSrc->select);
applySubSelectAlias(columnSources, joinSrc->alias);
+
+ QMutableListIterator<Column> it(columnSources);
+ while (it.hasNext())
+ {
+ if (it.next().alias.isEmpty())
+ continue;
+
+ it.value().aliasDefinedInSubQuery = true;
+ }
+
return columnSources;
}
@@ -640,6 +672,29 @@ QString SelectResolver::resolveDatabase(const QString& database)
return database;
}
+bool SelectResolver::parseOriginalQuery()
+{
+ if (originalQueryParsed)
+ return true;
+
+ Parser parser(db->getDialect());
+ if (!parser.parse(query) || parser.getQueries().isEmpty())
+ {
+ qWarning() << "Could not parse query in SelectResolver:" << query;
+ return false;
+ }
+
+ SqliteQueryPtr theQuery = parser.getQueries().first();
+ if (theQuery.dynamicCast<SqliteSelect>().isNull())
+ {
+ qWarning() << "Parsed query is not SELECT as expected in SelectResolver::parseOriginalQuery():" << query;
+ return false;
+ }
+
+ originalQueryParsed = theQuery.dynamicCast<SqliteSelect>();
+ return true;
+}
+
int SelectResolver::Table::operator ==(const SelectResolver::Table &other)
{
return table == other.table && database == other.database && alias == other.alias;