util/tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
changeset 7 f7bc934e204c
equal deleted inserted replaced
3:41300fa6a67c 7:f7bc934e204c
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the test suite of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 
       
    43 #include <QtTest/QtTest>
       
    44 #include <QtSql/QtSql>
       
    45 
       
    46 #include "../qsqldatabase/tst_databases.h"
       
    47 
       
    48 const QString reltest1(qTableName("reltest1", __FILE__)),
       
    49         reltest2(qTableName("reltest2", __FILE__)),
       
    50         reltest3(qTableName("reltest3", __FILE__)),
       
    51         reltest4(qTableName("reltest4", __FILE__)),
       
    52         reltest5(qTableName("reltest5", __FILE__));
       
    53 
       
    54 
       
    55 //TESTED_CLASS=
       
    56 //TESTED_FILES=
       
    57 
       
    58 class tst_QSqlRelationalTableModel : public QObject
       
    59 {
       
    60     Q_OBJECT
       
    61 
       
    62 public:
       
    63     void recreateTestTables(QSqlDatabase);
       
    64 
       
    65     tst_Databases dbs;
       
    66 
       
    67 public slots:
       
    68     void initTestCase_data();
       
    69     void initTestCase();
       
    70     void cleanupTestCase();
       
    71     void init();
       
    72     void cleanup();
       
    73 
       
    74 private slots:
       
    75     void data();
       
    76     void setData();
       
    77     void multipleRelation();
       
    78     void insertRecord();
       
    79     void setRecord();
       
    80     void insertWithStrategies();
       
    81     void removeColumn();
       
    82     void filter();
       
    83     void sort();
       
    84     void revert();
       
    85 
       
    86     void clearDisplayValuesCache();
       
    87     void insertRecordDuplicateFieldNames();
       
    88     void invalidData();
       
    89     void relationModel();
       
    90     void casing();
       
    91     void escapedRelations();
       
    92     void escapedTableName();
       
    93     void whiteSpaceInIdentifiers();
       
    94     void psqlSchemaTest();
       
    95 
       
    96 private:
       
    97     void dropTestTables( QSqlDatabase db );
       
    98 };
       
    99 
       
   100 
       
   101 void tst_QSqlRelationalTableModel::initTestCase_data()
       
   102 {
       
   103     dbs.open();
       
   104     if (dbs.fillTestTable() == 0) {
       
   105         qWarning("NO DATABASES");
       
   106         QSKIP("No database drivers are available in this Qt configuration", SkipAll);
       
   107     }
       
   108 }
       
   109 
       
   110 void tst_QSqlRelationalTableModel::recreateTestTables(QSqlDatabase db)
       
   111 {
       
   112     dropTestTables(db);
       
   113 
       
   114     QSqlQuery q(db);
       
   115     QVERIFY_SQL( q, exec("create table " + reltest1 +
       
   116             " (id int not null primary key, name varchar(20), title_key int, another_title_key int)"));
       
   117     QVERIFY_SQL( q, exec("insert into " + reltest1 + " values(1, 'harry', 1, 2)"));
       
   118     QVERIFY_SQL( q, exec("insert into " + reltest1 + " values(2, 'trond', 2, 1)"));
       
   119     QVERIFY_SQL( q, exec("insert into " + reltest1 + " values(3, 'vohi', 1, 2)"));
       
   120     QVERIFY_SQL( q, exec("insert into " + reltest1 + " values(4, 'boris', 2, 2)"));
       
   121 
       
   122     QVERIFY_SQL( q, exec("create table " + reltest2 + " (tid int not null primary key, title varchar(20))"));
       
   123     QVERIFY_SQL( q, exec("insert into " + reltest2 + " values(1, 'herr')"));
       
   124     QVERIFY_SQL( q, exec("insert into " + reltest2 + " values(2, 'mister')"));
       
   125 
       
   126     QVERIFY_SQL( q, exec("create table " + reltest3 + " (id int not null primary key, name varchar(20), city_key int)"));
       
   127     QVERIFY_SQL( q, exec("insert into " + reltest3 + " values(1, 'Gustav', 1)"));
       
   128     QVERIFY_SQL( q, exec("insert into " + reltest3 + " values(2, 'Heidi', 2)"));
       
   129 
       
   130     QVERIFY_SQL( q, exec("create table " + reltest4 + " (id int not null primary key, name varchar(20))"));
       
   131     QVERIFY_SQL( q, exec("insert into " + reltest4 + " values(1, 'Oslo')"));
       
   132     QVERIFY_SQL( q, exec("insert into " + reltest4 + " values(2, 'Trondheim')"));
       
   133 
       
   134     QVERIFY_SQL( q, exec("create table " + reltest5 + " (title varchar(20) not null primary key, abbrev varchar(20))"));
       
   135     QVERIFY_SQL( q, exec("insert into " + reltest5 + " values('herr', 'Hr')"));
       
   136     QVERIFY_SQL( q, exec("insert into " + reltest5 + " values('mister', 'Mr')"));
       
   137 
       
   138     if (testWhiteSpaceNames(db.driverName())) {
       
   139         QString reltest6 = db.driver()->escapeIdentifier(qTableName("rel", __FILE__)+" test6", QSqlDriver::TableName);
       
   140         QVERIFY_SQL( q, exec("create table " + reltest6 + " (id int not null primary key, " + db.driver()->escapeIdentifier("city key", QSqlDriver::FieldName) +
       
   141                     " int, " + db.driver()->escapeIdentifier("extra field", QSqlDriver::FieldName) + " int)"));
       
   142         QVERIFY_SQL( q, exec("insert into " + reltest6 + " values(1, 1,9)"));
       
   143         QVERIFY_SQL( q, exec("insert into " + reltest6 + " values(2, 2,8)"));
       
   144 
       
   145         QString reltest7 = db.driver()->escapeIdentifier(qTableName("rel", __FILE__)+" test7", QSqlDriver::TableName);
       
   146         QVERIFY_SQL( q, exec("create table " + reltest7 + " (" + db.driver()->escapeIdentifier("city id", QSqlDriver::TableName) + " int not null primary key, " + db.driver()->escapeIdentifier("city name", QSqlDriver::FieldName) + " varchar(20))"));
       
   147         QVERIFY_SQL( q, exec("insert into " + reltest7 + " values(1, 'New York')"));
       
   148         QVERIFY_SQL( q, exec("insert into " + reltest7 + " values(2, 'Washington')"));
       
   149     }
       
   150 }
       
   151 
       
   152 void tst_QSqlRelationalTableModel::initTestCase()
       
   153 {
       
   154     foreach (const QString &dbname, dbs.dbNames) {
       
   155         QSqlDatabase db=QSqlDatabase::database(dbname);
       
   156         if (db.driverName().startsWith("QIBASE"))
       
   157             db.exec("SET DIALECT 3");
       
   158         else if (tst_Databases::isSqlServer(db)) {
       
   159             db.exec("SET ANSI_DEFAULTS ON");
       
   160             db.exec("SET IMPLICIT_TRANSACTIONS OFF");
       
   161         }
       
   162         else if(tst_Databases::isPostgreSQL(db))
       
   163             db.exec("set client_min_messages='warning'");
       
   164         recreateTestTables(db);
       
   165     }
       
   166 }
       
   167 
       
   168 void tst_QSqlRelationalTableModel::cleanupTestCase()
       
   169 {
       
   170     foreach (const QString &dbName, dbs.dbNames) {
       
   171         QSqlDatabase db = QSqlDatabase::database(dbName);
       
   172         CHECK_DATABASE( db );
       
   173         dropTestTables( QSqlDatabase::database(dbName) );
       
   174     }
       
   175     dbs.close();
       
   176 }
       
   177 
       
   178 void tst_QSqlRelationalTableModel::dropTestTables( QSqlDatabase db )
       
   179 {
       
   180     QStringList tableNames;
       
   181     tableNames << reltest1
       
   182             << reltest2
       
   183             << reltest3
       
   184             << reltest4
       
   185             << reltest5
       
   186             << (qTableName( "rel", __FILE__)+" test6")
       
   187             << (qTableName( "rel", __FILE__)+" test7")
       
   188             << qTableName("CASETEST1", db.driver() )
       
   189             << qTableName("casetest1", db.driver() );
       
   190     tst_Databases::safeDropTables( db, tableNames );
       
   191 
       
   192     db.exec("DROP SCHEMA "+qTableName("QTBUG_5373", __FILE__)+" CASCADE");
       
   193     db.exec("DROP SCHEMA "+qTableName("QTBUG_5373_s2", __FILE__)+" CASCADE");
       
   194 }
       
   195 
       
   196 void tst_QSqlRelationalTableModel::init()
       
   197 {
       
   198 }
       
   199 
       
   200 void tst_QSqlRelationalTableModel::cleanup()
       
   201 {
       
   202 }
       
   203 
       
   204 void tst_QSqlRelationalTableModel::data()
       
   205 {
       
   206     QFETCH_GLOBAL(QString, dbName);
       
   207     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   208     CHECK_DATABASE(db);
       
   209 
       
   210     QSqlRelationalTableModel model(0, db);
       
   211 
       
   212     model.setTable(reltest1);
       
   213     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   214     QVERIFY_SQL(model, select());
       
   215 
       
   216     QCOMPARE(model.columnCount(), 4);
       
   217     QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
       
   218     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
       
   219     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
   220 
       
   221     //try a non-existant index
       
   222     QVERIFY2(model.data(model.index(0,4)).isValid() == false,"Invalid index returned valid QVariant");
       
   223 
       
   224     //check data retrieval when relational key is a non-integer type
       
   225     //in this case a string
       
   226     QSqlRelationalTableModel model2(0,db);
       
   227     model2.setTable(reltest2);
       
   228     model2.setRelation(1, QSqlRelation(reltest5,"title","abbrev"));
       
   229     QVERIFY_SQL(model2, select());
       
   230 
       
   231     QCOMPARE(model2.data(model2.index(0, 1)).toString(), QString("Hr"));
       
   232     QCOMPARE(model2.data(model2.index(1, 1)).toString(), QString("Mr"));
       
   233 }
       
   234 
       
   235 void tst_QSqlRelationalTableModel::setData()
       
   236 {
       
   237     QFETCH_GLOBAL(QString, dbName);
       
   238     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   239     CHECK_DATABASE(db);
       
   240 
       
   241     // set the values using OnRowChange Strategy
       
   242     {
       
   243         QSqlRelationalTableModel model(0, db);
       
   244 
       
   245         model.setTable(reltest1);
       
   246         model.setSort(0, Qt::AscendingOrder);
       
   247         model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   248         QVERIFY_SQL(model, select());
       
   249 
       
   250         QVERIFY(model.setData(model.index(0, 1), QString("harry2")));
       
   251         QVERIFY(model.setData(model.index(0, 2), 2));
       
   252 
       
   253         QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry2"));
       
   254         QCOMPARE(model.data(model.index(0, 2)).toString(), QString("mister"));
       
   255 
       
   256         model.submit();
       
   257 
       
   258         QVERIFY(model.setData(model.index(3,1), QString("boris2")));
       
   259         QVERIFY(model.setData(model.index(3, 2), 1));
       
   260 
       
   261         QCOMPARE(model.data(model.index(3,1)).toString(), QString("boris2"));
       
   262         QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr"));
       
   263 
       
   264         model.submit();
       
   265     }
       
   266     { //verify values
       
   267         QSqlRelationalTableModel model(0, db);
       
   268         model.setTable(reltest1);
       
   269         model.setSort(0, Qt::AscendingOrder);
       
   270         QVERIFY_SQL(model, select());
       
   271 
       
   272         QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry2"));
       
   273         QCOMPARE(model.data(model.index(0, 2)).toInt(), 2);
       
   274         QCOMPARE(model.data(model.index(3, 1)).toString(), QString("boris2"));
       
   275         QCOMPARE(model.data(model.index(3, 2)).toInt(), 1);
       
   276 
       
   277         model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   278         QVERIFY_SQL(model, select());
       
   279         QCOMPARE(model.data(model.index(0, 2)).toString(), QString("mister"));
       
   280         QCOMPARE(model.data(model.index(3,2)).toString(), QString("herr"));
       
   281 
       
   282     }
       
   283 
       
   284     //set the values using OnFieldChange strategy
       
   285     {
       
   286         QSqlRelationalTableModel model(0, db);
       
   287         model.setTable(reltest1);
       
   288         model.setEditStrategy(QSqlTableModel::OnFieldChange);
       
   289         model.setSort(0, Qt::AscendingOrder);
       
   290         model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   291         QVERIFY_SQL(model, select());
       
   292 
       
   293         QVERIFY(model.setData(model.index(1,1), QString("trond2")));
       
   294         QVERIFY(model.setData(model.index(2,2), 2));
       
   295 
       
   296         QCOMPARE(model.data(model.index(1,1)).toString(), QString("trond2"));
       
   297         QCOMPARE(model.data(model.index(2,2)).toString(), QString("mister"));
       
   298     }
       
   299     { //verify values
       
   300         QSqlRelationalTableModel model(0, db);
       
   301         model.setTable(reltest1);
       
   302         model.setSort(0, Qt::AscendingOrder);
       
   303         QVERIFY_SQL(model, select());
       
   304 
       
   305         QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond2"));
       
   306         QCOMPARE(model.data(model.index(2, 2)).toInt(), 2);
       
   307 
       
   308         model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   309         QVERIFY_SQL(model, select());
       
   310         QCOMPARE(model.data(model.index(2, 2)).toString(), QString("mister"));
       
   311     }
       
   312 
       
   313     //set values using OnManualSubmit strategy
       
   314     {
       
   315         QSqlRelationalTableModel model(0, db);
       
   316 
       
   317         model.setTable(reltest1);
       
   318         model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   319 
       
   320         //sybase doesn't allow tables with the same alias used twice as col names
       
   321         //so don't set up an identical relation when using the tds driver
       
   322         if (!db.driverName().startsWith("QTDS"))
       
   323             model.setRelation(3, QSqlRelation(reltest2, "tid", "title"));
       
   324 
       
   325         model.setEditStrategy(QSqlTableModel::OnManualSubmit);
       
   326         model.setSort(0, Qt::AscendingOrder);
       
   327         QVERIFY_SQL(model, select());
       
   328 
       
   329         QVERIFY(model.setData(model.index(2, 1), QString("vohi2")));
       
   330         QVERIFY(model.setData(model.index(3, 2), 1));
       
   331         QVERIFY(model.setData(model.index(0, 3), 1));
       
   332 
       
   333         QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi2"));
       
   334         QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr"));
       
   335         if (!db.driverName().startsWith("QTDS"))
       
   336             QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr"));
       
   337         else
       
   338             QCOMPARE(model.data(model.index(0, 3)).toInt(), 1);
       
   339 
       
   340         QVERIFY_SQL(model, submitAll());
       
   341     }
       
   342     { //verify values
       
   343         QSqlRelationalTableModel model(0, db);
       
   344         model.setTable(reltest1);
       
   345         model.setSort(0, Qt::AscendingOrder);
       
   346         QVERIFY_SQL(model, select());
       
   347 
       
   348         QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi2"));
       
   349         QCOMPARE(model.data(model.index(3, 2)).toInt(), 1);
       
   350         QCOMPARE(model.data(model.index(0, 3)).toInt(), 1);
       
   351 
       
   352         model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   353         if (!db.driverName().startsWith("QTDS"))
       
   354             model.setRelation(3, QSqlRelation(reltest2, "tid", "title"));
       
   355         QVERIFY_SQL(model, select());
       
   356         QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr"));
       
   357 
       
   358         if (!db.driverName().startsWith("QTDS"))
       
   359             QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr"));
       
   360         else
       
   361             QCOMPARE(model.data(model.index(0, 3)).toInt(), 1);
       
   362     }
       
   363 
       
   364     //check setting of data when the relational key is a non-integer type
       
   365     //in this case a string.
       
   366     {
       
   367         QSqlRelationalTableModel model(0, db);
       
   368 
       
   369         model.setTable(reltest2);
       
   370         model.setRelation(1, QSqlRelation(reltest5, "title", "abbrev"));
       
   371         model.setEditStrategy(QSqlTableModel::OnManualSubmit);
       
   372         QVERIFY_SQL(model, select());
       
   373 
       
   374         QCOMPARE(model.data(model.index(0,1)).toString(), QString("Hr"));
       
   375         QVERIFY(model.setData(model.index(0,1), QString("mister")));
       
   376         QCOMPARE(model.data(model.index(0,1)).toString(), QString("Mr"));
       
   377         QVERIFY_SQL(model, submitAll());
       
   378 
       
   379         QCOMPARE(model.data(model.index(0,1)).toString(), QString("Mr"));
       
   380     }
       
   381 
       
   382 }
       
   383 
       
   384 void tst_QSqlRelationalTableModel::multipleRelation()
       
   385 {
       
   386     QFETCH_GLOBAL(QString, dbName);
       
   387     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   388     CHECK_DATABASE(db);
       
   389     recreateTestTables(db);
       
   390 
       
   391     QSqlRelationalTableModel model(0, db);
       
   392 
       
   393     model.setTable(reltest1);
       
   394     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   395     model.setRelation(3, QSqlRelation(reltest4, "id", "name"));
       
   396     model.setSort(0, Qt::AscendingOrder);
       
   397     QVERIFY_SQL(model, select());
       
   398 
       
   399     QCOMPARE(model.data(model.index(2, 0)).toInt(), 3);
       
   400 
       
   401     QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
       
   402     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
       
   403     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
   404     QCOMPARE(model.data(model.index(0, 3)).toString(), QString("Trondheim"));
       
   405 }
       
   406 
       
   407 void tst_QSqlRelationalTableModel::insertRecord()
       
   408 {
       
   409     QFETCH_GLOBAL(QString, dbName);
       
   410     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   411     CHECK_DATABASE(db);
       
   412 
       
   413     QSqlRelationalTableModel model(0, db);
       
   414 
       
   415     model.setTable(reltest1);
       
   416     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   417     model.setSort(0, Qt::AscendingOrder);
       
   418     QVERIFY_SQL(model, select());
       
   419 
       
   420     QSqlRecord rec;
       
   421     QSqlField f1("id", QVariant::Int);
       
   422     QSqlField f2("name", QVariant::String);
       
   423     QSqlField f3("title_key", QVariant::Int);
       
   424     QSqlField f4("another_title_key", QVariant::Int);
       
   425 
       
   426     f1.setValue(5);
       
   427     f2.setValue("test");
       
   428     f3.setValue(1);
       
   429     f4.setValue(2);
       
   430 
       
   431     f1.setGenerated(true);
       
   432     f2.setGenerated(true);
       
   433     f3.setGenerated(true);
       
   434     f4.setGenerated(true);
       
   435 
       
   436     rec.append(f1);
       
   437     rec.append(f2);
       
   438     rec.append(f3);
       
   439     rec.append(f4);
       
   440 
       
   441     QVERIFY_SQL(model, insertRecord(-1, rec));
       
   442 
       
   443     QCOMPARE(model.data(model.index(4, 0)).toInt(), 5);
       
   444     QCOMPARE(model.data(model.index(4, 1)).toString(), QString("test"));
       
   445     QCOMPARE(model.data(model.index(4, 2)).toString(), QString("herr"));
       
   446 }
       
   447 
       
   448 void tst_QSqlRelationalTableModel::setRecord()
       
   449 {
       
   450     QFETCH_GLOBAL(QString, dbName);
       
   451     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   452     CHECK_DATABASE(db);
       
   453     recreateTestTables(db);
       
   454 
       
   455     QSqlRelationalTableModel model(0, db);
       
   456 
       
   457     model.setTable(reltest1);
       
   458     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   459     model.setSort(0, Qt::AscendingOrder);
       
   460     QVERIFY_SQL(model, select());
       
   461 
       
   462     QSqlRecord rec;
       
   463     QSqlField f1("id", QVariant::Int);
       
   464     QSqlField f2("name", QVariant::String);
       
   465     QSqlField f3("title_key", QVariant::Int);
       
   466     QSqlField f4("another_title_key", QVariant::Int);
       
   467 
       
   468     f1.setValue(5);
       
   469     f2.setValue("tester");
       
   470     f3.setValue(1);
       
   471     f4.setValue(2);
       
   472 
       
   473     f1.setGenerated(true);
       
   474     f2.setGenerated(true);
       
   475     f3.setGenerated(true);
       
   476     f4.setGenerated(true);
       
   477 
       
   478     rec.append(f1);
       
   479     rec.append(f2);
       
   480     rec.append(f3);
       
   481     rec.append(f4);
       
   482 
       
   483     QCOMPARE(model.data(model.index(1, 0)).toInt(), 2);
       
   484     QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond"));
       
   485     QCOMPARE(model.data(model.index(1, 2)).toString(), QString("mister"));
       
   486 
       
   487     QVERIFY_SQL(model, setRecord(1, rec));
       
   488 
       
   489     QCOMPARE(model.data(model.index(1, 0)).toInt(), 5);
       
   490     QCOMPARE(model.data(model.index(1, 1)).toString(), QString("tester"));
       
   491     QCOMPARE(model.data(model.index(1, 2)).toString(), QString("herr"));
       
   492 
       
   493     model.setSort(0, Qt::AscendingOrder);
       
   494     QVERIFY_SQL(model, submit());
       
   495 
       
   496     QCOMPARE(model.data(model.index(3, 0)).toInt(), 5);
       
   497     QCOMPARE(model.data(model.index(3, 1)).toString(), QString("tester"));
       
   498     QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr"));
       
   499 
       
   500 }
       
   501 
       
   502 void tst_QSqlRelationalTableModel::insertWithStrategies()
       
   503 {
       
   504     QFETCH_GLOBAL(QString, dbName);
       
   505     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   506     CHECK_DATABASE(db);
       
   507 
       
   508     QSqlRelationalTableModel model(0, db);
       
   509 
       
   510     model.setTable(reltest1);
       
   511     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   512     model.setSort(0, Qt::AscendingOrder);
       
   513 
       
   514     if (!db.driverName().startsWith("QTDS"))
       
   515         model.setRelation(3, QSqlRelation(reltest2, "tid", "title"));
       
   516     QVERIFY_SQL(model, select());
       
   517 
       
   518     QCOMPARE(model.data(model.index(0,0)).toInt(), 1);
       
   519     QCOMPARE(model.data(model.index(0,1)).toString(), QString("harry"));
       
   520     QCOMPARE(model.data(model.index(0,2)).toString(), QString("herr"));
       
   521     if (!db.driverName().startsWith("QTDS"))
       
   522         QCOMPARE(model.data(model.index(0,3)).toString(), QString("mister"));
       
   523     else
       
   524         QCOMPARE(model.data(model.index(0,3)).toInt(), 2);
       
   525 
       
   526     model.insertRows(0, 1);
       
   527     model.setData(model.index(0, 0), 1011);
       
   528     model.setData(model.index(0, 1), "test");
       
   529     model.setData(model.index(0, 2), 2);
       
   530     model.setData(model.index(0, 3), 1);
       
   531 
       
   532     QCOMPARE(model.data(model.index(0,0)).toInt(), 1011);
       
   533     QCOMPARE(model.data(model.index(0,1)).toString(), QString("test"));
       
   534     QCOMPARE(model.data(model.index(0,2)).toString(), QString("mister"));
       
   535     if (!db.driverName().startsWith("QTDS"))
       
   536         QCOMPARE(model.data(model.index(0,3)).toString(), QString("herr"));
       
   537     else
       
   538         QCOMPARE(model.data(model.index(0,3)).toInt(), 1);
       
   539 
       
   540     QCOMPARE(model.data(model.index(1,0)).toInt(), 1);
       
   541     QCOMPARE(model.data(model.index(1,1)).toString(), QString("harry"));
       
   542     QCOMPARE(model.data(model.index(1,2)).toString(), QString("herr"));
       
   543     if (!db.driverName().startsWith("QTDS"))
       
   544         QCOMPARE(model.data(model.index(1,3)).toString(), QString("mister"));
       
   545     else
       
   546         QCOMPARE(model.data(model.index(1,3)).toInt(), 2);
       
   547 
       
   548 
       
   549 
       
   550     QVERIFY_SQL(model, submitAll());
       
   551 
       
   552     model.setEditStrategy(QSqlTableModel::OnManualSubmit);
       
   553 
       
   554     QCOMPARE(model.data(model.index(0,0)).toInt(), 1);
       
   555     QCOMPARE(model.data(model.index(0,1)).toString(), QString("harry"));
       
   556     QCOMPARE(model.data(model.index(0,2)).toString(), QString("herr"));
       
   557 
       
   558     if (!db.driverName().startsWith("QTDS")) {
       
   559         QCOMPARE(model.data(model.index(0,3)).toString(), QString("mister"));
       
   560         model.setData(model.index(0,3),1);
       
   561         QCOMPARE(model.data(model.index(0,3)).toString(), QString("herr"));
       
   562     } else {
       
   563         QCOMPARE(model.data(model.index(0,3)).toInt(), 2);
       
   564         model.setData(model.index(0,3),1);
       
   565         QCOMPARE(model.data(model.index(0,3)).toInt(), 1);
       
   566     }
       
   567 
       
   568     model.insertRows(0, 2);
       
   569     model.setData(model.index(0, 0), 1012);
       
   570     model.setData(model.index(0, 1), "george");
       
   571     model.setData(model.index(0, 2), 2);
       
   572     model.setData(model.index(0, 3), 2);
       
   573 
       
   574     model.setData(model.index(1, 0), 1013);
       
   575     model.setData(model.index(1, 1), "kramer");
       
   576     model.setData(model.index(1, 2), 2);
       
   577     model.setData(model.index(1, 3), 1);
       
   578 
       
   579     QCOMPARE(model.data(model.index(0,0)).toInt(),1012);
       
   580     QCOMPARE(model.data(model.index(0,1)).toString(), QString("george"));
       
   581     QCOMPARE(model.data(model.index(0,2)).toString(), QString("mister"));
       
   582     if (!db.driverName().startsWith("QTDS"))
       
   583         QCOMPARE(model.data(model.index(0,3)).toString(), QString("mister"));
       
   584     else
       
   585         QCOMPARE(model.data(model.index(0,3)).toInt(), 2);
       
   586 
       
   587 
       
   588     QCOMPARE(model.data(model.index(1,0)).toInt(),1013);
       
   589     QCOMPARE(model.data(model.index(1,1)).toString(), QString("kramer"));
       
   590     QCOMPARE(model.data(model.index(1,2)).toString(), QString("mister"));
       
   591     if (!db.driverName().startsWith("QTDS"))
       
   592         QCOMPARE(model.data(model.index(1,3)).toString(), QString("herr"));
       
   593     else
       
   594         QCOMPARE(model.data(model.index(1,3)).toInt(), 1);
       
   595 
       
   596     QCOMPARE(model.data(model.index(2,0)).toInt(), 1);
       
   597     QCOMPARE(model.data(model.index(2,1)).toString(), QString("harry"));
       
   598     QCOMPARE(model.data(model.index(2,2)).toString(), QString("herr"));
       
   599     if (!db.driverName().startsWith("QTDS"))
       
   600         QCOMPARE(model.data(model.index(2,3)).toString(), QString("herr"));
       
   601     else
       
   602         QCOMPARE(model.data(model.index(2,3)).toInt(), 1);
       
   603 
       
   604     QVERIFY_SQL(model, submitAll());
       
   605 }
       
   606 
       
   607 void tst_QSqlRelationalTableModel::removeColumn()
       
   608 {
       
   609     QFETCH_GLOBAL(QString, dbName);
       
   610     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   611     CHECK_DATABASE(db);
       
   612     recreateTestTables(db);
       
   613 
       
   614     QSqlRelationalTableModel model(0, db);
       
   615 
       
   616     model.setTable(reltest1);
       
   617     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   618     QVERIFY_SQL(model, select());
       
   619 
       
   620     QVERIFY_SQL(model, removeColumn(3));
       
   621     QVERIFY_SQL(model, select());
       
   622 
       
   623     QCOMPARE(model.columnCount(), 3);
       
   624 
       
   625     QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
       
   626     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
       
   627     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
   628     QCOMPARE(model.data(model.index(0, 3)), QVariant());
       
   629 
       
   630     // try removing more than one column
       
   631     QVERIFY_SQL(model, removeColumns(1, 2));
       
   632     QCOMPARE(model.columnCount(), 1);
       
   633     QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
       
   634     QCOMPARE(model.data(model.index(0, 1)), QVariant());
       
   635 
       
   636 }
       
   637 
       
   638 void tst_QSqlRelationalTableModel::filter()
       
   639 {
       
   640     QFETCH_GLOBAL(QString, dbName);
       
   641     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   642     CHECK_DATABASE(db);
       
   643     recreateTestTables(db);
       
   644 
       
   645     QSqlRelationalTableModel model(0, db);
       
   646 
       
   647     model.setTable(reltest1);
       
   648     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   649     model.setFilter("title = 'herr'");
       
   650 
       
   651     QVERIFY_SQL(model, select());
       
   652     QCOMPARE(model.rowCount(), 2);
       
   653     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
   654     QCOMPARE(model.data(model.index(1, 2)).toString(), QString("herr"));
       
   655 }
       
   656 
       
   657 void tst_QSqlRelationalTableModel::sort()
       
   658 {
       
   659     QFETCH_GLOBAL(QString, dbName);
       
   660     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   661     CHECK_DATABASE(db);
       
   662 
       
   663     QSqlRelationalTableModel model(0, db);
       
   664 
       
   665     model.setTable(reltest1);
       
   666     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   667     if (!db.driverName().startsWith("QTDS"))
       
   668         model.setRelation(3, QSqlRelation(reltest2, "tid", "title"));
       
   669 
       
   670     model.setSort(2, Qt::DescendingOrder);
       
   671     QVERIFY_SQL(model, select());
       
   672 
       
   673     QCOMPARE(model.rowCount(), 4);
       
   674     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("mister"));
       
   675     QCOMPARE(model.data(model.index(1, 2)).toString(), QString("mister"));
       
   676     QCOMPARE(model.data(model.index(2, 2)).toString(), QString("herr"));
       
   677     QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr"));
       
   678 
       
   679 
       
   680     model.setSort(3, Qt::AscendingOrder);
       
   681     QVERIFY_SQL(model, select());
       
   682 
       
   683     if (!db.driverName().startsWith("QTDS")) {
       
   684         QCOMPARE(model.rowCount(), 4);
       
   685         QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr"));
       
   686         QCOMPARE(model.data(model.index(1, 3)).toString(), QString("mister"));
       
   687         QCOMPARE(model.data(model.index(2, 3)).toString(), QString("mister"));
       
   688         QCOMPARE(model.data(model.index(3, 3)).toString(), QString("mister"));
       
   689     } else {
       
   690         QCOMPARE(model.data(model.index(0, 3)).toInt(), 1);
       
   691         QCOMPARE(model.data(model.index(1, 3)).toInt(), 2);
       
   692         QCOMPARE(model.data(model.index(2, 3)).toInt(), 2);
       
   693         QCOMPARE(model.data(model.index(3, 3)).toInt(), 2);
       
   694     }
       
   695 
       
   696 }
       
   697 
       
   698 static void testRevert(QSqlRelationalTableModel &model)
       
   699 {
       
   700     /* revert single row */
       
   701     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
   702     QVERIFY(model.setData(model.index(0, 2), 2, Qt::EditRole));
       
   703 
       
   704     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("mister"));
       
   705     model.revertRow(0);
       
   706     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
   707 
       
   708     /* revert all */
       
   709     QVERIFY(model.setData(model.index(0, 2), 2, Qt::EditRole));
       
   710 
       
   711     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("mister"));
       
   712     model.revertAll();
       
   713     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
   714 
       
   715     // the following only works for OnManualSubmit
       
   716     if (model.editStrategy() != QSqlTableModel::OnManualSubmit)
       
   717         return;
       
   718 
       
   719     /* revert inserted rows */
       
   720     int initialRowCount = model.rowCount();
       
   721     QVERIFY(model.insertRows(4, 4));
       
   722     QVERIFY(model.rowCount() == (initialRowCount + 4));
       
   723 
       
   724     /* make sure the new rows are initialized to nothing */
       
   725     QVERIFY(model.data(model.index(4, 2)).toString().isEmpty());
       
   726     QVERIFY(model.data(model.index(5, 2)).toString().isEmpty());
       
   727     QVERIFY(model.data(model.index(6, 2)).toString().isEmpty());
       
   728     QVERIFY(model.data(model.index(7, 2)).toString().isEmpty());
       
   729 
       
   730     /* Set some values */
       
   731     QVERIFY(model.setData(model.index(4, 0), 42, Qt::EditRole));
       
   732     QVERIFY(model.setData(model.index(5, 0), 43, Qt::EditRole));
       
   733     QVERIFY(model.setData(model.index(6, 0), 44, Qt::EditRole));
       
   734     QVERIFY(model.setData(model.index(7, 0), 45, Qt::EditRole));
       
   735 
       
   736     QVERIFY(model.setData(model.index(4, 2), 2, Qt::EditRole));
       
   737     QVERIFY(model.setData(model.index(5, 2), 2, Qt::EditRole));
       
   738     QVERIFY(model.setData(model.index(6, 2), 1, Qt::EditRole));
       
   739     QVERIFY(model.setData(model.index(7, 2), 2, Qt::EditRole));
       
   740 
       
   741     /* Now revert the newly inserted rows */
       
   742     model.revertAll();
       
   743     QVERIFY(model.rowCount() == initialRowCount);
       
   744 
       
   745     /* Insert rows again */
       
   746     QVERIFY(model.insertRows(4, 4));
       
   747 
       
   748     /* make sure the new rows are initialized to nothing */
       
   749     QVERIFY(model.data(model.index(4, 2)).toString().isEmpty());
       
   750     QVERIFY(model.data(model.index(5, 2)).toString().isEmpty());
       
   751     QVERIFY(model.data(model.index(6, 2)).toString().isEmpty());
       
   752     QVERIFY(model.data(model.index(7, 2)).toString().isEmpty());
       
   753 }
       
   754 
       
   755 void tst_QSqlRelationalTableModel::revert()
       
   756 {
       
   757     QFETCH_GLOBAL(QString, dbName);
       
   758     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   759     CHECK_DATABASE(db);
       
   760 
       
   761     QSqlRelationalTableModel model(0, db);
       
   762 
       
   763     model.setTable(reltest1);
       
   764     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   765     model.setRelation(3, QSqlRelation(reltest4, "id", "name"));
       
   766 
       
   767     model.setSort(0, Qt::AscendingOrder);
       
   768 
       
   769     QVERIFY_SQL(model, select());
       
   770     QCOMPARE(model.data(model.index(0, 0)).toString(), QString("1"));
       
   771 
       
   772     testRevert(model);
       
   773     if (QTest::currentTestFailed())
       
   774         return;
       
   775 
       
   776     /* and again with OnManualSubmit */
       
   777     model.setEditStrategy(QSqlTableModel::OnManualSubmit);
       
   778     testRevert(model);
       
   779 }
       
   780 
       
   781 void tst_QSqlRelationalTableModel::clearDisplayValuesCache()
       
   782 {
       
   783     QFETCH_GLOBAL(QString, dbName);
       
   784     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   785     CHECK_DATABASE(db);
       
   786 
       
   787     QSqlRelationalTableModel model(0, db);
       
   788 
       
   789     model.setTable(reltest1);
       
   790     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   791 
       
   792     if (!db.driverName().startsWith("QTDS"))
       
   793         model.setRelation(3, QSqlRelation(reltest2, "tid", "title"));
       
   794     model.setSort(1, Qt::AscendingOrder);
       
   795     model.setEditStrategy(QSqlTableModel::OnManualSubmit);
       
   796 
       
   797     QVERIFY_SQL(model, select());
       
   798 
       
   799     QCOMPARE(model.data(model.index(3, 0)).toInt(), 3);
       
   800     QCOMPARE(model.data(model.index(3, 1)).toString(), QString("vohi"));
       
   801     QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr"));
       
   802     if (!db.driverName().startsWith("QTDS"))
       
   803         QCOMPARE(model.data(model.index(3, 3)).toString(), QString("mister"));
       
   804     else
       
   805         QCOMPARE(model.data(model.index(3, 3)).toInt(), 2 );
       
   806 
       
   807     model.insertRow(model.rowCount());
       
   808     QVERIFY(model.setData(model.index(4, 0), 5, Qt::EditRole));
       
   809     QVERIFY(model.setData(model.index(4, 1), "anders", Qt::EditRole));
       
   810     QVERIFY(model.setData(model.index(4, 2), 1, Qt::EditRole));
       
   811     QVERIFY(model.setData(model.index(4, 3), 1, Qt::EditRole));
       
   812     model.submitAll();
       
   813 
       
   814     QCOMPARE(model.data(model.index(0, 0)).toInt(), 5);
       
   815     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("anders"));
       
   816     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
   817     if (!db.driverName().startsWith("QTDS"))
       
   818         QCOMPARE(model.data(model.index(0, 3)).toString(), QString("herr"));
       
   819     else
       
   820         QCOMPARE(model.data(model.index(0, 3)).toInt(), 1);
       
   821 
       
   822     QCOMPARE(model.data(model.index(4, 0)).toInt(), 3);
       
   823     QCOMPARE(model.data(model.index(4, 1)).toString(), QString("vohi"));
       
   824     QCOMPARE(model.data(model.index(4, 2)).toString(), QString("herr"));
       
   825     if (!db.driverName().startsWith("QTDS"))
       
   826         QCOMPARE(model.data(model.index(4, 3)).toString(), QString("mister"));
       
   827     else
       
   828         QCOMPARE(model.data(model.index(4, 3)).toInt(), 2);
       
   829 }
       
   830 
       
   831 // For task 140782 and 176374: If the main table and the the related tables uses the same
       
   832 // name for a column or display column then insertRecord() would return true though it
       
   833 // actually failed.
       
   834 void tst_QSqlRelationalTableModel::insertRecordDuplicateFieldNames()
       
   835 {
       
   836     QFETCH_GLOBAL(QString, dbName);
       
   837     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   838     CHECK_DATABASE(db);
       
   839 
       
   840     QSqlRelationalTableModel model(0, db);
       
   841     model.setTable(reltest3);
       
   842     model.setEditStrategy(QSqlTableModel::OnManualSubmit);
       
   843     model.setSort(0, Qt::AscendingOrder);
       
   844 
       
   845     // Duplication of "name", used in both reltest3 and reltest4.
       
   846     model.setRelation(2, QSqlRelation(reltest4, "id", "name"));
       
   847     QVERIFY_SQL(model, select());
       
   848 
       
   849     if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) {
       
   850         QCOMPARE(model.record(1).value((reltest4+QLatin1String("_name_2")).toUpper()).toString(),
       
   851             QString("Trondheim"));
       
   852     } else {
       
   853         QCOMPARE(model.record(1).value((reltest4+QLatin1String("_name_2"))).toString(),
       
   854             QString("Trondheim"));
       
   855     }
       
   856 
       
   857     QSqlRecord rec = model.record();
       
   858     rec.setValue(0, 3);
       
   859     rec.setValue(1, "Berge");
       
   860     rec.setValue(2, 1); // Must insert the key value
       
   861 
       
   862     if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) {
       
   863         QCOMPARE(rec.fieldName(0), QLatin1String("ID"));
       
   864         QCOMPARE(rec.fieldName(1), QLatin1String("NAME")); // This comes from main table
       
   865     } else {
       
   866         QCOMPARE(rec.fieldName(0), QLatin1String("id"));
       
   867         QCOMPARE(rec.fieldName(1), QLatin1String("name"));
       
   868     }
       
   869 
       
   870     // The duplicate field names is aliased because it's comes from the relation's display column.
       
   871     if(db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2"))
       
   872         QCOMPARE(rec.fieldName(2), (reltest4+QLatin1String("_name_2")).toUpper());
       
   873     else
       
   874         QCOMPARE(rec.fieldName(2), reltest4+QLatin1String("_name_2"));
       
   875 
       
   876     QVERIFY(model.insertRecord(-1, rec));
       
   877     QCOMPARE(model.data(model.index(2, 2)).toString(), QString("Oslo"));
       
   878     QVERIFY(model.submitAll());
       
   879     QCOMPARE(model.data(model.index(2, 2)).toString(), QString("Oslo"));
       
   880 }
       
   881 
       
   882 void tst_QSqlRelationalTableModel::invalidData()
       
   883 {
       
   884     QFETCH_GLOBAL(QString, dbName);
       
   885     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   886     CHECK_DATABASE(db);
       
   887 
       
   888     QSqlRelationalTableModel model(0, db);
       
   889     model.setTable(reltest1);
       
   890     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   891     QVERIFY_SQL(model, select());
       
   892 
       
   893     //try set a non-existent relational key
       
   894     QVERIFY(model.setData(model.index(0, 2), 3) == false);
       
   895     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
   896 
       
   897     //try to set data in non valid index
       
   898     QVERIFY(model.setData(model.index(0,10),5) == false);
       
   899 }
       
   900 
       
   901 void tst_QSqlRelationalTableModel::relationModel()
       
   902 {
       
   903     QFETCH_GLOBAL(QString, dbName);
       
   904     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   905     CHECK_DATABASE(db);
       
   906 
       
   907     QSqlRelationalTableModel model(0, db);
       
   908     model.setTable(reltest1);
       
   909     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   910     QVERIFY_SQL(model, select());
       
   911 
       
   912     QVERIFY(model.relationModel(0) == NULL);
       
   913     QVERIFY(model.relationModel(1) == NULL);
       
   914     QVERIFY(model.relationModel(2) != NULL);
       
   915     QVERIFY(model.relationModel(3) == NULL);
       
   916     QVERIFY(model.relationModel(4) == NULL);
       
   917 
       
   918     model.setRelation(3, QSqlRelation(reltest4, "id", "name"));
       
   919     QVERIFY_SQL(model, select());
       
   920 
       
   921     QVERIFY(model.relationModel(0) == NULL);
       
   922     QVERIFY(model.relationModel(1) == NULL);
       
   923     QVERIFY(model.relationModel(2) != NULL);
       
   924     QVERIFY(model.relationModel(3) != NULL);
       
   925     QVERIFY(model.relationModel(4) == NULL);
       
   926 
       
   927     QSqlTableModel *rel_model = model.relationModel(2);
       
   928     QCOMPARE(rel_model->data(rel_model->index(0,1)).toString(), QString("herr"));
       
   929 }
       
   930 
       
   931 void tst_QSqlRelationalTableModel::casing()
       
   932 {
       
   933     QFETCH_GLOBAL(QString, dbName);
       
   934     QSqlDatabase db = QSqlDatabase::database(dbName);
       
   935     CHECK_DATABASE(db);
       
   936 
       
   937     if (db.driverName().startsWith("QSQLITE") || db.driverName().startsWith("QIBASE") || tst_Databases::isSqlServer(db))
       
   938         QSKIP("The casing test for this database is irrelevant since this database does not treat different cases as separate entities", SkipAll);
       
   939 
       
   940     QSqlQuery q(db);
       
   941     QVERIFY_SQL( q, exec("create table " + qTableName("CASETEST1", db.driver()).toUpper()  +
       
   942                 " (id int not null primary key, name varchar(20), title_key int, another_title_key int)"));
       
   943 
       
   944     if( !q.exec("create table " + qTableName("casetest1", db.driver())  +
       
   945                 " (ident int not null primary key, name varchar(20), title_key int)"))
       
   946         QSKIP("The casing test for this database is irrelevant since this database does not treat different cases as separate entities", SkipAll);
       
   947 
       
   948     QVERIFY_SQL( q, exec("insert into " + qTableName("CASETEST1", db.driver()).toUpper() + " values(1, 'harry', 1, 2)"));
       
   949     QVERIFY_SQL( q, exec("insert into " + qTableName("CASETEST1", db.driver()).toUpper() + " values(2, 'trond', 2, 1)"));
       
   950     QVERIFY_SQL( q, exec("insert into " + qTableName("CASETEST1", db.driver()).toUpper() + " values(3, 'vohi', 1, 2)"));
       
   951     QVERIFY_SQL( q, exec("insert into " + qTableName("CASETEST1", db.driver()).toUpper() + " values(4, 'boris', 2, 2)"));
       
   952     QVERIFY_SQL( q, exec("insert into " + qTableName("casetest1", db.driver()) + " values(1, 'jerry', 1)"));
       
   953     QVERIFY_SQL( q, exec("insert into " + qTableName("casetest1", db.driver()) + " values(2, 'george', 2)"));
       
   954     QVERIFY_SQL( q, exec("insert into " + qTableName("casetest1", db.driver()) + " values(4, 'kramer', 2)"));
       
   955 
       
   956     if (db.driverName().startsWith("QOCI")) {
       
   957         //try an owner that doesn't exist
       
   958         QSqlRecord rec = db.driver()->record("doug." + qTableName("CASETEST1", db.driver()).toUpper());
       
   959         QCOMPARE( rec.count(), 0);
       
   960 
       
   961         //try an owner that does exist
       
   962         rec = db.driver()->record(db.userName() + "." +  qTableName("CASETEST1", db.driver()).toUpper());
       
   963         QCOMPARE( rec.count(), 4);
       
   964     }
       
   965     QSqlRecord rec = db.driver()->record(qTableName("CASETEST1", db.driver()).toUpper());
       
   966     QCOMPARE( rec.count(), 4);
       
   967 
       
   968     rec = db.driver()->record(qTableName("casetest1", db.driver()));
       
   969     QCOMPARE( rec.count(), 3);
       
   970 
       
   971     QSqlTableModel upperCaseModel(0, db);
       
   972     upperCaseModel.setTable(qTableName("CASETEST1", db.driver()).toUpper());
       
   973 
       
   974     QCOMPARE(upperCaseModel.tableName(),qTableName("CASETEST1",db.driver()).toUpper());
       
   975 
       
   976     QVERIFY_SQL(upperCaseModel, select());
       
   977 
       
   978     QCOMPARE(upperCaseModel.rowCount(), 4);
       
   979 
       
   980     QSqlTableModel lowerCaseModel(0, db);
       
   981     lowerCaseModel.setTable(qTableName("casetest1", db.driver()));
       
   982     QCOMPARE(lowerCaseModel.tableName(), qTableName("casetest1",db.driver()));
       
   983     QVERIFY_SQL(lowerCaseModel, select());
       
   984 
       
   985     QCOMPARE(lowerCaseModel.rowCount(), 3);
       
   986 
       
   987     QSqlRelationalTableModel model(0, db);
       
   988     model.setTable(qTableName("CASETEST1", db.driver()).toUpper());
       
   989     model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
   990     QVERIFY_SQL(model, select());
       
   991 
       
   992     QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
       
   993     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
       
   994     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
   995 }
       
   996 
       
   997 void tst_QSqlRelationalTableModel::escapedRelations()
       
   998 {
       
   999     QFETCH_GLOBAL(QString, dbName);
       
  1000     QSqlDatabase db = QSqlDatabase::database(dbName);
       
  1001     CHECK_DATABASE(db);
       
  1002     recreateTestTables(db);
       
  1003 
       
  1004     QSqlRelationalTableModel model(0, db);
       
  1005     model.setTable(reltest1);
       
  1006 
       
  1007     //try with relation table name quoted
       
  1008     if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) {
       
  1009         model.setRelation(2, QSqlRelation(db.driver()->escapeIdentifier(reltest2.toUpper(),QSqlDriver::TableName),
       
  1010                             "tid",
       
  1011                             "title"));
       
  1012     } else {
       
  1013         model.setRelation(2, QSqlRelation(db.driver()->escapeIdentifier(reltest2,QSqlDriver::TableName),
       
  1014                             "tid",
       
  1015                             "title"));
       
  1016 
       
  1017     }
       
  1018     QVERIFY_SQL(model, select());
       
  1019 
       
  1020     QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
       
  1021     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
       
  1022     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
  1023 
       
  1024     //try with index column quoted
       
  1025     if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) {
       
  1026         model.setRelation(2, QSqlRelation(reltest2,
       
  1027                             db.driver()->escapeIdentifier("tid", QSqlDriver::FieldName).toUpper(),
       
  1028                             "title"));
       
  1029     } else {
       
  1030         model.setRelation(2, QSqlRelation(reltest2,
       
  1031                             db.driver()->escapeIdentifier("tid", QSqlDriver::FieldName),
       
  1032                             "title"));
       
  1033     }
       
  1034     QVERIFY_SQL(model, select());
       
  1035 
       
  1036     QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
       
  1037     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
       
  1038     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
  1039 
       
  1040     //try with display column quoted
       
  1041 
       
  1042     if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) {
       
  1043 
       
  1044         model.setRelation(2, QSqlRelation(reltest2,
       
  1045                             "tid",
       
  1046                             db.driver()->escapeIdentifier("title", QSqlDriver::FieldName).toUpper()));
       
  1047     } else {
       
  1048         model.setRelation(2, QSqlRelation(reltest2,
       
  1049                             "tid",
       
  1050                             db.driver()->escapeIdentifier("title", QSqlDriver::FieldName)));
       
  1051     }
       
  1052 
       
  1053     QVERIFY_SQL(model, select());
       
  1054 
       
  1055     QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
       
  1056     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
       
  1057     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
  1058 
       
  1059     //try with tablename and index and display columns quoted in the relation
       
  1060 
       
  1061     if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) {
       
  1062         model.setRelation(2, QSqlRelation(reltest2,
       
  1063                             "tid",
       
  1064                             db.driver()->escapeIdentifier("title", QSqlDriver::FieldName).toUpper()));
       
  1065     } else {
       
  1066         model.setRelation(2, QSqlRelation(reltest2,
       
  1067                             "tid",
       
  1068                             db.driver()->escapeIdentifier("title", QSqlDriver::FieldName)));
       
  1069     }
       
  1070     QVERIFY_SQL(model, select());
       
  1071 
       
  1072     QCOMPARE(model.data(model.index(0, 0)).toInt(), 1);
       
  1073     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry"));
       
  1074     QCOMPARE(model.data(model.index(0, 2)).toString(), QString("herr"));
       
  1075 }
       
  1076 
       
  1077 void tst_QSqlRelationalTableModel::escapedTableName()
       
  1078 {
       
  1079     QFETCH_GLOBAL(QString, dbName);
       
  1080     QSqlDatabase db = QSqlDatabase::database(dbName);
       
  1081     CHECK_DATABASE(db);
       
  1082 
       
  1083     // set the values using OnRowChange Strategy with an escaped tablename
       
  1084     {
       
  1085         QSqlRelationalTableModel model(0, db);
       
  1086 
       
  1087         if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) {
       
  1088             model.setTable(db.driver()->escapeIdentifier(reltest1.toUpper(), QSqlDriver::TableName));
       
  1089         } else {
       
  1090             model.setTable(db.driver()->escapeIdentifier(reltest1, QSqlDriver::TableName));
       
  1091         }
       
  1092         model.setSort(0, Qt::AscendingOrder);
       
  1093         model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
  1094         QVERIFY_SQL(model, select());
       
  1095 
       
  1096         QVERIFY(model.setData(model.index(0, 1), QString("harry2")));
       
  1097         QVERIFY(model.setData(model.index(0, 2), 2));
       
  1098 
       
  1099         QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry2"));
       
  1100         QCOMPARE(model.data(model.index(0, 2)).toString(), QString("mister"));
       
  1101 
       
  1102         model.submit();
       
  1103 
       
  1104         QVERIFY(model.setData(model.index(3,1), QString("boris2")));
       
  1105         QVERIFY(model.setData(model.index(3, 2), 1));
       
  1106 
       
  1107         QCOMPARE(model.data(model.index(3,1)).toString(), QString("boris2"));
       
  1108         QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr"));
       
  1109 
       
  1110         model.submit();
       
  1111     }
       
  1112     { //verify values
       
  1113         QSqlRelationalTableModel model(0, db);
       
  1114         model.setTable(reltest1);
       
  1115         model.setSort(0, Qt::AscendingOrder);
       
  1116         QVERIFY_SQL(model, select());
       
  1117 
       
  1118         QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry2"));
       
  1119         QCOMPARE(model.data(model.index(0, 2)).toInt(), 2);
       
  1120         QCOMPARE(model.data(model.index(3, 1)).toString(), QString("boris2"));
       
  1121         QCOMPARE(model.data(model.index(3, 2)).toInt(), 1);
       
  1122 
       
  1123         model.setRelation(2, QSqlRelation(reltest2, "tid", "title"));
       
  1124         QVERIFY_SQL(model, select());
       
  1125         QCOMPARE(model.data(model.index(0, 2)).toString(), QString("mister"));
       
  1126         QCOMPARE(model.data(model.index(3,2)).toString(), QString("herr"));
       
  1127 
       
  1128     }
       
  1129 }
       
  1130 
       
  1131 void tst_QSqlRelationalTableModel::whiteSpaceInIdentifiers()
       
  1132 {
       
  1133     QFETCH_GLOBAL(QString, dbName);
       
  1134     QSqlDatabase db = QSqlDatabase::database(dbName);
       
  1135     CHECK_DATABASE(db);
       
  1136 
       
  1137     if (!testWhiteSpaceNames(db.driverName()))
       
  1138         QSKIP("White space test irrelevant for driver", SkipAll);
       
  1139     QSqlRelationalTableModel model(0, db);
       
  1140     model.setTable(db.driver()->escapeIdentifier(qTableName("rel", __FILE__)+" test6", QSqlDriver::TableName));
       
  1141     model.setSort(0, Qt::DescendingOrder);
       
  1142     model.setRelation(1, QSqlRelation(db.driver()->escapeIdentifier(qTableName("rel", __FILE__)+" test7", QSqlDriver::TableName),
       
  1143                         db.driver()->escapeIdentifier("city id", QSqlDriver::FieldName),
       
  1144                         db.driver()->escapeIdentifier("city name", QSqlDriver::FieldName)));
       
  1145     QVERIFY_SQL(model, select());
       
  1146 
       
  1147     QCOMPARE(model.data(model.index(0,1)).toString(), QString("Washington"));
       
  1148     QCOMPARE(model.data(model.index(1,1)).toString(), QString("New York"));
       
  1149 
       
  1150     QSqlRecord rec;
       
  1151     QSqlField f1("id", QVariant::Int);
       
  1152     QSqlField f2(db.driver()->escapeIdentifier("city key", QSqlDriver::FieldName), QVariant::Int);
       
  1153     QSqlField f3(db.driver()->escapeIdentifier("extra field", QSqlDriver::FieldName), QVariant::Int);
       
  1154 
       
  1155     f1.setValue(3);
       
  1156     f2.setValue(2);
       
  1157     f3.setValue(7);
       
  1158 
       
  1159     f1.setGenerated(true);
       
  1160     f2.setGenerated(true);
       
  1161     f3.setGenerated(true);
       
  1162 
       
  1163     rec.append(f1);
       
  1164     rec.append(f2);
       
  1165     rec.append(f3);
       
  1166 
       
  1167     QVERIFY_SQL(model, insertRecord(-1, rec));
       
  1168     model.submitAll();
       
  1169 
       
  1170     QCOMPARE(model.data(model.index(0, 0)).toInt(), 3);
       
  1171     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("Washington"));
       
  1172     QCOMPARE(model.data(model.index(0, 2)).toInt(), 7);
       
  1173 
       
  1174     //TODO: For some reson setting a record using manual submit fails
       
  1175     //model.setEditStrategy(QSqlTableModel::OnManualSubmit);
       
  1176 
       
  1177     QSqlRecord recNew;
       
  1178     QSqlField f1New("id", QVariant::Int);
       
  1179     QSqlField f2New(db.driver()->escapeIdentifier("city key", QSqlDriver::FieldName), QVariant::Int);
       
  1180     QSqlField f3New(db.driver()->escapeIdentifier("extra field", QSqlDriver::FieldName), QVariant::Int);
       
  1181 
       
  1182     f1New.setValue(4);
       
  1183     f2New.setValue(1);
       
  1184     f3New.setValue(6);
       
  1185 
       
  1186     f1New.setGenerated(true);
       
  1187     f2New.setGenerated(true);
       
  1188     f3New.setGenerated(true);
       
  1189 
       
  1190     recNew.append(f1New);
       
  1191     recNew.append(f2New);
       
  1192     recNew.append(f3New);
       
  1193 
       
  1194     QVERIFY_SQL(model, setRecord(0, recNew));
       
  1195 
       
  1196     QCOMPARE(model.data(model.index(0, 0)).toInt(), 4);
       
  1197     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("New York"));
       
  1198     QCOMPARE(model.data(model.index(0, 2)).toInt(), 6);
       
  1199 
       
  1200     QVERIFY_SQL(model, submitAll());
       
  1201     QCOMPARE(model.data(model.index(0, 0)).toInt(), 4);
       
  1202     QCOMPARE(model.data(model.index(0, 1)).toString(), QString("New York"));
       
  1203     QCOMPARE(model.data(model.index(0, 2)).toInt(), 6);
       
  1204 }
       
  1205 
       
  1206 void tst_QSqlRelationalTableModel::psqlSchemaTest()
       
  1207 {
       
  1208     QFETCH_GLOBAL(QString, dbName);
       
  1209     QSqlDatabase db = QSqlDatabase::database(dbName);
       
  1210     CHECK_DATABASE(db);
       
  1211 
       
  1212     if(!tst_Databases::isPostgreSQL(db)) {
       
  1213         QSKIP("Postgresql specific test", SkipSingle);
       
  1214         return;
       
  1215     }
       
  1216     QSqlRelationalTableModel model(0, db);
       
  1217     QSqlQuery q(db);
       
  1218     QVERIFY_SQL(q, exec("create schema "+qTableName("QTBUG_5373", __FILE__)));
       
  1219     QVERIFY_SQL(q, exec("create schema "+qTableName("QTBUG_5373_s2", __FILE__)));
       
  1220     QVERIFY_SQL(q, exec("create table "+qTableName("QTBUG_5373", __FILE__)+"."+qTableName("document", __FILE__)+"(document_id int primary key, relatingid int, userid int)"));
       
  1221     QVERIFY_SQL(q, exec("create table "+qTableName("QTBUG_5373_s2", __FILE__)+"."+qTableName("user", __FILE__)+"(userid int primary key, username char(40))"));
       
  1222     model.setTable(qTableName("QTBUG_5373", __FILE__)+"."+qTableName("document", __FILE__));
       
  1223     model.setRelation(1, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__)+"."+qTableName("user", __FILE__), "userid", "username"));
       
  1224     model.setRelation(2, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__)+"."+qTableName("user", __FILE__), "userid", "username"));
       
  1225     QVERIFY_SQL(model, select());
       
  1226 }
       
  1227 
       
  1228 QTEST_MAIN(tst_QSqlRelationalTableModel)
       
  1229 #include "tst_qsqlrelationaltablemodel.moc"