tests/auto/qsqldatabase/tst_qsqldatabase.cpp
changeset 19 fcece45ef507
parent 18 2f34d5167611
equal deleted inserted replaced
18:2f34d5167611 19:fcece45ef507
   257 
   257 
   258 // creates a table out of the FieldDefs and returns the number of fields
   258 // creates a table out of the FieldDefs and returns the number of fields
   259 // excluding the primary key field
   259 // excluding the primary key field
   260 static int createFieldTable(const FieldDef fieldDefs[], QSqlDatabase db)
   260 static int createFieldTable(const FieldDef fieldDefs[], QSqlDatabase db)
   261 {
   261 {
   262     tst_Databases::safeDropTable(db, qTableName("qtestfields"));
   262     tst_Databases::safeDropTable(db, qTableName("qtestfields", __FILE__));
   263     QSqlQuery q(db);
   263     QSqlQuery q(db);
   264     // construct a create table statement consisting of all fieldtypes
   264     // construct a create table statement consisting of all fieldtypes
   265     QString qs = "create table " + qTableName("qtestfields");
   265     QString qs = "create table " + qTableName("qtestfields", __FILE__);
   266     QString autoName = tst_Databases::autoFieldName(db);
   266     QString autoName = tst_Databases::autoFieldName(db);
   267     if (tst_Databases::isMSAccess(db))
   267     if (tst_Databases::isMSAccess(db))
   268         qs.append(" (id int not null");
   268         qs.append(" (id int not null");
   269     else if (tst_Databases::isPostgreSQL(db))
   269     else if (tst_Databases::isPostgreSQL(db))
   270         qs.append(" (id serial not null");
   270         qs.append(" (id serial not null");
   314     } else if(tst_Databases::isPostgreSQL(db))
   314     } else if(tst_Databases::isPostgreSQL(db))
   315         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
   315         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
   316 
   316 
   317     // please never ever change this table; otherwise fix all tests ;)
   317     // please never ever change this table; otherwise fix all tests ;)
   318     if (tst_Databases::isMSAccess(db)) {
   318     if (tst_Databases::isMSAccess(db)) {
   319         QVERIFY_SQL(q, exec("create table " + qTableName("qtest") +
   319         QVERIFY_SQL(q, exec("create table " + qTableName("qtest", __FILE__) +
   320                    " (id int not null, t_varchar varchar(40) not null, t_char char(40), "
   320                    " (id int not null, t_varchar varchar(40) not null, t_char char(40), "
   321                    "t_numeric number, primary key (id, t_varchar))"));
   321                    "t_numeric number, primary key (id, t_varchar))"));
   322     } else {
   322     } else {
   323         QVERIFY_SQL(q, exec("create table " + qTableName("qtest") +
   323         QVERIFY_SQL(q, exec("create table " + qTableName("qtest", __FILE__) +
   324                " (id integer not null, t_varchar varchar(40) not null, "
   324                " (id integer not null, t_varchar varchar(40) not null, "
   325                "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar))"));
   325                "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar))"));
   326     }
   326     }
   327 
   327 
   328     if (testWhiteSpaceNames(db.driverName())) {
   328     if (testWhiteSpaceNames(db.driverName())) {
   329         QString qry = "create table "
   329         QString qry = "create table "
   330             + db.driver()->escapeIdentifier(qTableName("qtest") + " test", QSqlDriver::TableName)
   330             + db.driver()->escapeIdentifier(qTableName("qtest", __FILE__) + " test", QSqlDriver::TableName)
   331             + '('
   331             + '('
   332             + db.driver()->escapeIdentifier(QLatin1String("test test"), QSqlDriver::FieldName)
   332             + db.driver()->escapeIdentifier(QLatin1String("test test"), QSqlDriver::FieldName)
   333             + " int not null primary key)";
   333             + " int not null primary key)";
   334         QVERIFY_SQL(q, exec(qry));
   334         QVERIFY_SQL(q, exec(qry));
   335     }
   335     }
   344         QSqlQuery q(db);
   344         QSqlQuery q(db);
   345         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
   345         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
   346     }
   346     }
   347 
   347 
   348     // drop the view first, otherwise we'll get dependency problems
   348     // drop the view first, otherwise we'll get dependency problems
   349     tst_Databases::safeDropViews(db, QStringList() << qTableName("qtest_view") << qTableName("qtest_view2"));
   349     tst_Databases::safeDropViews(db, QStringList() << qTableName("qtest_view", __FILE__) << qTableName("qtest_view2", __FILE__));
   350 
   350 
   351     QStringList tableNames;
   351     QStringList tableNames;
   352     tableNames << qTableName("qtest")
   352     tableNames << qTableName("qtest", __FILE__)
   353             << qTableName("qtestfields")
   353             << qTableName("qtestfields", __FILE__)
   354             << qTableName("qtestalter")
   354             << qTableName("qtestalter", __FILE__)
   355             << qTableName("qtest_temp")
   355             << qTableName("qtest_temp", __FILE__)
   356             << qTableName("qtest_bigint")
   356             << qTableName("qtest_bigint", __FILE__)
   357             << qTableName("qtest_xmltype")
   357             << qTableName("qtest_xmltype", __FILE__)
   358             << qTableName("latin1table")
   358             << qTableName("latin1table", __FILE__)
   359             << qTableName("qtest_sqlguid")
   359             << qTableName("qtest_sqlguid", __FILE__)
   360             << qTableName("batable")
   360             << qTableName("batable", __FILE__)
   361             << qTableName("qtest_prec")
   361             << qTableName("qtest_prec", __FILE__)
   362             << qTableName("uint")
   362             << qTableName("uint", __FILE__)
   363             << qTableName("strings")
   363             << qTableName("strings", __FILE__)
   364             << qTableName("numericfields")
   364             << qTableName("numericfields", __FILE__)
   365             << qTableName("qtest_ibaseblobs")
   365             << qTableName("qtest_ibaseblobs", __FILE__)
   366             << qTableName("qtestBindBool")
   366             << qTableName("qtestBindBool", __FILE__)
   367             << qTableName("testqGetString")
   367             << qTableName("testqGetString", __FILE__)
   368             << qTableName("qtest_sqlguid")
   368             << qTableName("qtest_sqlguid", __FILE__)
   369             << qTableName("uint_table")
   369             << qTableName("uint_table", __FILE__)
   370             << qTableName("uint_test")
   370             << qTableName("uint_test", __FILE__)
   371             << qTableName("bug_249059");
   371             << qTableName("bug_249059", __FILE__);
   372 
   372 
   373     QSqlQuery q(0, db);
   373     QSqlQuery q(0, db);
   374     if (db.driverName().startsWith("QPSQL")) {
   374     if (db.driverName().startsWith("QPSQL")) {
   375         q.exec("drop schema " + qTableName("qtestschema") + " cascade");
   375         q.exec("drop schema " + qTableName("qtestschema", __FILE__) + " cascade");
   376         q.exec("drop schema " + qTableName("qtestScHeMa") + " cascade");
   376         q.exec("drop schema " + qTableName("qtestScHeMa", __FILE__) + " cascade");
   377     }
   377     }
   378 
   378 
   379     if (testWhiteSpaceNames(db.driverName()))
   379     if (testWhiteSpaceNames(db.driverName()))
   380         tableNames <<  db.driver()->escapeIdentifier(qTableName("qtest") + " test", QSqlDriver::TableName);
   380         tableNames <<  db.driver()->escapeIdentifier(qTableName("qtest", __FILE__) + " test", QSqlDriver::TableName);
   381 
   381 
   382     tst_Databases::safeDropTables(db, tableNames);
   382     tst_Databases::safeDropTables(db, tableNames);
   383 
   383 
   384     if (db.driverName().startsWith("QOCI")) {
   384     if (db.driverName().startsWith("QOCI")) {
   385         q.exec("drop user "+qTableName("CREATOR")+" cascade");
   385         q.exec("drop user "+qTableName("CREATOR", __FILE__)+" cascade");
   386         q.exec("drop user "+qTableName("APPUSER")+" cascade");
   386         q.exec("drop user "+qTableName("APPUSER", __FILE__)+" cascade");
   387         q.exec("DROP TABLE system."+qTableName("mypassword"));
   387         q.exec("DROP TABLE system."+qTableName("mypassword", __FILE__));
   388 
   388 
   389     }
   389     }
   390 }
   390 }
   391 
   391 
   392 void tst_QSqlDatabase::populateTestTables(QSqlDatabase db)
   392 void tst_QSqlDatabase::populateTestTables(QSqlDatabase db)
   393 {
   393 {
   394     if (!db.isValid())
   394     if (!db.isValid())
   395         return;
   395         return;
   396     QSqlQuery q(db);
   396     QSqlQuery q(db);
   397 
   397     const QString qtest(qTableName("qtest", __FILE__));
   398     q.exec("delete from " + qTableName("qtest")); //non-fatal
   398 
   399     QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (0, 'VarChar0', 'Char0', 1.1)"));
   399     q.exec("delete from " + qtest); //non-fatal
   400     QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (1, 'VarChar1', 'Char1', 2.2)"));
   400     QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (0, 'VarChar0', 'Char0', 1.1)"));
   401     QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (2, 'VarChar2', 'Char2', 3.3)"));
   401     QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (1, 'VarChar1', 'Char1', 2.2)"));
   402     QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (3, 'VarChar3', 'Char3', 4.4)"));
   402     QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (2, 'VarChar2', 'Char2', 3.3)"));
   403     QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (4, 'VarChar4', NULL, NULL)"));
   403     QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (3, 'VarChar3', 'Char3', 4.4)"));
       
   404     QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (4, 'VarChar4', NULL, NULL)"));
   404 }
   405 }
   405 
   406 
   406 void tst_QSqlDatabase::initTestCase()
   407 void tst_QSqlDatabase::initTestCase()
   407 {
   408 {
   408     dbs.open();
   409     dbs.open();
   494     QSqlRecord rec = db.record(q);
   495     QSqlRecord rec = db.record(q);
   495     QVERIFY(rec.isEmpty());
   496     QVERIFY(rec.isEmpty());
   496     Q3SqlRecordInfo rInf = db.recordInfo(q);
   497     Q3SqlRecordInfo rInf = db.recordInfo(q);
   497     QVERIFY(rInf.isEmpty());
   498     QVERIFY(rInf.isEmpty());
   498 
   499 
   499     QVERIFY_SQL(q, exec("create table " + qTableName("qtest_temp") + " (id int)"));
   500     QVERIFY_SQL(q, exec("create table " + qTableName("qtest_temp", __FILE__) + " (id int)"));
   500 
   501 
   501     // query without result set should return empty record
   502     // query without result set should return empty record
   502     rec = db.record(q);
   503     rec = db.record(q);
   503     QVERIFY(rec.isEmpty());
   504     QVERIFY(rec.isEmpty());
   504     rInf = db.recordInfo(q);
   505     rInf = db.recordInfo(q);
   510 {
   511 {
   511     QFETCH(QString, dbName);
   512     QFETCH(QString, dbName);
   512     QSqlDatabase db = QSqlDatabase::database(dbName);
   513     QSqlDatabase db = QSqlDatabase::database(dbName);
   513     CHECK_DATABASE(db);
   514     CHECK_DATABASE(db);
   514 
   515 
       
   516     const QString qtest(qTableName("qtest", __FILE__)), qtest_view(qTableName("qtest_view", __FILE__)), temp_tab(qTableName("test_tab", __FILE__));
       
   517 
   515     bool views = true;
   518     bool views = true;
   516     bool tempTables = false;
   519     bool tempTables = false;
   517 
   520 
   518     QSqlQuery q(db);
   521     QSqlQuery q(db);
   519     if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 )
   522     if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 )
   520         QSKIP( "Test requires MySQL >= 5.0", SkipSingle );
   523         QSKIP( "Test requires MySQL >= 5.0", SkipSingle );
   521 
   524 
   522 
   525 
   523     if (!q.exec("CREATE VIEW " + qTableName("qtest_view") + " as select * from " + qTableName("qtest"))) {
   526     if (!q.exec("CREATE VIEW " + qtest_view + " as select * from " + qtest)) {
   524         qDebug(QString("DBMS '%1' cannot handle VIEWs: %2").arg(
   527         qDebug(QString("DBMS '%1' cannot handle VIEWs: %2").arg(
   525                 tst_Databases::dbToString(db)).arg(QString(tst_Databases::printError(q.lastError()))).toLatin1());
   528                 tst_Databases::dbToString(db)).arg(QString(tst_Databases::printError(q.lastError()))).toLatin1());
   526         views = false;
   529         views = false;
   527     }
   530     }
   528 
   531 
   529     if (db.driverName().startsWith("QSQLITE3")) {
   532     if (db.driverName().startsWith("QSQLITE3")) {
   530         QVERIFY_SQL(q, exec("CREATE TEMPORARY TABLE " + qTableName("temp_tab") + " (id int)"));
   533         QVERIFY_SQL(q, exec("CREATE TEMPORARY TABLE " + temp_tab + " (id int)"));
   531         tempTables = true;
   534         tempTables = true;
   532     }
   535     }
   533 
   536 
   534     QStringList tables = db.tables(QSql::Tables);
   537     QStringList tables = db.tables(QSql::Tables);
   535     QVERIFY(tables.contains(qTableName("qtest"), Qt::CaseInsensitive));
   538     QVERIFY(tables.contains(qtest, Qt::CaseInsensitive));
   536     QVERIFY(!tables.contains("sql_features", Qt::CaseInsensitive)); //check for postgres 7.4 internal tables
   539     QVERIFY(!tables.contains("sql_features", Qt::CaseInsensitive)); //check for postgres 7.4 internal tables
   537     if (views) {
   540     if (views) {
   538         QVERIFY(!tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive));
   541         QVERIFY(!tables.contains(qtest_view, Qt::CaseInsensitive));
   539     }
   542     }
   540     if (tempTables)
   543     if (tempTables)
   541         QVERIFY(tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive));
   544         QVERIFY(tables.contains(temp_tab, Qt::CaseInsensitive));
   542 
   545 
   543     tables = db.tables(QSql::Views);
   546     tables = db.tables(QSql::Views);
   544     if (views) {
   547     if (views) {
   545         if(!tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive))
   548         if(!tables.contains(qtest_view, Qt::CaseInsensitive))
   546             qDebug() << "failed to find" << qTableName("qtest_view") << "in" << tables;
   549             qDebug() << "failed to find" << qtest_view << "in" << tables;
   547         QVERIFY(tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive));
   550         QVERIFY(tables.contains(qtest_view, Qt::CaseInsensitive));
   548     }
   551     }
   549     if (tempTables)
   552     if (tempTables)
   550         QVERIFY(!tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive));
   553         QVERIFY(!tables.contains(temp_tab, Qt::CaseInsensitive));
   551     QVERIFY(!tables.contains(qTableName("qtest"), Qt::CaseInsensitive));
   554     QVERIFY(!tables.contains(qtest, Qt::CaseInsensitive));
   552 
   555 
   553     tables = db.tables(QSql::SystemTables);
   556     tables = db.tables(QSql::SystemTables);
   554     QVERIFY(!tables.contains(qTableName("qtest"), Qt::CaseInsensitive));
   557     QVERIFY(!tables.contains(qtest, Qt::CaseInsensitive));
   555     QVERIFY(!tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive));
   558     QVERIFY(!tables.contains(qtest_view, Qt::CaseInsensitive));
   556     QVERIFY(!tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive));
   559     QVERIFY(!tables.contains(temp_tab, Qt::CaseInsensitive));
   557 
   560 
   558     tables = db.tables(QSql::AllTables);
   561     tables = db.tables(QSql::AllTables);
   559     if (views)
   562     if (views)
   560         QVERIFY(tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive));
   563         QVERIFY(tables.contains(qtest_view, Qt::CaseInsensitive));
   561     if (tempTables)
   564     if (tempTables)
   562         QVERIFY(tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive));
   565         QVERIFY(tables.contains(temp_tab, Qt::CaseInsensitive));
   563     QVERIFY(tables.contains(qTableName("qtest"), Qt::CaseInsensitive));
   566     QVERIFY(tables.contains(qtest, Qt::CaseInsensitive));
   564 
   567 
   565     if (db.driverName().startsWith("QPSQL")) {
   568     if (db.driverName().startsWith("QPSQL")) {
   566         QVERIFY(tables.contains(qTableName("qtest") + " test"));
   569         QVERIFY(tables.contains(qtest + " test"));
   567     }
   570     }
   568 }
   571 }
   569 
   572 
   570 void tst_QSqlDatabase::whitespaceInIdentifiers()
   573 void tst_QSqlDatabase::whitespaceInIdentifiers()
   571 {
   574 {
   572     QFETCH(QString, dbName);
   575     QFETCH(QString, dbName);
   573     QSqlDatabase db = QSqlDatabase::database(dbName);
   576     QSqlDatabase db = QSqlDatabase::database(dbName);
   574     CHECK_DATABASE(db);
   577     CHECK_DATABASE(db);
   575 
   578 
   576     if (testWhiteSpaceNames(db.driverName())) {
   579     if (testWhiteSpaceNames(db.driverName())) {
   577         QString tableName = qTableName("qtest") + " test";
   580         const QString tableName(qTableName("qtest", __FILE__) + " test");
   578         QVERIFY(db.tables().contains(tableName, Qt::CaseInsensitive));
   581         QVERIFY(db.tables().contains(tableName, Qt::CaseInsensitive));
   579 
   582 
   580         QSqlRecord rec = db.record(db.driver()->escapeIdentifier(tableName, QSqlDriver::TableName));
   583         QSqlRecord rec = db.record(db.driver()->escapeIdentifier(tableName, QSqlDriver::TableName));
   581         QCOMPARE(rec.count(), 1);
   584         QCOMPARE(rec.count(), 1);
   582         QCOMPARE(rec.fieldName(0), QString("test test"));
   585         QCOMPARE(rec.fieldName(0), QString("test test"));
   600 void tst_QSqlDatabase::alterTable()
   603 void tst_QSqlDatabase::alterTable()
   601 {
   604 {
   602     QFETCH(QString, dbName);
   605     QFETCH(QString, dbName);
   603     QSqlDatabase db = QSqlDatabase::database(dbName);
   606     QSqlDatabase db = QSqlDatabase::database(dbName);
   604     CHECK_DATABASE(db);
   607     CHECK_DATABASE(db);
   605 
   608     const QString qtestalter(qTableName("qtestalter", __FILE__));
   606     QSqlQuery q(db);
   609 
   607 
   610     QSqlQuery q(db);
   608     QVERIFY_SQL(q, exec("create table " + qTableName("qtestalter") + " (F1 char(20), F2 char(20), F3 char(20))"));
   611 
   609     QSqlRecord rec = db.record(qTableName("qtestalter"));
   612     QVERIFY_SQL(q, exec("create table " + qtestalter + " (F1 char(20), F2 char(20), F3 char(20))"));
       
   613     QSqlRecord rec = db.record(qtestalter);
   610     QCOMPARE((int)rec.count(), 3);
   614     QCOMPARE((int)rec.count(), 3);
   611 #ifdef QT3_SUPPORT
   615 #ifdef QT3_SUPPORT
   612     Q3SqlRecordInfo rinf = db.recordInfo(qTableName("qtestalter"));
   616     Q3SqlRecordInfo rinf = db.recordInfo(qtestalter);
   613     QCOMPARE((int)rinf.count(), 3);
   617     QCOMPARE((int)rinf.count(), 3);
   614 #endif
   618 #endif
   615 
   619 
   616 
   620 
   617     int i;
   621     int i;
   620 #ifdef QT3_SUPPORT
   624 #ifdef QT3_SUPPORT
   621         QCOMPARE(rinf[ i ].name().upper(), QString("F%1").arg(i + 1));
   625         QCOMPARE(rinf[ i ].name().upper(), QString("F%1").arg(i + 1));
   622 #endif
   626 #endif
   623     }
   627     }
   624 
   628 
   625     if (!q.exec("alter table " + qTableName("qtestalter") + " drop column F2")) {
   629     if (!q.exec("alter table " + qtestalter + " drop column F2")) {
   626         QSKIP("DBMS doesn't support dropping columns in ALTER TABLE statement", SkipSingle);
   630         QSKIP("DBMS doesn't support dropping columns in ALTER TABLE statement", SkipSingle);
   627     }
   631     }
   628 
   632 
   629     rec = db.record(qTableName("qtestalter"));
   633     rec = db.record(qtestalter);
   630 #ifdef QT3_SUPPORT
   634 #ifdef QT3_SUPPORT
   631     rinf = db.recordInfo(qTableName("qtestalter"));
   635     rinf = db.recordInfo(qtestalter);
   632 #endif
   636 #endif
   633 
   637 
   634     QCOMPARE((int)rec.count(), 2);
   638     QCOMPARE((int)rec.count(), 2);
   635 #ifdef QT3_SUPPORT
   639 #ifdef QT3_SUPPORT
   636     QCOMPARE((int)rinf.count(), 2);
   640     QCOMPARE((int)rinf.count(), 2);
   641 #ifdef QT3_SUPPORT
   645 #ifdef QT3_SUPPORT
   642     QCOMPARE(rinf[ 0 ].name().upper(), QString("F1"));
   646     QCOMPARE(rinf[ 0 ].name().upper(), QString("F1"));
   643     QCOMPARE(rinf[ 1 ].name().upper(), QString("F3"));
   647     QCOMPARE(rinf[ 1 ].name().upper(), QString("F3"));
   644 #endif
   648 #endif
   645 
   649 
   646     q.exec("select * from " + qTableName("qtestalter"));
   650     q.exec("select * from " + qtestalter);
   647 
   651 
   648 #ifdef QT3_SUPPORT
   652 #ifdef QT3_SUPPORT
   649     rec = db.record(q);
   653     rec = db.record(q);
   650     rinf = db.recordInfo(q);
   654     rinf = db.recordInfo(q);
   651 
   655 
   728 {
   732 {
   729     CHECK_DATABASE(db);
   733     CHECK_DATABASE(db);
   730 
   734 
   731     // check whether recordInfo returns the right types
   735     // check whether recordInfo returns the right types
   732 #ifdef QT3_SUPPORT
   736 #ifdef QT3_SUPPORT
   733     Q3SqlRecordInfo inf = db.recordInfo(qTableName("qtestfields"));
   737     Q3SqlRecordInfo inf = db.recordInfo(qTableName("qtestfields", __FILE__));
   734     QCOMPARE((int)inf.count(), fieldCount+1);
   738     QCOMPARE((int)inf.count(), fieldCount+1);
   735     testRecordInfo(fieldDefs, inf);
   739     testRecordInfo(fieldDefs, inf);
   736 #endif
   740 #endif
   737 
   741 
   738     QSqlRecord rec = db.record(qTableName("qtestfields"));
   742     QSqlRecord rec = db.record(qTableName("qtestfields", __FILE__));
   739     QCOMPARE((int)rec.count(), fieldCount+1);
   743     QCOMPARE((int)rec.count(), fieldCount+1);
   740     testRecord(fieldDefs, rec, db);
   744     testRecord(fieldDefs, rec, db);
   741 
   745 
   742     QSqlQuery q(db);
   746     QSqlQuery q(db);
   743     QVERIFY_SQL(q, exec("select * from " + qTableName("qtestfields")));
   747     QVERIFY_SQL(q, exec("select * from " + qTableName("qtestfields", __FILE__)));
   744 
   748 
   745 #ifdef QT3_SUPPORT
   749 #ifdef QT3_SUPPORT
   746     inf = db.recordInfo(q);
   750     inf = db.recordInfo(q);
   747     QCOMPARE((int)inf.count(), fieldCount+1);
   751     QCOMPARE((int)inf.count(), fieldCount+1);
   748     testRecordInfo(fieldDefs, inf);
   752     testRecordInfo(fieldDefs, inf);
   758 {
   762 {
   759     Q_UNUSED(fieldDefs);
   763     Q_UNUSED(fieldDefs);
   760 #ifdef QT3_SUPPORT
   764 #ifdef QT3_SUPPORT
   761     CHECK_DATABASE(db);
   765     CHECK_DATABASE(db);
   762 
   766 
   763     Q3SqlCursor cur(qTableName("qtestfields"), true, db);
   767     Q3SqlCursor cur(qTableName("qtestfields", __FILE__), true, db);
   764     QVERIFY_SQL(cur, select());
   768     QVERIFY_SQL(cur, select());
   765     QSqlRecord* rec = cur.primeInsert();
   769     QSqlRecord* rec = cur.primeInsert();
   766     Q_ASSERT(rec);
   770     Q_ASSERT(rec);
   767     rec->setValue("id", pkey++);
   771     rec->setValue("id", pkey++);
   768     int i = 0;
   772     int i = 0;
   819 {
   823 {
   820     Q_UNUSED(fieldDefs);
   824     Q_UNUSED(fieldDefs);
   821 #ifdef QT3_SUPPORT
   825 #ifdef QT3_SUPPORT
   822     CHECK_DATABASE(db);
   826     CHECK_DATABASE(db);
   823 
   827 
   824     Q3SqlCursor cur(qTableName("qtestfields"), true, db);
   828     Q3SqlCursor cur(qTableName("qtestfields", __FILE__), true, db);
   825     QVERIFY_SQL(cur, select());
   829     QVERIFY_SQL(cur, select());
   826     QSqlRecord* rec = cur.primeInsert();
   830     QSqlRecord* rec = cur.primeInsert();
   827     Q_ASSERT(rec);
   831     Q_ASSERT(rec);
   828     rec->setValue("id", pkey++);
   832     rec->setValue("id", pkey++);
   829     int i = 0;
   833     int i = 0;
   953     checkNullValues(fieldDefs, db);
   957     checkNullValues(fieldDefs, db);
   954     for (int i = 0; i < ITERATION_COUNT; ++i)
   958     for (int i = 0; i < ITERATION_COUNT; ++i)
   955         checkValues(fieldDefs, db);
   959         checkValues(fieldDefs, db);
   956 
   960 
   957     // some additional tests
   961     // some additional tests
   958     QSqlRecord rec = db.record(qTableName("qtestfields"));
   962     QSqlRecord rec = db.record(qTableName("qtestfields", __FILE__));
   959     QCOMPARE(rec.field("T_NUMBER").length(), 10);
   963     QCOMPARE(rec.field("T_NUMBER").length(), 10);
   960     QCOMPARE(rec.field("T_NUMBER").precision(), 5);
   964     QCOMPARE(rec.field("T_NUMBER").precision(), 5);
   961 
   965 
   962     QSqlQuery q(db);
   966     QSqlQuery q(db);
   963     QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtestfields")));
   967     QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtestfields", __FILE__)));
   964     rec = q.record();
   968     rec = q.record();
   965     QCOMPARE(rec.field("T_NUMBER").length(), 10);
   969     QCOMPARE(rec.field("T_NUMBER").length(), 10);
   966     QCOMPARE(rec.field("T_NUMBER").precision(), 5);
   970     QCOMPARE(rec.field("T_NUMBER").precision(), 5);
   967 }
   971 }
   968 
   972 
  1022     QSqlQuery q(db);
  1026     QSqlQuery q(db);
  1023 
  1027 
  1024     if(tst_Databases::isPostgreSQL(db))
  1028     if(tst_Databases::isPostgreSQL(db))
  1025         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
  1029         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
  1026 
  1030 
  1027     q.exec("drop sequence " + qTableName("qtestfields") + "_t_bigserial_seq");
  1031     q.exec("drop sequence " + qTableName("qtestfields", __FILE__) + "_t_bigserial_seq");
  1028     q.exec("drop sequence " + qTableName("qtestfields") + "_t_serial_seq");
  1032     q.exec("drop sequence " + qTableName("qtestfields", __FILE__) + "_t_serial_seq");
  1029     // older psql cut off the table name
  1033     // older psql cut off the table name
  1030     q.exec("drop sequence " + qTableName("qtestfields").left(15) + "_t_bigserial_seq");
  1034     q.exec("drop sequence " + qTableName("qtestfields", __FILE__).left(15) + "_t_bigserial_seq");
  1031     q.exec("drop sequence " + qTableName("qtestfields").left(18) + "_t_serial_seq");
  1035     q.exec("drop sequence " + qTableName("qtestfields", __FILE__).left(18) + "_t_serial_seq");
  1032 
  1036 
  1033     const int fieldCount = createFieldTable(fieldDefs, db);
  1037     const int fieldCount = createFieldTable(fieldDefs, db);
  1034     QVERIFY(fieldCount > 0);
  1038     QVERIFY(fieldCount > 0);
  1035 
  1039 
  1036     commonFieldTest(fieldDefs, db, fieldCount);
  1040     commonFieldTest(fieldDefs, db, fieldCount);
  1323 void tst_QSqlDatabase::transaction()
  1327 void tst_QSqlDatabase::transaction()
  1324 {
  1328 {
  1325     QFETCH(QString, dbName);
  1329     QFETCH(QString, dbName);
  1326     QSqlDatabase db = QSqlDatabase::database(dbName);
  1330     QSqlDatabase db = QSqlDatabase::database(dbName);
  1327     CHECK_DATABASE(db);
  1331     CHECK_DATABASE(db);
       
  1332     const QString qtest(qTableName("qtest", __FILE__));
  1328 
  1333 
  1329     if (!db.driver()->hasFeature(QSqlDriver::Transactions)) {
  1334     if (!db.driver()->hasFeature(QSqlDriver::Transactions)) {
  1330     QSKIP("DBMS not transaction capable", SkipSingle);
  1335     QSKIP("DBMS not transaction capable", SkipSingle);
  1331     }
  1336     }
  1332 
  1337 
  1333     QVERIFY(db.transaction());
  1338     QVERIFY(db.transaction());
  1334 
  1339 
  1335     QSqlQuery q(db);
  1340     QSqlQuery q(db);
  1336     QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " values (40, 'VarChar40', 'Char40', 40.40)"));
  1341     QVERIFY_SQL(q, exec("insert into " + qtest + " values (40, 'VarChar40', 'Char40', 40.40)"));
  1337     QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 40"));
  1342     QVERIFY_SQL(q, exec("select * from " + qtest + " where id = 40"));
  1338     QVERIFY(q.next());
  1343     QVERIFY(q.next());
  1339     QCOMPARE(q.value(0).toInt(), 40);
  1344     QCOMPARE(q.value(0).toInt(), 40);
  1340     q.clear();
  1345     q.clear();
  1341 
  1346 
  1342     QVERIFY(db.commit());
  1347     QVERIFY(db.commit());
  1343 
  1348 
  1344     QVERIFY(db.transaction());
  1349     QVERIFY(db.transaction());
  1345     QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 40"));
  1350     QVERIFY_SQL(q, exec("select * from " + qtest + " where id = 40"));
  1346     QVERIFY(q.next());
  1351     QVERIFY(q.next());
  1347     QCOMPARE(q.value(0).toInt(), 40);
  1352     QCOMPARE(q.value(0).toInt(), 40);
  1348     q.clear();
  1353     q.clear();
  1349     QVERIFY(db.commit());
  1354     QVERIFY(db.commit());
  1350 
  1355 
  1351     QVERIFY(db.transaction());
  1356     QVERIFY(db.transaction());
  1352     QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " values (41, 'VarChar41', 'Char41', 41.41)"));
  1357     QVERIFY_SQL(q, exec("insert into " + qtest + " values (41, 'VarChar41', 'Char41', 41.41)"));
  1353     QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 41"));
  1358     QVERIFY_SQL(q, exec("select * from " + qtest + " where id = 41"));
  1354     QVERIFY(q.next());
  1359     QVERIFY(q.next());
  1355     QCOMPARE(q.value(0).toInt(), 41);
  1360     QCOMPARE(q.value(0).toInt(), 41);
  1356     q.clear(); // for SQLite which does not allow any references on rows that shall be rolled back
  1361     q.clear(); // for SQLite which does not allow any references on rows that shall be rolled back
  1357     if (!db.rollback()) {
  1362     if (!db.rollback()) {
  1358     if (db.driverName().startsWith("QMYSQL")) {
  1363     if (db.driverName().startsWith("QMYSQL")) {
  1361     } else {
  1366     } else {
  1362         QFAIL("Could not rollback transaction: " + tst_Databases::printError(db.lastError()));
  1367         QFAIL("Could not rollback transaction: " + tst_Databases::printError(db.lastError()));
  1363         }
  1368         }
  1364     }
  1369     }
  1365 
  1370 
  1366     QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 41"));
  1371     QVERIFY_SQL(q, exec("select * from " + qtest + " where id = 41"));
  1367     if(db.driverName().startsWith("QODBC") && dbName.contains("MySQL"))
  1372     if(db.driverName().startsWith("QODBC") && dbName.contains("MySQL"))
  1368         QEXPECT_FAIL("", "Some odbc drivers don't actually roll back despite telling us they do, especially the mysql driver", Continue);
  1373         QEXPECT_FAIL("", "Some odbc drivers don't actually roll back despite telling us they do, especially the mysql driver", Continue);
  1369     QVERIFY(!q.next());
  1374     QVERIFY(!q.next());
  1370 
  1375 
  1371     populateTestTables(db);
  1376     populateTestTables(db);
  1375 {
  1380 {
  1376     QFETCH(QString, dbName);
  1381     QFETCH(QString, dbName);
  1377     QSqlDatabase db = QSqlDatabase::database(dbName);
  1382     QSqlDatabase db = QSqlDatabase::database(dbName);
  1378     CHECK_DATABASE(db);
  1383     CHECK_DATABASE(db);
  1379     QString drvName = db.driverName();
  1384     QString drvName = db.driverName();
       
  1385     const QString qtest_bigint(qTableName("qtest_bigint", __FILE__));
  1380 
  1386 
  1381     QSqlQuery q(db);
  1387     QSqlQuery q(db);
  1382     q.setForwardOnly(true);
  1388     q.setForwardOnly(true);
  1383     if (drvName.startsWith("QOCI"))
  1389     if (drvName.startsWith("QOCI"))
  1384         q.setNumericalPrecisionPolicy(QSql::LowPrecisionInt64);
  1390         q.setNumericalPrecisionPolicy(QSql::LowPrecisionInt64);
  1385 
  1391 
  1386     if (drvName.startsWith("QMYSQL")) {
  1392     if (drvName.startsWith("QMYSQL")) {
  1387         QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + " (id int, t_s64bit bigint, t_u64bit bigint unsigned)"));
  1393         QVERIFY_SQL(q, exec("create table " + qtest_bigint + " (id int, t_s64bit bigint, t_u64bit bigint unsigned)"));
  1388     } else if (drvName.startsWith("QPSQL")
  1394     } else if (drvName.startsWith("QPSQL")
  1389                 || drvName.startsWith("QDB2")
  1395                 || drvName.startsWith("QDB2")
  1390                 || tst_Databases::isSqlServer(db)) {
  1396                 || tst_Databases::isSqlServer(db)) {
  1391         QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + "(id int, t_s64bit bigint, t_u64bit bigint)"));
  1397         QVERIFY_SQL(q, exec("create table " + qtest_bigint + "(id int, t_s64bit bigint, t_u64bit bigint)"));
  1392     } else if (drvName.startsWith("QOCI")) {
  1398     } else if (drvName.startsWith("QOCI")) {
  1393         QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + " (id int, t_s64bit int, t_u64bit int)"));
  1399         QVERIFY_SQL(q, exec("create table " + qtest_bigint + " (id int, t_s64bit int, t_u64bit int)"));
  1394     //} else if (drvName.startsWith("QIBASE")) {
  1400     //} else if (drvName.startsWith("QIBASE")) {
  1395     //    QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + " (id int, t_s64bit int64, t_u64bit int64)"));
  1401     //    QVERIFY_SQL(q, exec("create table " + qtest_bigint + " (id int, t_s64bit int64, t_u64bit int64)"));
  1396     } else {
  1402     } else {
  1397         QSKIP("no 64 bit integer support", SkipAll);
  1403         QSKIP("no 64 bit integer support", SkipAll);
  1398     }
  1404     }
  1399     QVERIFY(q.prepare("insert into " + qTableName("qtest_bigint") + " values (?, ?, ?)"));
  1405     QVERIFY(q.prepare("insert into " + qtest_bigint + " values (?, ?, ?)"));
  1400     qlonglong ll = Q_INT64_C(9223372036854775807);
  1406     qlonglong ll = Q_INT64_C(9223372036854775807);
  1401     qulonglong ull = Q_UINT64_C(18446744073709551615);
  1407     qulonglong ull = Q_UINT64_C(18446744073709551615);
  1402 
  1408 
  1403     if (drvName.startsWith("QMYSQL") || drvName.startsWith("QOCI")) {
  1409     if (drvName.startsWith("QMYSQL") || drvName.startsWith("QOCI")) {
  1404         q.bindValue(0, 0);
  1410         q.bindValue(0, 0);
  1418         q.bindValue(0, 1);
  1424         q.bindValue(0, 1);
  1419         q.bindValue(1, -ll);
  1425         q.bindValue(1, -ll);
  1420         q.bindValue(2,  (qlonglong) ull);
  1426         q.bindValue(2,  (qlonglong) ull);
  1421         QVERIFY_SQL(q, exec());
  1427         QVERIFY_SQL(q, exec());
  1422     }
  1428     }
  1423     QVERIFY(q.exec("select * from " + qTableName("qtest_bigint") + " order by id"));
  1429     QVERIFY(q.exec("select * from " + qtest_bigint + " order by id"));
  1424     QVERIFY(q.next());
  1430     QVERIFY(q.next());
  1425     QCOMPARE(q.value(1).toDouble(), (double)ll);
  1431     QCOMPARE(q.value(1).toDouble(), (double)ll);
  1426     QCOMPARE(q.value(1).toLongLong(), ll);
  1432     QCOMPARE(q.value(1).toLongLong(), ll);
  1427     if(drvName.startsWith("QOCI"))
  1433     if(drvName.startsWith("QOCI"))
  1428         QEXPECT_FAIL("", "Oracle driver lacks support for unsigned int64 types", Continue);
  1434         QEXPECT_FAIL("", "Oracle driver lacks support for unsigned int64 types", Continue);
  1445      || db.driverName().startsWith("QSQLITE")
  1451      || db.driverName().startsWith("QSQLITE")
  1446      || db.driverName().startsWith("QTDS")
  1452      || db.driverName().startsWith("QTDS")
  1447      || db.driverName().startsWith("QODBC"))
  1453      || db.driverName().startsWith("QODBC"))
  1448     cs = true;
  1454     cs = true;
  1449 
  1455 
  1450     QSqlRecord rec = db.record(qTableName("qtest"));
  1456     QSqlRecord rec = db.record(qTableName("qtest", __FILE__));
  1451     QVERIFY((int)rec.count() > 0);
  1457     QVERIFY((int)rec.count() > 0);
  1452     if (!cs) {
  1458     if (!cs) {
  1453     rec = db.record(qTableName("QTEST").toUpper());
  1459     rec = db.record(qTableName("QTEST", __FILE__).toUpper());
  1454     QVERIFY((int)rec.count() > 0);
  1460     QVERIFY((int)rec.count() > 0);
  1455     rec = db.record(qTableName("qTesT"));
  1461     rec = db.record(qTableName("qTesT", __FILE__));
  1456     QVERIFY((int)rec.count() > 0);
  1462     QVERIFY((int)rec.count() > 0);
  1457     }
  1463     }
  1458 
  1464 
  1459 #ifdef QT3_SUPPORT
  1465 #ifdef QT3_SUPPORT
  1460     Q3SqlRecordInfo rInf = db.recordInfo(qTableName("qtest"));
  1466     Q3SqlRecordInfo rInf = db.recordInfo(qTableName("qtest", __FILE__));
  1461     QVERIFY((int)rInf.count() > 0);
  1467     QVERIFY((int)rInf.count() > 0);
  1462     if (!cs) {
  1468     if (!cs) {
  1463     rInf = db.recordInfo(qTableName("QTEST").upper());
  1469     rInf = db.recordInfo(qTableName("QTEST", __FILE__).upper());
  1464     QVERIFY((int)rInf.count() > 0);
  1470     QVERIFY((int)rInf.count() > 0);
  1465     rInf = db.recordInfo(qTableName("qTesT"));
  1471     rInf = db.recordInfo(qTableName("qTesT", __FILE__));
  1466     QVERIFY((int)rInf.count() > 0);
  1472     QVERIFY((int)rInf.count() > 0);
  1467     }
  1473     }
  1468 #endif
  1474 #endif
  1469 
  1475 
  1470     rec = db.primaryIndex(qTableName("qtest"));
  1476     rec = db.primaryIndex(qTableName("qtest", __FILE__));
  1471     QVERIFY((int)rec.count() > 0);
  1477     QVERIFY((int)rec.count() > 0);
  1472     if (!cs) {
  1478     if (!cs) {
  1473     rec = db.primaryIndex(qTableName("QTEST").toUpper());
  1479     rec = db.primaryIndex(qTableName("QTEST", __FILE__).toUpper());
  1474     QVERIFY((int)rec.count() > 0);
  1480     QVERIFY((int)rec.count() > 0);
  1475     rec = db.primaryIndex(qTableName("qTesT"));
  1481     rec = db.primaryIndex(qTableName("qTesT", __FILE__));
  1476     QVERIFY((int)rec.count() > 0);
  1482     QVERIFY((int)rec.count() > 0);
  1477     }
  1483     }
  1478 }
  1484 }
  1479 
  1485 
  1480 void tst_QSqlDatabase::noEscapedFieldNamesInRecord()
  1486 void tst_QSqlDatabase::noEscapedFieldNamesInRecord()
  1486     QString fieldname("t_varchar");
  1492     QString fieldname("t_varchar");
  1487     if (db.driverName().startsWith("QOCI") || db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QDB2"))
  1493     if (db.driverName().startsWith("QOCI") || db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QDB2"))
  1488         fieldname = fieldname.toUpper();
  1494         fieldname = fieldname.toUpper();
  1489 
  1495 
  1490     QSqlQuery q(db);
  1496     QSqlQuery q(db);
  1491     QString query = "SELECT " + db.driver()->escapeIdentifier(fieldname, QSqlDriver::FieldName) + " FROM " + qTableName("qtest");
  1497     QString query = "SELECT " + db.driver()->escapeIdentifier(fieldname, QSqlDriver::FieldName) + " FROM " + qTableName("qtest", __FILE__);
  1492     QVERIFY_SQL(q, exec(query));
  1498     QVERIFY_SQL(q, exec(query));
  1493     QCOMPARE(q.record().fieldName(0), fieldname);
  1499     QCOMPARE(q.record().fieldName(0), fieldname);
  1494 }
  1500 }
  1495 
  1501 
  1496 void tst_QSqlDatabase::psql_schemas()
  1502 void tst_QSqlDatabase::psql_schemas()
  1506 
  1512 
  1507     if(tst_Databases::isPostgreSQL(db)) {
  1513     if(tst_Databases::isPostgreSQL(db)) {
  1508         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
  1514         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
  1509     }
  1515     }
  1510 
  1516 
  1511     QVERIFY_SQL(q, exec("CREATE SCHEMA " + qTableName("qtestschema")));
  1517     QVERIFY_SQL(q, exec("CREATE SCHEMA " + qTableName("qtestschema", __FILE__)));
  1512 
  1518 
  1513     QString table = qTableName("qtestschema") + '.' + qTableName("qtesttable");
  1519     QString table = qTableName("qtestschema", __FILE__) + '.' + qTableName("qtesttable", __FILE__);
  1514     QVERIFY_SQL(q, exec("CREATE TABLE " + table + " (id int primary key, name varchar(20))"));
  1520     QVERIFY_SQL(q, exec("CREATE TABLE " + table + " (id int primary key, name varchar(20))"));
  1515 
  1521 
  1516     QVERIFY(db.tables().contains(table));
  1522     QVERIFY(db.tables().contains(table));
  1517 
  1523 
  1518     QSqlRecord rec = db.record(table);
  1524     QSqlRecord rec = db.record(table);
  1544     QSqlQuery q(db);
  1550     QSqlQuery q(db);
  1545 
  1551 
  1546     if(tst_Databases::isPostgreSQL(db))
  1552     if(tst_Databases::isPostgreSQL(db))
  1547         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
  1553         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
  1548 
  1554 
  1549     QString schemaName = qTableName("qtestScHeMa");
  1555     const QString schemaName(qTableName("qtestScHeMa", __FILE__)),
  1550     QString tableName = qTableName("qtest");
  1556                   tableName(qTableName("qtest", __FILE__)),
  1551     QString field1Name = QString("fIeLdNaMe");
  1557                   field1Name(QLatin1String("fIeLdNaMe")),
  1552     QString field2Name = QString("ZuLu");
  1558                   field2Name(QLatin1String("ZuLu"));
  1553 
  1559 
  1554     q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName));
  1560     q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName));
  1555     QString createSchema = QString("CREATE SCHEMA \"%1\"").arg(schemaName);
  1561     QString createSchema = QString("CREATE SCHEMA \"%1\"").arg(schemaName);
  1556     QVERIFY_SQL(q, exec(createSchema));
  1562     QVERIFY_SQL(q, exec(createSchema));
  1557     QString createTable = QString("CREATE TABLE \"%1\".\"%2\" (\"%3\" int PRIMARY KEY, \"%4\" varchar(20))").arg(schemaName).arg(tableName).arg(field1Name).arg(field2Name);
  1563     QString createTable = QString("CREATE TABLE \"%1\".\"%2\" (\"%3\" int PRIMARY KEY, \"%4\" varchar(20))").arg(schemaName).arg(tableName).arg(field1Name).arg(field2Name);
  1574     QCOMPARE(rec.field(0).type(), QVariant::Int);
  1580     QCOMPARE(rec.field(0).type(), QVariant::Int);
  1575 
  1581 
  1576     q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName));
  1582     q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName));
  1577 }
  1583 }
  1578 
  1584 
  1579 
       
  1580 void tst_QSqlDatabase::psql_escapeBytea()
  1585 void tst_QSqlDatabase::psql_escapeBytea()
  1581 {
  1586 {
  1582     QFETCH(QString, dbName);
  1587     QFETCH(QString, dbName);
  1583     QSqlDatabase db = QSqlDatabase::database(dbName);
  1588     QSqlDatabase db = QSqlDatabase::database(dbName);
  1584     CHECK_DATABASE(db);
  1589     CHECK_DATABASE(db);
  1585 
  1590 
  1586     const char dta[4] = {'\x71', '\x14', '\x32', '\x81'};
  1591     const char dta[4] = {'\x71', '\x14', '\x32', '\x81'};
  1587     QByteArray ba(dta, 4);
  1592     QByteArray ba(dta, 4);
  1588 
  1593 
  1589     QSqlQuery q(db);
  1594     QSqlQuery q(db);
  1590     QString tableName = qTableName("batable");
  1595     const QString tableName(qTableName("batable", __FILE__));
  1591     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (ba bytea)").arg(tableName)));
  1596     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (ba bytea)").arg(tableName)));
  1592 
  1597 
  1593     QSqlQuery iq(db);
  1598     QSqlQuery iq(db);
  1594     QVERIFY_SQL(iq, prepare(QString("INSERT INTO %1 VALUES (?)").arg(tableName)));
  1599     QVERIFY_SQL(iq, prepare(QString("INSERT INTO %1 VALUES (?)").arg(tableName)));
  1595     iq.bindValue(0, QVariant(ba));
  1600     iq.bindValue(0, QVariant(ba));
  1618     double ver=version.section(QChar::fromLatin1('.'),0,1).toDouble();
  1623     double ver=version.section(QChar::fromLatin1('.'),0,1).toDouble();
  1619     if (ver < 7.3)
  1624     if (ver < 7.3)
  1620         QSKIP("Test requires PostgreSQL >= 7.3", SkipSingle);
  1625         QSKIP("Test requires PostgreSQL >= 7.3", SkipSingle);
  1621 
  1626 
  1622     QSqlQuery q(db);
  1627     QSqlQuery q(db);
  1623     QString tableName = qTableName("bug_249059");
  1628     const QString tableName(qTableName("bug_249059", __FILE__));
  1624     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (dt timestamp, t time)").arg(tableName)));
  1629     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (dt timestamp, t time)").arg(tableName)));
  1625 
  1630 
  1626     QSqlQuery iq(db);
  1631     QSqlQuery iq(db);
  1627     QVERIFY_SQL(iq, prepare(QString("INSERT INTO %1 VALUES (?, ?)").arg(tableName)));
  1632     QVERIFY_SQL(iq, prepare(QString("INSERT INTO %1 VALUES (?, ?)").arg(tableName)));
  1628     iq.bindValue(0, QVariant(QString("2001-09-09 04:05:06.789 -5:00")));
  1633     iq.bindValue(0, QVariant(QString("2001-09-09 04:05:06.789 -5:00")));
  1653     QSqlDatabase db = QSqlDatabase::database(dbName);
  1658     QSqlDatabase db = QSqlDatabase::database(dbName);
  1654     CHECK_DATABASE(db);
  1659     CHECK_DATABASE(db);
  1655 //     DBMS_SPECIFIC(db, "QPSQL");
  1660 //     DBMS_SPECIFIC(db, "QPSQL");
  1656 
  1661 
  1657     QSqlQuery q(db);
  1662     QSqlQuery q(db);
  1658     QString tableName = qTableName("qtest_prec");
  1663     const QString tableName(qTableName("qtest_prec", __FILE__));
  1659     if(!db.driver()->hasFeature(QSqlDriver::LowPrecisionNumbers))
  1664     if(!db.driver()->hasFeature(QSqlDriver::LowPrecisionNumbers))
  1660         QSKIP("Driver or database doesn't support setting precision policy", SkipSingle);
  1665         QSKIP("Driver or database doesn't support setting precision policy", SkipSingle);
  1661 
  1666 
  1662     // Create a test table with some data
  1667     // Create a test table with some data
  1663     if(tst_Databases::isMSAccess(db))
  1668     if(tst_Databases::isMSAccess(db))
  1750        QSKIP("MySQL through ODBC-driver specific test", SkipSingle);
  1755        QSKIP("MySQL through ODBC-driver specific test", SkipSingle);
  1751        return;
  1756        return;
  1752     }
  1757     }
  1753 
  1758 
  1754     QSqlQuery q(db);
  1759     QSqlQuery q(db);
  1755     QString tableName = qTableName("uint");
  1760     const QString tableName(qTableName("uint", __FILE__));
  1756     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (foo integer(10) unsigned, bar integer(10))").arg(tableName)));
  1761     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (foo integer(10) unsigned, bar integer(10))").arg(tableName)));
  1757     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 VALUES (-4000000000, -4000000000)").arg(tableName)));
  1762     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 VALUES (-4000000000, -4000000000)").arg(tableName)));
  1758     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 VALUES (4000000000, 4000000000)").arg(tableName)));
  1763     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 VALUES (4000000000, 4000000000)").arg(tableName)));
  1759 
  1764 
  1760     QVERIFY_SQL(q, exec(QString("SELECT foo, bar FROM %1").arg(tableName)));
  1765     QVERIFY_SQL(q, exec(QString("SELECT foo, bar FROM %1").arg(tableName)));
  1776     QSKIP("MS Access specific test", SkipSingle);
  1781     QSKIP("MS Access specific test", SkipSingle);
  1777     return;
  1782     return;
  1778     }
  1783     }
  1779 
  1784 
  1780     QSqlQuery q(db);
  1785     QSqlQuery q(db);
  1781     QString tableName = qTableName("strings");
  1786     const QString tableName(qTableName("strings", __FILE__));
  1782     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (aStr memo, bStr memo, cStr memo, dStr memo"
  1787     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (aStr memo, bStr memo, cStr memo, dStr memo"
  1783             ", eStr memo, fStr memo, gStr memo, hStr memo)").arg(tableName)));
  1788             ", eStr memo, fStr memo, gStr memo, hStr memo)").arg(tableName)));
  1784 
  1789 
  1785     QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES (?, ?, ?, ?, ?, ?, ?, ?)").arg(tableName)));
  1790     QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES (?, ?, ?, ?, ?, ?, ?, ?)").arg(tableName)));
  1786     QString aStr, bStr, cStr, dStr, eStr, fStr, gStr, hStr;
  1791     QString aStr, bStr, cStr, dStr, eStr, fStr, gStr, hStr;
  1814     QFETCH(QString, dbName);
  1819     QFETCH(QString, dbName);
  1815     QSqlDatabase db = QSqlDatabase::database(dbName);
  1820     QSqlDatabase db = QSqlDatabase::database(dbName);
  1816     CHECK_DATABASE(db);
  1821     CHECK_DATABASE(db);
  1817 
  1822 
  1818     QSqlQuery q(db);
  1823     QSqlQuery q(db);
  1819     QString tableName = qTableName("numericfields");
  1824     const QString tableName(qTableName("numericfields", __FILE__));
  1820     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (id int not null, num1 NUMERIC(2,1), "
  1825     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (id int not null, num1 NUMERIC(2,1), "
  1821         "num2 NUMERIC(5,2), num3 NUMERIC(10,3), "
  1826         "num2 NUMERIC(5,2), num3 NUMERIC(10,3), "
  1822         "num4 NUMERIC(18,4))").arg(tableName)));
  1827         "num4 NUMERIC(18,4))").arg(tableName)));
  1823 
  1828 
  1824     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 VALUES (1, 1.1, 123.45, 1234567.123, 10203040506070.8090)").arg(tableName)));
  1829     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 VALUES (1, 1.1, 123.45, 1234567.123, 10203040506070.8090)").arg(tableName)));
  1886 {
  1891 {
  1887     QFETCH(QString, dbName);
  1892     QFETCH(QString, dbName);
  1888     QSqlDatabase db = QSqlDatabase::database(dbName);
  1893     QSqlDatabase db = QSqlDatabase::database(dbName);
  1889     CHECK_DATABASE(db);
  1894     CHECK_DATABASE(db);
  1890 
  1895 
  1891     QString tableName = qTableName("qtest_ibaseblobs");
  1896     const QString tableName(qTableName("qtest_ibaseblobs", __FILE__));
  1892     QSqlQuery q(db);
  1897     QSqlQuery q(db);
  1893     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (blob1 BLOB segment size 256)").arg(tableName)));
  1898     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (blob1 BLOB segment size 256)").arg(tableName)));
  1894 
  1899 
  1895     QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES (?)").arg(tableName)));
  1900     QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES (?)").arg(tableName)));
  1896     q.bindValue(0, QByteArray().fill('x', 1024));
  1901     q.bindValue(0, QByteArray().fill('x', 1024));
  1919     QFETCH(QString, dbName);
  1924     QFETCH(QString, dbName);
  1920     QSqlDatabase db = QSqlDatabase::database(dbName);
  1925     QSqlDatabase db = QSqlDatabase::database(dbName);
  1921     CHECK_DATABASE(db);
  1926     CHECK_DATABASE(db);
  1922 
  1927 
  1923     QSqlQuery q(db);
  1928     QSqlQuery q(db);
  1924     QString procName = qTableName("qtest_proc1");
  1929     const QString procName(qTableName("qtest_proc1", __FILE__));
  1925     q.exec(QString("drop procedure %1").arg(procName));
  1930     q.exec(QString("drop procedure %1").arg(procName));
  1926     QVERIFY_SQL(q, exec("CREATE PROCEDURE " + procName + " (str VARCHAR(10))\nAS BEGIN\nstr='test';\nEND;"));
  1931     QVERIFY_SQL(q, exec("CREATE PROCEDURE " + procName + " (str VARCHAR(10))\nAS BEGIN\nstr='test';\nEND;"));
  1927     QVERIFY_SQL(q, exec(QString("execute procedure %1('qtest')").arg(procName)));
  1932     QVERIFY_SQL(q, exec(QString("execute procedure %1('qtest')").arg(procName)));
  1928     q.exec(QString("drop procedure %1").arg(procName));
  1933     q.exec(QString("drop procedure %1").arg(procName));
  1929 }
  1934 }
  1937     if (!db.driverName().startsWith("QIBASE")) {
  1942     if (!db.driverName().startsWith("QIBASE")) {
  1938        QSKIP("InterBase specific test", SkipSingle);
  1943        QSKIP("InterBase specific test", SkipSingle);
  1939        return;
  1944        return;
  1940     }
  1945     }
  1941 
  1946 
  1942     QString procName = qTableName("qtest_proc2");
  1947     const QString procName(qTableName("qtest_proc2", __FILE__));
  1943 
  1948 
  1944     QSqlQuery q(db);
  1949     QSqlQuery q(db);
  1945     q.exec(QString("drop procedure %1").arg(procName));
  1950     q.exec(QString("drop procedure %1").arg(procName));
  1946     QVERIFY_SQL(q, exec("CREATE PROCEDURE " + procName + " ("
  1951     QVERIFY_SQL(q, exec("CREATE PROCEDURE " + procName + " ("
  1947                         "\nABC INTEGER)"
  1952                         "\nABC INTEGER)"
  1979     QSqlDatabase db = QSqlDatabase::database(dbName);
  1984     QSqlDatabase db = QSqlDatabase::database(dbName);
  1980     CHECK_DATABASE(db);
  1985     CHECK_DATABASE(db);
  1981 
  1986 
  1982     QSqlQuery q(db);
  1987     QSqlQuery q(db);
  1983 
  1988 
  1984     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (50, 'Trim Test ', 'Trim Test 2   ')").arg(qTableName("qtest"))));
  1989     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (50, 'Trim Test ', 'Trim Test 2   ')").arg(qTableName("qtest", __FILE__))));
  1985     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (51, 'TrimTest', 'Trim Test 2')").arg(qTableName("qtest"))));
  1990     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (51, 'TrimTest', 'Trim Test 2')").arg(qTableName("qtest", __FILE__))));
  1986     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (52, ' ', '    ')").arg(qTableName("qtest"))));
  1991     QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (52, ' ', '    ')").arg(qTableName("qtest", __FILE__))));
  1987 
  1992 
  1988     QVERIFY_SQL(q, exec(QString("SELECT t_varchar, t_char FROM %1 WHERE id >= 50 AND id <= 52 ORDER BY id").arg(qTableName("qtest"))));
  1993     QVERIFY_SQL(q, exec(QString("SELECT t_varchar, t_char FROM %1 WHERE id >= 50 AND id <= 52 ORDER BY id").arg(qTableName("qtest", __FILE__))));
  1989 
  1994 
  1990     QVERIFY_SQL(q, next());
  1995     QVERIFY_SQL(q, next());
  1991 
  1996 
  1992     QCOMPARE(db.driver()->formatValue(q.record().field(0), true), QString("'Trim Test'"));
  1997     QCOMPARE(db.driver()->formatValue(q.record().field(0), true), QString("'Trim Test'"));
  1993     QCOMPARE(db.driver()->formatValue(q.record().field(1), true), QString("'Trim Test 2'"));
  1998     QCOMPARE(db.driver()->formatValue(q.record().field(1), true), QString("'Trim Test 2'"));
  2007     QFETCH(QString, dbName);
  2012     QFETCH(QString, dbName);
  2008     QSqlDatabase db = QSqlDatabase::database(dbName);
  2013     QSqlDatabase db = QSqlDatabase::database(dbName);
  2009     CHECK_DATABASE(db);
  2014     CHECK_DATABASE(db);
  2010 
  2015 
  2011     QSqlQuery q(db);
  2016     QSqlQuery q(db);
  2012     QVERIFY_SQL(q, exec("SELECT * from " + qTableName("qtest")));
  2017     QVERIFY_SQL(q, exec("SELECT * from " + qTableName("qtest", __FILE__)));
  2013     QVERIFY_SQL(q, next());
  2018     QVERIFY_SQL(q, next());
  2014     db.open();
  2019     db.open();
  2015     QVERIFY_SQL(q, exec("SELECT * from " + qTableName("qtest")));
  2020     QVERIFY_SQL(q, exec("SELECT * from " + qTableName("qtest", __FILE__)));
  2016     QVERIFY_SQL(q, next());
  2021     QVERIFY_SQL(q, next());
  2017     db.open();
  2022     db.open();
  2018 }
  2023 }
  2019 
  2024 
  2020 void tst_QSqlDatabase::odbc_bindBoolean()
  2025 void tst_QSqlDatabase::odbc_bindBoolean()
  2027         QSKIP("MySql has inconsistent behaviour of bit field type across versions.", SkipSingle);
  2032         QSKIP("MySql has inconsistent behaviour of bit field type across versions.", SkipSingle);
  2028         return;
  2033         return;
  2029     }
  2034     }
  2030 
  2035 
  2031     QSqlQuery q(db);
  2036     QSqlQuery q(db);
  2032     QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("qtestBindBool") + "(id int, boolvalue bit)"));
  2037     QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("qtestBindBool", __FILE__) + "(id int, boolvalue bit)"));
  2033 
  2038 
  2034     // Bind and insert
  2039     // Bind and insert
  2035     QVERIFY_SQL(q, prepare("INSERT INTO " + qTableName("qtestBindBool") + " VALUES(?, ?)"));
  2040     QVERIFY_SQL(q, prepare("INSERT INTO " + qTableName("qtestBindBool", __FILE__) + " VALUES(?, ?)"));
  2036     q.bindValue(0, 1);
  2041     q.bindValue(0, 1);
  2037     q.bindValue(1, true);
  2042     q.bindValue(1, true);
  2038     QVERIFY_SQL(q, exec());
  2043     QVERIFY_SQL(q, exec());
  2039     q.bindValue(0, 2);
  2044     q.bindValue(0, 2);
  2040     q.bindValue(1, false);
  2045     q.bindValue(1, false);
  2041     QVERIFY_SQL(q, exec());
  2046     QVERIFY_SQL(q, exec());
  2042 
  2047 
  2043     // Retrive
  2048     // Retrive
  2044     QVERIFY_SQL(q, exec("SELECT id, boolvalue FROM " + qTableName("qtestBindBool") + " ORDER BY id"));
  2049     QVERIFY_SQL(q, exec("SELECT id, boolvalue FROM " + qTableName("qtestBindBool", __FILE__) + " ORDER BY id"));
  2045     QVERIFY_SQL(q, next());
  2050     QVERIFY_SQL(q, next());
  2046     QCOMPARE(q.value(0).toInt(), 1);
  2051     QCOMPARE(q.value(0).toInt(), 1);
  2047     QCOMPARE(q.value(1).toBool(), true);
  2052     QCOMPARE(q.value(1).toBool(), true);
  2048     QVERIFY_SQL(q, next());
  2053     QVERIFY_SQL(q, next());
  2049     QCOMPARE(q.value(0).toInt(), 2);
  2054     QCOMPARE(q.value(0).toInt(), 2);
  2053 void tst_QSqlDatabase::odbc_testqGetString()
  2058 void tst_QSqlDatabase::odbc_testqGetString()
  2054 {
  2059 {
  2055     QFETCH(QString, dbName);
  2060     QFETCH(QString, dbName);
  2056     QSqlDatabase db = QSqlDatabase::database(dbName);
  2061     QSqlDatabase db = QSqlDatabase::database(dbName);
  2057     CHECK_DATABASE(db);
  2062     CHECK_DATABASE(db);
       
  2063     const QString testqGetString(qTableName("testqGetString", __FILE__));
  2058 
  2064 
  2059     QSqlQuery q(db);
  2065     QSqlQuery q(db);
  2060     if (tst_Databases::isSqlServer(db))
  2066     if (tst_Databases::isSqlServer(db))
  2061         QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue varchar(MAX))"));
  2067         QVERIFY_SQL(q, exec("CREATE TABLE " + testqGetString + "(id int, vcvalue varchar(MAX))"));
  2062     else if(tst_Databases::isMSAccess(db))
  2068     else if(tst_Databases::isMSAccess(db))
  2063         QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue memo)"));
  2069         QVERIFY_SQL(q, exec("CREATE TABLE " + testqGetString + "(id int, vcvalue memo)"));
  2064     else
  2070     else
  2065         QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue varchar(65538))"));
  2071         QVERIFY_SQL(q, exec("CREATE TABLE " + testqGetString + "(id int, vcvalue varchar(65538))"));
  2066 
  2072 
  2067     QString largeString;
  2073     QString largeString;
  2068     largeString.fill('A', 65536);
  2074     largeString.fill('A', 65536);
  2069 
  2075 
  2070     // Bind and insert
  2076     // Bind and insert
  2071     QVERIFY_SQL(q, prepare("INSERT INTO " + qTableName("testqGetString") + " VALUES(?, ?)"));
  2077     QVERIFY_SQL(q, prepare("INSERT INTO " + testqGetString + " VALUES(?, ?)"));
  2072     q.bindValue(0, 1);
  2078     q.bindValue(0, 1);
  2073     q.bindValue(1, largeString);
  2079     q.bindValue(1, largeString);
  2074     QVERIFY_SQL(q, exec());
  2080     QVERIFY_SQL(q, exec());
  2075     q.bindValue(0, 2);
  2081     q.bindValue(0, 2);
  2076     q.bindValue(1, largeString+QLatin1Char('B'));
  2082     q.bindValue(1, largeString+QLatin1Char('B'));
  2078     q.bindValue(0, 3);
  2084     q.bindValue(0, 3);
  2079     q.bindValue(1, largeString+QLatin1Char('B')+QLatin1Char('C'));
  2085     q.bindValue(1, largeString+QLatin1Char('B')+QLatin1Char('C'));
  2080     QVERIFY_SQL(q, exec());
  2086     QVERIFY_SQL(q, exec());
  2081 
  2087 
  2082     // Retrive
  2088     // Retrive
  2083     QVERIFY_SQL(q, exec("SELECT id, vcvalue FROM " + qTableName("testqGetString") + " ORDER BY id"));
  2089     QVERIFY_SQL(q, exec("SELECT id, vcvalue FROM " + testqGetString + " ORDER BY id"));
  2084     QVERIFY_SQL(q, next());
  2090     QVERIFY_SQL(q, next());
  2085     QCOMPARE(q.value(0).toInt(), 1);
  2091     QCOMPARE(q.value(0).toInt(), 1);
  2086     QCOMPARE(q.value(1).toString().length(), 65536);
  2092     QCOMPARE(q.value(1).toString().length(), 65536);
  2087     QVERIFY_SQL(q, next());
  2093     QVERIFY_SQL(q, next());
  2088     QCOMPARE(q.value(0).toInt(), 2);
  2094     QCOMPARE(q.value(0).toInt(), 2);
  2096 void tst_QSqlDatabase::mysql_multiselect()
  2102 void tst_QSqlDatabase::mysql_multiselect()
  2097 {
  2103 {
  2098     QFETCH(QString, dbName);
  2104     QFETCH(QString, dbName);
  2099     QSqlDatabase db = QSqlDatabase::database(dbName);
  2105     QSqlDatabase db = QSqlDatabase::database(dbName);
  2100     CHECK_DATABASE(db);
  2106     CHECK_DATABASE(db);
       
  2107     const QString qtest(qTableName("qtest", __FILE__));
  2101 
  2108 
  2102     QSqlQuery q(db);
  2109     QSqlQuery q(db);
  2103     QString version=tst_Databases::getMySqlVersion( db );
  2110     QString version=tst_Databases::getMySqlVersion( db );
  2104     double ver=version.section(QChar::fromLatin1('.'),0,1).toDouble();
  2111     double ver=version.section(QChar::fromLatin1('.'),0,1).toDouble();
  2105     if (ver < 4.1)
  2112     if (ver < 4.1)
  2106         QSKIP("Test requires MySQL >= 4.1", SkipSingle);
  2113         QSKIP("Test requires MySQL >= 4.1", SkipSingle);
  2107 
  2114 
  2108     QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtest") + "; SELECT * FROM " + qTableName("qtest")));
  2115     QVERIFY_SQL(q, exec("SELECT * FROM " + qtest + "; SELECT * FROM " + qtest));
  2109     QVERIFY_SQL(q, next());
  2116     QVERIFY_SQL(q, next());
  2110     QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtest") + "; SELECT * FROM " + qTableName("qtest")));
  2117     QVERIFY_SQL(q, exec("SELECT * FROM " + qtest + "; SELECT * FROM " + qtest));
  2111     QVERIFY_SQL(q, next());
  2118     QVERIFY_SQL(q, next());
  2112     QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtest")));
  2119     QVERIFY_SQL(q, exec("SELECT * FROM " + qtest));
  2113 }
  2120 }
  2114 
  2121 
  2115 void tst_QSqlDatabase::ibase_useCustomCharset()
  2122 void tst_QSqlDatabase::ibase_useCustomCharset()
  2116 {
  2123 {
  2117     QFETCH(QString, dbName);
  2124     QFETCH(QString, dbName);
  2121 
  2128 
  2122     db.close();
  2129     db.close();
  2123     db.setConnectOptions("ISC_DPB_LC_CTYPE=Latin1");
  2130     db.setConnectOptions("ISC_DPB_LC_CTYPE=Latin1");
  2124     db.open();
  2131     db.open();
  2125 
  2132 
  2126     QString tableName = qTableName("latin1table");
  2133     const QString tableName(qTableName("latin1table", __FILE__));
  2127 
  2134 
  2128     QSqlQuery q(db);
  2135     QSqlQuery q(db);
  2129     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(text VARCHAR(6) CHARACTER SET Latin1)").arg(tableName)));
  2136     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(text VARCHAR(6) CHARACTER SET Latin1)").arg(tableName)));
  2130     QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES(?)").arg(tableName)));
  2137     QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES(?)").arg(tableName)));
  2131     q.addBindValue(nonlatin1string);
  2138     q.addBindValue(nonlatin1string);
  2159 {
  2166 {
  2160     QFETCH(QString, dbName);
  2167     QFETCH(QString, dbName);
  2161     QSqlDatabase db = QSqlDatabase::database(dbName);
  2168     QSqlDatabase db = QSqlDatabase::database(dbName);
  2162     CHECK_DATABASE(db);
  2169     CHECK_DATABASE(db);
  2163 
  2170 
  2164     QString tableName = qTableName("qtest_xmltype");
  2171     const QString tableName(qTableName("qtest_xmltype", __FILE__));
  2165     QString xml("<?xml version=\"1.0\"?><TABLE_NAME>MY_TABLE</TABLE_NAME>");
  2172     QString xml("<?xml version=\"1.0\"?><TABLE_NAME>MY_TABLE</TABLE_NAME>");
  2166     QSqlQuery q(db);
  2173     QSqlQuery q(db);
  2167 
  2174 
  2168     // Embedding the XML in the statement
  2175     // Embedding the XML in the statement
  2169     if(!q.exec(QString("CREATE TABLE %1(xmldata xmltype)").arg(tableName)))
  2176     if(!q.exec(QString("CREATE TABLE %1(xmldata xmltype)").arg(tableName)))
  2187 {
  2194 {
  2188     QFETCH(QString, dbName);
  2195     QFETCH(QString, dbName);
  2189     QSqlDatabase db = QSqlDatabase::database(dbName);
  2196     QSqlDatabase db = QSqlDatabase::database(dbName);
  2190     CHECK_DATABASE(db);
  2197     CHECK_DATABASE(db);
  2191 
  2198 
  2192     QString tableName = qTableName("qtest");
  2199     const QString tableName(qTableName("qtest", __FILE__));
  2193     QSqlQuery q(db);
  2200     QSqlQuery q(db);
  2194 
  2201 
  2195     QVERIFY_SQL(q, exec(QString("SELECT t_varchar, t_char FROM %1").arg(tableName)));
  2202     QVERIFY_SQL(q, exec(QString("SELECT t_varchar, t_char FROM %1").arg(tableName)));
  2196     QVERIFY_SQL(q, next());
  2203     QVERIFY_SQL(q, next());
  2197     QCOMPARE(q.record().field(0).length(), 40);
  2204     QCOMPARE(q.record().field(0).length(), 40);
  2203     QFETCH(QString, dbName);
  2210     QFETCH(QString, dbName);
  2204     QSqlDatabase db = QSqlDatabase::database(dbName);
  2211     QSqlDatabase db = QSqlDatabase::database(dbName);
  2205     CHECK_DATABASE(db);
  2212     CHECK_DATABASE(db);
  2206 
  2213 
  2207     QSqlQuery q(db);
  2214     QSqlQuery q(db);
  2208     QString creator(qTableName("CREATOR")), appuser(qTableName("APPUSER")), table1(qTableName("TABLE1"));
  2215     const QString creator(qTableName("CREATOR", __FILE__)), appuser(qTableName("APPUSER", __FILE__)), table1(qTableName("TABLE1", __FILE__));
  2209 //     QVERIFY_SQL(q, exec("drop public synonym "+table1));
  2216 //     QVERIFY_SQL(q, exec("drop public synonym "+table1));
  2210     QVERIFY_SQL(q, exec(QString("create user %1 identified by %2 default tablespace users temporary tablespace temp").arg(creator).arg(creator)));
  2217     QVERIFY_SQL(q, exec(QString("create user %1 identified by %2 default tablespace users temporary tablespace temp").arg(creator).arg(creator)));
  2211     QVERIFY_SQL(q, exec(QString("grant CONNECT to %1").arg(creator)));
  2218     QVERIFY_SQL(q, exec(QString("grant CONNECT to %1").arg(creator)));
  2212     QVERIFY_SQL(q, exec(QString("grant RESOURCE to %1").arg(creator)));
  2219     QVERIFY_SQL(q, exec(QString("grant RESOURCE to %1").arg(creator)));
  2213     QSqlDatabase db2=db.cloneDatabase(db, QLatin1String("oci_synonymstest"));
  2220     QSqlDatabase db2=db.cloneDatabase(db, QLatin1String("oci_synonymstest"));
  2221     QVERIFY_SQL(q2, exec(QString("grant select, insert, update, delete on %1 to %2").arg(table1).arg(appuser)));
  2228     QVERIFY_SQL(q2, exec(QString("grant select, insert, update, delete on %1 to %2").arg(table1).arg(appuser)));
  2222     QSqlDatabase db3=db.cloneDatabase(db, QLatin1String("oci_synonymstest2"));
  2229     QSqlDatabase db3=db.cloneDatabase(db, QLatin1String("oci_synonymstest2"));
  2223     db3.close();
  2230     db3.close();
  2224     QVERIFY_SQL(db3, open(appuser,appuser));
  2231     QVERIFY_SQL(db3, open(appuser,appuser));
  2225     QSqlQuery q3(db3);
  2232     QSqlQuery q3(db3);
  2226     QVERIFY_SQL(q3, exec("create synonym "+appuser+'.'+qTableName("synonyms")+" for "+creator+'.'+table1));
  2233     QVERIFY_SQL(q3, exec("create synonym "+appuser+'.'+qTableName("synonyms", __FILE__)+" for "+creator+'.'+table1));
  2227     QVERIFY_SQL(db3, tables().filter(qTableName("synonyms"), Qt::CaseInsensitive).count() >= 1);
  2234     QVERIFY_SQL(db3, tables().filter(qTableName("synonyms", __FILE__), Qt::CaseInsensitive).count() >= 1);
  2228 }
  2235 }
  2229 
  2236 
  2230 
  2237 
  2231 // This test isn't really necessary as SQL_GUID / uniqueidentifier is
  2238 // This test isn't really necessary as SQL_GUID / uniqueidentifier is
  2232 // already tested in recordSQLServer().
  2239 // already tested in recordSQLServer().
  2238     if (!tst_Databases::isSqlServer(db)) {
  2245     if (!tst_Databases::isSqlServer(db)) {
  2239         QSKIP("SQL Server (ODBC) specific test", SkipSingle);
  2246         QSKIP("SQL Server (ODBC) specific test", SkipSingle);
  2240         return;
  2247         return;
  2241     }
  2248     }
  2242 
  2249 
  2243     QString tableName = qTableName("qtest_sqlguid");
  2250     const QString tableName(qTableName("qtest_sqlguid", __FILE__));
  2244     QString guid = QString("AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE");
  2251     QString guid = QString("AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE");
  2245     QString invalidGuid = QString("GAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE");
  2252     QString invalidGuid = QString("GAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE");
  2246 
  2253 
  2247     QSqlQuery q(db);
  2254     QSqlQuery q(db);
  2248     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(id uniqueidentifier)").arg(tableName)));
  2255     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(id uniqueidentifier)").arg(tableName)));
  2281 {
  2288 {
  2282     QFETCH(QString, dbName);
  2289     QFETCH(QString, dbName);
  2283     QSqlDatabase db = QSqlDatabase::database(dbName);
  2290     QSqlDatabase db = QSqlDatabase::database(dbName);
  2284     CHECK_DATABASE(db);
  2291     CHECK_DATABASE(db);
  2285 
  2292 
  2286     QString tableName = qTableName("uint_table");
  2293     const QString tableName(qTableName("uint_table", __FILE__));
  2287     unsigned int val = 4294967295U;
  2294     unsigned int val = 4294967295U;
  2288 
  2295 
  2289     QSqlQuery q(db);
  2296     QSqlQuery q(db);
  2290     if ( tst_Databases::isMSAccess( db ) )
  2297     if ( tst_Databases::isMSAccess( db ) )
  2291         QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(num number)").arg(tableName)));
  2298         QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(num number)").arg(tableName)));
  2345 {
  2352 {
  2346     QFETCH(QString, dbName);
  2353     QFETCH(QString, dbName);
  2347     QSqlDatabase db = QSqlDatabase::database(dbName);
  2354     QSqlDatabase db = QSqlDatabase::database(dbName);
  2348     CHECK_DATABASE(db);
  2355     CHECK_DATABASE(db);
  2349 
  2356 
  2350     QString procedureName = qTableName("posteventProc");
  2357     const QString procedureName(qTableName("posteventProc", __FILE__));
  2351     QSqlDriver *driver=db.driver();
  2358     QSqlDriver *driver=db.driver();
  2352     QVERIFY_SQL(*driver, subscribeToNotification(procedureName));
  2359     QVERIFY_SQL(*driver, subscribeToNotification(procedureName));
  2353     QTest::qWait(300);  // Interbase needs some time to call the driver callback.
  2360     QTest::qWait(300);  // Interbase needs some time to call the driver callback.
  2354 
  2361 
  2355     db.transaction();   // InterBase events are posted from within transactions.
  2362     db.transaction();   // InterBase events are posted from within transactions.
  2379 #if defined(Q_OS_LINUX)
  2386 #if defined(Q_OS_LINUX)
  2380     QSKIP( "Event support doesn't work on linux", SkipAll );
  2387     QSKIP( "Event support doesn't work on linux", SkipAll );
  2381 #endif
  2388 #endif
  2382 
  2389 
  2383     QSqlQuery query(db);
  2390     QSqlQuery query(db);
  2384     QString procedureName = qTableName("posteventProc");
  2391     QString procedureName = qTableName("posteventProc", __FILE__);
  2385 
  2392 
  2386     QSqlDriver &driver=*(db.driver());
  2393     QSqlDriver &driver=*(db.driver());
  2387     QVERIFY_SQL(driver, subscribeToNotification(procedureName));
  2394     QVERIFY_SQL(driver, subscribeToNotification(procedureName));
  2388     QSignalSpy spy(db.driver(), SIGNAL(notification(const QString&)));
  2395     QSignalSpy spy(db.driver(), SIGNAL(notification(const QString&)));
  2389     query.exec(QString("NOTIFY \"%1\"").arg(procedureName));
  2396     query.exec(QString("NOTIFY \"%1\"").arg(procedureName));
  2403         QSKIP("SQLite3 specific test", SkipSingle); 
  2410         QSKIP("SQLite3 specific test", SkipSingle); 
  2404         return; 
  2411         return; 
  2405     }
  2412     }
  2406 
  2413 
  2407     QSqlQuery q(db);
  2414     QSqlQuery q(db);
  2408     QString tableName = qTableName("uint_test");
  2415     const QString tableName(qTableName("uint_test", __FILE__));
  2409     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(uint_field UNSIGNED INTEGER)").arg(tableName)));
  2416     QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(uint_field UNSIGNED INTEGER)").arg(tableName)));
  2410     QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES(?)").arg(tableName)));
  2417     QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES(?)").arg(tableName)));
  2411     q.addBindValue(4000000000U);
  2418     q.addBindValue(4000000000U);
  2412     QVERIFY_SQL(q, exec());
  2419     QVERIFY_SQL(q, exec());
  2413     QVERIFY_SQL(q, exec(QString("SELECT uint_field FROM %1").arg(tableName)));
  2420     QVERIFY_SQL(q, exec(QString("SELECT uint_field FROM %1").arg(tableName)));
  2423 {
  2430 {
  2424     QFETCH(QString, dbName);
  2431     QFETCH(QString, dbName);
  2425     QSqlDatabase db = QSqlDatabase::database(dbName);
  2432     QSqlDatabase db = QSqlDatabase::database(dbName);
  2426     CHECK_DATABASE(db);
  2433     CHECK_DATABASE(db);
  2427 
  2434 
  2428     QString tableName = qTableName("qtest");
  2435     const QString tableName(qTableName("qtest", __FILE__));
  2429     QSqlQuery q(db);
  2436     QSqlQuery q(db);
  2430     q.exec(QString("SELECT id, t_varchar, t_char, t_numeric FROM %1").arg(tableName));
  2437     q.exec(QString("SELECT id, t_varchar, t_char, t_numeric FROM %1").arg(tableName));
  2431     q.next();
  2438     q.next();
  2432     QVariant c4 = q.value(3);
  2439     QVariant c4 = q.value(3);
  2433     QVariant c3 = q.value(2);
  2440     QVariant c3 = q.value(2);
  2446     QSqlDatabase db = QSqlDatabase::database(dbName);
  2453     QSqlDatabase db = QSqlDatabase::database(dbName);
  2447     CHECK_DATABASE(db);
  2454     CHECK_DATABASE(db);
  2448 
  2455 
  2449     // select a record with NULL value
  2456     // select a record with NULL value
  2450     QSqlQuery q(QString::null, db);
  2457     QSqlQuery q(QString::null, db);
  2451     QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 4"));
  2458     QVERIFY_SQL(q, exec("select * from " + qTableName("qtest", __FILE__) + " where id = 4"));
  2452     QVERIFY_SQL(q, next());
  2459     QVERIFY_SQL(q, next());
  2453 
  2460 
  2454     QSqlDriver *driver = db.driver();
  2461     QSqlDriver *driver = db.driver();
  2455     QVERIFY(driver);
  2462     QVERIFY(driver);
  2456 
  2463 
  2469     if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 1 ).toDouble()<4.1 )
  2476     if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 1 ).toDouble()<4.1 )
  2470         QSKIP( "Test requires MySQL >= 4.1", SkipSingle );
  2477         QSKIP( "Test requires MySQL >= 4.1", SkipSingle );
  2471 
  2478 
  2472     QSqlQuery q(db);
  2479     QSqlQuery q(db);
  2473     QVERIFY_SQL(q, exec("begin"));
  2480     QVERIFY_SQL(q, exec("begin"));
  2474     QVERIFY_SQL(q, exec("insert into "+qTableName("qtest")+" VALUES (54, 'foo', 'foo', 54.54)"));
  2481     QVERIFY_SQL(q, exec("insert into "+qTableName("qtest", __FILE__)+" VALUES (54, 'foo', 'foo', 54.54)"));
  2475     QVERIFY_SQL(q, exec("savepoint foo"));
  2482     QVERIFY_SQL(q, exec("savepoint foo"));
  2476 }
  2483 }
  2477 
  2484 
  2478 void tst_QSqlDatabase::oci_tables()
  2485 void tst_QSqlDatabase::oci_tables()
  2479 {
  2486 {
  2480     QFETCH(QString, dbName);
  2487     QFETCH(QString, dbName);
  2481     QSqlDatabase db = QSqlDatabase::database(dbName);
  2488     QSqlDatabase db = QSqlDatabase::database(dbName);
  2482     CHECK_DATABASE(db);
  2489     CHECK_DATABASE(db);
  2483     QSqlQuery q(db);
  2490     QSqlQuery q(db);
  2484     QString systemTableName("system."+qTableName("mypassword"));
  2491     const QString systemTableName("system."+qTableName("mypassword", __FILE__));
  2485     QVERIFY_SQL(q, exec("CREATE TABLE "+systemTableName+"(name VARCHAR(20))"));
  2492     QVERIFY_SQL(q, exec("CREATE TABLE "+systemTableName+"(name VARCHAR(20))"));
  2486     QVERIFY(!db.tables().contains(systemTableName.toUpper()));
  2493     QVERIFY(!db.tables().contains(systemTableName.toUpper()));
  2487     QVERIFY(db.tables(QSql::SystemTables).contains(systemTableName.toUpper()));
  2494     QVERIFY(db.tables(QSql::SystemTables).contains(systemTableName.toUpper()));
  2488 }
  2495 }
  2489 
  2496 
  2499     QVERIFY_SQL(db, open());
  2506     QVERIFY_SQL(db, open());
  2500     QSqlDatabase db2 = QSqlDatabase::cloneDatabase(db, dbName+":cachemodeconn2");
  2507     QSqlDatabase db2 = QSqlDatabase::cloneDatabase(db, dbName+":cachemodeconn2");
  2501     db2.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE");
  2508     db2.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE");
  2502     QVERIFY_SQL(db2, open());
  2509     QVERIFY_SQL(db2, open());
  2503     QSqlQuery q(db), q2(db2);
  2510     QSqlQuery q(db), q2(db2);
  2504     QVERIFY_SQL(q, exec("select * from "+qTableName("qtest")));
  2511     QVERIFY_SQL(q, exec("select * from "+qTableName("qtest", __FILE__)));
  2505     QVERIFY_SQL(q2, exec("select * from "+qTableName("qtest")));
  2512     QVERIFY_SQL(q2, exec("select * from "+qTableName("qtest", __FILE__)));
  2506 }
  2513 }
  2507 
  2514 
  2508 QTEST_MAIN(tst_QSqlDatabase)
  2515 QTEST_MAIN(tst_QSqlDatabase)
  2509 #include "tst_qsqldatabase.moc"
  2516 #include "tst_qsqldatabase.moc"