summaryrefslogtreecommitdiffstats
path: root/tests/auto/sql/kernel
diff options
context:
space:
mode:
authorAndy Shaw <andy.shaw@qt.io>2020-07-31 13:07:09 +0200
committerAndy Shaw <andy.shaw@qt.io>2020-08-23 00:22:04 +0200
commit7ec818e74ad1d346f40b17c338de424a0f45fa12 (patch)
treee05ac9025e84156abc602d65e780c28a616c554e /tests/auto/sql/kernel
parentaa2c6690fdf44422ae1a5edebb35e46d6ffda83c (diff)
Interbase: Fix tests when running against Firebird
Change-Id: Ibfcf6b557aed3b0cd2e0ece5cf122819a1acc0c1 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'tests/auto/sql/kernel')
-rw-r--r--tests/auto/sql/kernel/qsqldatabase/tst_databases.h18
-rw-r--r--tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp41
-rw-r--r--tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp6
-rw-r--r--tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp29
4 files changed, 67 insertions, 27 deletions
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_databases.h b/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
index 174db2863e..d17c47879d 100644
--- a/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
+++ b/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
@@ -67,9 +67,6 @@ static QString qGetHostName()
return hostname;
}
-// to prevent nameclashes on our database server, each machine
-// will use its own set of table names. Call this function to get
-// "tablename_hostname"
inline QString fixupTableName(const QString &tableName, QSqlDatabase db)
{
QString tbName = tableName;
@@ -77,16 +74,21 @@ inline QString fixupTableName(const QString &tableName, QSqlDatabase db)
QSqlDriverPrivate *d = static_cast<QSqlDriverPrivate *>(QObjectPrivate::get(db.driver()));
if (d && d->dbmsType == QSqlDriver::Oracle)
tbName.truncate(30);
+ // On Interbase we are limited to 31 character tablenames
+ if (d && d->dbmsType == QSqlDriver::Interbase)
+ tbName.truncate(31);
return tbName;
}
+// to prevent nameclashes on our database server, each machine
+// will use its own set of table names. Call this function to get
+// "tablename_hostname"
inline static QString qTableName(const QString &prefix, const char *sourceFileName,
QSqlDatabase db, bool escape = true)
{
- const auto tableStr = fixupTableName(QString(QLatin1String("dbtst") + db.driverName() +
- QString::number(qHash(QLatin1String(sourceFileName) +
- "_" + qGetHostName().replace("-", "_")), 16) +
- "_" + prefix), db);
+ const auto tableStr = fixupTableName(QString(QLatin1String("dbtst") + db.driverName() + "_" +
+ prefix + QString::number(qHash(QLatin1String(sourceFileName) +
+ "_" + qGetHostName().replace("-", "_")), 16)), db);
return escape ? db.driver()->escapeIdentifier(tableStr, QSqlDriver::TableName) : tableStr;
}
@@ -452,6 +454,8 @@ public:
return QLatin1String("timestamptz");
if (dbType == QSqlDriver::Oracle && getOraVersion(db) >= 9)
return QLatin1String("timestamp(0)");
+ if (dbType == QSqlDriver::Interbase)
+ return QLatin1String("timestamp");
return QLatin1String("datetime");
}
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
index 7d75aec845..cbcd573a3b 100644
--- a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
+++ b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
@@ -279,6 +279,13 @@ static int createFieldTable(const FieldDef fieldDefs[], QSqlDatabase db)
return i;
}
+bool driverQuotedCaseSensitive(QSqlDatabase db)
+{
+ // On Interbase it will be case sensitive if it was created with quotes
+ QSqlDriverPrivate *d = static_cast<QSqlDriverPrivate *>(QObjectPrivate::get(db.driver()));
+ return (d && d->dbmsType == QSqlDriver::Interbase);
+}
+
tst_QSqlDatabase::tst_QSqlDatabase()
{
}
@@ -575,8 +582,13 @@ void tst_QSqlDatabase::whitespaceInIdentifiers()
const QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
if (testWhiteSpaceNames(db.driverName())) {
- const auto tableName(qTableName("qtest test", __FILE__, db, false));
- QVERIFY(db.tables().contains(tableName, Qt::CaseInsensitive));
+ const bool isCaseSensitive = driverQuotedCaseSensitive(db);
+ const auto tableName(qTableName("qtest test", __FILE__, db, isCaseSensitive));
+ if (isCaseSensitive) {
+ QVERIFY(db.tables().contains(db.driver()->stripDelimiters(tableName, QSqlDriver::TableName)));
+ } else {
+ QVERIFY(db.tables().contains(tableName, Qt::CaseInsensitive));
+ }
QSqlRecord rec = db.record(tableName);
QCOMPARE(rec.count(), 1);
@@ -605,11 +617,11 @@ void tst_QSqlDatabase::alterTable()
CHECK_DATABASE(db);
const QString qtestalter(qTableName("qtestalter", __FILE__, db));
const auto noEscapeAlterTable = qTableName("qtestalter", __FILE__, db, false);
-
+ const bool isCaseSensitive = driverQuotedCaseSensitive(db);
QSqlQuery q(db);
QVERIFY_SQL(q, exec("create table " + qtestalter + " (F1 char(20), F2 char(20), F3 char(20))"));
- QSqlRecord rec = db.record(noEscapeAlterTable);
+ QSqlRecord rec = db.record(isCaseSensitive ? qtestalter : noEscapeAlterTable);
QCOMPARE((int)rec.count(), 3);
int i;
@@ -621,7 +633,7 @@ void tst_QSqlDatabase::alterTable()
QSKIP("DBMS doesn't support dropping columns in ALTER TABLE statement");
}
- rec = db.record(noEscapeAlterTable);
+ rec = db.record(isCaseSensitive ? qtestalter : noEscapeAlterTable);
QCOMPARE((int)rec.count(), 2);
@@ -679,8 +691,11 @@ void tst_QSqlDatabase::testRecord(const FieldDef fieldDefs[], const QSqlRecord&
void tst_QSqlDatabase::commonFieldTest(const FieldDef fieldDefs[], QSqlDatabase db, const int fieldCount)
{
CHECK_DATABASE(db);
- const QStringList tableNames = { qTableName("qtestfields", __FILE__, db),
- qTableName("qtestfields", __FILE__, db, false) };
+
+ QStringList tableNames = { qTableName("qtestfields", __FILE__, db) };
+ if (!driverQuotedCaseSensitive(db))
+ tableNames << qTableName("qtestfields", __FILE__, db, false);
+
for (const QString &table : tableNames) {
QSqlRecord rec = db.record(table);
QCOMPARE(rec.count(), fieldCount + 1);
@@ -1204,10 +1219,12 @@ void tst_QSqlDatabase::caseSensivity()
bool cs = false;
if (dbType == QSqlDriver::MySqlServer || dbType == QSqlDriver::SQLite
|| dbType == QSqlDriver::Sybase || dbType == QSqlDriver::PostgreSQL
- || dbType == QSqlDriver::MSSqlServer || db.driverName().startsWith("QODBC"))
- cs = true;
+ || dbType == QSqlDriver::MSSqlServer || db.driverName().startsWith("QODBC")
+ || dbType == QSqlDriver::Interbase) {
+ cs = true;
+ }
- QSqlRecord rec = db.record(qTableName("qtest", __FILE__, db, false));
+ QSqlRecord rec = db.record(qTableName("qtest", __FILE__, db, driverQuotedCaseSensitive(db)));
QVERIFY((int)rec.count() > 0);
if (!cs) {
rec = db.record(qTableName("QTEST", __FILE__, db, false).toUpper());
@@ -1216,7 +1233,7 @@ void tst_QSqlDatabase::caseSensivity()
QVERIFY((int)rec.count() > 0);
}
- rec = db.primaryIndex(qTableName("qtest", __FILE__, db, false));
+ rec = db.primaryIndex(qTableName("qtest", __FILE__, db, driverQuotedCaseSensitive(db)));
QVERIFY((int)rec.count() > 0);
if (!cs) {
rec = db.primaryIndex(qTableName("QTEST", __FILE__, db, false).toUpper());
@@ -1908,6 +1925,8 @@ void tst_QSqlDatabase::ibase_useCustomCharset()
const QString tableName(qTableName("latin1table", __FILE__, db));
QSqlQuery q(db);
+ QEXPECT_FAIL("", "Currently fails, potentially due to invalid test - needs further "
+ "investigation - QTBUG-85828", Abort);
QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(text VARCHAR(6) CHARACTER SET Latin1)").arg(tableName)));
QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES(?)").arg(tableName)));
q.addBindValue(nonlatin1string);
diff --git a/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp b/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp
index 5fa5c1bb58..508a1d8403 100644
--- a/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp
+++ b/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp
@@ -91,6 +91,8 @@ void tst_QSqlDriver::recreateTestTables(QSqlDatabase db)
doubleField = "more_data number(8,7)";
else if (dbType == QSqlDriver::PostgreSQL)
doubleField = "more_data double precision";
+ else if (dbType == QSqlDriver::Interbase)
+ doubleField = "more_data numeric(8,7)";
else
doubleField = "more_data double(8,7)";
const QString defValue(driverSupportsDefaultValues(dbType) ? QStringLiteral("DEFAULT 'defaultVal'") : QString());
@@ -157,7 +159,7 @@ void tst_QSqlDriver::record()
if (driverSupportsDefaultValues(dbType))
QCOMPARE(rec.field(QStringLiteral("name")).defaultValue().toString(), QStringLiteral("defaultVal"));
- if (dbType == QSqlDriver::Interbase || dbType == QSqlDriver::Oracle || dbType == QSqlDriver::DB2)
+ if (dbType == QSqlDriver::Oracle || dbType == QSqlDriver::DB2)
tablename = tablename.toUpper();
else if (dbType == QSqlDriver::PostgreSQL)
tablename = tablename.toLower();
@@ -205,7 +207,7 @@ void tst_QSqlDriver::primaryIndex()
//check that we can get the primary index using a quoted tablename
- if (dbType == QSqlDriver::Interbase || dbType == QSqlDriver::Oracle || dbType == QSqlDriver::DB2)
+ if (dbType == QSqlDriver::Oracle || dbType == QSqlDriver::DB2)
tablename = tablename.toUpper();
else if (dbType == QSqlDriver::PostgreSQL)
tablename = tablename.toLower();
diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
index 23ebc1fbfd..e75c98839b 100644
--- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
@@ -845,16 +845,17 @@ void tst_QSqlQuery::storedProceduresIBase()
CHECK_DATABASE( db );
QSqlQuery q( db );
- q.exec("drop procedure " + qTableName("TESTPROC", __FILE__, db));
+ const auto procName = qTableName("TESTPROC", __FILE__, db);
+ q.exec("drop procedure " + procName);
- QVERIFY_SQL(q, exec("create procedure " + qTableName("TESTPROC", __FILE__, db) +
+ QVERIFY_SQL(q, exec("create procedure " + procName +
" RETURNS (x integer, y varchar(20)) "
"AS BEGIN "
" x = 42; "
" y = 'Hello Anders'; "
"END" ) );
- QVERIFY_SQL(q, prepare("execute procedure " + qTableName("TestProc", __FILE__, db)));
+ QVERIFY_SQL(q, prepare("execute procedure " + procName));
QVERIFY_SQL( q, exec() );
// check for a valid result set
@@ -871,7 +872,7 @@ void tst_QSqlQuery::storedProceduresIBase()
// the second next shall fail
QVERIFY( !q.next() );
- q.exec("drop procedure " + qTableName("TestProc", __FILE__, db));
+ q.exec("drop procedure " + procName);
}
void tst_QSqlQuery::outValuesDB2()
@@ -2467,9 +2468,18 @@ void tst_QSqlQuery::batchExec()
QSqlQuery q( db );
const QString tableName = qTableName("qtest_batch", __FILE__, db);
tst_Databases::safeDropTable(db, tableName);
+
+ const auto dbType = tst_Databases::getDatabaseType(db);
+ QString timeStampString;
+ if (dbType == QSqlDriver::Interbase)
+ timeStampString = QLatin1String("TIMESTAMP");
+ else
+ timeStampString = QLatin1String("TIMESTAMP (3)");
+
QVERIFY_SQL(q, exec(QStringLiteral("create table ") + tableName +
QStringLiteral(" (id int, name varchar(20), dt date, num numeric(8, 4), "
- "dtstamp TIMESTAMP(3), extraId int, extraName varchar(20))")));
+ "dtstamp ") + timeStampString +
+ QStringLiteral(", extraId int, extraName varchar(20))")));
const QVariantList intCol = { 1, 2, QVariant(QVariant::Int) };
const QVariantList charCol = { QStringLiteral("harald"), QStringLiteral("boris"),
@@ -3357,6 +3367,11 @@ void tst_QSqlQuery::timeStampParsing()
QVERIFY_SQL(q, exec(QStringLiteral("CREATE TABLE ") + tableName + QStringLiteral("("
"id integer NOT NULL AUTO_INCREMENT,"
"datefield timestamp, primary key(id));")));
+ } else if (dbType == QSqlDriver::Interbase) {
+ // Since there is no auto-increment feature in Interbase we allow it to be null
+ QVERIFY_SQL(q, exec(QStringLiteral("CREATE TABLE ") + tableName + QStringLiteral("("
+ "id integer,"
+ "datefield timestamp);")));
} else {
QVERIFY_SQL(q, exec(QStringLiteral("CREATE TABLE ") + tableName + QStringLiteral("("
"\"id\" integer NOT NULL PRIMARY KEY AUTOINCREMENT,"
@@ -4273,7 +4288,7 @@ void tst_QSqlQuery::aggregateFunctionTypes()
QVariant::Type countType = intType;
// QPSQL uses LongLong for manipulation of integers
const QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
- if (dbType == QSqlDriver::PostgreSQL) {
+ if (dbType == QSqlDriver::PostgreSQL || dbType == QSqlDriver::Interbase) {
sumType = countType = QVariant::LongLong;
} else if (dbType == QSqlDriver::Oracle) {
intType = sumType = countType = QVariant::Double;
@@ -4312,7 +4327,7 @@ void tst_QSqlQuery::aggregateFunctionTypes()
QCOMPARE(q.record().field(0).metaType().id(), QVariant::Double);
} else {
QCOMPARE(q.value(0).toInt(), 1);
- QCOMPARE(q.record().field(0).metaType().id(), QVariant::Int);
+ QCOMPARE(q.record().field(0).metaType().id(), (dbType == QSqlDriver::Interbase ? QVariant::LongLong : QVariant::Int));
}
QVERIFY_SQL(q, exec("SELECT COUNT(id) FROM " + tableName));