diff options
| author | 2016-06-13 18:42:57 -0400 | |
|---|---|---|
| committer | 2016-06-13 18:42:57 -0400 | |
| commit | 65d5f68cc6dc81799c5a5d90400a2c1f0dd02547 (patch) | |
| tree | 6f245ba901b87ef42fed69965aea22f5eea6b590 /SQLiteStudio3/coreSQLiteStudio/selectresolver.cpp | |
| parent | aeb6bad01630d325a4e768e798a7a6d44e18fdaf (diff) | |
| parent | 5d9314f134ddd3dc4c853e398ac90ba247fb2e4f (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.cpp | 61 |
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; |
