diff options
author | Andy Shaw <andy.shaw@digia.com> | 2013-04-04 08:45:50 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-04-25 19:59:16 +0200 |
commit | 8f125985dbebef9ab9db31e8a180d01b7452030e (patch) | |
tree | 36e6c192f46bbb1488fb021b3809305cc669f910 /tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp | |
parent | 89e2319322e2e29d6297e72431c9327358e3be21 (diff) |
Cleanup the SQL tests
This removes some XFAILS that were no longer correct and
fixes some existing problems in the tests where ODBC is
concerned.
Change-Id: I91de526bb50ad4046ba07ddb5336aa3714966687
Reviewed-by: Mark Brand <mabrand@mabrand.nl>
Reviewed-by: Caroline Chao <caroline.chao@digia.com>
Diffstat (limited to 'tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp')
-rw-r--r-- | tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp | 245 |
1 files changed, 114 insertions, 131 deletions
diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp index ff458d6f2b..1a100ce706 100644 --- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp +++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp @@ -97,7 +97,7 @@ private slots: void record_sqlite(); void finish_data() { generic_data(); } void finish(); - void sqlite_finish_data() { generic_data(); } + void sqlite_finish_data() { generic_data("QSQLITE"); } void sqlite_finish(); void nextResult_data() { generic_data(); } void nextResult(); @@ -107,14 +107,14 @@ private slots: void forwardOnly(); // bug specific tests - void bitField_data() {generic_data("QTDS"); } - void bitField(); - void nullBlob_data() { generic_data("QOCI"); } - void nullBlob(); + void tds_bitField_data() { generic_data("QTDS"); } + void tds_bitField(); + void oci_nullBlob_data() { generic_data("QOCI"); } + void oci_nullBlob(); void blob_data() { generic_data(); } void blob(); - void rawField_data() { generic_data("QOCI"); } - void rawField(); + void oci_rawField_data() { generic_data("QOCI"); } + void oci_rawField(); void precision_data() { generic_data(); } void precision(); void nullResult_data() { generic_data(); } @@ -131,8 +131,8 @@ private slots: void synonyms(); void oraOutValues_data() { generic_data("QOCI"); } void oraOutValues(); - void mysqlOutValues_data() { generic_data("QMYSQL"); } - void mysqlOutValues(); + void mysql_outValues_data() { generic_data("QMYSQL"); } + void mysql_outValues(); void oraClob_data() { generic_data("QOCI"); } void oraClob(); void oraLong_data() { generic_data("QOCI"); } @@ -163,8 +163,8 @@ private slots: void lastQuery(); void bindBool_data() { generic_data(); } void bindBool(); - void bindWithDoubleColonCastOperator_data() { generic_data(); } - void bindWithDoubleColonCastOperator(); + void psql_bindWithDoubleColonCastOperator_data() { generic_data("QPSQL"); } + void psql_bindWithDoubleColonCastOperator(); void queryOnInvalidDatabase_data() { generic_data(); } void queryOnInvalidDatabase(); void createQueryOnClosedDatabase_data() { generic_data(); } @@ -286,7 +286,7 @@ void tst_QSqlQuery::cleanup() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - + const QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); if ( QTest::currentTestFunction() == QLatin1String( "numRowsAffected" ) || QTest::currentTestFunction() == QLatin1String( "transactions" ) || QTest::currentTestFunction() == QLatin1String( "size" ) @@ -295,8 +295,7 @@ void tst_QSqlQuery::cleanup() populateTestTables( db ); } - if ( QTest::currentTestFailed() && ( db.driverName().startsWith( "QOCI" ) - || db.driverName().startsWith( "QODBC" ) ) ) { + if (QTest::currentTestFailed() && (dbType == QSqlDriverPrivate::Oracle || db.driverName().startsWith("QODBC"))) { //since Oracle ODBC totally craps out on error, we init again db.close(); db.open(); @@ -315,6 +314,7 @@ void tst_QSqlQuery::generic_data(const QString& engine) void tst_QSqlQuery::dropTestTables( QSqlDatabase db ) { + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); QStringList tablenames; // drop all the table in case a testcase failed tablenames << qtest @@ -351,24 +351,24 @@ void tst_QSqlQuery::dropTestTables( QSqlDatabase db ) << qTableName("qtest_oraOCINumber", __FILE__, db) << qTableName("bug2192", __FILE__, db); - if ( db.driverName().startsWith("QPSQL") ) + if (dbType == QSqlDriverPrivate::PostgreSQL) tablenames << qTableName("task_233829", __FILE__, db); - if ( db.driverName().startsWith("QSQLITE") ) + if (dbType == QSqlDriverPrivate::SQLite) tablenames << qTableName("record_sqlite", __FILE__, db); - if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QOCI" ) ) + if (dbType == QSqlDriverPrivate::MSSqlServer || dbType == QSqlDriverPrivate::Oracle) tablenames << qTableName("qtest_longstr", __FILE__, db); - if (tst_Databases::isSqlServer( db )) + if (dbType == QSqlDriverPrivate::MSSqlServer) db.exec("DROP PROCEDURE " + qTableName("test141895_proc", __FILE__, db)); - if (tst_Databases::isMySQL( db )) - db.exec("DROP PROCEDURE IF EXISTS "+qTableName("bug6852_proc", __FILE__, db)); + if (dbType == QSqlDriverPrivate::MySqlServer) + db.exec("DROP PROCEDURE IF EXISTS "+ qTableName("bug6852_proc", __FILE__, db)); tst_Databases::safeDropTables( db, tablenames ); - if ( db.driverName().startsWith( "QOCI" ) ) { + if (dbType == QSqlDriverPrivate::Oracle) { QSqlQuery q( db ); q.exec("DROP PACKAGE " + qTableName("pkg", __FILE__, db)); } @@ -377,20 +377,20 @@ void tst_QSqlQuery::dropTestTables( QSqlDatabase db ) void tst_QSqlQuery::createTestTables( QSqlDatabase db ) { QSqlQuery q( db ); - - if ( db.driverName().startsWith( "QMYSQL" ) ) + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType == QSqlDriverPrivate::MySqlServer) // ### stupid workaround until we find a way to hardcode this // in the MySQL server startup script q.exec( "set table_type=innodb" ); - else if(tst_Databases::isPostgreSQL(db)) + else if (dbType == QSqlDriverPrivate::PostgreSQL) QVERIFY_SQL( q, exec("set client_min_messages='warning'")); - if(tst_Databases::isPostgreSQL(db)) + if (dbType == QSqlDriverPrivate::PostgreSQL) QVERIFY_SQL( q, exec( "create table " + qtest + " (id serial NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id)) WITH OIDS" ) ); else QVERIFY_SQL( q, exec( "create table " + qtest + " (id int "+tst_Databases::autoFieldName(db) +" NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id))" ) ); - if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) ) + if (dbType == QSqlDriverPrivate::MSSqlServer || dbType == QSqlDriverPrivate::Sybase) QVERIFY_SQL(q, exec("create table " + qTableName("qtest_null", __FILE__, db) + " (id int null, t_varchar varchar(20) null)")); else QVERIFY_SQL(q, exec("create table " + qTableName("qtest_null", __FILE__, db) + " (id int, t_varchar varchar(20))")); @@ -429,8 +429,8 @@ void tst_QSqlQuery::char1Select() QVERIFY_SQL(q, exec("insert into " + tbl + " values ('a')")); QVERIFY_SQL(q, exec("select * from " + tbl)); QVERIFY( q.next() ); - - if ( db.driverName().startsWith( "QIBASE" ) ) + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType == QSqlDriverPrivate::Interbase) QCOMPARE( q.value( 0 ).toString().left( 1 ), QString( "a" ) ); else QCOMPARE( q.value( 0 ).toString(), QString( "a" ) ); @@ -444,8 +444,8 @@ void tst_QSqlQuery::char1SelectUnicode() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - - if(db.driverName().startsWith("QDB2")) + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType == QSqlDriverPrivate::DB2) QSKIP("Needs someone with more Unicode knowledge than I have to fix"); if ( db.driver()->hasFeature( QSqlDriver::Unicode ) ) { @@ -458,16 +458,14 @@ void tst_QSqlQuery::char1SelectUnicode() QString createQuery; const QString char1SelectUnicode(qTableName("char1SU", __FILE__, db)); - if ( tst_Databases::isSqlServer( db ) ) + if (dbType == QSqlDriverPrivate::MSSqlServer) createQuery = "create table " + char1SelectUnicode + "(id nchar(1))"; - else if ( db.driverName().startsWith( "QDB2" ) - || db.driverName().startsWith( "QOCI" ) - || db.driverName().startsWith( "QPSQL" ) ) + else if (dbType == QSqlDriverPrivate::DB2 || dbType == QSqlDriverPrivate::Oracle || dbType == QSqlDriverPrivate::PostgreSQL) createQuery = "create table " + char1SelectUnicode + " (id char(3))"; - else if ( db.driverName().startsWith( "QIBASE" ) ) + else if (dbType == QSqlDriverPrivate::Interbase) createQuery = "create table " + char1SelectUnicode + " (id char(1) character set unicode_fss)"; - else if ( db.driverName().startsWith( "QMYSQL" ) ) + else if (dbType == QSqlDriverPrivate::MySqlServer) createQuery = "create table " + char1SelectUnicode + " (id char(1)) " "default character set 'utf8'"; else @@ -531,18 +529,18 @@ void tst_QSqlQuery::oraRowId() QCOMPARE( q.value( 0 ).toString(), QString( "b" ) ); } -void tst_QSqlQuery::mysqlOutValues() +void tst_QSqlQuery::mysql_outValues() { QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + if (tst_Databases::getMySqlVersion(db).section(QChar('.'), 0, 0 ).toInt() < 5) + QSKIP( "Test requires MySQL >= 5.0"); + const QString hello(qTableName("hello", __FILE__, db)), qtestproc(qTableName("qtestproc", __FILE__, db)); QSqlQuery q( db ); - if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) - QSKIP( "Test requires MySQL >= 5.0"); - q.exec( "drop function " + hello ); QVERIFY_SQL(q, exec("create function " + hello + " (s char(20)) returns varchar(50) READS SQL DATA return concat('Hello ', s)")); @@ -593,10 +591,11 @@ void tst_QSqlQuery::bindBool() QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); QSqlQuery q(db); - + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); const QString tableName(qTableName("bindBool", __FILE__, db)); + q.exec("DROP TABLE " + tableName); - QString colType = db.driverName().startsWith("QPSQL") ? QLatin1String("BOOLEAN") : QLatin1String("INT"); + QString colType = dbType == QSqlDriverPrivate::PostgreSQL ? QLatin1String("BOOLEAN") : QLatin1String("INT"); QVERIFY_SQL(q, exec("CREATE TABLE " + tableName + " (id INT, flag " + colType + " NOT NULL, PRIMARY KEY(id))")); for (int i = 0; i < 2; ++i) { @@ -849,14 +848,14 @@ void tst_QSqlQuery::outValues() QSqlQuery q( db ); q.setForwardOnly( true ); - - if ( db.driverName().startsWith( "QOCI" ) ) { + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType == QSqlDriverPrivate::Oracle) { QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x out int) is\n" "begin\n" " x := 42;\n" "end;\n" ) ); QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); - } else if ( db.driverName().startsWith( "QDB2" ) ) { + } else if (dbType == QSqlDriverPrivate::DB2) { q.exec( "drop procedure " + tst_outValues ); //non-fatal QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + tst_outValues + " (OUT x int)\n" "LANGUAGE SQL\n" @@ -864,7 +863,7 @@ void tst_QSqlQuery::outValues() " SET x = 42;\n" "END P1" ) ); QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); - } else if ( tst_Databases::isSqlServer( db ) ) { + } else if (dbType == QSqlDriverPrivate::MSSqlServer) { q.exec( "drop procedure " + tst_outValues ); //non-fatal QVERIFY_SQL( q, exec( "create procedure " + tst_outValues + " (@x int out) as\n" "begin\n" @@ -938,7 +937,7 @@ void tst_QSqlQuery::value() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - + const QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); QSqlQuery q( db ); QVERIFY_SQL( q, exec( "select id, t_varchar, t_char from " + qtest + " order by id" ) ); int i = 1; @@ -947,14 +946,14 @@ void tst_QSqlQuery::value() QCOMPARE( q.value( 0 ).toInt(), i ); QCOMPARE( q.value( "id" ).toInt(), i ); - if ( db.driverName().startsWith( "QIBASE" ) ) + if (dbType == QSqlDriverPrivate::Interbase) QVERIFY( q.value( 1 ).toString().startsWith( "VarChar" + QString::number( i ) ) ); else if ( q.value( 1 ).toString().right( 1 ) == " " ) QCOMPARE( q.value( 1 ).toString(), ( "VarChar" + QString::number( i ) + " " ) ); else QCOMPARE( q.value( 1 ).toString(), ( "VarChar" + QString::number( i ) ) ); - if ( db.driverName().startsWith( "QIBASE" ) ) + if (dbType == QSqlDriverPrivate::Interbase) QVERIFY( q.value( 2 ).toString().startsWith( "Char" + QString::number( i ) ) ); else if ( q.value( 2 ).toString().right( 1 ) != " " ) QCOMPARE( q.value( 2 ).toString(), ( "Char" + QString::number( i ) ) ); @@ -1397,24 +1396,21 @@ void tst_QSqlQuery::isNull() } /*! TDS specific BIT field test */ -void tst_QSqlQuery::bitField() +void tst_QSqlQuery::tds_bitField() { QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - - if ( !db.driverName().startsWith( "QTDS" ) ) - QSKIP( "TDS specific test"); - + const QString tableName = qTableName("qtest_bittest", __FILE__, db); QSqlQuery q( db ); - QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bittest", __FILE__, db) + " (bitty bit)")); + QVERIFY_SQL(q, exec("create table " + tableName + " (bitty bit)")); - QVERIFY_SQL(q, exec("insert into " + qTableName("qtest_bittest", __FILE__, db) + " values (0)")); + QVERIFY_SQL(q, exec("insert into " + tableName + " values (0)")); - QVERIFY_SQL(q, exec("insert into " + qTableName("qtest_bittest", __FILE__, db) + " values (1)")); + QVERIFY_SQL(q, exec("insert into " + tableName + " values (1)")); - QVERIFY_SQL(q, exec("select bitty from " + qTableName("qtest_bittest", __FILE__, db))); + QVERIFY_SQL(q, exec("select bitty from " + tableName)); QVERIFY( q.next() ); @@ -1427,7 +1423,7 @@ void tst_QSqlQuery::bitField() /*! Oracle specific NULL BLOB test */ -void tst_QSqlQuery::nullBlob() +void tst_QSqlQuery::oci_nullBlob() { QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); @@ -1457,7 +1453,7 @@ void tst_QSqlQuery::nullBlob() } /* Oracle specific RAW field test */ -void tst_QSqlQuery::rawField() +void tst_QSqlQuery::oci_rawField() { QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); @@ -1487,13 +1483,13 @@ void tst_QSqlQuery::precision() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - const QString qtest_precision(qTableName("qtest_precision", __FILE__, db)); + const QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType == QSqlDriverPrivate::Interbase) + QSKIP("DB unable to store high precision"); + const QString qtest_precision(qTableName("qtest_precision", __FILE__, db)); static const char* precStr = "1.2345678901234567891"; - if ( db.driverName().startsWith( "QIBASE" ) ) - QSKIP( "DB unable to store high precision"); - { // need a new scope for SQLITE QSqlQuery q( db ); @@ -1518,10 +1514,10 @@ void tst_QSqlQuery::precision() i++; // MySQL and TDS have crappy precisions by default - if ( db.driverName().startsWith( "QMYSQL" ) ) { + if (dbType == QSqlDriverPrivate::MySqlServer) { if ( i < 17 ) QWARN( "MySQL didn't return the right precision" ); - } else if ( db.driverName().startsWith( "QTDS" ) ) { + } else if (dbType == QSqlDriverPrivate::Sybase) { if ( i < 18 ) QWARN( "TDS didn't return the right precision" ); } else { @@ -1563,14 +1559,14 @@ void tst_QSqlQuery::transaction() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - + const QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); if ( !db.driver()->hasFeature( QSqlDriver::Transactions ) ) QSKIP( "DBMS not transaction capable"); // this is the standard SQL QString startTransactionStr( "start transaction" ); - if ( db.driverName().startsWith( "QMYSQL" ) ) + if (dbType == QSqlDriverPrivate::MySqlServer) startTransactionStr = "begin work"; QSqlQuery q( db ); @@ -1608,7 +1604,7 @@ void tst_QSqlQuery::transaction() QCOMPARE( q.value( 0 ).toInt(), 41 ); if ( !q.exec( "rollback" ) ) { - if ( db.driverName().startsWith( "QMYSQL" ) ) { + if (dbType == QSqlDriverPrivate::MySqlServer) { qDebug( "MySQL: %s", qPrintable(tst_Databases::printError( q.lastError() ) )); QSKIP( "MySQL transaction failed "); //non-fatal } else @@ -1646,12 +1642,11 @@ void tst_QSqlQuery::joins() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); const QString qtestj1(qTableName("qtestj1", __FILE__, db)), qtestj2(qTableName("qtestj2", __FILE__, db)); - if ( db.driverName().startsWith( "QOCI" ) - || db.driverName().startsWith( "QTDS" ) - || db.driverName().startsWith( "QODBC" ) - || db.driverName().startsWith( "QIBASE" ) ) + if (dbType == QSqlDriverPrivate::Oracle || dbType == QSqlDriverPrivate::Sybase + || dbType == QSqlDriverPrivate::Interbase || db.driverName().startsWith("QODBC")) // Oracle broken beyond recognition - cannot outer join on more than // one table. QSKIP( "DBMS cannot understand standard SQL"); @@ -1731,11 +1726,12 @@ void tst_QSqlQuery::prepare_bind_exec() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); const QString qtest_prepare(qTableName("qtest_prepare", __FILE__, db)); - if(db.driverName().startsWith("QIBASE") && (db.databaseName() == "silence.nokia.troll.no:c:\\ibase\\testdb_ascii" || db.databaseName() == "/opt/interbase/qttest.gdb")) + if (dbType == QSqlDriverPrivate::Interbase && (db.databaseName() == "silence.nokia.troll.no:c:\\ibase\\testdb_ascii" || db.databaseName() == "/opt/interbase/qttest.gdb")) QSKIP("Can't transliterate extended unicode to ascii"); - if(db.driverName().startsWith("QDB2")) + if (dbType == QSqlDriverPrivate::DB2) QSKIP("Needs someone with more Unicode knowledge than I have to fix"); { @@ -1752,13 +1748,13 @@ void tst_QSqlQuery::prepare_bind_exec() useUnicode = false; QString createQuery; - - if(tst_Databases::isPostgreSQL(db)) + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType == QSqlDriverPrivate::PostgreSQL) QVERIFY_SQL( q, exec("set client_min_messages='warning'")); - if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) ) + if (dbType == QSqlDriverPrivate::MSSqlServer || dbType == QSqlDriverPrivate::Sybase) createQuery = "create table " + qtest_prepare + " (id int primary key, name nvarchar(200) null, name2 nvarchar(200) null)"; - else if ( tst_Databases::isMySQL(db) && useUnicode ) + else if (dbType == QSqlDriverPrivate::MySqlServer && useUnicode) createQuery = "create table " + qtest_prepare + " (id int not null primary key, name varchar(200) character set utf8, name2 varchar(200) character set utf8)"; else createQuery = "create table " + qtest_prepare + " (id int not null primary key, name varchar(200), name2 varchar(200))"; @@ -2026,7 +2022,8 @@ void tst_QSqlQuery::sqlServerLongStrings() QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - if ( !tst_Databases::isSqlServer( db ) ) + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType != QSqlDriverPrivate::MSSqlServer) QSKIP( "SQL Server specific test"); QSqlQuery q( db ); @@ -2071,7 +2068,7 @@ void tst_QSqlQuery::invalidQuery() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - + const QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); QSqlQuery q( db ); QVERIFY( !q.exec() ); @@ -2081,7 +2078,7 @@ void tst_QSqlQuery::invalidQuery() QVERIFY( !q.next() ); QVERIFY( !q.isActive() ); - if ( !db.driverName().startsWith( "QOCI" ) && !db.driverName().startsWith( "QDB2" ) && !db.driverName().startsWith( "QODBC" ) ) { + if (dbType != QSqlDriverPrivate::Oracle && dbType != QSqlDriverPrivate::DB2 && !db.driverName().startsWith("QODBC")) { // oracle and db2 just prepares everything without complaining if ( db.driver()->hasFeature( QSqlDriver::PreparedQueries ) ) QVERIFY( !q.prepare( "blahfasel" ) ); @@ -2343,17 +2340,12 @@ void tst_QSqlQuery::lastQuery() QCOMPARE( q.executedQuery(), sql ); } -void tst_QSqlQuery::bindWithDoubleColonCastOperator() +void tst_QSqlQuery::psql_bindWithDoubleColonCastOperator() { QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - // Only PostgreSQL support the double-colon cast operator - - if ( !db.driverName().startsWith( "QPSQL" ) ) - QSKIP( "Test requires PostgreSQL"); - const QString tablename(qTableName("bindtest", __FILE__, db)); QSqlQuery q( db ); @@ -2413,13 +2405,11 @@ void tst_QSqlQuery::createQueryOnClosedDatabase() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - + const QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); // Only supported by these drivers - if ( !db.driverName().startsWith( "QPSQL" ) - && !db.driverName().startsWith( "QOCI" ) - && !db.driverName().startsWith( "QMYSQL" ) - && !db.driverName().startsWith( "QDB2" ) ) + if (dbType != QSqlDriverPrivate::PostgreSQL && dbType != QSqlDriverPrivate::Oracle + && dbType != QSqlDriverPrivate::MySqlServer && dbType != QSqlDriverPrivate::DB2) QSKIP( "Test is specific for PostgreSQL, Oracle, MySql and DB2"); db.close(); @@ -2505,8 +2495,6 @@ void tst_QSqlQuery::sqlite_finish() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - if (db.driverName() != QLatin1String("QSQLITE")) - QSKIP("Sqlite3 specific test"); if ( db.databaseName().startsWith( ':' ) ) QSKIP( "This test requires a database on the filesystem, not in-memory"); @@ -2549,7 +2537,7 @@ void tst_QSqlQuery::nextResult() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - + const QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); if ( !db.driver()->hasFeature( QSqlDriver::MultipleResultSets ) || !db.driver()->hasFeature( QSqlDriver::BatchOperations ) ) QSKIP( "DBMS does not support multiple result sets or batch operations"); @@ -2558,14 +2546,6 @@ void tst_QSqlQuery::nextResult() if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) QSKIP( "Test requires MySQL >= 5.0"); - enum DriverType { ODBC, MYSQL, DB2 }; - DriverType driverType = ODBC; - - if ( db.driverName().startsWith( "QMYSQL" ) ) - driverType = MYSQL; - else if ( db.driverName().startsWith( "QDB2" ) ) - driverType = DB2; - const QString tableName(qTableName("more_results", __FILE__, db)); QVERIFY_SQL( q, exec( "CREATE TABLE " + tableName + " (id integer, text varchar(20), num numeric(6, 3), empty varchar(10));" ) ); @@ -2597,7 +2577,7 @@ void tst_QSqlQuery::nextResult() // Query that returns two result sets (batch sql) // When working with multiple result sets SQL Server insists on non-scrollable cursors - if ( driverType == ODBC ) + if (db.driverName().startsWith("QODBC")) q.setForwardOnly( true ); QVERIFY_SQL( q, exec( "SELECT id FROM " + tableName + "; SELECT text, num FROM " + tableName + ';' ) ); @@ -2618,7 +2598,7 @@ void tst_QSqlQuery::nextResult() QCOMPARE( q.record().field( 1 ).name().toUpper(), QString( "NUM" ) ); - if ( driverType == MYSQL ) + if (dbType == QSqlDriverPrivate::MySqlServer) QCOMPARE( q.record().field( 1 ).type(), QVariant::String ); else QCOMPARE( q.record().field( 1 ).type(), QVariant::Double ); @@ -2674,13 +2654,13 @@ void tst_QSqlQuery::nextResult() q.exec( QString( "DROP PROCEDURE %1;" ).arg( procName ) ); - if ( driverType == MYSQL ) + if (dbType == QSqlDriverPrivate::MySqlServer) QVERIFY_SQL( q, exec( QString( "CREATE PROCEDURE %1()" "\nBEGIN" "\nSELECT id, text FROM %2;" "\nSELECT empty, num, text, id FROM %3;" "\nEND" ).arg( procName ).arg( tableName ).arg( tableName ) ) ); - else if ( driverType == DB2 ) + else if (dbType == QSqlDriverPrivate::DB2) QVERIFY_SQL( q, exec( QString( "CREATE PROCEDURE %1()" "\nRESULT SETS 2" "\nLANGUAGE SQL" @@ -2696,7 +2676,7 @@ void tst_QSqlQuery::nextResult() "\nSELECT id, text FROM %2" "\nSELECT empty, num, text, id FROM %3" ).arg( procName ).arg( tableName ).arg( tableName ) ) ); - if ( driverType == MYSQL || driverType == DB2 ) { + if (dbType == QSqlDriverPrivate::MySqlServer || dbType == QSqlDriverPrivate::DB2) { q.setForwardOnly( true ); QVERIFY_SQL( q, exec( QString( "CALL %1()" ).arg( procName ) ) ); } else { @@ -2722,7 +2702,7 @@ void tst_QSqlQuery::nextResult() } // MySQL also counts the CALL itself as a result - if ( driverType == MYSQL ) { + if (dbType == QSqlDriverPrivate::MySqlServer) { QVERIFY( q.nextResult() ); QVERIFY( !q.isSelect() ); // ... but it's not a select QCOMPARE( q.numRowsAffected(), 0 ); // ... and no rows are affected (at least not with this procedure) @@ -2757,10 +2737,11 @@ void tst_QSqlQuery::blobsPreparedQuery() // In PostgreSQL a BLOB is not called a BLOB, but a BYTEA! :-) // ... and in SQL Server it can be called a lot, but IMAGE will do. + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); QString typeName( "BLOB" ); - if ( db.driverName().startsWith( "QPSQL" ) ) + if (dbType == QSqlDriverPrivate::PostgreSQL) typeName = "BYTEA"; - else if ( db.driverName().startsWith( "QODBC" ) && tst_Databases::isSqlServer( db )) + else if (dbType == QSqlDriverPrivate::MSSqlServer) typeName = "IMAGE"; QVERIFY_SQL( q, exec( QString( "CREATE TABLE %1(id INTEGER, data %2)" ).arg( tableName ).arg( typeName ) ) ); @@ -2994,7 +2975,8 @@ void tst_QSqlQuery::sqlServerReturn0() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - if (!tst_Databases::isSqlServer( db )) + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType != QSqlDriverPrivate::MSSqlServer) QSKIP("SQL Server specific test"); const QString tableName(qTableName("test141895", __FILE__, db)), procName(qTableName("test141895_proc", __FILE__, db)); @@ -3088,9 +3070,9 @@ void tst_QSqlQuery::QTBUG_18435() QFETCH(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - - if (!db.driverName().startsWith("QODBC") || !tst_Databases::isSqlServer(db)) - return; + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType != QSqlDriverPrivate::MSSqlServer || !db.driverName().startsWith("QODBC")) + QSKIP("SQL Server specific test"); QSqlQuery q(db); QString procName(qTableName("qtbug_18435_proc", __FILE__, db)); @@ -3120,8 +3102,6 @@ void tst_QSqlQuery::QTBUG_5251() CHECK_DATABASE( db ); const QString timetest(qTableName("timetest", __FILE__, db)); - if (!db.driverName().startsWith( "QPSQL" )) return; - QSqlQuery q(db); q.exec("DROP TABLE " + timetest); QVERIFY_SQL(q, exec("CREATE TABLE " + timetest + " (t TIME)")); @@ -3172,7 +3152,8 @@ void tst_QSqlQuery::QTBUG_6618() QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - if (!tst_Databases::isSqlServer( db )) + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType != QSqlDriverPrivate::MSSqlServer) QSKIP("SQL Server specific test"); QSqlQuery q(db); @@ -3588,7 +3569,8 @@ void tst_QSqlQuery::sqlite_constraint() QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - if (db.driverName() != QLatin1String("QSQLITE")) + QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType != QSqlDriverPrivate::SQLite) QSKIP("Sqlite3 specific test"); QSqlQuery q(db); @@ -3639,9 +3621,10 @@ void tst_QSqlQuery::aggregateFunctionTypes() CHECK_DATABASE(db); QVariant::Type intType = QVariant::Int; // QPSQL uses LongLong for manipulation of integers - if (db.driverName().startsWith("QPSQL") || db.driverName().startsWith("QMYSQL")) + const QSqlDriverPrivate::DBMSType dbType = tst_Databases::getDatabaseType(db); + if (dbType == QSqlDriverPrivate::MySqlServer || dbType == QSqlDriverPrivate::PostgreSQL) intType = QVariant::LongLong; - else if (db.driverName().startsWith("QOCI")) + else if (dbType == QSqlDriverPrivate::Oracle) intType = QVariant::Double; { const QString tableName(qTableName("numericFunctionsWithIntValues", __FILE__, db)); @@ -3653,9 +3636,9 @@ void tst_QSqlQuery::aggregateFunctionTypes() // First test without any entries QVERIFY_SQL(q, exec("SELECT SUM(id) FROM " + tableName)); QVERIFY(q.next()); - if (db.driverName().startsWith("QSQLITE")) + if (dbType == QSqlDriverPrivate::SQLite) QCOMPARE(q.record().field(0).type(), QVariant::Invalid); - else if (db.driverName().startsWith("QMYSQL")) + else if (dbType == QSqlDriverPrivate::MySqlServer) QCOMPARE(q.record().field(0).type(), QVariant::Double); else QCOMPARE(q.record().field(0).type(), intType); @@ -3666,15 +3649,15 @@ void tst_QSqlQuery::aggregateFunctionTypes() QVERIFY_SQL(q, exec("SELECT SUM(id) FROM " + tableName)); QVERIFY(q.next()); QCOMPARE(q.value(0).toInt(), 3); - if (db.driverName().startsWith("QMYSQL")) + if (dbType == QSqlDriverPrivate::MySqlServer) QCOMPARE(q.record().field(0).type(), QVariant::Double); else QCOMPARE(q.record().field(0).type(), intType); QVERIFY_SQL(q, exec("SELECT AVG(id) FROM " + tableName)); QVERIFY(q.next()); - if (db.driverName().startsWith("QSQLITE") || db.driverName().startsWith("QPSQL") - || db.driverName().startsWith("QMYSQL") || db.driverName().startsWith("QOCI")) { + if (dbType == QSqlDriverPrivate::SQLite || dbType == QSqlDriverPrivate::PostgreSQL || dbType == QSqlDriverPrivate::MySqlServer + || dbType == QSqlDriverPrivate::Oracle) { QCOMPARE(q.value(0).toDouble(), 1.5); QCOMPARE(q.record().field(0).type(), QVariant::Double); } else { @@ -3707,7 +3690,7 @@ void tst_QSqlQuery::aggregateFunctionTypes() // First test without any entries QVERIFY_SQL(q, exec("SELECT SUM(id) FROM " + tableName)); QVERIFY(q.next()); - if (db.driverName().startsWith("QSQLITE")) + if (dbType == QSqlDriverPrivate::SQLite) QCOMPARE(q.record().field(0).type(), QVariant::Invalid); else QCOMPARE(q.record().field(0).type(), QVariant::Double); @@ -3741,7 +3724,7 @@ void tst_QSqlQuery::aggregateFunctionTypes() QCOMPARE(q.record().field(0).type(), QVariant::Double); // PSQL does not have support for the round() function - if (!db.driverName().startsWith("QPSQL")) { + if (dbType != QSqlDriverPrivate::PostgreSQL) { QVERIFY_SQL(q, exec("SELECT ROUND(id, 1) FROM " + tableName + " WHERE id=1.5")); QVERIFY(q.next()); QCOMPARE(q.value(0).toDouble(), 1.5); @@ -3749,7 +3732,7 @@ void tst_QSqlQuery::aggregateFunctionTypes() QVERIFY_SQL(q, exec("SELECT ROUND(id, 0) FROM " + tableName + " WHERE id=2.5")); QVERIFY(q.next()); - if (db.driverName().startsWith("QMYSQL")) + if (dbType == QSqlDriverPrivate::MySqlServer) QCOMPARE(q.value(0).toDouble(), 2.0); else QCOMPARE(q.value(0).toDouble(), 3.0); @@ -3765,7 +3748,7 @@ void tst_QSqlQuery::aggregateFunctionTypes() QVERIFY_SQL(q, exec("SELECT MAX(txt) FROM " + tableName)); QVERIFY(q.next()); - if (db.driverName().startsWith("QSQLITE")) + if (dbType == QSqlDriverPrivate::SQLite) QCOMPARE(q.record().field(0).type(), QVariant::Invalid); else QCOMPARE(q.record().field(0).type(), QVariant::String); |