diff options
Diffstat (limited to 'tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp')
-rw-r--r-- | tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp | 190 |
1 files changed, 48 insertions, 142 deletions
diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp index ef58d612c9..4533284a0f 100644 --- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp +++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp @@ -185,19 +185,12 @@ private slots: void mysql_timeType_data() { generic_data("QMYSQL"); } void mysql_timeType(); -#ifdef NOT_READY_YET - void task_229811(); - void task_229811_data() { generic_data(); } - void task_234422_data() { generic_data(); } - void task_234422(); -#endif void task_217003_data() { generic_data(); } void task_217003(); void task_250026_data() { generic_data("QODBC"); } void task_250026(); - void task_205701_data() { generic_data("QMYSQL"); } - void task_205701(); + void crashQueryOnCloseDatabase(); void task_233829_data() { generic_data("QPSQL"); } void task_233829(); @@ -311,6 +304,8 @@ void tst_QSqlQuery::init() void tst_QSqlQuery::cleanup() { + if (QTest::currentTestFunction() == QLatin1String("crashQueryOnCloseDatabase")) + return; QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); @@ -970,9 +965,7 @@ void tst_QSqlQuery::blob() //don' make it too big otherwise sybase and mysql will complain QByteArray ba( BLOBSIZE, 0 ); - int i; - - for ( i = 0; i < ( int )ba.size(); ++i ) + for (int i = 0; i < ba.size(); ++i) ba[i] = i % 256; QSqlQuery q( db ); @@ -985,7 +978,7 @@ void tst_QSqlQuery::blob() QVERIFY_SQL(q, prepare("insert into " + qTableName("qtest_blob", __FILE__, db) + " (id, t_blob) values (?, ?)")); - for ( i = 0; i < BLOBCOUNT; ++i ) { + for (int i = 0; i < BLOBCOUNT; ++i) { q.addBindValue( i ); q.addBindValue( ba ); QVERIFY_SQL( q, exec() ); @@ -993,13 +986,13 @@ void tst_QSqlQuery::blob() QVERIFY_SQL(q, exec("select * from " + qTableName("qtest_blob", __FILE__, db))); - for ( i = 0; i < BLOBCOUNT; ++i ) { + for (int i = 0; i < BLOBCOUNT; ++i) { QVERIFY( q.next() ); QByteArray res = q.value( 1 ).toByteArray(); QVERIFY2( res.size() >= ba.size(), QString( "array sizes differ, expected %1, got %2" ).arg( ba.size() ).arg( res.size() ).toLatin1() ); - for ( int i2 = 0; i2 < ( int )ba.size(); ++i2 ) { + for (int i2 = 0; i2 < ba.size(); ++i2) { if ( res[i2] != ba[i2] ) QFAIL( QString( "ByteArrays differ at position %1, expected %2, got %3" ).arg( i2 ).arg(( int )( unsigned char )ba[i2] ).arg(( int )( unsigned char )res[i2] ).toLatin1() ); @@ -1839,7 +1832,7 @@ void tst_QSqlQuery::oci_rawField() } // test whether we can fetch values with more than DOUBLE precision -// note that MySQL's 3.x highest precision is that of a double, although +// note that SQLite highest precision is that of a double, although // you can define field with higher precision void tst_QSqlQuery::precision() { @@ -1850,45 +1843,41 @@ void tst_QSqlQuery::precision() if (dbType == QSqlDriver::Interbase) QSKIP("DB unable to store high precision"); + const auto oldPrecision = db.driver()->numericalPrecisionPolicy(); + db.driver()->setNumericalPrecisionPolicy(QSql::HighPrecision); const QString qtest_precision(qTableName("qtest_precision", __FILE__, db)); - static const char* precStr = "1.2345678901234567891"; + static const QLatin1String precStr("1.2345678901234567891"); { // need a new scope for SQLITE QSqlQuery q( db ); q.exec("drop table " + qtest_precision); - if ( tst_Databases::isMSAccess( db ) ) - QVERIFY_SQL( q, exec( "create table " + qtest_precision + " (col1 number)" ) ); + if (tst_Databases::isMSAccess(db)) + QVERIFY_SQL(q, exec("CREATE TABLE " + qtest_precision + " (col1 number)")); else - QVERIFY_SQL( q, exec( "create table " + qtest_precision + " (col1 numeric(21, 20))" ) ); - - QVERIFY_SQL( q, exec( "insert into " + qtest_precision + " (col1) values (1.2345678901234567891)" ) ); - - QVERIFY_SQL( q, exec( "select * from " + qtest_precision ) ); - QVERIFY( q.next() ); - - QString val = q.value( 0 ).toString(); + QVERIFY_SQL(q, exec("CREATE TABLE " + qtest_precision + " (col1 numeric(21, 20))")); - if ( !val.startsWith( "1.2345678901234567891" ) ) { + QVERIFY_SQL(q, exec("INSERT INTO " + qtest_precision + " (col1) VALUES (" + precStr + ")")); + QVERIFY_SQL(q, exec("SELECT * FROM " + qtest_precision)); + QVERIFY(q.next()); + const QString val = q.value(0).toString(); + if (!val.startsWith(precStr)) { int i = 0; - - while ( precStr[i] != 0 && *( precStr + i ) == val[i].toLatin1() ) + while (i < val.size() && precStr[i] != 0 && precStr[i] == val[i].toLatin1()) i++; - // MySQL and TDS have crappy precisions by default - if (dbType == QSqlDriver::MySqlServer) { - if ( i < 17 ) - QWARN( "MySQL didn't return the right precision" ); - } else if (dbType == QSqlDriver::Sybase) { - if ( i < 18 ) - QWARN( "TDS didn't return the right precision" ); + // TDS has crappy precisions by default + if (dbType == QSqlDriver::Sybase) { + if (i < 18) + QWARN("TDS didn't return the right precision"); } else { - QWARN( QString( tst_Databases::dbToString( db ) + " didn't return the right precision (" + - QString::number( i ) + " out of 21), " + val ).toLatin1() ); + QWARN(QString(tst_Databases::dbToString(db) + " didn't return the right precision (" + + QString::number(i) + " out of 21), " + val).toUtf8()); } } } // SQLITE scope + db.driver()->setNumericalPrecisionPolicy(oldPrecision); } void tst_QSqlQuery::nullResult() @@ -2844,10 +2833,11 @@ void tst_QSqlQuery::psql_bindWithDoubleColonCastOperator() QVERIFY_SQL( q, exec() ); QVERIFY_SQL( q, next() ); - if ( db.driver()->hasFeature( QSqlDriver::PreparedQueries ) ) - QCOMPARE( q.executedQuery(), QString( "select sum((fld1 - fld2)::int) from " + tablename + " where id1 = ? and id2 =? and id3=?" ) ); + // the positional placeholders are converted to named placeholders in executedQuery() + if (db.driver()->hasFeature(QSqlDriver::PreparedQueries)) + QCOMPARE(q.executedQuery(), QString("select sum((fld1 - fld2)::int) from " + tablename + " where id1 = :myid1 and id2 =:myid2 and id3=:myid3")); else - QCOMPARE( q.executedQuery(), QString( "select sum((fld1 - fld2)::int) from " + tablename + " where id1 = 1 and id2 =2 and id3=3" ) ); + QCOMPARE(q.executedQuery(), QString("select sum((fld1 - fld2)::int) from " + tablename + " where id1 = 1 and id2 =2 and id3=3")); } void tst_QSqlQuery::psql_specialFloatValues() @@ -3433,105 +3423,19 @@ void tst_QSqlQuery::task_250026() QCOMPARE( q.value( 0 ).toString().length(), data1026.length() ); } -void tst_QSqlQuery::task_205701() -{ - QSqlDatabase qsdb = QSqlDatabase::addDatabase("QMYSQL", "atest"); - qsdb.setHostName("test"); - qsdb.setDatabaseName("test"); - qsdb.setUserName("test"); - qsdb.setPassword("test"); - qsdb.open(); - -// { - QSqlQuery query(qsdb); -// } - QSqlDatabase::removeDatabase("atest"); -} - -#ifdef NOT_READY_YET -// For task: 229811 -void tst_QSqlQuery::task_229811() +void tst_QSqlQuery::crashQueryOnCloseDatabase() { - QFETCH( QString, dbName ); - QSqlDatabase db = QSqlDatabase::database( dbName ); - CHECK_DATABASE( db ); - - if (!db.driverName().startsWith( "QODBC" )) return; - - QSqlQuery q( db ); - - const QString tableName(qTableName("task_229811", __FILE__, db)); - - if ( !q.exec( "CREATE TABLE " + tableName + " (Word varchar(20))" ) ) { - qDebug() << "Warning" << q.lastError(); + for (const auto &dbName : qAsConst(dbs.dbNames)) { + QSqlDatabase clonedDb = QSqlDatabase::cloneDatabase( + QSqlDatabase::database(dbName), "crashTest"); + qDebug() << "Testing crash in sqlquery dtor for driver" << clonedDb.driverName(); + QVERIFY(clonedDb.open()); + QSqlQuery q(clonedDb); + clonedDb.close(); + QSqlDatabase::removeDatabase("crashTest"); } - - QVERIFY_SQL( q, exec( "INSERT INTO " + tableName + " values ('Albert')" ) ); - QVERIFY_SQL( q, exec( "INSERT INTO " + tableName + " values ('Beehive')" ) ); - QVERIFY_SQL( q, exec( "INSERT INTO " + tableName + " values ('Alimony')" ) ); - QVERIFY_SQL( q, exec( "INSERT INTO " + tableName + " values ('Bohemian')" ) ); - QVERIFY_SQL( q, exec( "INSERT INTO " + tableName + " values ('AllStars')" ) ); - - - QString stmt = "SELECT * FROM " + tableName + " WHERE Word LIKE :name"; - QVERIFY_SQL(q,prepare(stmt)); - q.bindValue(":name", "A%"); - QVERIFY_SQL(q,exec()); - - QVERIFY(q.isActive()); - QVERIFY(q.isSelect()); - QVERIFY(q.first()); - - QSqlRecord rec = q.record(); - QCOMPARE(rec.field(0).value().toString(), QString("Albert")); - QVERIFY(q.next()); - rec = q.record(); - QCOMPARE(rec.field(0).value().toString(), QString("Alimony")); - QVERIFY(q.next()); - rec = q.record(); - QCOMPARE(rec.field(0).value().toString(),QString("AllStars")); - - q.exec("DROP TABLE " + tableName ); } -void tst_QSqlQuery::task_234422() -{ - QFETCH( QString, dbName ); - QSqlDatabase db = QSqlDatabase::database( dbName ); - CHECK_DATABASE( db ); - - QSqlQuery query(db); - QStringList m_airlines; - QStringList m_countries; - - m_airlines << "Lufthansa" << "SAS" << "United" << "KLM" << "Aeroflot"; - m_countries << "DE" << "SE" << "US" << "NL" << "RU"; - - const QString tableName(qTableName("task_234422", __FILE__, db)); - - QVERIFY_SQL(query,exec("CREATE TABLE " + tableName + " (id int primary key, " - "name varchar(20), homecountry varchar(2))")); - for (int i = 0; i < m_airlines.count(); ++i) { - QVERIFY(query.exec(QString("INSERT INTO " + tableName + " values(%1, '%2', '%3')") - .arg(i).arg(m_airlines[i], m_countries[i]))); - } - - QVERIFY_SQL(query, exec("SELECT name FROM " + tableName)); - QVERIFY(query.isSelect()); - QVERIFY(query.first()); - QVERIFY(query.next()); - QCOMPARE(query.at(), 1); - - QSqlQuery query2(query); - - QVERIFY_SQL(query2,exec()); - QVERIFY(query2.first()); - QCOMPARE(query2.at(), 0); - QCOMPARE(query.at(), 1); -} - -#endif - void tst_QSqlQuery::task_233829() { QFETCH( QString, dbName ); @@ -4093,8 +3997,8 @@ void tst_QSqlQuery::QTBUG_2192() // Check if retrieved value preserves reported precision int precision = qMax(0, q.record().field("dt").precision()); - int diff = qAbs(q.value(0).toDateTime().msecsTo(dt)); - int keep = qMin(1000, (int)qPow(10.0, precision)); + qint64 diff = qAbs(q.value(0).toDateTime().msecsTo(dt)); + qint64 keep = qMin(1000LL, qRound64(qPow(10.0, precision))); QVERIFY(diff <= 1000 - keep); } } @@ -4111,8 +4015,10 @@ void tst_QSqlQuery::QTBUG_36211() QSqlQuery q(db); QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (dtwtz timestamptz, dtwotz timestamp)").arg(tableName))); - QTimeZone l_tzBrazil("BRT"); - QTimeZone l_tzChina("CST"); + QTimeZone l_tzBrazil("America/Sao_Paulo"); + QTimeZone l_tzChina("Asia/Shanghai"); + QVERIFY(l_tzBrazil.isValid()); + QVERIFY(l_tzChina.isValid()); QDateTime dt = QDateTime(QDate(2014, 10, 30), QTime(14, 12, 02, 357)); QVERIFY_SQL(q, prepare("INSERT INTO " + tableName + " (dtwtz, dtwotz) VALUES (:dt, :dt)")); q.bindValue(":dt", dt); @@ -4130,8 +4036,8 @@ void tst_QSqlQuery::QTBUG_36211() for (int j = 0; j < 2; ++j) { // Check if retrieved value preserves reported precision int precision = qMax(0, q.record().field(j).precision()); - int diff = qAbs(q.value(j).toDateTime().msecsTo(dt)); - int keep = qMin(1000, (int)qPow(10.0, precision)); + qint64 diff = qAbs(q.value(j).toDateTime().msecsTo(dt)); + qint64 keep = qMin(1000LL, qRound64(qPow(10.0, precision))); QVERIFY(diff <= 1000 - keep); } } |