diff options
| author | 2014-12-14 08:24:32 -0500 | |
|---|---|---|
| committer | 2014-12-14 08:24:32 -0500 | |
| commit | e571839e140139a6a819077e94cf8cc01c13b29f (patch) | |
| tree | 8263635257cfb5ed979a584a958103b700bf31e7 /SQLiteStudio3/coreSQLiteStudio/db | |
| parent | 407eac41f46936e3f346bb5a964a682e578b4237 (diff) | |
| parent | 89214766d8e3e7b8dd749a1fa18a5b9727f5010d (diff) | |
Merge tag 'upstream/3.0.0'
Upstream version 3.0.0
# gpg: Signature made Sun 14 Dec 2014 08:24:31 AM EST 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>"
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/db')
3 files changed, 49 insertions, 3 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h index d8e54b4..89c3d96 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h @@ -700,6 +700,8 @@ void AbstractDb3<T>::releaseAggregateContext(typename T::context* context) template <class T> void AbstractDb3<T>::registerDefaultCollation(void* fnUserData, typename T::handle* fnDbHandle, int eTextRep, const char* collationName) { + UNUSED(eTextRep); + CollationUserData* defUserData = reinterpret_cast<CollationUserData*>(fnUserData); if (!defUserData) { @@ -725,7 +727,7 @@ void AbstractDb3<T>::registerDefaultCollation(void* fnUserData, typename T::hand return; } - int res = T::create_collation_v2(fnDbHandle, collationName, eTextRep, nullptr, + int res = T::create_collation_v2(fnDbHandle, collationName, T::UTF8, nullptr, &AbstractDb3<T>::evaluateDefaultCollation, nullptr); if (res != T::OK) @@ -738,7 +740,7 @@ int AbstractDb3<T>::evaluateDefaultCollation(void* userData, int length1, const UNUSED(userData); UNUSED(length1); UNUSED(length2); - return COLLATIONS->evaluateDefault(QString::fromUtf8((const char*)value1), QString::fromUtf8((const char*)value2)); + return COLLATIONS->evaluateDefault(QString::fromUtf8((const char*)value1, length1), QString::fromUtf8((const char*)value2, length2)); } template <class T> diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp index 02f90b2..bce1304 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp @@ -164,6 +164,28 @@ SqliteSelect::Core::ResultColumn* QueryExecutorColumns::getResultColumnForSelect selectResultColumn->expr->table = resultColumn->table; } + +// // SQLite2 requires special treatment here. It won't allow selecting db.table.col from a subquery - it needs escaped ID that reflects db.table.col. +// if (dialect == Dialect::Sqlite2) +// { +// selectResultColumn->expr->rebuildTokens(); +// colString = wrapObjIfNeeded(selectResultColumn->expr->detokenize(), dialect); +// delete selectResultColumn->expr; +// selectResultColumn->expr = nullptr; + +// expr = parser.parseExpr(colString); +// if (!expr) +// { +// qWarning() << "Could not parse result column expr in SQLite2's second parsing phase:" << colString; +// if (parser.getErrors().size() > 0) +// qWarning() << "The error was:" << parser.getErrors().first()->getFrom() << ":" << parser.getErrors().first()->getMessage(); + +// return nullptr; +// } + +// expr->setParent(selectResultColumn); +// selectResultColumn->expr = expr; +// } } if (!col.alias.isNull()) @@ -232,8 +254,10 @@ void QueryExecutorColumns::wrapWithAliasedColumns(SqliteSelect* select) baseColName = QString(); if (!resCol->alias.isNull()) baseColName = resCol->alias; - else if (!resCol->expression) + else if (dialect == Dialect::Sqlite3 && !resCol->expression) baseColName = resCol->column; + else if (dialect == Dialect::Sqlite2 && !resCol->expression) + baseColName = getAliasedColumnNameForSqlite2(resCol); if (!baseColName.isNull()) { @@ -254,3 +278,21 @@ void QueryExecutorColumns::wrapWithAliasedColumns(SqliteSelect* select) //QString t = outerColumns.detokenize(); // keeping it for debug purposes select->tokens = wrapSelect(select->tokens, outerColumns); } + +QString QueryExecutorColumns::getAliasedColumnNameForSqlite2(const QueryExecutor::ResultColumnPtr& resCol) +{ + QStringList colNameParts; + if (!resCol->table.isNull()) + { + if (!resCol->database.isNull()) + { + if (context->dbNameToAttach.containsLeft(resCol->database, Qt::CaseInsensitive)) + colNameParts << context->dbNameToAttach.valueByLeft(resCol->database, Qt::CaseInsensitive); + else + colNameParts << resCol->database; + } + colNameParts << resCol->table; + } + colNameParts << resCol->column; + return colNameParts.join("."); +} diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h index 3f90311..fd85651 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h @@ -67,6 +67,8 @@ class QueryExecutorColumns : public QueryExecutorStep bool isRowIdColumnAlias(const QString& alias); void wrapWithAliasedColumns(SqliteSelect* select); + + QString getAliasedColumnNameForSqlite2(const QueryExecutor::ResultColumnPtr& resCol); }; #endif // QUERYEXECUTORCOLUMNS_H |
