diff options
author | Andy Shaw <andy.shaw@qt.io> | 2017-05-19 15:31:46 +0200 |
---|---|---|
committer | Andy Shaw <andy.shaw@qt.io> | 2017-07-12 09:01:50 +0000 |
commit | 0843c6ca7fe604d8c44b9a81b8fcb072ab424172 (patch) | |
tree | e6784759b9dd8729d5bd179a38552170e084a723 /src/plugins | |
parent | 9423be1f190bd7cdeb04add39f4ec621a33a3041 (diff) |
QSqlField: Add a means to see what the tablename is for a given field
When you are using a query that pulls from a number of different tables
then it can be ambiguous as to which table a particular field belongs to.
So this will make it possible to determine the table that a given field
belongs to if it is set.
Task-number: QTBUG-7170
Change-Id: I49b7890c0523d81272a153df3860df800ff853d5
Reviewed-by: Jesus Fernandez <Jesus.Fernandez@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/sqldrivers/db2/qsql_db2.cpp | 14 | ||||
-rw-r--r-- | src/plugins/sqldrivers/ibase/qsql_ibase.cpp | 9 | ||||
-rw-r--r-- | src/plugins/sqldrivers/mysql/qsql_mysql.cpp | 3 | ||||
-rw-r--r-- | src/plugins/sqldrivers/odbc/qsql_odbc.cpp | 7 | ||||
-rw-r--r-- | src/plugins/sqldrivers/psql/qsql_psql.cpp | 11 | ||||
-rw-r--r-- | src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp | 8 | ||||
-rw-r--r-- | src/plugins/sqldrivers/sqlite2/qsql_sqlite2.cpp | 2 | ||||
-rw-r--r-- | src/plugins/sqldrivers/tds/qsql_tds.cpp | 4 |
8 files changed, 44 insertions, 14 deletions
diff --git a/src/plugins/sqldrivers/db2/qsql_db2.cpp b/src/plugins/sqldrivers/db2/qsql_db2.cpp index 27d0e7001a..1a9631f1eb 100644 --- a/src/plugins/sqldrivers/db2/qsql_db2.cpp +++ b/src/plugins/sqldrivers/db2/qsql_db2.cpp @@ -66,6 +66,10 @@ QT_BEGIN_NAMESPACE static const int COLNAMESIZE = 255; +// Based on what is mentioned in the documentation here: +// https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/sqlref/src/tpc/db2z_limits.html +// The limit is 128 bytes for table names +static const SQLSMALLINT TABLENAMESIZE = 128; static const SQLSMALLINT qParamType[4] = { SQL_PARAM_INPUT, SQL_PARAM_INPUT, SQL_PARAM_OUTPUT, SQL_PARAM_INPUT_OUTPUT }; class QDB2DriverPrivate : public QSqlDriverPrivate @@ -297,6 +301,12 @@ static QSqlField qMakeFieldInfo(const QDB2ResultPrivate* d, int i) f.setLength(colSize == 0 ? -1 : int(colSize)); f.setPrecision(colScale == 0 ? -1 : int(colScale)); f.setSqlType(int(colType)); + SQLTCHAR tableName[TABLENAMESIZE]; + SQLSMALLINT tableNameLen; + r = SQLColAttribute(d->hStmt, i + 1, SQL_DESC_BASE_TABLE_NAME, tableName, + TABLENAMESIZE, &tableNameLen, 0); + if (r == SQL_SUCCESS) + f.setTableName(qFromTChar(tableName)); return f; } @@ -1394,7 +1404,9 @@ QSqlRecord QDB2Driver::record(const QString& tableName) const SQL_FETCH_NEXT, 0); while (r == SQL_SUCCESS) { - fil.append(qMakeFieldInfo(hStmt)); + QSqlField fld = qMakeFieldInfo(hStmt); + fld.setTableName(tableName); + fil.append(fld); r = SQLFetchScroll(hStmt, SQL_FETCH_NEXT, 0); diff --git a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp index 6fd91b6b76..23a86e2266 100644 --- a/src/plugins/sqldrivers/ibase/qsql_ibase.cpp +++ b/src/plugins/sqldrivers/ibase/qsql_ibase.cpp @@ -1382,7 +1382,8 @@ QSqlRecord QIBaseResult::record() const for (int i = 0; i < d->sqlda->sqld; ++i) { v = d->sqlda->sqlvar[i]; QSqlField f(QString::fromLatin1(v.aliasname, v.aliasname_length).simplified(), - qIBaseTypeName2(v.sqltype, v.sqlscale < 0)); + qIBaseTypeName2(v.sqltype, v.sqlscale < 0), + QString::fromLatin1(v.relname, v.relname_length)); f.setLength(v.sqllen); f.setPrecision(qAbs(v.sqlscale)); f.setRequiredStatus((v.sqltype & 1) == 0 ? QSqlField::Required : QSqlField::Optional); @@ -1685,7 +1686,7 @@ QSqlRecord QIBaseDriver::record(const QString& tablename) const while (q.next()) { int type = q.value(1).toInt(); bool hasScale = q.value(3).toInt() < 0; - QSqlField f(q.value(0).toString().simplified(), qIBaseTypeName(type, hasScale)); + QSqlField f(q.value(0).toString().simplified(), qIBaseTypeName(type, hasScale), tablename); if(hasScale) { f.setLength(q.value(4).toInt()); f.setPrecision(qAbs(q.value(3).toInt())); @@ -1726,7 +1727,9 @@ QSqlIndex QIBaseDriver::primaryIndex(const QString &table) const "ORDER BY b.RDB$FIELD_POSITION")); while (q.next()) { - QSqlField field(q.value(1).toString().simplified(), qIBaseTypeName(q.value(2).toInt(), q.value(3).toInt() < 0)); + QSqlField field(q.value(1).toString().simplified(), + qIBaseTypeName(q.value(2).toInt(), q.value(3).toInt() < 0), + tablename); index.append(field); //TODO: asc? desc? index.setName(q.value(0).toString()); } diff --git a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp index ee439fa33e..3dc0e73af5 100644 --- a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp +++ b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp @@ -331,7 +331,8 @@ static QVariant::Type qDecodeMYSQLType(int mysqltype, uint flags) static QSqlField qToField(MYSQL_FIELD *field, QTextCodec *tc) { QSqlField f(toUnicode(tc, field->name), - qDecodeMYSQLType(int(field->type), field->flags)); + qDecodeMYSQLType(int(field->type), field->flags), + toUnicode(tc, field->table)); f.setRequired(IS_NOT_NULL(field->flags)); f.setLength(field->length); f.setPrecision(field->decimals); diff --git a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp index 59ef42d609..c32a29c5e7 100644 --- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp +++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp @@ -64,6 +64,7 @@ QT_BEGIN_NAMESPACE #define ODBC_CHECK_DRIVER static const int COLNAMESIZE = 256; +static const SQLSMALLINT TABLENAMESIZE = 128; //Map Qt parameter types to ODBC types static const SQLSMALLINT qParamType[4] = { SQL_PARAM_INPUT, SQL_PARAM_INPUT, SQL_PARAM_OUTPUT, SQL_PARAM_INPUT_OUTPUT }; @@ -730,6 +731,12 @@ static QSqlField qMakeFieldInfo(const SQLHANDLE hStmt, int i, QString *errorMess f.setRequired(false); // else we don't know f.setAutoValue(isAutoValue(hStmt, i)); + QVarLengthArray<SQLTCHAR> tableName(TABLENAMESIZE); + SQLSMALLINT tableNameLen; + r = SQLColAttribute(hStmt, i + 1, SQL_DESC_BASE_TABLE_NAME, tableName.data(), + TABLENAMESIZE, &tableNameLen, 0); + if (r == SQL_SUCCESS) + f.setTableName(fromSQLTCHAR(tableName, tableNameLen)); return f; } diff --git a/src/plugins/sqldrivers/psql/qsql_psql.cpp b/src/plugins/sqldrivers/psql/qsql_psql.cpp index b60fa1058f..a3aa0f6593 100644 --- a/src/plugins/sqldrivers/psql/qsql_psql.cpp +++ b/src/plugins/sqldrivers/psql/qsql_psql.cpp @@ -552,6 +552,11 @@ QSqlRecord QPSQLResult::record() const f.setName(QString::fromUtf8(PQfname(d->result, i))); else f.setName(QString::fromLocal8Bit(PQfname(d->result, i))); + QSqlQuery qry(driver()->createResult()); + if (qry.exec(QStringLiteral("SELECT relname FROM pg_class WHERE pg_class.oid = %1") + .arg(PQftable(d->result, i))) && qry.next()) { + f.setTableName(qry.value(0).toString()); + } int ptype = PQftype(d->result, i); f.setType(qDecodePSQLType(ptype)); int len = PQfsize(d->result, i); @@ -1132,7 +1137,7 @@ QSqlIndex QPSQLDriver::primaryIndex(const QString& tablename) const i.exec(stmt.arg(tbl)); while (i.isActive() && i.next()) { - QSqlField f(i.value(0).toString(), qDecodePSQLType(i.value(1).toInt())); + QSqlField f(i.value(0).toString(), qDecodePSQLType(i.value(1).toInt()), tablename); idx.append(f); idx.setName(i.value(2).toString()); } @@ -1237,7 +1242,7 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const QString defVal = query.value(5).toString(); if (!defVal.isEmpty() && defVal.at(0) == QLatin1Char('\'')) defVal = defVal.mid(1, defVal.length() - 2); - QSqlField f(query.value(0).toString(), qDecodePSQLType(query.value(1).toInt())); + QSqlField f(query.value(0).toString(), qDecodePSQLType(query.value(1).toInt()), tablename); f.setRequired(query.value(2).toBool()); f.setLength(len); f.setPrecision(precision); @@ -1264,7 +1269,7 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const len = precision - 4; precision = -1; } - QSqlField f(query.value(0).toString(), qDecodePSQLType(query.value(1).toInt())); + QSqlField f(query.value(0).toString(), qDecodePSQLType(query.value(1).toInt()), tablename); f.setRequired(query.value(2).toBool()); f.setLength(len); f.setPrecision(precision); diff --git a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp index e7f9be9e39..b0db1c276e 100644 --- a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp +++ b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp @@ -212,7 +212,9 @@ void QSQLiteResultPrivate::initColumns(bool emptyResultset) QString colName = QString(reinterpret_cast<const QChar *>( sqlite3_column_name16(stmt, i)) ).remove(QLatin1Char('"')); - + const QString tableName = QString(reinterpret_cast<const QChar *>( + sqlite3_column_table_name16(stmt, i)) + ).remove(QLatin1Char('"')); // must use typeName for resolving the type to match QSqliteDriver::record QString typeName = QString(reinterpret_cast<const QChar *>( sqlite3_column_decltype16(stmt, i))); @@ -245,7 +247,7 @@ void QSQLiteResultPrivate::initColumns(bool emptyResultset) } } - QSqlField fld(colName, fieldType); + QSqlField fld(colName, fieldType, tableName); fld.setSqlType(stp); rInf.append(fld); } @@ -872,7 +874,7 @@ static QSqlIndex qGetTableInfo(QSqlQuery &q, const QString &tableName, bool only if (onlyPIndex && !isPk) continue; QString typeName = q.value(2).toString().toLower(); - QSqlField fld(q.value(1).toString(), qGetColumnType(typeName)); + QSqlField fld(q.value(1).toString(), qGetColumnType(typeName), tableName); if (isPk && (typeName == QLatin1String("integer"))) // INTEGER PRIMARY KEY fields are auto-generated in sqlite // INT PRIMARY KEY is not the same as INTEGER PRIMARY KEY! diff --git a/src/plugins/sqldrivers/sqlite2/qsql_sqlite2.cpp b/src/plugins/sqldrivers/sqlite2/qsql_sqlite2.cpp index 67c24e4168..93f47e3f13 100644 --- a/src/plugins/sqldrivers/sqlite2/qsql_sqlite2.cpp +++ b/src/plugins/sqldrivers/sqlite2/qsql_sqlite2.cpp @@ -576,7 +576,7 @@ QSqlIndex QSQLite2Driver::primaryIndex(const QString &tblname) const QVariant::Type type = QVariant::Invalid; if (rec.contains(name)) type = rec.field(name).type(); - index.append(QSqlField(name, type)); + index.append(QSqlField(name, type, tblname)); } return index; } diff --git a/src/plugins/sqldrivers/tds/qsql_tds.cpp b/src/plugins/sqldrivers/tds/qsql_tds.cpp index 6ebd09a572..670198af81 100644 --- a/src/plugins/sqldrivers/tds/qsql_tds.cpp +++ b/src/plugins/sqldrivers/tds/qsql_tds.cpp @@ -767,7 +767,7 @@ QSqlRecord QTDSDriver::record(const QString& tablename) const "where id = (select id from sysobjects where name = '%1')")); t.exec(stmt.arg(table)); while (t.next()) { - QSqlField f(t.value(0).toString().simplified(), qDecodeTDSType(t.value(1).toInt())); + QSqlField f(t.value(0).toString().simplified(), qDecodeTDSType(t.value(1).toInt()), tablename); f.setLength(t.value(2).toInt()); f.setPrecision(t.value(3).toInt()); f.setSqlType(t.value(1).toInt()); @@ -853,7 +853,7 @@ QSqlIndex QTDSDriver::primaryIndex(const QString& tablename) const QRegExp regx(QLatin1String("\\s*(\\S+)(?:\\s+(DESC|desc))?\\s*")); for(QStringList::Iterator it = fNames.begin(); it != fNames.end(); ++it) { regx.indexIn(*it); - QSqlField f(regx.cap(1), rec.field(regx.cap(1)).type()); + QSqlField f(regx.cap(1), rec.field(regx.cap(1)).type(), tablename); if (regx.cap(2).toLower() == QLatin1String("desc")) { idx.append(f, true); } else { |