From 295e98915d933970e56c65510b35f21e848f9af1 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Fri, 31 Jul 2020 12:48:22 +0200 Subject: Introduce maximumIdentifierLength to return database limits for names Since Interbase/Firebird has a limit for column and table names then this function can be used by QSqlRelationalTableModel to make sure that the aliases created are within that limit. Change-Id: I0cb1c65b34befcb3690ccad3f081556dd2691344 Reviewed-by: Volker Hilsheimer --- src/plugins/sqldrivers/ibase/qsql_ibase.cpp | 6 ++++++ src/plugins/sqldrivers/ibase/qsql_ibase_p.h | 2 +- src/sql/kernel/qsqldriver.cpp | 15 +++++++++++++++ src/sql/kernel/qsqldriver.h | 2 +- src/sql/models/qsqlrelationaltablemodel.cpp | 3 ++- 5 files changed, 25 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp index dc4eb036d8..75fc68ca9b 100644 --- a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp +++ b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp @@ -1884,4 +1884,10 @@ QString QIBaseDriver::escapeIdentifier(const QString &identifier, IdentifierType return res; } +int QIBaseDriver::maximumIdentifierLength(IdentifierType type) const +{ + Q_UNUSED(type); + return 31; +} + QT_END_NAMESPACE diff --git a/src/plugins/sqldrivers/ibase/qsql_ibase_p.h b/src/plugins/sqldrivers/ibase/qsql_ibase_p.h index 82a0ab8e4d..e7c908cf2b 100644 --- a/src/plugins/sqldrivers/ibase/qsql_ibase_p.h +++ b/src/plugins/sqldrivers/ibase/qsql_ibase_p.h @@ -106,7 +106,7 @@ public: bool subscribeToNotification(const QString &name) override; bool unsubscribeFromNotification(const QString &name) override; QStringList subscribedToNotifications() const override; - + int maximumIdentifierLength(IdentifierType type) const override; private Q_SLOTS: void qHandleEventNotification(void* updatedResultBuffer); }; diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp index 8753352617..02371a209b 100644 --- a/src/sql/kernel/qsqldriver.cpp +++ b/src/sql/kernel/qsqldriver.cpp @@ -46,6 +46,8 @@ #include "private/qobject_p.h" #include "private/qsqldriver_p.h" +#include + QT_BEGIN_NAMESPACE static QString prepareIdentifier(const QString &identifier, @@ -829,4 +831,17 @@ bool QSqlDriver::cancelQuery() return false; } +/*! + \since 6.0 + + Returns the maximum length for the identifier \a type according to the database settings. Returns + INT_MAX by default if the is no maximum for the database. +*/ + +int QSqlDriver::maximumIdentifierLength(QSqlDriver::IdentifierType type) const +{ + Q_UNUSED(type); + return INT_MAX; +} + QT_END_NAMESPACE diff --git a/src/sql/kernel/qsqldriver.h b/src/sql/kernel/qsqldriver.h index 31de63be15..361a11bec3 100644 --- a/src/sql/kernel/qsqldriver.h +++ b/src/sql/kernel/qsqldriver.h @@ -130,7 +130,7 @@ public: QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() const; DbmsType dbmsType() const; - + virtual int maximumIdentifierLength(IdentifierType type) const; public Q_SLOTS: virtual bool cancelQuery(); diff --git a/src/sql/models/qsqlrelationaltablemodel.cpp b/src/sql/models/qsqlrelationaltablemodel.cpp index bdd82990d9..8c787eab0c 100644 --- a/src/sql/models/qsqlrelationaltablemodel.cpp +++ b/src/sql/models/qsqlrelationaltablemodel.cpp @@ -590,8 +590,9 @@ QString QSqlRelationalTableModel::selectStatement() const QString displayColumn = relation.displayColumn(); if (d->db.driver()->isIdentifierEscaped(displayColumn, QSqlDriver::FieldName)) displayColumn = d->db.driver()->stripDelimiters(displayColumn, QSqlDriver::FieldName); - const QString alias = QString::fromLatin1("%1_%2_%3") + QString alias = QString::fromLatin1("%1_%2_%3") .arg(relTableName, displayColumn, QString::number(fieldNames.value(fieldList[i]))); + alias.truncate(d->db.driver()->maximumIdentifierLength(QSqlDriver::FieldName)); displayTableField = Sql::as(displayTableField, alias); --fieldNames[fieldList[i]]; } -- cgit v1.2.3