From 5d9314f134ddd3dc4c853e398ac90ba247fb2e4f Mon Sep 17 00:00:00 2001 From: Unit 193 Date: Mon, 13 Jun 2016 18:42:42 -0400 Subject: Imported Upstream version 3.1.0 --- SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp | 61 +++++++++++++++++++++-- 1 file changed, 58 insertions(+), 3 deletions(-) (limited to 'SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp') 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::resolveColumnsFromFirstCore() +{ + if (!parseOriginalQuery()) + return QList(); + + return resolve(originalQueryParsed->coreSelects.first()); +} + +QList> SelectResolver::resolveColumns() +{ + if (!parseOriginalQuery()) + return QList>(); + + return resolve(originalQueryParsed.data()); +} + QList SelectResolver::resolve(SqliteSelect::Core *selectCore) { errors.clear(); return resolveCore(selectCore); } -QList > SelectResolver::resolve(SqliteSelect *select) +QList> SelectResolver::resolve(SqliteSelect *select) { errors.clear(); QList > 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::resolveSingleSourceSubSelect(Sqlit { QList columnSources = resolveSubSelect(joinSrc->select); applySubSelectAlias(columnSources, joinSrc->alias); + + QMutableListIterator 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().isNull()) + { + qWarning() << "Parsed query is not SELECT as expected in SelectResolver::parseOriginalQuery():" << query; + return false; + } + + originalQueryParsed = theQuery.dynamicCast(); + return true; +} + int SelectResolver::Table::operator ==(const SelectResolver::Table &other) { return table == other.table && database == other.database && alias == other.alias; -- cgit v1.2.3