aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/db
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/db')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h6
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp44
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h2
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