tests/auto/qsqlquery/tst_qsqlquery.cpp
changeset 7 f7bc934e204c
parent 3 41300fa6a67c
equal deleted inserted replaced
3:41300fa6a67c 7:f7bc934e204c
     1 /****************************************************************************
     1 /****************************************************************************
     2 **
     2 **
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     4 ** All rights reserved.
     4 ** All rights reserved.
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     6 **
     6 **
     7 ** This file is part of the test suite of the Qt Toolkit.
     7 ** This file is part of the test suite of the Qt Toolkit.
     8 **
     8 **
    41 
    41 
    42 #include <QtTest/QtTest>
    42 #include <QtTest/QtTest>
    43 #include <QtSql/QtSql>
    43 #include <QtSql/QtSql>
    44 
    44 
    45 #include "../qsqldatabase/tst_databases.h"
    45 #include "../qsqldatabase/tst_databases.h"
       
    46 
       
    47 const QString qtest(qTableName( "qtest", __FILE__ ));
    46 
    48 
    47 //TESTED_FILES=
    49 //TESTED_FILES=
    48 
    50 
    49 class tst_QSqlQuery : public QObject
    51 class tst_QSqlQuery : public QObject
    50 {
    52 {
   201     void QTBUG_5251();
   203     void QTBUG_5251();
   202     void QTBUG_6421_data() { generic_data("QOCI"); }
   204     void QTBUG_6421_data() { generic_data("QOCI"); }
   203     void QTBUG_6421();
   205     void QTBUG_6421();
   204     void QTBUG_6618_data() { generic_data("QODBC"); }
   206     void QTBUG_6618_data() { generic_data("QODBC"); }
   205     void QTBUG_6618();
   207     void QTBUG_6618();
       
   208     void QTBUG_6852_data() { generic_data("QMYSQL"); }
       
   209     void QTBUG_6852();
       
   210     void QTBUG_5765_data() { generic_data("QMYSQL"); }
       
   211     void QTBUG_5765();
       
   212 
       
   213 #if 0
       
   214     void benchmark_data() { generic_data(); }
       
   215     void benchmark();
       
   216 #endif
   206 
   217 
   207 private:
   218 private:
   208     // returns all database connections
   219     // returns all database connections
   209     void generic_data(const QString &engine=QString());
   220     void generic_data(const QString &engine=QString());
   210     void dropTestTables( QSqlDatabase db );
   221     void dropTestTables( QSqlDatabase db );
   284 
   295 
   285 void tst_QSqlQuery::dropTestTables( QSqlDatabase db )
   296 void tst_QSqlQuery::dropTestTables( QSqlDatabase db )
   286 {
   297 {
   287     QStringList tablenames;
   298     QStringList tablenames;
   288     // drop all the table in case a testcase failed
   299     // drop all the table in case a testcase failed
   289     tablenames <<  qTableName( "qtest" )
   300     tablenames <<  qtest
   290                << qTableName( "qtest_null" )
   301                << qTableName( "qtest_null", __FILE__ )
   291                << qTableName( "qtest_blob" )
   302                << qTableName( "qtest_blob", __FILE__ )
   292                << qTableName( "qtest_bittest" )
   303                << qTableName( "qtest_bittest", __FILE__ )
   293                << qTableName( "qtest_nullblob" )
   304                << qTableName( "qtest_nullblob", __FILE__ )
   294                << qTableName( "qtest_rawtest" )
   305                << qTableName( "qtest_rawtest", __FILE__ )
   295                << qTableName( "qtest_precision" )
   306                << qTableName( "qtest_precision", __FILE__ )
   296                << qTableName( "qtest_prepare" )
   307                << qTableName( "qtest_prepare", __FILE__ )
   297                << qTableName( "qtestj1" )
   308                << qTableName( "qtestj1", __FILE__ )
   298                << qTableName( "qtestj2" )
   309                << qTableName( "qtestj2", __FILE__ )
   299                << qTableName( "char1Select" )
   310                << qTableName( "char1Select", __FILE__ )
   300                << qTableName( "char1SelectUnicode" )
   311                << qTableName( "char1SU", __FILE__ )
   301                << qTableName( "qxmltest" )
   312                << qTableName( "qxmltest", __FILE__ )
   302                << qTableName( "qtest_exerr" )
   313                << qTableName( "qtest_exerr", __FILE__ )
   303                << qTableName( "qtest_empty" )
   314                << qTableName( "qtest_empty", __FILE__ )
   304                << qTableName( "clobby" )
   315                << qTableName( "clobby", __FILE__ )
   305                << qTableName( "bindtest" )
   316                << qTableName( "bindtest", __FILE__ )
   306                << qTableName( "more_results" )
   317                << qTableName( "more_results", __FILE__ )
   307                << qTableName( "blobstest" )
   318                << qTableName( "blobstest", __FILE__ )
   308                << qTableName( "oraRowId" )
   319                << qTableName( "oraRowId", __FILE__ )
   309                << qTableName( "qtest_batch" )
   320                << qTableName( "qtest_batch", __FILE__ )
   310                << qTableName(QLatin1String("bug6421")).toUpper();
   321                << qTableName("bug6421", __FILE__).toUpper()
       
   322                << qTableName("bug5765", __FILE__)
       
   323                << qTableName("bug6852", __FILE__)
       
   324                << qTableName( "qtest_lockedtable", __FILE__ )
       
   325                << qTableName( "Planet", __FILE__ )
       
   326                << qTableName( "task_250026", __FILE__ )
       
   327                << qTableName( "task_234422", __FILE__ )
       
   328                << qTableName("test141895", __FILE__);
   311 
   329 
   312     if ( db.driverName().startsWith("QPSQL") )
   330     if ( db.driverName().startsWith("QPSQL") )
   313         tablenames << qTableName("task_233829");
   331         tablenames << qTableName("task_233829", __FILE__);
   314 
   332 
   315     if ( db.driverName().startsWith("QSQLITE") )
   333     if ( db.driverName().startsWith("QSQLITE") )
   316         tablenames << qTableName( "record_sqlite" );
   334         tablenames << qTableName( "record_sqlite", __FILE__ );
   317 
   335 
   318     if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QOCI" ) )
   336     if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QOCI" ) )
   319         tablenames << qTableName( "qtest_longstr" );
   337         tablenames << qTableName( "qtest_longstr", __FILE__ );
   320 
   338 
   321     tablenames <<  qTableName( "qtest_lockedtable" );
   339     if (tst_Databases::isSqlServer( db ))
   322 
   340         db.exec("DROP PROCEDURE " + qTableName("test141895_proc", __FILE__));
   323     tablenames <<  qTableName( "Planet" );
   341 
   324 
   342     if (tst_Databases::isMySQL( db ))
   325     tablenames << qTableName( "task_250026" );
   343         db.exec("DROP PROCEDURE IF EXISTS "+qTableName("bug6852_proc", __FILE__));
   326     tablenames << qTableName( "task_234422" );
       
   327 
       
   328     if (tst_Databases::isSqlServer( db )) {
       
   329         QSqlQuery q( db );
       
   330         q.exec("DROP PROCEDURE " + qTableName("test141895_proc"));
       
   331     }
       
   332 
       
   333     tablenames << qTableName("test141895");
       
   334 
   344 
   335     tst_Databases::safeDropTables( db, tablenames );
   345     tst_Databases::safeDropTables( db, tablenames );
   336 
   346 
   337     if ( db.driverName().startsWith( "QOCI" ) ) {
   347     if ( db.driverName().startsWith( "QOCI" ) ) {
   338         QSqlQuery q( db );
   348         QSqlQuery q( db );
   339         q.exec( "DROP PACKAGE " + qTableName("pkg") );
   349         q.exec( "DROP PACKAGE " + qTableName("pkg", __FILE__) );
   340     }
   350     }
   341 }
   351 }
   342 
   352 
   343 void tst_QSqlQuery::createTestTables( QSqlDatabase db )
   353 void tst_QSqlQuery::createTestTables( QSqlDatabase db )
   344 {
   354 {
   350         q.exec( "set table_type=innodb" );
   360         q.exec( "set table_type=innodb" );
   351     else if(tst_Databases::isPostgreSQL(db))
   361     else if(tst_Databases::isPostgreSQL(db))
   352         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
   362         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
   353 
   363 
   354     if(tst_Databases::isPostgreSQL(db))
   364     if(tst_Databases::isPostgreSQL(db))
   355         QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest" ) + " (id serial NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id)) WITH OIDS" ) );
   365         QVERIFY_SQL( q, exec( "create table " + qtest + " (id serial NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id)) WITH OIDS" ) );
   356     else
   366     else
   357         QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest" ) + " (id int "+tst_Databases::autoFieldName(db) +" NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id))" ) );
   367         QVERIFY_SQL( q, exec( "create table " + qtest + " (id int "+tst_Databases::autoFieldName(db) +" NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id))" ) );
   358 
   368 
   359     if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) )
   369     if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) )
   360         QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null" ) + " (id int null, t_varchar varchar(20) null)" ) );
   370         QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null", __FILE__ ) + " (id int null, t_varchar varchar(20) null)" ) );
   361     else
   371     else
   362         QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null" ) + " (id int, t_varchar varchar(20))" ) );
   372         QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null", __FILE__ ) + " (id int, t_varchar varchar(20))" ) );
   363 }
   373 }
   364 
   374 
   365 void tst_QSqlQuery::populateTestTables( QSqlDatabase db )
   375 void tst_QSqlQuery::populateTestTables( QSqlDatabase db )
   366 {
   376 {
   367     QSqlQuery q( db );
   377     QSqlQuery q( db );
   368     q.exec( "delete from " + qTableName( "qtest" ) );
   378     const QString qtest_null(qTableName( "qtest_null", __FILE__ ));
   369     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (1, 'VarChar1', 'Char1')" ) );
   379     q.exec( "delete from " + qtest );
   370     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (2, 'VarChar2', 'Char2')" ) );
   380     QVERIFY_SQL( q, exec( "insert into " + qtest + " values (1, 'VarChar1', 'Char1')" ) );
   371     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (3, 'VarChar3', 'Char3')" ) );
   381     QVERIFY_SQL( q, exec( "insert into " + qtest + " values (2, 'VarChar2', 'Char2')" ) );
   372     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (4, 'VarChar4', 'Char4')" ) );
   382     QVERIFY_SQL( q, exec( "insert into " + qtest + " values (3, 'VarChar3', 'Char3')" ) );
   373     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (5, 'VarChar5', 'Char5')" ) );
   383     QVERIFY_SQL( q, exec( "insert into " + qtest + " values (4, 'VarChar4', 'Char4')" ) );
   374 
   384     QVERIFY_SQL( q, exec( "insert into " + qtest + " values (5, 'VarChar5', 'Char5')" ) );
   375     q.exec( "delete from " + qTableName( "qtest_null" ) );
   385 
   376     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (0, NULL)" ) );
   386     q.exec( "delete from " + qtest_null );
   377     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (1, 'n')" ) );
   387     QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (0, NULL)" ) );
   378     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (2, 'i')" ) );
   388     QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (1, 'n')" ) );
   379     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (3, NULL)" ) );
   389     QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (2, 'i')" ) );
       
   390     QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (3, NULL)" ) );
   380 }
   391 }
   381 
   392 
   382 // There were problems with char fields of size 1
   393 // There were problems with char fields of size 1
   383 void tst_QSqlQuery::char1Select()
   394 void tst_QSqlQuery::char1Select()
   384 {
   395 {
   386     QSqlDatabase db = QSqlDatabase::database( dbName );
   397     QSqlDatabase db = QSqlDatabase::database( dbName );
   387     CHECK_DATABASE( db );
   398     CHECK_DATABASE( db );
   388 
   399 
   389     {
   400     {
   390         QSqlQuery q( db );
   401         QSqlQuery q( db );
   391         QVERIFY_SQL( q, exec( "create table " + qTableName( "char1Select" ) + " (id char(1))" ) );
   402         QVERIFY_SQL( q, exec( "create table " + qTableName( "char1Select", __FILE__ ) + " (id char(1))" ) );
   392         QVERIFY_SQL( q, exec( "insert into " + qTableName( "char1Select" ) + " values ('a')" ) );
   403         QVERIFY_SQL( q, exec( "insert into " + qTableName( "char1Select", __FILE__ ) + " values ('a')" ) );
   393         QVERIFY_SQL( q, exec( "select * from " + qTableName( "char1Select" ) ) );
   404         QVERIFY_SQL( q, exec( "select * from " + qTableName( "char1Select", __FILE__ ) ) );
   394         QVERIFY( q.next() );
   405         QVERIFY( q.next() );
   395 
   406 
   396         if ( db.driverName().startsWith( "QIBASE" ) )
   407         if ( db.driverName().startsWith( "QIBASE" ) )
   397             QCOMPARE( q.value( 0 ).toString().left( 1 ), QString( "a" ) );
   408             QCOMPARE( q.value( 0 ).toString().left( 1 ), QString( "a" ) );
   398         else
   409         else
   417 
   428 
   418         if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 )
   429         if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 )
   419             QSKIP( "Test requires MySQL >= 5.0", SkipSingle );
   430             QSKIP( "Test requires MySQL >= 5.0", SkipSingle );
   420 
   431 
   421         QString createQuery;
   432         QString createQuery;
       
   433         const QString char1SelectUnicode(qTableName( "char1SU", __FILE__ ));
   422 
   434 
   423         if ( tst_Databases::isSqlServer( db ) )
   435         if ( tst_Databases::isSqlServer( db ) )
   424             createQuery = "create table " + qTableName( "char1SelectUnicode" ) + "(id nchar(1))";
   436             createQuery = "create table " + char1SelectUnicode + "(id nchar(1))";
   425         else if ( db.driverName().startsWith( "QDB2" )
   437         else if ( db.driverName().startsWith( "QDB2" )
   426                   || db.driverName().startsWith( "QOCI" )
   438                   || db.driverName().startsWith( "QOCI" )
   427                   || db.driverName().startsWith( "QPSQL" ) )
   439                   || db.driverName().startsWith( "QPSQL" ) )
   428             createQuery = "create table " + qTableName( "char1SelectUnicode" ) + " (id char(3))";
   440             createQuery = "create table " + char1SelectUnicode + " (id char(3))";
   429         else if ( db.driverName().startsWith( "QIBASE" ) )
   441         else if ( db.driverName().startsWith( "QIBASE" ) )
   430             createQuery = "create table " + qTableName( "char1SelectUnicode" ) +
   442             createQuery = "create table " + char1SelectUnicode +
   431                           " (id char(1) character set unicode_fss)";
   443                           " (id char(1) character set unicode_fss)";
   432         else if ( db.driverName().startsWith( "QMYSQL" ) )
   444         else if ( db.driverName().startsWith( "QMYSQL" ) )
   433             createQuery = "create table " + qTableName( "char1SelectUnicode" ) + " (id char(1)) "
   445             createQuery = "create table " + char1SelectUnicode + " (id char(1)) "
   434                           "default character set 'utf8'";
   446                           "default character set 'utf8'";
   435         else
   447         else
   436             createQuery = "create table " + qTableName( "char1SelectUnicode" ) + " (id char(1))";
   448             createQuery = "create table " + char1SelectUnicode + " (id char(1))";
   437 
   449 
   438         QVERIFY_SQL( q, exec( createQuery ) );
   450         QVERIFY_SQL( q, exec( createQuery ) );
   439 
   451 
   440         QVERIFY_SQL( q, prepare( "insert into " + qTableName( "char1SelectUnicode" ) + " values(?)" ) );
   452         QVERIFY_SQL( q, prepare( "insert into " + char1SelectUnicode + " values(?)" ) );
   441 
   453 
   442         q.bindValue( 0, uniStr );
   454         q.bindValue( 0, uniStr );
   443 
   455 
   444         QVERIFY_SQL( q, exec() );
   456         QVERIFY_SQL( q, exec() );
   445 
   457 
   446         QVERIFY_SQL( q, exec( "select * from " + qTableName( "char1SelectUnicode" ) ) );
   458         QVERIFY_SQL( q, exec( "select * from " + char1SelectUnicode ) );
   447 
   459 
   448         QVERIFY( q.next() );
   460         QVERIFY( q.next() );
   449 
   461 
   450         if ( !q.value( 0 ).toString().isEmpty() )
   462         if ( !q.value( 0 ).toString().isEmpty() )
   451             QCOMPARE( q.value( 0 ).toString()[ 0 ].unicode(), uniStr[0].unicode() );
   463             QCOMPARE( q.value( 0 ).toString()[ 0 ].unicode(), uniStr[0].unicode() );
   461 void tst_QSqlQuery::oraRowId()
   473 void tst_QSqlQuery::oraRowId()
   462 {
   474 {
   463     QFETCH( QString, dbName );
   475     QFETCH( QString, dbName );
   464     QSqlDatabase db = QSqlDatabase::database( dbName );
   476     QSqlDatabase db = QSqlDatabase::database( dbName );
   465     CHECK_DATABASE( db );
   477     CHECK_DATABASE( db );
   466 
   478     const QString oraRowId(qTableName("oraRowId", __FILE__));
   467     QSqlQuery q( db );
   479 
   468     QVERIFY_SQL( q, exec( "select rowid from " + qTableName( "qtest" ) ) );
   480     QSqlQuery q( db );
       
   481     QVERIFY_SQL( q, exec( "select rowid from " + qtest ) );
   469     QVERIFY( q.next() );
   482     QVERIFY( q.next() );
   470     QCOMPARE( q.value( 0 ).type(), QVariant::String );
   483     QCOMPARE( q.value( 0 ).type(), QVariant::String );
   471     QVERIFY( !q.value( 0 ).toString().isEmpty() );
   484     QVERIFY( !q.value( 0 ).toString().isEmpty() );
   472 
   485 
   473     QVERIFY_SQL( q, exec( "create table " + qTableName( "oraRowId" ) + " (id char(1))" ) );
   486     QVERIFY_SQL( q, exec( "create table " + oraRowId + " (id char(1))" ) );
   474 
   487 
   475     QVERIFY_SQL( q, exec( "insert into " + qTableName( "oraRowId" ) + " values('a')" ) );
   488     QVERIFY_SQL( q, exec( "insert into " + oraRowId + " values('a')" ) );
   476     QVariant v1 = q.lastInsertId();
   489     QVariant v1 = q.lastInsertId();
   477     QVERIFY( v1.isValid() );
   490     QVERIFY( v1.isValid() );
   478 
   491 
   479     QVERIFY_SQL( q, exec( "insert into " + qTableName( "oraRowId" ) + " values('b')" ) );
   492     QVERIFY_SQL( q, exec( "insert into " + oraRowId + " values('b')" ) );
   480     QVariant v2 = q.lastInsertId();
   493     QVariant v2 = q.lastInsertId();
   481     QVERIFY( v2.isValid() );
   494     QVERIFY( v2.isValid() );
   482 
   495 
   483     QVERIFY_SQL( q, prepare( "select * from " + qTableName( "oraRowId" ) + " where rowid = ?" ) );
   496     QVERIFY_SQL( q, prepare( "select * from " + oraRowId + " where rowid = ?" ) );
   484     q.addBindValue( v1 );
   497     q.addBindValue( v1 );
   485     QVERIFY_SQL( q, exec() );
   498     QVERIFY_SQL( q, exec() );
   486     QVERIFY( q.next() );
   499     QVERIFY( q.next() );
   487     QCOMPARE( q.value( 0 ).toString(), QString( "a" ) );
   500     QCOMPARE( q.value( 0 ).toString(), QString( "a" ) );
   488 
   501 
   495 void tst_QSqlQuery::mysqlOutValues()
   508 void tst_QSqlQuery::mysqlOutValues()
   496 {
   509 {
   497     QFETCH( QString, dbName );
   510     QFETCH( QString, dbName );
   498     QSqlDatabase db = QSqlDatabase::database( dbName );
   511     QSqlDatabase db = QSqlDatabase::database( dbName );
   499     CHECK_DATABASE( db );
   512     CHECK_DATABASE( db );
       
   513     const QString hello(qTableName( "hello", __FILE__ )), qtestproc(qTableName( "qtestproc", __FILE__ ));
   500 
   514 
   501     QSqlQuery q( db );
   515     QSqlQuery q( db );
   502 
   516 
   503     if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 )
   517     if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 )
   504         QSKIP( "Test requires MySQL >= 5.0", SkipSingle );
   518         QSKIP( "Test requires MySQL >= 5.0", SkipSingle );
   505 
   519 
   506     q.exec( "drop function " + qTableName( "hello" ) );
   520     q.exec( "drop function " + hello );
   507 
   521 
   508     QVERIFY_SQL( q, exec( "create function " + qTableName( "hello" ) + " (s char(20)) returns varchar(50) return concat('Hello ', s)" ) );
   522     QVERIFY_SQL( q, exec( "create function " + hello + " (s char(20)) returns varchar(50) return concat('Hello ', s)" ) );
   509 
   523 
   510     QVERIFY_SQL( q, exec( "select " + qTableName( "hello" ) + "('world')" ) );
   524     QVERIFY_SQL( q, exec( "select " + hello + "('world')" ) );
   511     QVERIFY_SQL( q, next() );
   525     QVERIFY_SQL( q, next() );
   512 
   526 
   513     QCOMPARE( q.value( 0 ).toString(), QString( "Hello world" ) );
   527     QCOMPARE( q.value( 0 ).toString(), QString( "Hello world" ) );
   514 
   528 
   515     QVERIFY_SQL( q, prepare( "select " + qTableName( "hello" ) + "('harald')" ) );
   529     QVERIFY_SQL( q, prepare( "select " + hello + "('harald')" ) );
   516     QVERIFY_SQL( q, exec() );
   530     QVERIFY_SQL( q, exec() );
   517     QVERIFY_SQL( q, next() );
   531     QVERIFY_SQL( q, next() );
   518 
   532 
   519     QCOMPARE( q.value( 0 ).toString(), QString( "Hello harald" ) );
   533     QCOMPARE( q.value( 0 ).toString(), QString( "Hello harald" ) );
   520 
   534 
   521     QVERIFY_SQL( q, exec( "drop function " + qTableName( "hello" ) ) );
   535     QVERIFY_SQL( q, exec( "drop function " + hello ) );
   522 
   536 
   523     q.exec( "drop procedure " + qTableName( "qtestproc" ) );
   537     q.exec( "drop procedure " + qtestproc );
   524 
   538 
   525     QVERIFY_SQL( q, exec( "create procedure " + qTableName( "qtestproc" ) + " () "
   539     QVERIFY_SQL( q, exec( "create procedure " + qtestproc + " () "
   526                             "BEGIN select * from " + qTableName( "qtest" ) + " order by id; END" ) );
   540                             "BEGIN select * from " + qtest + " order by id; END" ) );
   527     QVERIFY_SQL( q, exec( "call " + qTableName( "qtestproc" ) + "()" ) );
   541     QVERIFY_SQL( q, exec( "call " + qtestproc + "()" ) );
   528     QVERIFY_SQL( q, next() );
   542     QVERIFY_SQL( q, next() );
   529     QCOMPARE( q.value( 1 ).toString(), QString( "VarChar1" ) );
   543     QCOMPARE( q.value( 1 ).toString(), QString( "VarChar1" ) );
   530 
   544 
   531     QVERIFY_SQL( q, exec( "drop procedure " + qTableName( "qtestproc" ) ) );
   545     QVERIFY_SQL( q, exec( "drop procedure " + qtestproc ) );
   532 
   546 
   533     QVERIFY_SQL( q, exec( "create procedure " + qTableName( "qtestproc" ) + " (OUT param1 INT) "
   547     QVERIFY_SQL( q, exec( "create procedure " + qtestproc + " (OUT param1 INT) "
   534                             "BEGIN set param1 = 42; END" ) );
   548                             "BEGIN set param1 = 42; END" ) );
   535 
   549 
   536     QVERIFY_SQL( q, exec( "call " + qTableName( "qtestproc" ) + " (@out)" ) );
   550     QVERIFY_SQL( q, exec( "call " + qtestproc + " (@out)" ) );
   537     QVERIFY_SQL( q, exec( "select @out" ) );
   551     QVERIFY_SQL( q, exec( "select @out" ) );
   538     QCOMPARE( q.record().fieldName( 0 ), QString( "@out" ) );
   552     QCOMPARE( q.record().fieldName( 0 ), QString( "@out" ) );
   539     QVERIFY_SQL( q, next() );
   553     QVERIFY_SQL( q, next() );
   540     QCOMPARE( q.value( 0 ).toInt(), 42 );
   554     QCOMPARE( q.value( 0 ).toInt(), 42 );
   541 
   555 
   542     QVERIFY_SQL( q, exec( "drop procedure " + qTableName( "qtestproc" ) ) );
   556     QVERIFY_SQL( q, exec( "drop procedure " + qtestproc ) );
   543 }
   557 }
   544 
   558 
   545 void tst_QSqlQuery::oraOutValues()
   559 void tst_QSqlQuery::oraOutValues()
   546 {
   560 {
   547     QFETCH( QString, dbName );
   561     QFETCH( QString, dbName );
   548     QSqlDatabase db = QSqlDatabase::database( dbName );
   562     QSqlDatabase db = QSqlDatabase::database( dbName );
   549     CHECK_DATABASE( db );
   563     CHECK_DATABASE( db );
       
   564     const QString tst_outValues(qTableName("tst_outValues", __FILE__));
   550 
   565 
   551     if ( !db.driver()->hasFeature( QSqlDriver::PreparedQueries ) ) {
   566     if ( !db.driver()->hasFeature( QSqlDriver::PreparedQueries ) ) {
   552         QSKIP( "Test requires prepared query support", SkipSingle );
   567         QSKIP( "Test requires prepared query support", SkipSingle );
   553         return;
   568         return;
   554     }
   569     }
   556     QSqlQuery q( db );
   571     QSqlQuery q( db );
   557 
   572 
   558     q.setForwardOnly( true );
   573     q.setForwardOnly( true );
   559 
   574 
   560     /*** outvalue int ***/
   575     /*** outvalue int ***/
   561     QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x out int) is\n"
   576     QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x out int) is\n"
   562                             "begin\n"
   577                             "begin\n"
   563                             "    x := 42;\n"
   578                             "    x := 42;\n"
   564                             "end;\n" ) );
   579                             "end;\n" ) );
   565     QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) );
   580     QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) );
   566     q.addBindValue( 0, QSql::Out );
   581     q.addBindValue( 0, QSql::Out );
   567     QVERIFY_SQL( q, exec() );
   582     QVERIFY_SQL( q, exec() );
   568     QCOMPARE( q.boundValue( 0 ).toInt(), 42 );
   583     QCOMPARE( q.boundValue( 0 ).toInt(), 42 );
   569 
   584 
   570     // bind a null value, make sure the OCI driver resets the null flag
   585     // bind a null value, make sure the OCI driver resets the null flag
   572     QVERIFY_SQL( q, exec() );
   587     QVERIFY_SQL( q, exec() );
   573     QCOMPARE( q.boundValue( 0 ).toInt(), 42 );
   588     QCOMPARE( q.boundValue( 0 ).toInt(), 42 );
   574     QVERIFY( !q.boundValue( 0 ).isNull() );
   589     QVERIFY( !q.boundValue( 0 ).isNull() );
   575 
   590 
   576     /*** outvalue varchar ***/
   591     /*** outvalue varchar ***/
   577     QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x out varchar) is\n"
   592     QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x out varchar) is\n"
   578                             "begin\n"
   593                             "begin\n"
   579                             "    x := 'blah';\n"
   594                             "    x := 'blah';\n"
   580                             "end;\n" ) );
   595                             "end;\n" ) );
   581     QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) );
   596     QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) );
   582     QString s1( "12345" );
   597     QString s1( "12345" );
   583     s1.reserve( 512 );
   598     s1.reserve( 512 );
   584     q.addBindValue( s1, QSql::Out );
   599     q.addBindValue( s1, QSql::Out );
   585     QVERIFY_SQL( q, exec() );
   600     QVERIFY_SQL( q, exec() );
   586     QCOMPARE( q.boundValue( 0 ).toString(), QString( "blah" ) );
   601     QCOMPARE( q.boundValue( 0 ).toString(), QString( "blah" ) );
   587 
   602 
   588     /*** in/outvalue numeric ***/
   603     /*** in/outvalue numeric ***/
   589     QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out numeric) is\n"
   604     QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out numeric) is\n"
   590                             "begin\n"
   605                             "begin\n"
   591                             "    x := x + 10;\n"
   606                             "    x := x + 10;\n"
   592                             "end;\n" ) );
   607                             "end;\n" ) );
   593     QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) );
   608     QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) );
   594     q.addBindValue( 10, QSql::Out );
   609     q.addBindValue( 10, QSql::Out );
   595     QVERIFY_SQL( q, exec() );
   610     QVERIFY_SQL( q, exec() );
   596     QCOMPARE( q.boundValue( 0 ).toInt(), 20 );
   611     QCOMPARE( q.boundValue( 0 ).toInt(), 20 );
   597 
   612 
   598     /*** in/outvalue varchar ***/
   613     /*** in/outvalue varchar ***/
   599     QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out varchar) is\n"
   614     QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out varchar) is\n"
   600                             "begin\n"
   615                             "begin\n"
   601                             "    x := 'homer';\n"
   616                             "    x := 'homer';\n"
   602                             "end;\n" ) );
   617                             "end;\n" ) );
   603     QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) );
   618     QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) );
   604     q.addBindValue( QString( "maggy" ), QSql::Out );
   619     q.addBindValue( QString( "maggy" ), QSql::Out );
   605     QVERIFY_SQL( q, exec() );
   620     QVERIFY_SQL( q, exec() );
   606     QCOMPARE( q.boundValue( 0 ).toString(), QString( "homer" ) );
   621     QCOMPARE( q.boundValue( 0 ).toString(), QString( "homer" ) );
   607 
   622 
   608     /*** in/outvalue varchar ***/
   623     /*** in/outvalue varchar ***/
   609     QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out varchar) is\n"
   624     QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out varchar) is\n"
   610                             "begin\n"
   625                             "begin\n"
   611                             "    x := NULL;\n"
   626                             "    x := NULL;\n"
   612                             "end;\n" ) );
   627                             "end;\n" ) );
   613     QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) );
   628     QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) );
   614     q.addBindValue( QString( "maggy" ), QSql::Out );
   629     q.addBindValue( QString( "maggy" ), QSql::Out );
   615     QVERIFY_SQL( q, exec() );
   630     QVERIFY_SQL( q, exec() );
   616     QVERIFY( q.boundValue( 0 ).isNull() );
   631     QVERIFY( q.boundValue( 0 ).isNull() );
   617 
   632 
   618     /*** in/outvalue int ***/
   633     /*** in/outvalue int ***/
   619     QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out int) is\n"
   634     QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out int) is\n"
   620                             "begin\n"
   635                             "begin\n"
   621                             "    x := NULL;\n"
   636                             "    x := NULL;\n"
   622                             "end;\n" ) );
   637                             "end;\n" ) );
   623     QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) );
   638     QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) );
   624     q.addBindValue( 42, QSql::Out );
   639     q.addBindValue( 42, QSql::Out );
   625     QVERIFY_SQL( q, exec() );
   640     QVERIFY_SQL( q, exec() );
   626     QVERIFY( q.boundValue( 0 ).isNull() );
   641     QVERIFY( q.boundValue( 0 ).isNull() );
   627 
   642 
   628     /*** in/outvalue varchar ***/
   643     /*** in/outvalue varchar ***/
   629     QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in varchar, y out varchar) is\n"
   644     QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in varchar, y out varchar) is\n"
   630                             "begin\n"
   645                             "begin\n"
   631                             "    y := x||'bubulalakikikokololo';\n"
   646                             "    y := x||'bubulalakikikokololo';\n"
   632                             "end;\n" ) );
   647                             "end;\n" ) );
   633     QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?, ?)" ) );
   648     QVERIFY( q.prepare( "call " + tst_outValues + "(?, ?)" ) );
   634     q.addBindValue( QString( "fifi" ), QSql::In );
   649     q.addBindValue( QString( "fifi" ), QSql::In );
   635     QString out;
   650     QString out;
   636     out.reserve( 50 );
   651     out.reserve( 50 );
   637     q.addBindValue( out, QSql::Out );
   652     q.addBindValue( out, QSql::Out );
   638     QVERIFY_SQL( q, exec() );
   653     QVERIFY_SQL( q, exec() );
   642 void tst_QSqlQuery::oraClob()
   657 void tst_QSqlQuery::oraClob()
   643 {
   658 {
   644     QFETCH( QString, dbName );
   659     QFETCH( QString, dbName );
   645     QSqlDatabase db = QSqlDatabase::database( dbName );
   660     QSqlDatabase db = QSqlDatabase::database( dbName );
   646     CHECK_DATABASE( db );
   661     CHECK_DATABASE( db );
       
   662     const QString clobby(qTableName("clobby", __FILE__));
   647 
   663 
   648     QSqlQuery q( db );
   664     QSqlQuery q( db );
   649 
   665 
   650     // simple short string
   666     // simple short string
   651     QVERIFY_SQL( q, exec( "create table " + qTableName( "clobby" ) + "(id int primary key, cl clob, bl blob)" ) );
   667     QVERIFY_SQL( q, exec( "create table " + clobby + "(id int primary key, cl clob, bl blob)" ) );
   652     QVERIFY_SQL( q, prepare( "insert into " + qTableName( "clobby" ) + " (id, cl, bl) values(?, ?, ?)" ) );
   668     QVERIFY_SQL( q, prepare( "insert into " + clobby + " (id, cl, bl) values(?, ?, ?)" ) );
   653     q.addBindValue( 1 );
   669     q.addBindValue( 1 );
   654     q.addBindValue( "bubu" );
   670     q.addBindValue( "bubu" );
   655     q.addBindValue( QByteArray("bubu") );
   671     q.addBindValue( QByteArray("bubu") );
   656     QVERIFY_SQL( q, exec() );
   672     QVERIFY_SQL( q, exec() );
   657 
   673 
   658     QVERIFY_SQL( q, exec( "select bl, cl from " + qTableName( "clobby" ) + " where id = 1" ) );
   674     QVERIFY_SQL( q, exec( "select bl, cl from " + clobby + " where id = 1" ) );
   659     QVERIFY( q.next() );
   675     QVERIFY( q.next() );
   660     QCOMPARE( q.value( 0 ).toString(), QString( "bubu" ) );
   676     QCOMPARE( q.value( 0 ).toString(), QString( "bubu" ) );
   661     QCOMPARE( q.value( 1 ).toString(), QString( "bubu" ) );
   677     QCOMPARE( q.value( 1 ).toString(), QString( "bubu" ) );
   662 
   678 
   663     // simple short string with binding
   679     // simple short string with binding
   664     QVERIFY_SQL( q, prepare( "insert into " + qTableName( "clobby" ) + " (id, cl, bl) values(?, ?, ?)" ) );
   680     QVERIFY_SQL( q, prepare( "insert into " + clobby + " (id, cl, bl) values(?, ?, ?)" ) );
   665     q.addBindValue( 2 );
   681     q.addBindValue( 2 );
   666     q.addBindValue( "lala", QSql::Binary );
   682     q.addBindValue( "lala", QSql::Binary );
   667     q.addBindValue( QByteArray("lala"), QSql::Binary );
   683     q.addBindValue( QByteArray("lala"), QSql::Binary );
   668     QVERIFY_SQL( q, exec() );
   684     QVERIFY_SQL( q, exec() );
   669 
   685 
   670     QVERIFY_SQL( q, exec( "select bl, cl from " + qTableName( "clobby" ) + " where id = 2" ) );
   686     QVERIFY_SQL( q, exec( "select bl, cl from " + clobby + " where id = 2" ) );
   671     QVERIFY( q.next() );
   687     QVERIFY( q.next() );
   672     QCOMPARE( q.value( 0 ).toString(), QString( "lala" ) );
   688     QCOMPARE( q.value( 0 ).toString(), QString( "lala" ) );
   673     QCOMPARE( q.value( 1 ).toString(), QString( "lala" ) );
   689     QCOMPARE( q.value( 1 ).toString(), QString( "lala" ) );
   674 
   690 
   675     // loooong string
   691     // loooong string
   676     QString loong;
   692     QString loong;
   677     loong.fill( QLatin1Char( 'A' ), 25000 );
   693     loong.fill( QLatin1Char( 'A' ), 25000 );
   678     QVERIFY_SQL( q, prepare( "insert into " + qTableName( "clobby" ) + " (id, cl, bl) values(?, ?, ?)" ) );
   694     QVERIFY_SQL( q, prepare( "insert into " + clobby + " (id, cl, bl) values(?, ?, ?)" ) );
   679     q.addBindValue( 3 );
   695     q.addBindValue( 3 );
   680     q.addBindValue( loong, QSql::Binary );
   696     q.addBindValue( loong, QSql::Binary );
   681     q.addBindValue( loong.toLatin1(), QSql::Binary );
   697     q.addBindValue( loong.toLatin1(), QSql::Binary );
   682     QVERIFY_SQL( q, exec() );
   698     QVERIFY_SQL( q, exec() );
   683 
   699 
   684     QVERIFY_SQL( q, exec( "select bl, cl from " + qTableName( "clobby" ) + " where id = 3" ) );
   700     QVERIFY_SQL( q, exec( "select bl, cl from " + clobby + " where id = 3" ) );
   685     QVERIFY( q.next() );
   701     QVERIFY( q.next() );
   686     QCOMPARE( q.value( 0 ).toString().count(), loong.count() );
   702     QCOMPARE( q.value( 0 ).toString().count(), loong.count() );
   687     QVERIFY( q.value( 0 ).toString() == loong );
   703     QVERIFY( q.value( 0 ).toString() == loong );
   688     QCOMPARE( q.value( 1 ).toByteArray().count(), loong.toLatin1().count() );
   704     QCOMPARE( q.value( 1 ).toByteArray().count(), loong.toLatin1().count() );
   689     QVERIFY( q.value( 1 ).toByteArray() == loong.toLatin1() );
   705     QVERIFY( q.value( 1 ).toByteArray() == loong.toLatin1() );
   694     QFETCH( QString, dbName );
   710     QFETCH( QString, dbName );
   695     QSqlDatabase db = QSqlDatabase::database( dbName );
   711     QSqlDatabase db = QSqlDatabase::database( dbName );
   696     CHECK_DATABASE( db );
   712     CHECK_DATABASE( db );
   697 
   713 
   698     QSqlQuery q( db );
   714     QSqlQuery q( db );
   699     q.exec( "drop procedure " + qTableName( "TESTPROC" ) );
   715     q.exec( "drop procedure " + qTableName( "TESTPROC", __FILE__ ) );
   700 
   716 
   701     QVERIFY_SQL( q, exec( "create procedure " + qTableName( "TESTPROC" ) +
   717     QVERIFY_SQL( q, exec( "create procedure " + qTableName( "TESTPROC", __FILE__ ) +
   702                             " RETURNS (x integer, y varchar(20)) "
   718                             " RETURNS (x integer, y varchar(20)) "
   703                             "AS BEGIN "
   719                             "AS BEGIN "
   704                             "  x = 42; "
   720                             "  x = 42; "
   705                             "  y = 'Hello Anders'; "
   721                             "  y = 'Hello Anders'; "
   706                             "END" ) );
   722                             "END" ) );
   707 
   723 
   708     QVERIFY_SQL( q, prepare( "execute procedure " + qTableName( "TestProc" ) ) );
   724     QVERIFY_SQL( q, prepare( "execute procedure " + qTableName( "TestProc", __FILE__ ) ) );
   709     QVERIFY_SQL( q, exec() );
   725     QVERIFY_SQL( q, exec() );
   710 
   726 
   711     // check for a valid result set
   727     // check for a valid result set
   712     QSqlRecord rec = q.record();
   728     QSqlRecord rec = q.record();
   713     QCOMPARE( rec.count(), 2 );
   729     QCOMPARE( rec.count(), 2 );
   720     QCOMPARE( q.value( 1 ).toString(), QString( "Hello Anders" ) );
   736     QCOMPARE( q.value( 1 ).toString(), QString( "Hello Anders" ) );
   721 
   737 
   722     // the second next shall fail
   738     // the second next shall fail
   723     QVERIFY( !q.next() );
   739     QVERIFY( !q.next() );
   724 
   740 
   725     q.exec( "drop procedure " + qTableName( "TestProc" ) );
   741     q.exec( "drop procedure " + qTableName( "TestProc", __FILE__ ) );
   726 }
   742 }
   727 
   743 
   728 void tst_QSqlQuery::outValuesDB2()
   744 void tst_QSqlQuery::outValuesDB2()
   729 {
   745 {
   730     QFETCH( QString, dbName );
   746     QFETCH( QString, dbName );
   738 
   754 
   739     QSqlQuery q( db );
   755     QSqlQuery q( db );
   740 
   756 
   741     q.setForwardOnly( true );
   757     q.setForwardOnly( true );
   742 
   758 
   743     q.exec( "drop procedure " + qTableName( "tst_outValues" ) ); //non-fatal
   759     q.exec( "drop procedure " + qTableName( "tst_outValues", __FILE__ ) ); //non-fatal
   744     QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + qTableName( "tst_outValues" ) +
   760     QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + qTableName( "tst_outValues", __FILE__ ) +
   745                             " (OUT x int, OUT x2 double, OUT x3 char(20))\n"
   761                             " (OUT x int, OUT x2 double, OUT x3 char(20))\n"
   746                             "LANGUAGE SQL\n"
   762                             "LANGUAGE SQL\n"
   747                             "P1: BEGIN\n"
   763                             "P1: BEGIN\n"
   748                             " SET x = 42;\n"
   764                             " SET x = 42;\n"
   749                             " SET x2 = 4.2;\n"
   765                             " SET x2 = 4.2;\n"
   750                             " SET x3 = 'Homer';\n"
   766                             " SET x3 = 'Homer';\n"
   751                             "END P1" ) );
   767                             "END P1" ) );
   752 
   768 
   753     QVERIFY_SQL( q, prepare( "call " + qTableName( "tst_outValues" ) + "(?, ?, ?)" ) );
   769     QVERIFY_SQL( q, prepare( "call " + qTableName( "tst_outValues", __FILE__ ) + "(?, ?, ?)" ) );
   754 
   770 
   755     q.addBindValue( 0, QSql::Out );
   771     q.addBindValue( 0, QSql::Out );
   756     q.addBindValue( 0.0, QSql::Out );
   772     q.addBindValue( 0.0, QSql::Out );
   757     q.addBindValue( "Simpson", QSql::Out );
   773     q.addBindValue( "Simpson", QSql::Out );
   758 
   774 
   766 void tst_QSqlQuery::outValues()
   782 void tst_QSqlQuery::outValues()
   767 {
   783 {
   768     QFETCH( QString, dbName );
   784     QFETCH( QString, dbName );
   769     QSqlDatabase db = QSqlDatabase::database( dbName );
   785     QSqlDatabase db = QSqlDatabase::database( dbName );
   770     CHECK_DATABASE( db );
   786     CHECK_DATABASE( db );
       
   787     const QString tst_outValues(qTableName("tst_outValues", __FILE__));
   771 
   788 
   772     if ( !db.driver()->hasFeature( QSqlDriver::PreparedQueries ) ) {
   789     if ( !db.driver()->hasFeature( QSqlDriver::PreparedQueries ) ) {
   773         QSKIP( "Test requires prepared query support", SkipSingle );
   790         QSKIP( "Test requires prepared query support", SkipSingle );
   774         return;
   791         return;
   775     }
   792     }
   777     QSqlQuery q( db );
   794     QSqlQuery q( db );
   778 
   795 
   779     q.setForwardOnly( true );
   796     q.setForwardOnly( true );
   780 
   797 
   781     if ( db.driverName().startsWith( "QOCI" ) ) {
   798     if ( db.driverName().startsWith( "QOCI" ) ) {
   782         QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x out int) is\n"
   799         QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x out int) is\n"
   783                                 "begin\n"
   800                                 "begin\n"
   784                                 "    x := 42;\n"
   801                                 "    x := 42;\n"
   785                                 "end;\n" ) );
   802                                 "end;\n" ) );
   786         QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) );
   803         QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) );
   787     } else if ( db.driverName().startsWith( "QDB2" ) ) {
   804     } else if ( db.driverName().startsWith( "QDB2" ) ) {
   788         q.exec( "drop procedure " + qTableName( "tst_outValues" ) ); //non-fatal
   805         q.exec( "drop procedure " + tst_outValues ); //non-fatal
   789         QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + qTableName( "tst_outValues" ) + " (OUT x int)\n"
   806         QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + tst_outValues + " (OUT x int)\n"
   790                                 "LANGUAGE SQL\n"
   807                                 "LANGUAGE SQL\n"
   791                                 "P1: BEGIN\n"
   808                                 "P1: BEGIN\n"
   792                                 " SET x = 42;\n"
   809                                 " SET x = 42;\n"
   793                                 "END P1" ) );
   810                                 "END P1" ) );
   794         QVERIFY( q.prepare( "call " + qTableName( "tst_outValues" ) + "(?)" ) );
   811         QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) );
   795     } else if ( tst_Databases::isSqlServer( db ) ) {
   812     } else if ( tst_Databases::isSqlServer( db ) ) {
   796         q.exec( "drop procedure " + qTableName( "tst_outValues" ) );  //non-fatal
   813         q.exec( "drop procedure " + tst_outValues );  //non-fatal
   797         QVERIFY_SQL( q, exec( "create procedure " + qTableName( "tst_outValues" ) + " (@x int out) as\n"
   814         QVERIFY_SQL( q, exec( "create procedure " + tst_outValues + " (@x int out) as\n"
   798                                 "begin\n"
   815                                 "begin\n"
   799                                 "    set @x = 42\n"
   816                                 "    set @x = 42\n"
   800                                 "end\n" ) );
   817                                 "end\n" ) );
   801         QVERIFY( q.prepare( "{call " + qTableName( "tst_outvalues" ) + "(?)}" ) );
   818         QVERIFY( q.prepare( "{call " + tst_outValues + "(?)}" ) );
   802     } else {
   819     } else {
   803         QSKIP( "Don't know how to create a stored procedure for this database server, please fix this test", SkipSingle );
   820         QSKIP( "Don't know how to create a stored procedure for this database server, please fix this test", SkipSingle );
   804         return;
   821         return;
   805     }
   822     }
   806 
   823 
   833 
   850 
   834     QSqlQuery q( db );
   851     QSqlQuery q( db );
   835 
   852 
   836     q.setForwardOnly( true );
   853     q.setForwardOnly( true );
   837 
   854 
   838     QString queryString = QString( "create table " + qTableName( "qtest_blob" ) +
   855     QString queryString = QString( "create table " + qTableName( "qtest_blob", __FILE__ ) +
   839                                    " (id int not null primary key, t_blob %1)" ).arg( tst_Databases::blobTypeName( db, BLOBSIZE ) );
   856                                    " (id int not null primary key, t_blob %1)" ).arg( tst_Databases::blobTypeName( db, BLOBSIZE ) );
   840     QVERIFY_SQL( q, exec( queryString ) );
   857     QVERIFY_SQL( q, exec( queryString ) );
   841 
   858 
   842     QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_blob" ) + " (id, t_blob) values (?, ?)" ) );
   859     QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_blob", __FILE__ ) + " (id, t_blob) values (?, ?)" ) );
   843 
   860 
   844     for ( i = 0; i < BLOBCOUNT; ++i ) {
   861     for ( i = 0; i < BLOBCOUNT; ++i ) {
   845         q.addBindValue( i );
   862         q.addBindValue( i );
   846         q.addBindValue( ba );
   863         q.addBindValue( ba );
   847         QVERIFY_SQL( q, exec() );
   864         QVERIFY_SQL( q, exec() );
   848     }
   865     }
   849 
   866 
   850     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_blob" ) ) );
   867     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_blob", __FILE__ ) ) );
   851 
   868 
   852     for ( i = 0; i < BLOBCOUNT; ++i ) {
   869     for ( i = 0; i < BLOBCOUNT; ++i ) {
   853         QVERIFY( q.next() );
   870         QVERIFY( q.next() );
   854         QByteArray res = q.value( 1 ).toByteArray();
   871         QByteArray res = q.value( 1 ).toByteArray();
   855         QVERIFY2( res.size() >= ba.size(),
   872         QVERIFY2( res.size() >= ba.size(),
   868     QFETCH( QString, dbName );
   885     QFETCH( QString, dbName );
   869     QSqlDatabase db = QSqlDatabase::database( dbName );
   886     QSqlDatabase db = QSqlDatabase::database( dbName );
   870     CHECK_DATABASE( db );
   887     CHECK_DATABASE( db );
   871 
   888 
   872     QSqlQuery q( db );
   889     QSqlQuery q( db );
   873     QVERIFY_SQL( q, exec( "select id, t_varchar, t_char from " + qTableName( "qtest" ) + " order by id" ) );
   890     QVERIFY_SQL( q, exec( "select id, t_varchar, t_char from " + qtest + " order by id" ) );
   874     int i = 1;
   891     int i = 1;
   875 
   892 
   876     while ( q.next() ) {
   893     while ( q.next() ) {
   877         QCOMPARE( q.value( 0 ).toInt(), i );
   894         QCOMPARE( q.value( 0 ).toInt(), i );
   878 
   895 
   900     QSqlDatabase db = QSqlDatabase::database( dbName );
   917     QSqlDatabase db = QSqlDatabase::database( dbName );
   901     CHECK_DATABASE( db );
   918     CHECK_DATABASE( db );
   902 
   919 
   903     QSqlQuery q( db );
   920     QSqlQuery q( db );
   904     QVERIFY( q.record().isEmpty() );
   921     QVERIFY( q.record().isEmpty() );
   905     QVERIFY_SQL( q, exec( "select id, t_varchar, t_char from " + qTableName( "qtest" ) + " order by id" ) );
   922     QVERIFY_SQL( q, exec( "select id, t_varchar, t_char from " + qtest + " order by id" ) );
   906     QSqlRecord rec = q.record();
   923     QSqlRecord rec = q.record();
   907     QCOMPARE( q.record().fieldName( 0 ).toLower(), QString( "id" ) );
   924     QCOMPARE( q.record().fieldName( 0 ).toLower(), QString( "id" ) );
   908     QCOMPARE( q.record().fieldName( 1 ).toLower(), QString( "t_varchar" ) );
   925     QCOMPARE( q.record().fieldName( 1 ).toLower(), QString( "t_varchar" ) );
   909     QCOMPARE( q.record().fieldName( 2 ).toLower(), QString( "t_char" ) );
   926     QCOMPARE( q.record().fieldName( 2 ).toLower(), QString( "t_char" ) );
   910     QVERIFY( !q.record().value( 0 ).isValid() );
   927     QVERIFY( !q.record().value( 0 ).isValid() );
   924     QSqlDatabase db = QSqlDatabase::database( dbName );
   941     QSqlDatabase db = QSqlDatabase::database( dbName );
   925     CHECK_DATABASE( db );
   942     CHECK_DATABASE( db );
   926 
   943 
   927     QSqlQuery q( db );
   944     QSqlQuery q( db );
   928     QVERIFY( !q.isValid() );
   945     QVERIFY( !q.isValid() );
   929     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) );
   946     QVERIFY_SQL( q, exec( "select * from " + qtest ) );
   930     QVERIFY( q.first() );
   947     QVERIFY( q.first() );
   931     QVERIFY( q.isValid() );
   948     QVERIFY( q.isValid() );
   932 }
   949 }
   933 
   950 
   934 void tst_QSqlQuery::isActive()
   951 void tst_QSqlQuery::isActive()
   937     QSqlDatabase db = QSqlDatabase::database( dbName );
   954     QSqlDatabase db = QSqlDatabase::database( dbName );
   938     CHECK_DATABASE( db );
   955     CHECK_DATABASE( db );
   939 
   956 
   940     QSqlQuery q( db );
   957     QSqlQuery q( db );
   941     QVERIFY( !q.isActive() );
   958     QVERIFY( !q.isActive() );
   942     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) );
   959     QVERIFY_SQL( q, exec( "select * from " + qtest ) );
   943     QVERIFY( q.isActive() );
   960     QVERIFY( q.isActive() );
   944     QVERIFY( q.last() );
   961     QVERIFY( q.last() );
   945 
   962 
   946     if ( !tst_Databases::isMSAccess( db ) )
   963     if ( !tst_Databases::isMSAccess( db ) )
   947         // Access is stupid enough to let you scroll over boundaries
   964         // Access is stupid enough to let you scroll over boundaries
   948         QVERIFY( !q.next() );
   965         QVERIFY( !q.next() );
   949 
   966 
   950     QVERIFY( q.isActive() );
   967     QVERIFY( q.isActive() );
   951 
   968 
   952     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (41, 'VarChar41', 'Char41')" ) );
   969     QVERIFY_SQL( q, exec( "insert into " + qtest + " values (41, 'VarChar41', 'Char41')" ) );
   953 
   970 
   954     QVERIFY( q.isActive() );
   971     QVERIFY( q.isActive() );
   955 
   972 
   956     QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = 42 where id = 41" ) );
   973     QVERIFY_SQL( q, exec( "update " + qtest + " set id = 42 where id = 41" ) );
   957 
   974 
   958     QVERIFY( q.isActive() );
   975     QVERIFY( q.isActive() );
   959 
   976 
   960     QVERIFY_SQL( q, exec( "delete from " + qTableName( "qtest" ) + " where id = 42" ) );
   977     QVERIFY_SQL( q, exec( "delete from " + qtest + " where id = 42" ) );
   961 
   978 
   962     QVERIFY( q.isActive() );
   979     QVERIFY( q.isActive() );
   963 }
   980 }
   964 
   981 
   965 void tst_QSqlQuery::numRowsAffected()
   982 void tst_QSqlQuery::numRowsAffected()
   969     CHECK_DATABASE( db );
   986     CHECK_DATABASE( db );
   970 
   987 
   971     QSqlQuery q( db );
   988     QSqlQuery q( db );
   972     QCOMPARE( q.numRowsAffected(), -1 );
   989     QCOMPARE( q.numRowsAffected(), -1 );
   973 
   990 
   974     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) );
   991     QVERIFY_SQL( q, exec( "select * from " + qtest ) );
   975     int i = 0;
   992     int i = 0;
   976 
   993 
   977     while ( q.next() )
   994     while ( q.next() )
   978         ++i;
   995         ++i;
   979 
   996 
   983     if ( q.numRowsAffected() != -1 && q.numRowsAffected() != 0 && q.numRowsAffected() != i ) {
  1000     if ( q.numRowsAffected() != -1 && q.numRowsAffected() != 0 && q.numRowsAffected() != i ) {
   984         // the value is undefined for SELECT, this check is just here for curiosity
  1001         // the value is undefined for SELECT, this check is just here for curiosity
   985         qDebug( "Expected numRowsAffected to be -1, 0 or %d, got %d", i, q.numRowsAffected() );
  1002         qDebug( "Expected numRowsAffected to be -1, 0 or %d, got %d", i, q.numRowsAffected() );
   986     }
  1003     }
   987 
  1004 
   988     QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = 100 where id = 1" ) );
  1005     QVERIFY_SQL( q, exec( "update " + qtest + " set id = 100 where id = 1" ) );
   989 
  1006 
   990     QCOMPARE( q.numRowsAffected(), 1 );
  1007     QCOMPARE( q.numRowsAffected(), 1 );
   991     QCOMPARE( q.numRowsAffected(), 1 ); // yes, we check twice
  1008     QCOMPARE( q.numRowsAffected(), 1 ); // yes, we check twice
   992 
  1009 
   993     QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = id + 100" ) );
  1010     QVERIFY_SQL( q, exec( "update " + qtest + " set id = id + 100" ) );
   994     QCOMPARE( q.numRowsAffected(), i );
  1011     QCOMPARE( q.numRowsAffected(), i );
   995     QCOMPARE( q.numRowsAffected(), i ); // yes, we check twice
  1012     QCOMPARE( q.numRowsAffected(), i ); // yes, we check twice
   996 
  1013 
   997     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (42000, 'homer', 'marge')" ) );
  1014     QVERIFY_SQL( q, exec( "insert into " + qtest + " values (42000, 'homer', 'marge')" ) );
   998     QCOMPARE( q.numRowsAffected(), 1 );
  1015     QCOMPARE( q.numRowsAffected(), 1 );
   999     QCOMPARE( q.numRowsAffected(), 1 ); // yes, we check twice
  1016     QCOMPARE( q.numRowsAffected(), 1 ); // yes, we check twice
  1000 
  1017 
  1001     QSqlQuery q2( db );
  1018     QSqlQuery q2( db );
  1002     QVERIFY_SQL( q2, exec( "insert into " + qTableName( "qtest" ) + " values (42001, 'homer', 'marge')" ) );
  1019     QVERIFY_SQL( q2, exec( "insert into " + qtest + " values (42001, 'homer', 'marge')" ) );
  1003 
  1020 
  1004     if ( !db.driverName().startsWith( "QSQLITE2" ) ) {
  1021     if ( !db.driverName().startsWith( "QSQLITE2" ) ) {
  1005         // SQLite 2.x accumulates changed rows in nested queries. See task 33794
  1022         // SQLite 2.x accumulates changed rows in nested queries. See task 33794
  1006         QCOMPARE( q2.numRowsAffected(), 1 );
  1023         QCOMPARE( q2.numRowsAffected(), 1 );
  1007         QCOMPARE( q2.numRowsAffected(), 1 ); // yes, we check twice
  1024         QCOMPARE( q2.numRowsAffected(), 1 ); // yes, we check twice
  1015     CHECK_DATABASE( db );
  1032     CHECK_DATABASE( db );
  1016 
  1033 
  1017     QSqlQuery q( db );
  1034     QSqlQuery q( db );
  1018     QCOMPARE( q.size(), -1 );
  1035     QCOMPARE( q.size(), -1 );
  1019 
  1036 
  1020     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) );
  1037     QVERIFY_SQL( q, exec( "select * from " + qtest ) );
  1021     int i = 0;
  1038     int i = 0;
  1022 
  1039 
  1023     while ( q.next() )
  1040     while ( q.next() )
  1024         ++i;
  1041         ++i;
  1025 
  1042 
  1029     } else {
  1046     } else {
  1030         QCOMPARE( q.size(), -1 );
  1047         QCOMPARE( q.size(), -1 );
  1031         QCOMPARE( q.size(), -1 ); // yes, twice
  1048         QCOMPARE( q.size(), -1 ); // yes, twice
  1032     }
  1049     }
  1033 
  1050 
  1034     QSqlQuery q2( "select * from " + qTableName( "qtest" ), db );
  1051     QSqlQuery q2( "select * from " + qtest, db );
  1035 
  1052 
  1036     if ( db.driver()->hasFeature( QSqlDriver::QuerySize ) )
  1053     if ( db.driver()->hasFeature( QSqlDriver::QuerySize ) )
  1037         QCOMPARE( q.size(), i );
  1054         QCOMPARE( q.size(), i );
  1038     else
  1055     else
  1039         QCOMPARE( q.size(), -1 );
  1056         QCOMPARE( q.size(), -1 );
  1040 
  1057 
  1041     q2.clear();
  1058     q2.clear();
  1042 
  1059 
  1043     QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = 100 where id = 1" ) );
  1060     QVERIFY_SQL( q, exec( "update " + qtest + " set id = 100 where id = 1" ) );
  1044     QCOMPARE( q.size(), -1 );
  1061     QCOMPARE( q.size(), -1 );
  1045     QCOMPARE( q.size(), -1 ); // yes, twice
  1062     QCOMPARE( q.size(), -1 ); // yes, twice
  1046 }
  1063 }
  1047 
  1064 
  1048 void tst_QSqlQuery::isSelect()
  1065 void tst_QSqlQuery::isSelect()
  1050     QFETCH( QString, dbName );
  1067     QFETCH( QString, dbName );
  1051     QSqlDatabase db = QSqlDatabase::database( dbName );
  1068     QSqlDatabase db = QSqlDatabase::database( dbName );
  1052     CHECK_DATABASE( db );
  1069     CHECK_DATABASE( db );
  1053 
  1070 
  1054     QSqlQuery q( db );
  1071     QSqlQuery q( db );
  1055     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) );
  1072     QVERIFY_SQL( q, exec( "select * from " + qtest ) );
  1056     QVERIFY( q.isSelect() );
  1073     QVERIFY( q.isSelect() );
  1057 
  1074 
  1058     QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = 1 where id = 1" ) );
  1075     QVERIFY_SQL( q, exec( "update " + qtest + " set id = 1 where id = 1" ) );
  1059     QVERIFY( q.isSelect() == false );
  1076     QVERIFY( q.isSelect() == false );
  1060 }
  1077 }
  1061 
  1078 
  1062 void tst_QSqlQuery::first()
  1079 void tst_QSqlQuery::first()
  1063 {
  1080 {
  1065     QSqlDatabase db = QSqlDatabase::database( dbName );
  1082     QSqlDatabase db = QSqlDatabase::database( dbName );
  1066     CHECK_DATABASE( db );
  1083     CHECK_DATABASE( db );
  1067 
  1084 
  1068     QSqlQuery q( db );
  1085     QSqlQuery q( db );
  1069     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1086     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1070     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) );
  1087     QVERIFY_SQL( q, exec( "select * from " + qtest ) );
  1071     QVERIFY( q.last() );
  1088     QVERIFY( q.last() );
  1072     QVERIFY_SQL( q, first() );
  1089     QVERIFY_SQL( q, first() );
  1073     QVERIFY( q.at() == 0 );
  1090     QVERIFY( q.at() == 0 );
  1074 }
  1091 }
  1075 
  1092 
  1079     QSqlDatabase db = QSqlDatabase::database( dbName );
  1096     QSqlDatabase db = QSqlDatabase::database( dbName );
  1080     CHECK_DATABASE( db );
  1097     CHECK_DATABASE( db );
  1081 
  1098 
  1082     QSqlQuery q( db );
  1099     QSqlQuery q( db );
  1083     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1100     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1084     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) );
  1101     QVERIFY_SQL( q, exec( "select * from " + qtest ) );
  1085     QVERIFY( q.first() );
  1102     QVERIFY( q.first() );
  1086     QVERIFY( q.next() );
  1103     QVERIFY( q.next() );
  1087     QVERIFY( q.at() == 1 );
  1104     QVERIFY( q.at() == 1 );
  1088 }
  1105 }
  1089 
  1106 
  1093     QSqlDatabase db = QSqlDatabase::database( dbName );
  1110     QSqlDatabase db = QSqlDatabase::database( dbName );
  1094     CHECK_DATABASE( db );
  1111     CHECK_DATABASE( db );
  1095 
  1112 
  1096     QSqlQuery q( db );
  1113     QSqlQuery q( db );
  1097     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1114     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1098     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) );
  1115     QVERIFY_SQL( q, exec( "select * from " + qtest ) );
  1099     QVERIFY( q.first() );
  1116     QVERIFY( q.first() );
  1100     QVERIFY( q.next() );
  1117     QVERIFY( q.next() );
  1101     QVERIFY( q.previous() );
  1118     QVERIFY( q.previous() );
  1102     QVERIFY( q.at() == 0 );
  1119     QVERIFY( q.at() == 0 );
  1103 }
  1120 }
  1108     QSqlDatabase db = QSqlDatabase::database( dbName );
  1125     QSqlDatabase db = QSqlDatabase::database( dbName );
  1109     CHECK_DATABASE( db );
  1126     CHECK_DATABASE( db );
  1110 
  1127 
  1111     QSqlQuery q( db );
  1128     QSqlQuery q( db );
  1112     QCOMPARE( q.at(), int( QSql::BeforeFirstRow ) );
  1129     QCOMPARE( q.at(), int( QSql::BeforeFirstRow ) );
  1113     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) );
  1130     QVERIFY_SQL( q, exec( "select * from " + qtest ) );
  1114     int i = 0;
  1131     int i = 0;
  1115 
  1132 
  1116     while ( q.next() )
  1133     while ( q.next() )
  1117         i++;
  1134         i++;
  1118 
  1135 
  1119     QCOMPARE( q.at(), int( QSql::AfterLastRow ) );
  1136     QCOMPARE( q.at(), int( QSql::AfterLastRow ) );
  1120 
  1137 
  1121     QVERIFY( q.last() );
  1138     QVERIFY( q.last() );
  1122 
  1139 
  1123     if ( !tst_Databases::isMSAccess( db ) )
  1140     QSet<int> validReturns(QSet<int>() << -1 << i-1);
  1124         // Access doesn't return the correct position
  1141     QVERIFY( validReturns.contains(q.at()) );
  1125         QCOMPARE( q.at(), ( i-1 ) );
  1142 
  1126 
  1143     QSqlQuery q2( "select * from " + qtest, db );
  1127     QSqlQuery q2( "select * from " + qTableName( "qtest" ), db );
       
  1128 
  1144 
  1129     QVERIFY( q2.last() );
  1145     QVERIFY( q2.last() );
  1130 
  1146 
  1131     if ( !tst_Databases::isMSAccess( db ) )
  1147     QVERIFY( validReturns.contains(q.at()) );
  1132         // Access doesn't return the correct position
       
  1133         QCOMPARE( q.at(), ( i-1 ) );
       
  1134 }
  1148 }
  1135 
  1149 
  1136 void tst_QSqlQuery::seek()
  1150 void tst_QSqlQuery::seek()
  1137 {
  1151 {
  1138     QFETCH( QString, dbName );
  1152     QFETCH( QString, dbName );
  1139     QSqlDatabase db = QSqlDatabase::database( dbName );
  1153     QSqlDatabase db = QSqlDatabase::database( dbName );
  1140     CHECK_DATABASE( db );
  1154     CHECK_DATABASE( db );
  1141     QSqlQuery q( db );
  1155     QSqlQuery q( db );
  1142     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1156     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1143     QVERIFY_SQL( q, exec( QString( "select id from %1 order by id" ).arg( qTableName( "qtest" ) ) ) );
  1157     QVERIFY_SQL( q, exec( QString( "select id from %1 order by id" ).arg( qtest ) ) );
  1144 
  1158 
  1145     // NB! The order of the calls below are important!
  1159     // NB! The order of the calls below are important!
  1146     QVERIFY( q.last() );
  1160     QVERIFY( q.last() );
  1147     QVERIFY( !q.seek( QSql::BeforeFirstRow ) );
  1161     QVERIFY( !q.seek( QSql::BeforeFirstRow ) );
  1148     QCOMPARE( q.at(), int( QSql::BeforeFirstRow ) );
  1162     QCOMPARE( q.at(), int( QSql::BeforeFirstRow ) );
  1174     QSqlQuery q( db );
  1188     QSqlQuery q( db );
  1175     q.setForwardOnly( false );
  1189     q.setForwardOnly( false );
  1176     QVERIFY( !q.isForwardOnly() );
  1190     QVERIFY( !q.isForwardOnly() );
  1177 
  1191 
  1178     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1192     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1179     QVERIFY_SQL( q, exec( QString( "select id from %1 order by id" ).arg( qTableName( "qtest" ) ) ) );
  1193     QVERIFY_SQL( q, exec( QString( "select id from %1 order by id" ).arg( qtest ) ) );
  1180 
  1194 
  1181     QSqlRecord rec;
  1195     QSqlRecord rec;
  1182 
  1196 
  1183     // NB! The order of the calls below are important!
  1197     // NB! The order of the calls below are important!
  1184     QVERIFY( q.seek( 0 ) );
  1198     QVERIFY( q.seek( 0 ) );
  1213 
  1227 
  1214     QSqlQuery q( db );
  1228     QSqlQuery q( db );
  1215     q.setForwardOnly( true );
  1229     q.setForwardOnly( true );
  1216     QVERIFY( q.isForwardOnly() );
  1230     QVERIFY( q.isForwardOnly() );
  1217     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1231     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1218     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) + " order by id" ) );
  1232     QVERIFY_SQL( q, exec( "select * from " + qtest + " order by id" ) );
  1219     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1233     QVERIFY( q.at() == QSql::BeforeFirstRow );
  1220     QVERIFY( q.first() );
  1234     QVERIFY( q.first() );
  1221     QCOMPARE( q.at(), 0 );
  1235     QCOMPARE( q.at(), 0 );
  1222     QCOMPARE( q.value( 0 ).toInt(), 1 );
  1236     QCOMPARE( q.value( 0 ).toInt(), 1 );
  1223     QVERIFY( q.next() );
  1237     QVERIFY( q.next() );
  1238     QCOMPARE( q.value( 0 ).toInt(), 3 );
  1252     QCOMPARE( q.value( 0 ).toInt(), 3 );
  1239     QVERIFY( q.next() );
  1253     QVERIFY( q.next() );
  1240     QCOMPARE( q.at(), 3 );
  1254     QCOMPARE( q.at(), 3 );
  1241     QCOMPARE( q.value( 0 ).toInt(), 4 );
  1255     QCOMPARE( q.value( 0 ).toInt(), 4 );
  1242 
  1256 
  1243     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) );
  1257     QVERIFY_SQL( q, exec( "select * from " + qtest ) );
  1244     int i = 0;
  1258     int i = 0;
  1245 
  1259 
  1246     while ( q.next() )
  1260     while ( q.next() )
  1247         i++;
  1261         i++;
  1248 
  1262 
  1250 
  1264 
  1251     QSqlQuery q2 = q;
  1265     QSqlQuery q2 = q;
  1252 
  1266 
  1253     QVERIFY( q2.isForwardOnly() );
  1267     QVERIFY( q2.isForwardOnly() );
  1254 
  1268 
  1255     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) + " order by id" ) );
  1269     QVERIFY_SQL( q, exec( "select * from " + qtest + " order by id" ) );
  1256 
  1270 
  1257     QVERIFY( q.isForwardOnly() );
  1271     QVERIFY( q.isForwardOnly() );
  1258 
  1272 
  1259     QVERIFY( q2.isForwardOnly() );
  1273     QVERIFY( q2.isForwardOnly() );
  1260 
  1274 
  1296     CHECK_DATABASE( db );
  1310     CHECK_DATABASE( db );
  1297 
  1311 
  1298     QSqlQuery q( db );
  1312     QSqlQuery q( db );
  1299     QVERIFY( !q.isValid() );
  1313     QVERIFY( !q.isValid() );
  1300     QVERIFY( !q.isActive() );
  1314     QVERIFY( !q.isActive() );
  1301     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) );
  1315     QVERIFY_SQL( q, exec( "select * from " + qtest ) );
  1302     QVERIFY( q.isActive() );
  1316     QVERIFY( q.isActive() );
  1303     QVERIFY( q.next() );
  1317     QVERIFY( q.next() );
  1304     QVERIFY( q.isValid() );
  1318     QVERIFY( q.isValid() );
  1305 }
  1319 }
  1306 
  1320 
  1309     QFETCH( QString, dbName );
  1323     QFETCH( QString, dbName );
  1310     QSqlDatabase db = QSqlDatabase::database( dbName );
  1324     QSqlDatabase db = QSqlDatabase::database( dbName );
  1311     CHECK_DATABASE( db );
  1325     CHECK_DATABASE( db );
  1312 
  1326 
  1313     QSqlQuery q( db );
  1327     QSqlQuery q( db );
  1314     QVERIFY_SQL( q, exec( "select id, t_varchar from " + qTableName( "qtest_null" ) + " order by id" ) );
  1328     QVERIFY_SQL( q, exec( "select id, t_varchar from " + qTableName( "qtest_null", __FILE__ ) + " order by id" ) );
  1315     QVERIFY( q.next() );
  1329     QVERIFY( q.next() );
  1316     QVERIFY( !q.isNull( 0 ) );
  1330     QVERIFY( !q.isNull( 0 ) );
  1317     QVERIFY( q.isNull( 1 ) );
  1331     QVERIFY( q.isNull( 1 ) );
  1318     QCOMPARE( q.value( 0 ).toInt(), 0 );
  1332     QCOMPARE( q.value( 0 ).toInt(), 0 );
  1319     QCOMPARE( q.value( 1 ).toString(), QString() );
  1333     QCOMPARE( q.value( 1 ).toString(), QString() );
  1335     if ( !db.driverName().startsWith( "QTDS" ) )
  1349     if ( !db.driverName().startsWith( "QTDS" ) )
  1336         QSKIP( "TDS specific test", SkipSingle );
  1350         QSKIP( "TDS specific test", SkipSingle );
  1337 
  1351 
  1338     QSqlQuery q( db );
  1352     QSqlQuery q( db );
  1339 
  1353 
  1340     QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_bittest" ) + " (bitty bit)" ) );
  1354     QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_bittest", __FILE__ ) + " (bitty bit)" ) );
  1341 
  1355 
  1342     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_bittest" ) + " values (0)" ) );
  1356     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_bittest", __FILE__ ) + " values (0)" ) );
  1343 
  1357 
  1344     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_bittest" ) + " values (1)" ) );
  1358     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_bittest", __FILE__ ) + " values (1)" ) );
  1345 
  1359 
  1346     QVERIFY_SQL( q, exec( "select bitty from " + qTableName( "qtest_bittest" ) ) );
  1360     QVERIFY_SQL( q, exec( "select bitty from " + qTableName( "qtest_bittest", __FILE__ ) ) );
  1347 
  1361 
  1348     QVERIFY( q.next() );
  1362     QVERIFY( q.next() );
  1349 
  1363 
  1350     QVERIFY( q.value( 0 ).toInt() == 0 );
  1364     QVERIFY( q.value( 0 ).toInt() == 0 );
  1351 
  1365 
  1359 void tst_QSqlQuery::nullBlob()
  1373 void tst_QSqlQuery::nullBlob()
  1360 {
  1374 {
  1361     QFETCH( QString, dbName );
  1375     QFETCH( QString, dbName );
  1362     QSqlDatabase db = QSqlDatabase::database( dbName );
  1376     QSqlDatabase db = QSqlDatabase::database( dbName );
  1363     CHECK_DATABASE( db );
  1377     CHECK_DATABASE( db );
  1364 
  1378     const QString qtest_nullblob(qTableName("qtest_nullblob", __FILE__));
  1365     QSqlQuery q( db );
  1379 
  1366     QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_nullblob" ) + " (id int primary key, bb blob)" ) );
  1380     QSqlQuery q( db );
  1367     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_nullblob" ) + " values (0, EMPTY_BLOB())" ) );
  1381     QVERIFY_SQL( q, exec( "create table " + qtest_nullblob + " (id int primary key, bb blob)" ) );
  1368     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_nullblob" ) + " values (1, NULL)" ) );
  1382     QVERIFY_SQL( q, exec( "insert into " + qtest_nullblob + " values (0, EMPTY_BLOB())" ) );
  1369     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_nullblob" ) + " values (2, 'aabbcc00112233445566')" ) );
  1383     QVERIFY_SQL( q, exec( "insert into " + qtest_nullblob + " values (1, NULL)" ) );
       
  1384     QVERIFY_SQL( q, exec( "insert into " + qtest_nullblob + " values (2, 'aabbcc00112233445566')" ) );
  1370     // necessary otherwise oracle will bombard you with internal errors
  1385     // necessary otherwise oracle will bombard you with internal errors
  1371     q.setForwardOnly( true );
  1386     q.setForwardOnly( true );
  1372     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_nullblob" ) + " order by id" ) );
  1387     QVERIFY_SQL( q, exec( "select * from " + qtest_nullblob + " order by id" ) );
  1373 
  1388 
  1374     QVERIFY( q.next() );
  1389     QVERIFY( q.next() );
  1375     QCOMPARE(( int )q.value( 1 ).toByteArray().size(), 0 );
  1390     QCOMPARE(( int )q.value( 1 ).toByteArray().size(), 0 );
  1376     QVERIFY( !q.isNull( 1 ) );
  1391     QVERIFY( !q.isNull( 1 ) );
  1377 
  1392 
  1388 void tst_QSqlQuery::rawField()
  1403 void tst_QSqlQuery::rawField()
  1389 {
  1404 {
  1390     QFETCH( QString, dbName );
  1405     QFETCH( QString, dbName );
  1391     QSqlDatabase db = QSqlDatabase::database( dbName );
  1406     QSqlDatabase db = QSqlDatabase::database( dbName );
  1392     CHECK_DATABASE( db );
  1407     CHECK_DATABASE( db );
       
  1408     const QString qtest_rawtest(qTableName("qtest_rawtest", __FILE__));
  1393 
  1409 
  1394     QSqlQuery q( db );
  1410     QSqlQuery q( db );
  1395     q.setForwardOnly( true );
  1411     q.setForwardOnly( true );
  1396     QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_rawtest" ) +
  1412     QVERIFY_SQL( q, exec( "create table " + qtest_rawtest +
  1397                             " (id int, col raw(20))" ) );
  1413                             " (id int, col raw(20))" ) );
  1398     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_rawtest" ) + " values (0, NULL)" ) );
  1414     QVERIFY_SQL( q, exec( "insert into " + qtest_rawtest + " values (0, NULL)" ) );
  1399     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_rawtest" ) + " values (1, '00aa1100ddeeff')" ) );
  1415     QVERIFY_SQL( q, exec( "insert into " + qtest_rawtest + " values (1, '00aa1100ddeeff')" ) );
  1400     QVERIFY_SQL( q, exec( "select col from " + qTableName( "qtest_rawtest" ) + " order by id" ) );
  1416     QVERIFY_SQL( q, exec( "select col from " + qtest_rawtest + " order by id" ) );
  1401     QVERIFY( q.next() );
  1417     QVERIFY( q.next() );
  1402     QVERIFY( q.isNull( 0 ) );
  1418     QVERIFY( q.isNull( 0 ) );
  1403     QCOMPARE(( int )q.value( 0 ).toByteArray().size(), 0 );
  1419     QCOMPARE(( int )q.value( 0 ).toByteArray().size(), 0 );
  1404     QVERIFY( q.next() );
  1420     QVERIFY( q.next() );
  1405     QVERIFY( !q.isNull( 0 ) );
  1421     QVERIFY( !q.isNull( 0 ) );
  1412 void tst_QSqlQuery::precision()
  1428 void tst_QSqlQuery::precision()
  1413 {
  1429 {
  1414     QFETCH( QString, dbName );
  1430     QFETCH( QString, dbName );
  1415     QSqlDatabase db = QSqlDatabase::database( dbName );
  1431     QSqlDatabase db = QSqlDatabase::database( dbName );
  1416     CHECK_DATABASE( db );
  1432     CHECK_DATABASE( db );
       
  1433     const QString qtest_precision(qTableName( "qtest_precision", __FILE__ ));
  1417 
  1434 
  1418     static const char* precStr = "1.2345678901234567891";
  1435     static const char* precStr = "1.2345678901234567891";
  1419 
  1436 
  1420     if ( db.driverName().startsWith( "QIBASE" ) )
  1437     if ( db.driverName().startsWith( "QIBASE" ) )
  1421         QSKIP( "DB unable to store high precision", SkipSingle );
  1438         QSKIP( "DB unable to store high precision", SkipSingle );
  1423     {
  1440     {
  1424         // need a new scope for SQLITE
  1441         // need a new scope for SQLITE
  1425         QSqlQuery q( db );
  1442         QSqlQuery q( db );
  1426 
  1443 
  1427         if ( tst_Databases::isMSAccess( db ) )
  1444         if ( tst_Databases::isMSAccess( db ) )
  1428             QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_precision" ) + " (col1 number)" ) );
  1445             QVERIFY_SQL( q, exec( "create table " + qtest_precision + " (col1 number)" ) );
  1429         else
  1446         else
  1430             QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_precision" ) + " (col1 numeric(21, 20))" ) );
  1447             QVERIFY_SQL( q, exec( "create table " + qtest_precision + " (col1 numeric(21, 20))" ) );
  1431 
  1448 
  1432         QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_precision" ) + " (col1) values (1.2345678901234567891)" ) );
  1449         QVERIFY_SQL( q, exec( "insert into " + qtest_precision + " (col1) values (1.2345678901234567891)" ) );
  1433 
  1450 
  1434         QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_precision" ) ) );
  1451         QVERIFY_SQL( q, exec( "select * from " + qtest_precision ) );
  1435         QVERIFY( q.next() );
  1452         QVERIFY( q.next() );
  1436 
  1453 
  1437         QString val = q.value( 0 ).toString();
  1454         QString val = q.value( 0 ).toString();
  1438 
  1455 
  1439         if ( !val.startsWith( "1.2345678901234567891" ) ) {
  1456         if ( !val.startsWith( "1.2345678901234567891" ) ) {
  1462     QFETCH( QString, dbName );
  1479     QFETCH( QString, dbName );
  1463     QSqlDatabase db = QSqlDatabase::database( dbName );
  1480     QSqlDatabase db = QSqlDatabase::database( dbName );
  1464     CHECK_DATABASE( db );
  1481     CHECK_DATABASE( db );
  1465 
  1482 
  1466     QSqlQuery q( db );
  1483     QSqlQuery q( db );
  1467     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) + " where id > 50000" ) );
  1484     QVERIFY_SQL( q, exec( "select * from " + qtest + " where id > 50000" ) );
  1468 
  1485 
  1469     if ( q.driver()->hasFeature( QSqlDriver::QuerySize ) )
  1486     if ( q.driver()->hasFeature( QSqlDriver::QuerySize ) )
  1470         QCOMPARE( q.size(), 0 );
  1487         QCOMPARE( q.size(), 0 );
  1471 
  1488 
  1472     QVERIFY( q.next() == false );
  1489     QVERIFY( q.next() == false );
  1503     QSqlQuery q2( db );
  1520     QSqlQuery q2( db );
  1504 
  1521 
  1505     // test a working transaction
  1522     // test a working transaction
  1506     q.exec( startTransactionStr );
  1523     q.exec( startTransactionStr );
  1507 
  1524 
  1508     QVERIFY_SQL( q, exec( "insert into" + qTableName( "qtest" ) + " values (40, 'VarChar40', 'Char40')" ) );
  1525     QVERIFY_SQL( q, exec( "insert into" + qtest + " values (40, 'VarChar40', 'Char40')" ) );
  1509 
  1526 
  1510     QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 40" ) );
  1527     QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 40" ) );
  1511 
  1528 
  1512     QVERIFY( q.next() );
  1529     QVERIFY( q.next() );
  1513 
  1530 
  1514     QCOMPARE( q.value( 0 ).toInt(), 40 );
  1531     QCOMPARE( q.value( 0 ).toInt(), 40 );
  1515 
  1532 
  1516     QVERIFY_SQL( q, exec( "commit" ) );
  1533     QVERIFY_SQL( q, exec( "commit" ) );
  1517 
  1534 
  1518     QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 40" ) );
  1535     QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 40" ) );
  1519 
  1536 
  1520     QVERIFY( q.next() );
  1537     QVERIFY( q.next() );
  1521 
  1538 
  1522     QCOMPARE( q.value( 0 ).toInt(), 40 );
  1539     QCOMPARE( q.value( 0 ).toInt(), 40 );
  1523 
  1540 
  1524     // test a rollback
  1541     // test a rollback
  1525     q.exec( startTransactionStr );
  1542     q.exec( startTransactionStr );
  1526 
  1543 
  1527     QVERIFY_SQL( q, exec( "insert into" + qTableName( "qtest" ) + " values (41, 'VarChar41', 'Char41')" ) );
  1544     QVERIFY_SQL( q, exec( "insert into" + qtest + " values (41, 'VarChar41', 'Char41')" ) );
  1528 
  1545 
  1529     QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 41" ) );
  1546     QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 41" ) );
  1530 
  1547 
  1531     QVERIFY( q.next() );
  1548     QVERIFY( q.next() );
  1532 
  1549 
  1533     QCOMPARE( q.value( 0 ).toInt(), 41 );
  1550     QCOMPARE( q.value( 0 ).toInt(), 41 );
  1534 
  1551 
  1538             QSKIP( "MySQL transaction failed ", SkipSingle ); //non-fatal
  1555             QSKIP( "MySQL transaction failed ", SkipSingle ); //non-fatal
  1539         } else
  1556         } else
  1540             QFAIL( "Could not rollback transaction: " + tst_Databases::printError( q.lastError() ) );
  1557             QFAIL( "Could not rollback transaction: " + tst_Databases::printError( q.lastError() ) );
  1541     }
  1558     }
  1542 
  1559 
  1543     QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 41" ) );
  1560     QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 41" ) );
  1544 
  1561 
  1545     QVERIFY( q.next() == false );
  1562     QVERIFY( q.next() == false );
  1546 
  1563 
  1547     // test concurrent access
  1564     // test concurrent access
  1548     q.exec( startTransactionStr );
  1565     q.exec( startTransactionStr );
  1549     QVERIFY_SQL( q, exec( "insert into" + qTableName( "qtest" ) + " values (42, 'VarChar42', 'Char42')" ) );
  1566     QVERIFY_SQL( q, exec( "insert into" + qtest + " values (42, 'VarChar42', 'Char42')" ) );
  1550     QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 42" ) );
  1567     QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 42" ) );
  1551     QVERIFY( q.next() );
  1568     QVERIFY( q.next() );
  1552     QCOMPARE( q.value( 0 ).toInt(), 42 );
  1569     QCOMPARE( q.value( 0 ).toInt(), 42 );
  1553 
  1570 
  1554     QVERIFY_SQL( q2, exec( "select * from" + qTableName( "qtest" ) + " where id = 42" ) );
  1571     QVERIFY_SQL( q2, exec( "select * from" + qtest + " where id = 42" ) );
  1555 
  1572 
  1556     if ( q2.next() )
  1573     if ( q2.next() )
  1557         qDebug( QString( "DBMS '%1' doesn't support query based transactions with concurrent access" ).arg(
  1574         qDebug( QString( "DBMS '%1' doesn't support query based transactions with concurrent access" ).arg(
  1558                     tst_Databases::dbToString( db ) ).toLatin1() );
  1575                     tst_Databases::dbToString( db ) ).toLatin1() );
  1559 
  1576 
  1560     QVERIFY_SQL( q, exec( "commit" ) );
  1577     QVERIFY_SQL( q, exec( "commit" ) );
  1561 
  1578 
  1562     QVERIFY_SQL( q2, exec( "select * from" + qTableName( "qtest" ) + " where id = 42" ) );
  1579     QVERIFY_SQL( q2, exec( "select * from" + qtest + " where id = 42" ) );
  1563 
  1580 
  1564     QVERIFY( q2.next() );
  1581     QVERIFY( q2.next() );
  1565 
  1582 
  1566     QCOMPARE( q2.value( 0 ).toInt(), 42 );
  1583     QCOMPARE( q2.value( 0 ).toInt(), 42 );
  1567 }
  1584 }
  1569 void tst_QSqlQuery::joins()
  1586 void tst_QSqlQuery::joins()
  1570 {
  1587 {
  1571     QFETCH( QString, dbName );
  1588     QFETCH( QString, dbName );
  1572     QSqlDatabase db = QSqlDatabase::database( dbName );
  1589     QSqlDatabase db = QSqlDatabase::database( dbName );
  1573     CHECK_DATABASE( db );
  1590     CHECK_DATABASE( db );
       
  1591     const QString qtestj1(qTableName("qtestj1", __FILE__)), qtestj2(qTableName("qtestj2", __FILE__));
  1574 
  1592 
  1575     if ( db.driverName().startsWith( "QOCI" )
  1593     if ( db.driverName().startsWith( "QOCI" )
  1576             || db.driverName().startsWith( "QTDS" )
  1594             || db.driverName().startsWith( "QTDS" )
  1577             || db.driverName().startsWith( "QODBC" )
  1595             || db.driverName().startsWith( "QODBC" )
  1578             || db.driverName().startsWith( "QIBASE" ) ) {
  1596             || db.driverName().startsWith( "QIBASE" ) ) {
  1582         return;
  1600         return;
  1583     }
  1601     }
  1584 
  1602 
  1585     QSqlQuery q( db );
  1603     QSqlQuery q( db );
  1586 
  1604 
  1587     QVERIFY_SQL( q, exec( "create table " + qTableName( "qtestj1" ) + " (id1 int, id2 int)" ) );
  1605     QVERIFY_SQL( q, exec( "create table " + qtestj1 + " (id1 int, id2 int)" ) );
  1588     QVERIFY_SQL( q, exec( "create table " + qTableName( "qtestj2" ) + " (id int, name varchar(20))" ) );
  1606     QVERIFY_SQL( q, exec( "create table " + qtestj2 + " (id int, name varchar(20))" ) );
  1589     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj1" ) + " values (1, 1)" ) );
  1607     QVERIFY_SQL( q, exec( "insert into " + qtestj1 + " values (1, 1)" ) );
  1590     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj1" ) + " values (1, 2)" ) );
  1608     QVERIFY_SQL( q, exec( "insert into " + qtestj1 + " values (1, 2)" ) );
  1591     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj2" ) + " values(1, 'trenton')" ) );
  1609     QVERIFY_SQL( q, exec( "insert into " + qtestj2 + " values(1, 'trenton')" ) );
  1592     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj2" ) + " values(2, 'marius')" ) );
  1610     QVERIFY_SQL( q, exec( "insert into " + qtestj2 + " values(2, 'marius')" ) );
  1593 
  1611 
  1594     QVERIFY_SQL( q, exec( "select qtestj1.id1, qtestj1.id2, qtestj2.id, qtestj2.name, qtestj3.id, qtestj3.name "
  1612     QVERIFY_SQL( q, exec( "select qtestj1.id1, qtestj1.id2, qtestj2.id, qtestj2.name, qtestj3.id, qtestj3.name "
  1595                             "from " + qTableName( "qtestj1" ) + " qtestj1 left outer join " + qTableName( "qtestj2" ) +
  1613                             "from " + qtestj1 + " qtestj1 left outer join " + qtestj2 +
  1596                             " qtestj2 on (qtestj1.id1 = qtestj2.id) "
  1614                             " qtestj2 on (qtestj1.id1 = qtestj2.id) "
  1597                             "left outer join " + qTableName( "qtestj2" ) + " as qtestj3 on (qtestj1.id2 = qtestj3.id)" ) );
  1615                             "left outer join " + qtestj2 + " as qtestj3 on (qtestj1.id2 = qtestj3.id)" ) );
  1598 
  1616 
  1599     QVERIFY( q.next() );
  1617     QVERIFY( q.next() );
  1600     QCOMPARE( q.value( 0 ).toInt(), 1 );
  1618     QCOMPARE( q.value( 0 ).toInt(), 1 );
  1601     QCOMPARE( q.value( 1 ).toInt(), 1 );
  1619     QCOMPARE( q.value( 1 ).toInt(), 1 );
  1602     QCOMPARE( q.value( 2 ).toInt(), 1 );
  1620     QCOMPARE( q.value( 2 ).toInt(), 1 );
  1618     QFETCH( QString, dbName );
  1636     QFETCH( QString, dbName );
  1619     QSqlDatabase db = QSqlDatabase::database( dbName );
  1637     QSqlDatabase db = QSqlDatabase::database( dbName );
  1620     CHECK_DATABASE( db );
  1638     CHECK_DATABASE( db );
  1621 
  1639 
  1622     QSqlQuery q(db);
  1640     QSqlQuery q(db);
  1623     QVERIFY_SQL( q, exec("select a.id, a.t_char, a.t_varchar from " + qTableName( "qtest" ) + " a where a.id = 1") );
  1641     QVERIFY_SQL( q, exec("select a.id, a.t_char, a.t_varchar from " + qtest + " a where a.id = 1") );
  1624     QVERIFY( q.next() );
  1642     QVERIFY( q.next() );
  1625     QCOMPARE( q.value( 0 ).toInt(), 1 );
  1643     QCOMPARE( q.value( 0 ).toInt(), 1 );
  1626     QCOMPARE( q.value( 1 ).toString().trimmed(), QString( "Char1" ) );
  1644     QCOMPARE( q.value( 1 ).toString().trimmed(), QString( "Char1" ) );
  1627     QCOMPARE( q.value( 2 ).toString().trimmed(), QString( "VarChar1" ) );
  1645     QCOMPARE( q.value( 2 ).toString().trimmed(), QString( "VarChar1" ) );
  1628 
  1646 
  1637 void tst_QSqlQuery::prepare_bind_exec()
  1655 void tst_QSqlQuery::prepare_bind_exec()
  1638 {
  1656 {
  1639     QFETCH( QString, dbName );
  1657     QFETCH( QString, dbName );
  1640     QSqlDatabase db = QSqlDatabase::database( dbName );
  1658     QSqlDatabase db = QSqlDatabase::database( dbName );
  1641     CHECK_DATABASE( db );
  1659     CHECK_DATABASE( db );
       
  1660     const QString qtest_prepare(qTableName("qtest_prepare", __FILE__));
       
  1661 
  1642     if(db.driverName().startsWith("QIBASE") && (db.databaseName() == "silence.nokia.troll.no:c:\\ibase\\testdb_ascii" || db.databaseName() == "/opt/interbase/qttest.gdb"))
  1662     if(db.driverName().startsWith("QIBASE") && (db.databaseName() == "silence.nokia.troll.no:c:\\ibase\\testdb_ascii" || db.databaseName() == "/opt/interbase/qttest.gdb"))
  1643         QSKIP("Can't transliterate extended unicode to ascii", SkipSingle);
  1663         QSKIP("Can't transliterate extended unicode to ascii", SkipSingle);
  1644     if(db.driverName().startsWith("QDB2"))
  1664     if(db.driverName().startsWith("QDB2"))
  1645         QSKIP("Needs someone with more Unicode knowledge than I have to fix", SkipSingle);
  1665         QSKIP("Needs someone with more Unicode knowledge than I have to fix", SkipSingle);
  1646 
  1666 
  1661 
  1681 
  1662         if(tst_Databases::isPostgreSQL(db))
  1682         if(tst_Databases::isPostgreSQL(db))
  1663             QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
  1683             QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
  1664 
  1684 
  1665         if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) )
  1685         if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) )
  1666             createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int primary key, name nvarchar(200) null)";
  1686             createQuery = "create table " + qtest_prepare + " (id int primary key, name nvarchar(200) null)";
  1667         else if ( tst_Databases::isMySQL(db) && useUnicode )
  1687         else if ( tst_Databases::isMySQL(db) && useUnicode )
  1668             createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int not null primary key, name varchar(200) character set utf8)";
  1688             createQuery = "create table " + qtest_prepare + " (id int not null primary key, name varchar(200) character set utf8)";
  1669         else
  1689         else
  1670             createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int not null primary key, name varchar(200))";
  1690             createQuery = "create table " + qtest_prepare + " (id int not null primary key, name varchar(200))";
  1671 
  1691 
  1672         QVERIFY_SQL( q, exec( createQuery ) );
  1692         QVERIFY_SQL( q, exec( createQuery ) );
  1673 
  1693 
  1674         QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (:id, :name)" ) );
  1694         QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (:id, :name)" ) );
  1675         int i;
  1695         int i;
  1676 
  1696 
  1677         for ( i = 0; i < 6; ++i ) {
  1697         for ( i = 0; i < 6; ++i ) {
  1678             q.bindValue( ":name", values[i] );
  1698             q.bindValue( ":name", values[i] );
  1679             q.bindValue( ":id", i );
  1699             q.bindValue( ":id", i );
  1692             q.bindValue( ":id", 7 );
  1712             q.bindValue( ":id", 7 );
  1693             q.bindValue( ":name", utf8str );
  1713             q.bindValue( ":name", utf8str );
  1694             QVERIFY_SQL( q, exec() );
  1714             QVERIFY_SQL( q, exec() );
  1695         }
  1715         }
  1696 
  1716 
  1697         QVERIFY_SQL( q, exec( "SELECT * FROM " + qTableName( "qtest_prepare" ) + " order by id" ) );
  1717         QVERIFY_SQL( q, exec( "SELECT * FROM " + qtest_prepare + " order by id" ) );
  1698 
  1718 
  1699         for ( i = 0; i < 6; ++i ) {
  1719         for ( i = 0; i < 6; ++i ) {
  1700             QVERIFY( q.next() );
  1720             QVERIFY( q.next() );
  1701             QCOMPARE( q.value( 0 ).toInt(), i );
  1721             QCOMPARE( q.value( 0 ).toInt(), i );
  1702             QCOMPARE( q.value( 1 ).toString().trimmed(), values[ i ] );
  1722             QCOMPARE( q.value( 1 ).toString().trimmed(), values[ i ] );
  1711         QVERIFY_SQL( q, next() );
  1731         QVERIFY_SQL( q, next() );
  1712 
  1732 
  1713         QCOMPARE( q.value( 0 ).toInt(), 8 );
  1733         QCOMPARE( q.value( 0 ).toInt(), 8 );
  1714         QCOMPARE( q.value( 1 ).toString(), values[5] );
  1734         QCOMPARE( q.value( 1 ).toString(), values[5] );
  1715 
  1735 
  1716         QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (:id, 'Bart')" ) );
  1736         QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (:id, 'Bart')" ) );
  1717         q.bindValue( ":id", 99 );
  1737         q.bindValue( ":id", 99 );
  1718         QVERIFY_SQL( q, exec() );
  1738         QVERIFY_SQL( q, exec() );
  1719         q.bindValue( ":id", 100 );
  1739         q.bindValue( ":id", 100 );
  1720         QVERIFY_SQL( q, exec() );
  1740         QVERIFY_SQL( q, exec() );
  1721         QVERIFY( q.exec( "select * from " + qTableName( "qtest_prepare" ) + " where id > 98 order by id" ) );
  1741         QVERIFY( q.exec( "select * from " + qtest_prepare + " where id > 98 order by id" ) );
  1722 
  1742 
  1723         for ( i = 99; i <= 100; ++i ) {
  1743         for ( i = 99; i <= 100; ++i ) {
  1724             QVERIFY( q.next() );
  1744             QVERIFY( q.next() );
  1725             QCOMPARE( q.value( 0 ).toInt(), i );
  1745             QCOMPARE( q.value( 0 ).toInt(), i );
  1726             QCOMPARE( q.value( 1 ).toString().trimmed(), QString( "Bart" ) );
  1746             QCOMPARE( q.value( 1 ).toString().trimmed(), QString( "Bart" ) );
  1727         }
  1747         }
  1728 
  1748 
  1729         /*** SELECT stuff ***/
  1749         /*** SELECT stuff ***/
  1730         QVERIFY( q.prepare( "select * from " + qTableName( "qtest_prepare" ) + " where id = :id" ) );
  1750         QVERIFY( q.prepare( "select * from " + qtest_prepare + " where id = :id" ) );
  1731 
  1751 
  1732         for ( i = 0; i < 6; ++i ) {
  1752         for ( i = 0; i < 6; ++i ) {
  1733             q.bindValue( ":id", i );
  1753             q.bindValue( ":id", i );
  1734             QVERIFY_SQL( q, exec() );
  1754             QVERIFY_SQL( q, exec() );
  1735             QVERIFY_SQL( q, next() );
  1755             QVERIFY_SQL( q, next() );
  1740             QCOMPARE( rInf.field( 0 ).name().toUpper(), QString( "ID" ) );
  1760             QCOMPARE( rInf.field( 0 ).name().toUpper(), QString( "ID" ) );
  1741             QCOMPARE( rInf.field( 1 ).name().toUpper(), QString( "NAME" ) );
  1761             QCOMPARE( rInf.field( 1 ).name().toUpper(), QString( "NAME" ) );
  1742             QVERIFY( !q.next() );
  1762             QVERIFY( !q.next() );
  1743         }
  1763         }
  1744 
  1764 
  1745         QVERIFY_SQL( q, exec( "DELETE FROM " + qTableName( "qtest_prepare" ) ) );
  1765         QVERIFY_SQL( q, exec( "DELETE FROM " + qtest_prepare ) );
  1746 
  1766 
  1747         QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (?, ?)" ) );
  1767         QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (?, ?)" ) );
  1748         q.bindValue( 0, 0 );
  1768         q.bindValue( 0, 0 );
  1749         q.bindValue( 1, values[ 0 ] );
  1769         q.bindValue( 1, values[ 0 ] );
  1750         QVERIFY_SQL( q, exec() );
  1770         QVERIFY_SQL( q, exec() );
  1751         q.addBindValue( 1 );
  1771         q.addBindValue( 1 );
  1752         q.addBindValue( values[ 1 ] );
  1772         q.addBindValue( values[ 1 ] );
  1771             q.bindValue( 0, 7 );
  1791             q.bindValue( 0, 7 );
  1772             q.bindValue( 1, utf8str );
  1792             q.bindValue( 1, utf8str );
  1773             QVERIFY_SQL( q, exec() );
  1793             QVERIFY_SQL( q, exec() );
  1774         }
  1794         }
  1775 
  1795 
  1776         QVERIFY_SQL( q, exec( "SELECT * FROM " + qTableName( "qtest_prepare" ) + " order by id" ) );
  1796         QVERIFY_SQL( q, exec( "SELECT * FROM " + qtest_prepare + " order by id" ) );
  1777 
  1797 
  1778         for ( i = 0; i < 6; ++i ) {
  1798         for ( i = 0; i < 6; ++i ) {
  1779             QVERIFY( q.next() );
  1799             QVERIFY( q.next() );
  1780             QCOMPARE( q.value( 0 ).toInt(), i );
  1800             QCOMPARE( q.value( 0 ).toInt(), i );
  1781             QCOMPARE( q.value( 1 ).toString().trimmed(), values[ i ] );
  1801             QCOMPARE( q.value( 1 ).toString().trimmed(), values[ i ] );
  1790             QVERIFY( q.next() );
  1810             QVERIFY( q.next() );
  1791             QCOMPARE( q.value( 0 ).toInt(), 7 );
  1811             QCOMPARE( q.value( 0 ).toInt(), 7 );
  1792             QCOMPARE( q.value( 1 ).toString(), utf8str );
  1812             QCOMPARE( q.value( 1 ).toString(), utf8str );
  1793         }
  1813         }
  1794 
  1814 
  1795         QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (?, 'Bart')" ) );
  1815         QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (?, 'Bart')" ) );
  1796 
  1816 
  1797         q.bindValue( 0, 99 );
  1817         q.bindValue( 0, 99 );
  1798         QVERIFY_SQL( q, exec() );
  1818         QVERIFY_SQL( q, exec() );
  1799         q.addBindValue( 100 );
  1819         q.addBindValue( 100 );
  1800         QVERIFY_SQL( q, exec() );
  1820         QVERIFY_SQL( q, exec() );
  1801         QVERIFY( q.exec( "select * from " + qTableName( "qtest_prepare" ) + " where id > 98 order by id" ) );
  1821         QVERIFY( q.exec( "select * from " + qtest_prepare + " where id > 98 order by id" ) );
  1802 
  1822 
  1803         for ( i = 99; i <= 100; ++i ) {
  1823         for ( i = 99; i <= 100; ++i ) {
  1804             QVERIFY( q.next() );
  1824             QVERIFY( q.next() );
  1805             QCOMPARE( q.value( 0 ).toInt(), i );
  1825             QCOMPARE( q.value( 0 ).toInt(), i );
  1806             QCOMPARE( q.value( 1 ).toString().trimmed(), QString( "Bart" ) );
  1826             QCOMPARE( q.value( 1 ).toString().trimmed(), QString( "Bart" ) );
  1807         }
  1827         }
  1808 
  1828 
  1809         /* insert a duplicate id and make sure the db bails out */
  1829         /* insert a duplicate id and make sure the db bails out */
  1810         QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (?, ?)" ) );
  1830         QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (?, ?)" ) );
  1811 
  1831 
  1812         q.addBindValue( 99 );
  1832         q.addBindValue( 99 );
  1813 
  1833 
  1814         q.addBindValue( "something silly" );
  1834         q.addBindValue( "something silly" );
  1815 
  1835 
  1827     QFETCH( QString, dbName );
  1847     QFETCH( QString, dbName );
  1828     QSqlDatabase db = QSqlDatabase::database( dbName );
  1848     QSqlDatabase db = QSqlDatabase::database( dbName );
  1829     CHECK_DATABASE( db );
  1849     CHECK_DATABASE( db );
  1830 
  1850 
  1831     QSqlQuery q( db );
  1851     QSqlQuery q( db );
  1832     QVERIFY_SQL( q, prepare( "select a.id, a.t_char, a.t_varchar from " + qTableName( "qtest" ) + " a where a.id = ?" ) );
  1852     QVERIFY_SQL( q, prepare( "select a.id, a.t_char, a.t_varchar from " + qtest + " a where a.id = ?" ) );
  1833 
  1853 
  1834     q.bindValue( 0, 1 );
  1854     q.bindValue( 0, 1 );
  1835     QVERIFY_SQL( q, exec() );
  1855     QVERIFY_SQL( q, exec() );
  1836     QCOMPARE( q.at(), ( int )QSql::BeforeFirstRow );
  1856     QCOMPARE( q.at(), ( int )QSql::BeforeFirstRow );
  1837     QVERIFY( q.next() );
  1857     QVERIFY( q.next() );
  1847     QVERIFY_SQL( q, exec() );
  1867     QVERIFY_SQL( q, exec() );
  1848     QCOMPARE( q.at(), ( int )QSql::BeforeFirstRow );
  1868     QCOMPARE( q.at(), ( int )QSql::BeforeFirstRow );
  1849     QVERIFY( q.next() );
  1869     QVERIFY( q.next() );
  1850     QCOMPARE( q.value( 0 ).toInt(), 3 );
  1870     QCOMPARE( q.value( 0 ).toInt(), 3 );
  1851 
  1871 
  1852     QVERIFY_SQL( q, prepare( "select a.id, a.t_char, a.t_varchar from " + qTableName( "qtest" ) + " a where a.id = ?" ) );
  1872     QVERIFY_SQL( q, prepare( "select a.id, a.t_char, a.t_varchar from " + qtest + " a where a.id = ?" ) );
  1853     QCOMPARE( q.at(), ( int )QSql::BeforeFirstRow );
  1873     QCOMPARE( q.at(), ( int )QSql::BeforeFirstRow );
  1854     QVERIFY( !q.first() );
  1874     QVERIFY( !q.first() );
  1855 }
  1875 }
  1856 
  1876 
  1857 void tst_QSqlQuery::sqlServerLongStrings()
  1877 void tst_QSqlQuery::sqlServerLongStrings()
  1863     if ( !tst_Databases::isSqlServer( db ) )
  1883     if ( !tst_Databases::isSqlServer( db ) )
  1864         QSKIP( "SQL Server specific test", SkipSingle );
  1884         QSKIP( "SQL Server specific test", SkipSingle );
  1865 
  1885 
  1866     QSqlQuery q( db );
  1886     QSqlQuery q( db );
  1867 
  1887 
  1868     QVERIFY_SQL( q, exec( "CREATE TABLE " + qTableName( "qtest_longstr" ) + " (id int primary key, longstring ntext)" ) );
  1888     QVERIFY_SQL( q, exec( "CREATE TABLE " + qTableName( "qtest_longstr", __FILE__ ) + " (id int primary key, longstring ntext)" ) );
  1869 
  1889 
  1870     QVERIFY_SQL( q, prepare( "INSERT INTO " + qTableName( "qtest_longstr" ) + " VALUES (?, ?)" ) );
  1890     QVERIFY_SQL( q, prepare( "INSERT INTO " + qTableName( "qtest_longstr", __FILE__ ) + " VALUES (?, ?)" ) );
  1871 
  1891 
  1872     q.addBindValue( 0 );
  1892     q.addBindValue( 0 );
  1873 
  1893 
  1874     q.addBindValue( QString::fromLatin1( "bubu" ) );
  1894     q.addBindValue( QString::fromLatin1( "bubu" ) );
  1875 
  1895 
  1883 
  1903 
  1884     q.addBindValue( testStr );
  1904     q.addBindValue( testStr );
  1885 
  1905 
  1886     QVERIFY_SQL( q, exec() );
  1906     QVERIFY_SQL( q, exec() );
  1887 
  1907 
  1888     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_longstr" ) ) );
  1908     QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_longstr", __FILE__ ) ) );
  1889 
  1909 
  1890     QVERIFY_SQL( q, next() );
  1910     QVERIFY_SQL( q, next() );
  1891 
  1911 
  1892     QCOMPARE( q.value( 0 ).toInt(), 0 );
  1912     QCOMPARE( q.value( 0 ).toInt(), 0 );
  1893 
  1913 
  1947 
  1967 
  1948     if ( !db.driver()->hasFeature( QSqlDriver::BatchOperations ) )
  1968     if ( !db.driver()->hasFeature( QSqlDriver::BatchOperations ) )
  1949         QSKIP( "Database can't do BatchOperations", SkipSingle );
  1969         QSKIP( "Database can't do BatchOperations", SkipSingle );
  1950 
  1970 
  1951     QSqlQuery q( db );
  1971     QSqlQuery q( db );
  1952     QString tableName = qTableName( "qtest_batch" );
  1972     const QString tableName = qTableName( "qtest_batch", __FILE__ );
  1953 
  1973 
  1954     QVERIFY_SQL( q, exec( "create table " + tableName + " (id int, name varchar(20), dt date, num numeric(8, 4))" ) );
  1974     QVERIFY_SQL( q, exec( "create table " + tableName + " (id int, name varchar(20), dt date, num numeric(8, 4))" ) );
  1955     QVERIFY_SQL( q, prepare( "insert into " + tableName + " (id, name, dt, num) values (?, ?, ?, ?)" ) );
  1975     QVERIFY_SQL( q, prepare( "insert into " + tableName + " (id, name, dt, num) values (?, ?, ?, ?)" ) );
  1956 
  1976 
  1957     QVariantList intCol;
  1977     QVariantList intCol;
  2091     QSqlDatabase db = QSqlDatabase::database( dbName );
  2111     QSqlDatabase db = QSqlDatabase::database( dbName );
  2092     CHECK_DATABASE( db );
  2112     CHECK_DATABASE( db );
  2093 
  2113 
  2094     QSqlQuery q( db );
  2114     QSqlQuery q( db );
  2095 
  2115 
  2096     QVERIFY_SQL( q, exec( "create table "+qTableName( "record_sqlite" )+"(id integer primary key, name varchar, title int)" ) );
  2116     QVERIFY_SQL( q, exec( "create table "+qTableName( "record_sqlite", __FILE__ )+"(id integer primary key, name varchar, title int)" ) );
  2097 
  2117 
  2098     QSqlRecord rec = db.record( qTableName( "record_sqlite" ) );
  2118     QSqlRecord rec = db.record( qTableName( "record_sqlite", __FILE__ ) );
  2099 
  2119 
  2100     QCOMPARE( rec.count(), 3 );
  2120     QCOMPARE( rec.count(), 3 );
  2101     QCOMPARE( rec.field( 0 ).type(), QVariant::Int );
  2121     QCOMPARE( rec.field( 0 ).type(), QVariant::Int );
  2102     QCOMPARE( rec.field( 1 ).type(), QVariant::String );
  2122     QCOMPARE( rec.field( 1 ).type(), QVariant::String );
  2103     QCOMPARE( rec.field( 2 ).type(), QVariant::Int );
  2123     QCOMPARE( rec.field( 2 ).type(), QVariant::Int );
  2104 
  2124 
  2105     /* important - select from an empty table */
  2125     /* important - select from an empty table */
  2106     QVERIFY_SQL( q, exec( "select id, name, title from "+qTableName( "record_sqlite" ) ) );
  2126     QVERIFY_SQL( q, exec( "select id, name, title from "+qTableName( "record_sqlite", __FILE__ ) ) );
  2107 
  2127 
  2108     rec = q.record();
  2128     rec = q.record();
  2109     QCOMPARE( rec.count(), 3 );
  2129     QCOMPARE( rec.count(), 3 );
  2110     QCOMPARE( rec.field( 0 ).type(), QVariant::Int );
  2130     QCOMPARE( rec.field( 0 ).type(), QVariant::Int );
  2111     QCOMPARE( rec.field( 1 ).type(), QVariant::String );
  2131     QCOMPARE( rec.field( 1 ).type(), QVariant::String );
  2120 
  2140 
  2121     QSqlQuery q( db );
  2141     QSqlQuery q( db );
  2122 
  2142 
  2123     QString aLotOfText( 127000, QLatin1Char( 'H' ) );
  2143     QString aLotOfText( 127000, QLatin1Char( 'H' ) );
  2124 
  2144 
  2125     QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_longstr" ) + " (id int primary key, astr long)" ) );
  2145     QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_longstr", __FILE__ ) + " (id int primary key, astr long)" ) );
  2126     QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_longstr" ) + " (id, astr) values (?, ?)" ) );
  2146     QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_longstr", __FILE__ ) + " (id, astr) values (?, ?)" ) );
  2127     q.addBindValue( 1 );
  2147     q.addBindValue( 1 );
  2128     q.addBindValue( aLotOfText );
  2148     q.addBindValue( aLotOfText );
  2129     QVERIFY_SQL( q, exec() );
  2149     QVERIFY_SQL( q, exec() );
  2130 
  2150 
  2131     QVERIFY_SQL( q, exec( "select id,astr from " + qTableName( "qtest_longstr" ) ) );
  2151     QVERIFY_SQL( q, exec( "select id,astr from " + qTableName( "qtest_longstr", __FILE__ ) ) );
  2132 
  2152 
  2133     QVERIFY( q.next() );
  2153     QVERIFY( q.next() );
  2134     QCOMPARE( q.value( 0 ).toInt(), 1 );
  2154     QCOMPARE( q.value( 0 ).toInt(), 1 );
  2135     QCOMPARE( q.value( 1 ).toString(), aLotOfText );
  2155     QCOMPARE( q.value( 1 ).toString(), aLotOfText );
  2136 }
  2156 }
  2141     QSqlDatabase db = QSqlDatabase::database( dbName );
  2161     QSqlDatabase db = QSqlDatabase::database( dbName );
  2142     CHECK_DATABASE( db );
  2162     CHECK_DATABASE( db );
  2143 
  2163 
  2144     QSqlQuery q( db );
  2164     QSqlQuery q( db );
  2145 
  2165 
  2146     QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_exerr" ) + " (id int not null primary key)" ) );
  2166     QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_exerr", __FILE__ ) + " (id int not null primary key)" ) );
  2147     QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_exerr" ) + " values (?)" ) );
  2167     QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_exerr", __FILE__ ) + " values (?)" ) );
  2148 
  2168 
  2149     q.addBindValue( 1 );
  2169     q.addBindValue( 1 );
  2150     QVERIFY_SQL( q, exec() );
  2170     QVERIFY_SQL( q, exec() );
  2151 
  2171 
  2152     q.addBindValue( 1 ); // binding the same pkey - should fail
  2172     q.addBindValue( 1 ); // binding the same pkey - should fail
  2165     if ( !db.driver()->hasFeature( QSqlDriver::LastInsertId ) )
  2185     if ( !db.driver()->hasFeature( QSqlDriver::LastInsertId ) )
  2166         QSKIP( "Database doesn't support lastInsertId", SkipSingle );
  2186         QSKIP( "Database doesn't support lastInsertId", SkipSingle );
  2167 
  2187 
  2168     QSqlQuery q( db );
  2188     QSqlQuery q( db );
  2169 
  2189 
  2170     QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (41, 'VarChar41', 'Char41')" ) );
  2190     QVERIFY_SQL( q, exec( "insert into " + qtest + " values (41, 'VarChar41', 'Char41')" ) );
  2171 
  2191 
  2172     QVariant v = q.lastInsertId();
  2192     QVariant v = q.lastInsertId();
  2173 
  2193 
  2174     QVERIFY( v.isValid() );
  2194     QVERIFY( v.isValid() );
  2175 }
  2195 }
  2179     QFETCH( QString, dbName );
  2199     QFETCH( QString, dbName );
  2180     QSqlDatabase db = QSqlDatabase::database( dbName );
  2200     QSqlDatabase db = QSqlDatabase::database( dbName );
  2181     CHECK_DATABASE( db );
  2201     CHECK_DATABASE( db );
  2182 
  2202 
  2183     QSqlQuery q( db );
  2203     QSqlQuery q( db );
  2184     QString sql = "select * from " + qTableName( "qtest" );
  2204     QString sql = "select * from " + qtest;
  2185     QVERIFY_SQL( q, exec( sql ) );
  2205     QVERIFY_SQL( q, exec( sql ) );
  2186     QCOMPARE( q.lastQuery(), sql );
  2206     QCOMPARE( q.lastQuery(), sql );
  2187     QCOMPARE( q.executedQuery(), sql );
  2207     QCOMPARE( q.executedQuery(), sql );
  2188 }
  2208 }
  2189 
  2209 
  2198     if ( !db.driverName().startsWith( "QPSQL" ) ) {
  2218     if ( !db.driverName().startsWith( "QPSQL" ) ) {
  2199         QSKIP( "Test requires PostgreSQL", SkipSingle );
  2219         QSKIP( "Test requires PostgreSQL", SkipSingle );
  2200         return;
  2220         return;
  2201     }
  2221     }
  2202 
  2222 
  2203     QString tablename = qTableName( "bindtest" );
  2223     const QString tablename(qTableName( "bindtest", __FILE__ ));
  2204 
  2224 
  2205     QSqlQuery q( db );
  2225     QSqlQuery q( db );
  2206 
  2226 
  2207     QVERIFY_SQL( q, exec( "create table " + tablename + " (id1 int, id2 int, id3 int, fld1 int, fld2 int)" ) );
  2227     QVERIFY_SQL( q, exec( "create table " + tablename + " (id1 int, id2 int, id3 int, fld1 int, fld2 int)" ) );
  2208     QVERIFY_SQL( q, exec( "insert into " + tablename + " values (1, 2, 3, 10, 5)" ) );
  2228     QVERIFY_SQL( q, exec( "insert into " + tablename + " values (1, 2, 3, 10, 5)" ) );
  2272 
  2292 
  2273     db.close();
  2293     db.close();
  2274 
  2294 
  2275     QSqlQuery q( db );
  2295     QSqlQuery q( db );
  2276     db.open();
  2296     db.open();
  2277     QVERIFY_SQL( q, exec( QString( "select * from %1 where id = 1" ).arg( qTableName( "qtest" ) ) ) );
  2297     QVERIFY_SQL( q, exec( QString( "select * from %1 where id = 1" ).arg( qtest ) ) );
  2278 
  2298 
  2279     QVERIFY_SQL( q, next() );
  2299     QVERIFY_SQL( q, next() );
  2280     QCOMPARE( q.value( 0 ).toInt(), 1 );
  2300     QCOMPARE( q.value( 0 ).toInt(), 1 );
  2281     QCOMPARE( q.value( 1 ).toString().trimmed(), QLatin1String( "VarChar1" ) );
  2301     QCOMPARE( q.value( 1 ).toString().trimmed(), QLatin1String( "VarChar1" ) );
  2282     QCOMPARE( q.value( 2 ).toString().trimmed(), QLatin1String( "Char1" ) );
  2302     QCOMPARE( q.value( 2 ).toString().trimmed(), QLatin1String( "Char1" ) );
  2283 
  2303 
  2284     db.close();
  2304     db.close();
  2285     QVERIFY2( !q.exec( QString( "select * from %1 where id = 1" ).arg( qTableName( "qtest" ) ) ),
  2305     QVERIFY2( !q.exec( QString( "select * from %1 where id = 1" ).arg( qtest ) ),
  2286               qPrintable( QString( "This can't happen! The query should not have been executed!" ) ) );
  2306               qPrintable( QString( "This can't happen! The query should not have been executed!" ) ) );
  2287 }
  2307 }
  2288 
  2308 
  2289 void tst_QSqlQuery::reExecutePreparedForwardOnlyQuery()
  2309 void tst_QSqlQuery::reExecutePreparedForwardOnlyQuery()
  2290 {
  2310 {
  2293     CHECK_DATABASE( db );
  2313     CHECK_DATABASE( db );
  2294 
  2314 
  2295     QSqlQuery q( db );
  2315     QSqlQuery q( db );
  2296     q.setForwardOnly( true );
  2316     q.setForwardOnly( true );
  2297 
  2317 
  2298     QVERIFY_SQL( q, prepare( QString( "SELECT id, t_varchar, t_char FROM %1 WHERE id = :id" ).arg( qTableName( "qtest" ) ) ) );
  2318     QVERIFY_SQL( q, prepare( QString( "SELECT id, t_varchar, t_char FROM %1 WHERE id = :id" ).arg( qtest ) ) );
  2299     q.bindValue( ":id", 1 );
  2319     q.bindValue( ":id", 1 );
  2300     QVERIFY_SQL( q, exec() );
  2320     QVERIFY_SQL( q, exec() );
  2301 
  2321 
  2302     // Do something, like iterate over the result, or skip to the end
  2322     // Do something, like iterate over the result, or skip to the end
  2303     QVERIFY_SQL( q, last() );
  2323     QVERIFY_SQL( q, last() );
  2318     QFETCH( QString, dbName );
  2338     QFETCH( QString, dbName );
  2319     QSqlDatabase db = QSqlDatabase::database( dbName );
  2339     QSqlDatabase db = QSqlDatabase::database( dbName );
  2320     CHECK_DATABASE( db );
  2340     CHECK_DATABASE( db );
  2321 
  2341 
  2322     QSqlQuery q( db );
  2342     QSqlQuery q( db );
  2323     QVERIFY_SQL( q, prepare( "SELECT id FROM " + qTableName( "qtest" ) + " WHERE id = ?" ) );
  2343     QVERIFY_SQL( q, prepare( "SELECT id FROM " + qtest + " WHERE id = ?" ) );
  2324 
  2344 
  2325     int id = 4;
  2345     int id = 4;
  2326     q.bindValue( 0, id );
  2346     q.bindValue( 0, id );
  2327     QVERIFY_SQL( q, exec() );
  2347     QVERIFY_SQL( q, exec() );
  2328     QVERIFY( q.isActive() );
  2348     QVERIFY( q.isActive() );
  2339     QCOMPARE( q.value( 0 ).toInt(), id );
  2359     QCOMPARE( q.value( 0 ).toInt(), id );
  2340 
  2360 
  2341     q.finish();
  2361     q.finish();
  2342     QVERIFY( !q.isActive() );
  2362     QVERIFY( !q.isActive() );
  2343 
  2363 
  2344     QVERIFY_SQL( q, exec( "SELECT id FROM " + qTableName( "qtest" ) + " WHERE id = 1" ) );
  2364     QVERIFY_SQL( q, exec( "SELECT id FROM " + qtest + " WHERE id = 1" ) );
  2345     QVERIFY( q.isActive() );
  2365     QVERIFY( q.isActive() );
  2346     QVERIFY_SQL( q, next() );
  2366     QVERIFY_SQL( q, next() );
  2347     QCOMPARE( q.value( 0 ).toInt(), 1 );
  2367     QCOMPARE( q.value( 0 ).toInt(), 1 );
  2348     QCOMPARE( q.record().count(), 1 );
  2368     QCOMPARE( q.record().count(), 1 );
  2349 }
  2369 }
  2364     {
  2384     {
  2365         QSqlDatabase db2 = QSqlDatabase::addDatabase( "QSQLITE", "sqlite_finish_sqlite" );
  2385         QSqlDatabase db2 = QSqlDatabase::addDatabase( "QSQLITE", "sqlite_finish_sqlite" );
  2366         db2.setDatabaseName( db.databaseName() );
  2386         db2.setDatabaseName( db.databaseName() );
  2367         QVERIFY_SQL( db2, open() );
  2387         QVERIFY_SQL( db2, open() );
  2368 
  2388 
  2369         QString tableName = qTableName( "qtest_lockedtable" );
  2389         const QString tableName(qTableName( "qtest_lockedtable", __FILE__ ));
  2370         QSqlQuery q( db );
  2390         QSqlQuery q( db );
  2371 
  2391 
  2372         tst_Databases::safeDropTable( db, tableName );
  2392         tst_Databases::safeDropTable( db, tableName );
  2373         q.exec( "CREATE TABLE " + tableName + " (pk_id INTEGER PRIMARY KEY, whatever TEXT)" );
  2393         q.exec( "CREATE TABLE " + tableName + " (pk_id INTEGER PRIMARY KEY, whatever TEXT)" );
  2374         q.exec( "INSERT INTO " + tableName + " values(1, 'whatever')" );
  2394         q.exec( "INSERT INTO " + tableName + " values(1, 'whatever')" );
  2414     if ( db.driverName().startsWith( "QMYSQL" ) )
  2434     if ( db.driverName().startsWith( "QMYSQL" ) )
  2415         driverType = MYSQL;
  2435         driverType = MYSQL;
  2416     else if ( db.driverName().startsWith( "QDB2" ) )
  2436     else if ( db.driverName().startsWith( "QDB2" ) )
  2417         driverType = DB2;
  2437         driverType = DB2;
  2418 
  2438 
  2419     QString tableName = qTableName( "more_results" );
  2439     const QString tableName(qTableName( "more_results", __FILE__ ));
  2420 
  2440 
  2421     QVERIFY_SQL( q, exec( "CREATE TABLE " + tableName + " (id integer, text varchar(20), num numeric(6, 3), empty varchar(10));" ) );
  2441     QVERIFY_SQL( q, exec( "CREATE TABLE " + tableName + " (id integer, text varchar(20), num numeric(6, 3), empty varchar(10));" ) );
  2422 
  2442 
  2423     QVERIFY_SQL( q, exec( "INSERT INTO " + tableName + " VALUES(1, 'one', 1.1, '');" ) );
  2443     QVERIFY_SQL( q, exec( "INSERT INTO " + tableName + " VALUES(1, 'one', 1.1, '');" ) );
  2424 
  2444 
  2518         QCOMPARE( q.value( 0 ).toInt(), 1+i );
  2538         QCOMPARE( q.value( 0 ).toInt(), 1+i );
  2519         QCOMPARE( q.value( 1 ).toString(), QString( "Yatta!" ) );
  2539         QCOMPARE( q.value( 1 ).toString(), QString( "Yatta!" ) );
  2520     }
  2540     }
  2521 
  2541 
  2522     // Stored procedure with multiple result sets
  2542     // Stored procedure with multiple result sets
  2523     QString procName = qTableName( "proc_more_res" );
  2543     const QString procName(qTableName( "proc_more_res", __FILE__ ));
  2524 
  2544 
  2525     q.exec( QString( "DROP PROCEDURE %1;" ).arg( procName ) );
  2545     q.exec( QString( "DROP PROCEDURE %1;" ).arg( procName ) );
  2526 
  2546 
  2527     if ( driverType == MYSQL )
  2547     if ( driverType == MYSQL )
  2528         QVERIFY_SQL( q, exec( QString( "CREATE PROCEDURE %1()"
  2548         QVERIFY_SQL( q, exec( QString( "CREATE PROCEDURE %1()"
  2596     CHECK_DATABASE( db );
  2616     CHECK_DATABASE( db );
  2597 
  2617 
  2598     if ( !db.driver()->hasFeature( QSqlDriver::BLOB ) || !db.driver()->hasFeature( QSqlDriver::PreparedQueries ) )
  2618     if ( !db.driver()->hasFeature( QSqlDriver::BLOB ) || !db.driver()->hasFeature( QSqlDriver::PreparedQueries ) )
  2599         QSKIP( "DBMS does not support BLOBs or prepared queries", SkipSingle );
  2619         QSKIP( "DBMS does not support BLOBs or prepared queries", SkipSingle );
  2600 
  2620 
  2601     QString tableName = qTableName( "blobstest" );
  2621     const QString tableName(qTableName( "blobstest", __FILE__ ));
  2602 
  2622 
  2603     QSqlQuery q( db );
  2623     QSqlQuery q( db );
  2604     q.setForwardOnly( true ); // This is needed to make the test work with DB2.
  2624     q.setForwardOnly( true ); // This is needed to make the test work with DB2.
  2605     QString shortBLOB( "abc" );
  2625     QString shortBLOB( "abc" );
  2606     QString longerBLOB( "abcdefghijklmnopqrstuvxyz¿äëïöü¡  " );
  2626     QString longerBLOB( "abcdefghijklmnopqrstuvxyz¿äëïöü¡  " );
  2651     QSqlDatabase db = QSqlDatabase::database( dbName );
  2671     QSqlDatabase db = QSqlDatabase::database( dbName );
  2652     CHECK_DATABASE( db );
  2672     CHECK_DATABASE( db );
  2653 
  2673 
  2654     {
  2674     {
  2655         QSqlQuery q( db );
  2675         QSqlQuery q( db );
  2656         QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_empty" ) + " (id char(10))" ) );
  2676         QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_empty", __FILE__ ) + " (id char(10))" ) );
  2657         QVERIFY_SQL( q, prepare( "select * from " + qTableName( "qtest_empty" ) ) );
  2677         QVERIFY_SQL( q, prepare( "select * from " + qTableName( "qtest_empty", __FILE__ ) ) );
  2658         QVERIFY_SQL( q, exec() );
  2678         QVERIFY_SQL( q, exec() );
  2659         QVERIFY( !q.next() );
  2679         QVERIFY( !q.next() );
  2660         QCOMPARE( q.lastError().isValid(), false );
  2680         QCOMPARE( q.lastError().isValid(), false );
  2661     }
  2681     }
  2662 }
  2682 }
  2665 {
  2685 {
  2666     QFETCH( QString, dbName );
  2686     QFETCH( QString, dbName );
  2667     QSqlDatabase db = QSqlDatabase::database( dbName );
  2687     QSqlDatabase db = QSqlDatabase::database( dbName );
  2668     CHECK_DATABASE( db );
  2688     CHECK_DATABASE( db );
  2669     QSqlQuery q( db );
  2689     QSqlQuery q( db );
  2670 
  2690     const QString Planet(qTableName( "Planet", __FILE__));
  2671     QVERIFY_SQL( q, exec( "create table " + qTableName( "Planet" ) + " (Name varchar(20))" ) );
  2691 
  2672     QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Mercury')" ) );
  2692     QVERIFY_SQL( q, exec( "create table " + Planet + " (Name varchar(20))" ) );
  2673     QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Venus')" ) );
  2693     QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Mercury')" ) );
  2674     QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Earth')" ) );
  2694     QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Venus')" ) );
  2675     QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Mars')" ) );
  2695     QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Earth')" ) );
  2676 
  2696     QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Mars')" ) );
  2677     QVERIFY_SQL( q, exec( "SELECT Name FROM "+qTableName( "Planet" ) ) );
  2697 
       
  2698     QVERIFY_SQL( q, exec( "SELECT Name FROM " + Planet ) );
  2678     QVERIFY_SQL( q, seek( 3 ) );
  2699     QVERIFY_SQL( q, seek( 3 ) );
  2679     QCOMPARE( q.value( 0 ).toString(), QString( "Mars" ) );
  2700     QCOMPARE( q.value( 0 ).toString(), QString( "Mars" ) );
  2680     QVERIFY_SQL( q, seek( 1 ) );
  2701     QVERIFY_SQL( q, seek( 1 ) );
  2681     QCOMPARE( q.value( 0 ).toString(), QString( "Venus" ) );
  2702     QCOMPARE( q.value( 0 ).toString(), QString( "Venus" ) );
  2682     QVERIFY_SQL( q, exec( "SELECT Name FROM "+qTableName( "Planet" ) ) );
  2703     QVERIFY_SQL( q, exec( "SELECT Name FROM " + Planet ) );
  2683     QVERIFY_SQL( q, seek( 3 ) );
  2704     QVERIFY_SQL( q, seek( 3 ) );
  2684     QCOMPARE( q.value( 0 ).toString(), QString( "Mars" ) );
  2705     QCOMPARE( q.value( 0 ).toString(), QString( "Mars" ) );
  2685     QVERIFY_SQL( q, seek( 0 ) );
  2706     QVERIFY_SQL( q, seek( 0 ) );
  2686     QCOMPARE( q.value( 0 ).toString(), QString( "Mercury" ) );
  2707     QCOMPARE( q.value( 0 ).toString(), QString( "Mercury" ) );
  2687     QVERIFY_SQL( q, seek( 1 ) );
  2708     QVERIFY_SQL( q, seek( 1 ) );
  2694     QFETCH( QString, dbName );
  2715     QFETCH( QString, dbName );
  2695     QSqlDatabase db = QSqlDatabase::database( dbName );
  2716     QSqlDatabase db = QSqlDatabase::database( dbName );
  2696     CHECK_DATABASE( db );
  2717     CHECK_DATABASE( db );
  2697     QSqlQuery q( db );
  2718     QSqlQuery q( db );
  2698 
  2719 
  2699     QString tableName = qTableName( "task_250026" );
  2720     const QString tableName(qTableName( "task_250026", __FILE__ ));
  2700 
  2721 
  2701     if ( !q.exec( "create table " + tableName + " (longfield varchar(1100))" ) ) {
  2722     if ( !q.exec( "create table " + tableName + " (longfield varchar(1100))" ) ) {
  2702         qDebug() << "Error" << q.lastError();
  2723         qDebug() << "Error" << q.lastError();
  2703         QSKIP( "Db doesn't support \"1100\" as a size for fields", SkipSingle );
  2724         QSKIP( "Db doesn't support \"1100\" as a size for fields", SkipSingle );
  2704     }
  2725     }
  2742 
  2763 
  2743     if (!db.driverName().startsWith( "QODBC" )) return;
  2764     if (!db.driverName().startsWith( "QODBC" )) return;
  2744 
  2765 
  2745     QSqlQuery q( db );
  2766     QSqlQuery q( db );
  2746 
  2767 
  2747     QString tableName = qTableName( "task_229811" );
  2768     const QString tableName(qTableName( "task_229811", __FILE__ ));
  2748 
  2769 
  2749     if ( !q.exec( "CREATE TABLE " + tableName + " (Word varchar(20))" ) ) {
  2770     if ( !q.exec( "CREATE TABLE " + tableName + " (Word varchar(20))" ) ) {
  2750         qDebug() << "Warning" << q.lastError();
  2771         qDebug() << "Warning" << q.lastError();
  2751     }
  2772     }
  2752 
  2773 
  2789     QStringList m_countries;
  2810     QStringList m_countries;
  2790 
  2811 
  2791     m_airlines << "Lufthansa" << "SAS" << "United" << "KLM" << "Aeroflot";
  2812     m_airlines << "Lufthansa" << "SAS" << "United" << "KLM" << "Aeroflot";
  2792     m_countries << "DE" << "SE" << "US" << "NL" << "RU";
  2813     m_countries << "DE" << "SE" << "US" << "NL" << "RU";
  2793 
  2814 
  2794     QString tableName = qTableName( "task_234422" );
  2815     const QString tableName(qTableName( "task_234422", __FILE__ ));
  2795 
  2816 
  2796     QVERIFY_SQL(query,exec("CREATE TABLE " + tableName + " (id int primary key, "
  2817     QVERIFY_SQL(query,exec("CREATE TABLE " + tableName + " (id int primary key, "
  2797                 "name varchar(20), homecountry varchar(2))"));
  2818                 "name varchar(20), homecountry varchar(2))"));
  2798     for (int i = 0; i < m_airlines.count(); ++i) {
  2819     for (int i = 0; i < m_airlines.count(); ++i) {
  2799         QVERIFY(query.exec(QString("INSERT INTO " + tableName + " values(%1, '%2', '%3')")
  2820         QVERIFY(query.exec(QString("INSERT INTO " + tableName + " values(%1, '%2', '%3')")
  2821     QFETCH( QString, dbName );
  2842     QFETCH( QString, dbName );
  2822     QSqlDatabase db = QSqlDatabase::database( dbName );
  2843     QSqlDatabase db = QSqlDatabase::database( dbName );
  2823     CHECK_DATABASE( db );
  2844     CHECK_DATABASE( db );
  2824 
  2845 
  2825     QSqlQuery q( db );
  2846     QSqlQuery q( db );
  2826     QString tableName = qTableName("task_233829");
  2847     const QString tableName(qTableName("task_233829", __FILE__));
  2827     QVERIFY_SQL(q,exec("CREATE TABLE " + tableName  + "(dbl1 double precision,dbl2 double precision) without oids;"));
  2848     QVERIFY_SQL(q,exec("CREATE TABLE " + tableName  + "(dbl1 double precision,dbl2 double precision) without oids;"));
  2828 
  2849 
  2829     QString queryString("INSERT INTO " + tableName +"(dbl1, dbl2) VALUES(?,?)");
  2850     QString queryString("INSERT INTO " + tableName +"(dbl1, dbl2) VALUES(?,?)");
  2830 
  2851 
  2831     double k = 0.0;
  2852     double k = 0.0;
  2841     QSqlDatabase db = QSqlDatabase::database( dbName );
  2862     QSqlDatabase db = QSqlDatabase::database( dbName );
  2842     CHECK_DATABASE( db );
  2863     CHECK_DATABASE( db );
  2843     if (!tst_Databases::isSqlServer( db ))
  2864     if (!tst_Databases::isSqlServer( db ))
  2844         QSKIP("SQL Server specific test", SkipSingle);
  2865         QSKIP("SQL Server specific test", SkipSingle);
  2845 
  2866 
  2846     QString tableName(qTableName("test141895")), procName(qTableName("test141895_proc"));
  2867     const QString tableName(qTableName("test141895", __FILE__)), procName(qTableName("test141895_proc", __FILE__));
  2847     QSqlQuery q( db );
  2868     QSqlQuery q( db );
  2848     q.exec("DROP TABLE " + tableName);
  2869     q.exec("DROP TABLE " + tableName);
  2849     q.exec("DROP PROCEDURE " + procName);
  2870     q.exec("DROP PROCEDURE " + procName);
  2850     QVERIFY_SQL(q, exec("CREATE TABLE "+tableName+" (id integer)"));
  2871     QVERIFY_SQL(q, exec("CREATE TABLE "+tableName+" (id integer)"));
  2851     QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" (id) VALUES (1)"));
  2872     QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" (id) VALUES (1)"));
  2867 {
  2888 {
  2868     QFETCH( QString, dbName );
  2889     QFETCH( QString, dbName );
  2869     QSqlDatabase db = QSqlDatabase::database( dbName );
  2890     QSqlDatabase db = QSqlDatabase::database( dbName );
  2870     CHECK_DATABASE( db );
  2891     CHECK_DATABASE( db );
  2871     QSqlQuery q(db);
  2892     QSqlQuery q(db);
  2872     QString pkgname=qTableName("pkg");
  2893     const QString pkgname(qTableName("pkg", __FILE__));
  2873     QVERIFY_SQL(q, exec("CREATE OR REPLACE PACKAGE "+pkgname+" IS \n\
  2894     QVERIFY_SQL(q, exec("CREATE OR REPLACE PACKAGE "+pkgname+" IS \n\
  2874             \n\
  2895             \n\
  2875             TYPE IntType IS TABLE OF INTEGER      INDEX BY BINARY_INTEGER;\n\
  2896             TYPE IntType IS TABLE OF INTEGER      INDEX BY BINARY_INTEGER;\n\
  2876             TYPE VCType  IS TABLE OF VARCHAR2(60) INDEX BY BINARY_INTEGER;\n\
  2897             TYPE VCType  IS TABLE OF VARCHAR2(60) INDEX BY BINARY_INTEGER;\n\
  2877             PROCEDURE P (Inp IN IntType,  Outp OUT VCType);\n\
  2898             PROCEDURE P (Inp IN IntType,  Outp OUT VCType);\n\
  2913 void tst_QSqlQuery::QTBUG_5251()
  2934 void tst_QSqlQuery::QTBUG_5251()
  2914 {
  2935 {
  2915     QFETCH( QString, dbName );
  2936     QFETCH( QString, dbName );
  2916     QSqlDatabase db = QSqlDatabase::database( dbName );
  2937     QSqlDatabase db = QSqlDatabase::database( dbName );
  2917     CHECK_DATABASE( db );
  2938     CHECK_DATABASE( db );
       
  2939     const QString timetest(qTableName("timetest", __FILE__));
  2918 
  2940 
  2919     if (!db.driverName().startsWith( "QPSQL" )) return;
  2941     if (!db.driverName().startsWith( "QPSQL" )) return;
  2920 
  2942 
  2921     QSqlQuery q(db);
  2943     QSqlQuery q(db);
  2922     q.exec("DROP TABLE " + qTableName("timetest"));
  2944     q.exec("DROP TABLE " + timetest);
  2923     QVERIFY_SQL(q, exec("CREATE TABLE  " + qTableName("timetest") + " (t  TIME)"));
  2945     QVERIFY_SQL(q, exec("CREATE TABLE  " + timetest + " (t  TIME)"));
  2924     QVERIFY_SQL(q, exec("INSERT INTO " + qTableName("timetest") +  " VALUES ('1:2:3.666')"));
  2946     QVERIFY_SQL(q, exec("INSERT INTO " + timetest +  " VALUES ('1:2:3.666')"));
  2925 
  2947 
  2926     QSqlTableModel timetestModel(0,db);
  2948     QSqlTableModel timetestModel(0,db);
  2927     timetestModel.setEditStrategy(QSqlTableModel::OnManualSubmit);
  2949     timetestModel.setEditStrategy(QSqlTableModel::OnManualSubmit);
  2928     timetestModel.setTable(qTableName("timetest"));
  2950     timetestModel.setTable(timetest);
  2929     QVERIFY_SQL(timetestModel, select());
  2951     QVERIFY_SQL(timetestModel, select());
  2930 
  2952 
  2931     QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("01:02:03.666"));
  2953     QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("01:02:03.666"));
  2932     QVERIFY_SQL(timetestModel,setData(timetestModel.index(0, 0), QTime(0,12,34,500)));
  2954     QVERIFY_SQL(timetestModel,setData(timetestModel.index(0, 0), QTime(0,12,34,500)));
  2933     QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:12:34.500"));
  2955     QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:12:34.500"));
  2934     QVERIFY_SQL(timetestModel, submitAll());
  2956     QVERIFY_SQL(timetestModel, submitAll());
  2935     QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:12:34.500"));
  2957     QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:12:34.500"));
  2936 
  2958 
  2937     QVERIFY_SQL(q, exec("UPDATE " + qTableName("timetest") + " SET t = '0:11:22.33'"));
  2959     QVERIFY_SQL(q, exec("UPDATE " + timetest + " SET t = '0:11:22.33'"));
  2938     QVERIFY_SQL(timetestModel, select());
  2960     QVERIFY_SQL(timetestModel, select());
  2939     QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:11:22.330"));
  2961     QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:11:22.330"));
  2940 
  2962 
  2941 }
  2963 }
  2942 
  2964 
  2945     QFETCH( QString, dbName );
  2967     QFETCH( QString, dbName );
  2946     QSqlDatabase db = QSqlDatabase::database( dbName );
  2968     QSqlDatabase db = QSqlDatabase::database( dbName );
  2947     CHECK_DATABASE( db );
  2969     CHECK_DATABASE( db );
  2948 
  2970 
  2949     QSqlQuery q(db);
  2971     QSqlQuery q(db);
  2950     QString tableName=qTableName(QLatin1String("bug6421")).toUpper();
  2972     const QString tableName(qTableName("bug6421", __FILE__).toUpper());
  2951 
  2973 
  2952     QVERIFY_SQL(q, exec("create table "+tableName+"(COL1 char(10), COL2 char(10), COL3 char(10))"));
  2974     QVERIFY_SQL(q, exec("create table "+tableName+"(COL1 char(10), COL2 char(10), COL3 char(10))"));
  2953     QVERIFY_SQL(q, exec("create index INDEX1 on "+tableName+" (COL1 desc)"));
  2975     QVERIFY_SQL(q, exec("create index INDEX1 on "+tableName+" (COL1 desc)"));
  2954     QVERIFY_SQL(q, exec("create index INDEX2 on "+tableName+" (COL2 desc)"));
  2976     QVERIFY_SQL(q, exec("create index INDEX2 on "+tableName+" (COL2 desc)"));
  2955     QVERIFY_SQL(q, exec("create index INDEX3 on "+tableName+" (COL3 desc)"));
  2977     QVERIFY_SQL(q, exec("create index INDEX3 on "+tableName+" (COL3 desc)"));
  2970     CHECK_DATABASE( db );
  2992     CHECK_DATABASE( db );
  2971     if (!tst_Databases::isSqlServer( db ))
  2993     if (!tst_Databases::isSqlServer( db ))
  2972         QSKIP("SQL Server specific test", SkipSingle);
  2994         QSKIP("SQL Server specific test", SkipSingle);
  2973 
  2995 
  2974     QSqlQuery q(db);
  2996     QSqlQuery q(db);
  2975     q.exec( "drop procedure " + qTableName( "tst_raiseError" ) );  //non-fatal
  2997     q.exec( "drop procedure " + qTableName( "tst_raiseError", __FILE__ ) );  //non-fatal
  2976     QString errorString;
  2998     QString errorString;
  2977     for (int i=0;i<110;i++)
  2999     for (int i=0;i<110;i++)
  2978         errorString+="reallylong";
  3000         errorString+="reallylong";
  2979     errorString+=" error";
  3001     errorString+=" error";
  2980     QVERIFY_SQL( q, exec("create procedure " + qTableName( "tst_raiseError" ) + " as\n"
  3002     QVERIFY_SQL( q, exec("create procedure " + qTableName( "tst_raiseError", __FILE__ ) + " as\n"
  2981                          "begin\n"
  3003                          "begin\n"
  2982                          "    raiserror('" + errorString + "', 16, 1)\n"
  3004                          "    raiserror('" + errorString + "', 16, 1)\n"
  2983                          "end\n" ));
  3005                          "end\n" ));
  2984     q.exec( "{call " + qTableName( "tst_raiseError" ) + "}" );
  3006     q.exec( "{call " + qTableName( "tst_raiseError", __FILE__ ) + "}" );
  2985     QVERIFY(q.lastError().text().contains(errorString));
  3007     QVERIFY(q.lastError().text().contains(errorString));
  2986 }
  3008 }
       
  3009 
       
  3010 void tst_QSqlQuery::QTBUG_6852()
       
  3011 {
       
  3012     QFETCH( QString, dbName );
       
  3013     QSqlDatabase db = QSqlDatabase::database( dbName );
       
  3014     CHECK_DATABASE( db );
       
  3015     if ( tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 )
       
  3016         QSKIP( "Test requires MySQL >= 5.0", SkipSingle );
       
  3017 
       
  3018     QSqlQuery q(db);
       
  3019     const QString tableName(qTableName("bug6852", __FILE__)), procName(qTableName("bug6852_proc", __FILE__));
       
  3020 
       
  3021     QVERIFY_SQL(q, exec("DROP PROCEDURE IF EXISTS "+procName));
       
  3022     QVERIFY_SQL(q, exec("CREATE TABLE "+tableName+"(\n"
       
  3023                         "MainKey INT NOT NULL,\n"
       
  3024                         "OtherTextCol VARCHAR(45) NOT NULL,\n"
       
  3025                         "PRIMARY KEY(`MainKey`))"));
       
  3026     QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" VALUES(0, \"Disabled\")"));
       
  3027     QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" VALUES(5, \"Error Only\")"));
       
  3028     QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" VALUES(10, \"Enabled\")"));
       
  3029     QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" VALUES(15, \"Always\")"));
       
  3030     QVERIFY_SQL(q, exec("CREATE PROCEDURE "+procName+"()\n"
       
  3031                         "READS SQL DATA\n"
       
  3032                         "BEGIN\n"
       
  3033                         "  SET @st = 'SELECT MainKey, OtherTextCol from "+tableName+"';\n"
       
  3034                         "  PREPARE stmt from @st;\n"
       
  3035                         "  EXECUTE stmt;\n"
       
  3036                         "END;"));
       
  3037 
       
  3038     QVERIFY_SQL(q, exec("CALL "+procName+"()"));
       
  3039     QVERIFY_SQL(q, next());
       
  3040     QCOMPARE(q.value(0).toInt(), 0);
       
  3041     QCOMPARE(q.value(1).toString(), QLatin1String("Disabled"));
       
  3042 }
       
  3043 
       
  3044 void tst_QSqlQuery::QTBUG_5765()
       
  3045 {
       
  3046     QFETCH( QString, dbName );
       
  3047     QSqlDatabase db = QSqlDatabase::database( dbName );
       
  3048     CHECK_DATABASE( db );
       
  3049     if ( tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 1 ).toFloat()<4.1 )
       
  3050         QSKIP( "Test requires MySQL >= 4.1", SkipSingle );
       
  3051 
       
  3052     QSqlQuery q(db);
       
  3053     const QString tableName(qTableName("bug5765", __FILE__));
       
  3054 
       
  3055     QVERIFY_SQL(q, exec("CREATE TABLE "+tableName+"(testval TINYINT(1) DEFAULT 0)"));
       
  3056     q.prepare("INSERT INTO "+tableName+" SET testval = :VALUE");
       
  3057     q.bindValue(":VALUE", 1);
       
  3058     QVERIFY_SQL(q, exec());
       
  3059     q.bindValue(":VALUE", 12);
       
  3060     QVERIFY_SQL(q, exec());
       
  3061     q.bindValue(":VALUE", 123);
       
  3062     QVERIFY_SQL(q, exec());
       
  3063     QString sql="select testval from "+tableName;
       
  3064     QVERIFY_SQL(q, exec(sql));
       
  3065     QVERIFY_SQL(q, next());
       
  3066     QCOMPARE(q.value(0).toInt(), 1);
       
  3067     QVERIFY_SQL(q, next());
       
  3068     QCOMPARE(q.value(0).toInt(), 12);
       
  3069     QVERIFY_SQL(q, next());
       
  3070     QCOMPARE(q.value(0).toInt(), 123);
       
  3071     QVERIFY_SQL(q, prepare(sql));
       
  3072     QVERIFY_SQL(q, exec());
       
  3073     QVERIFY_SQL(q, next());
       
  3074     QCOMPARE(q.value(0).toInt(), 1);
       
  3075     QVERIFY_SQL(q, next());
       
  3076     QCOMPARE(q.value(0).toInt(), 12);
       
  3077     QVERIFY_SQL(q, next());
       
  3078     QCOMPARE(q.value(0).toInt(), 123);
       
  3079 }
       
  3080 
       
  3081 #if 0
       
  3082 void tst_QSqlQuery::benchmark()
       
  3083 {
       
  3084     QFETCH( QString, dbName );
       
  3085     QSqlDatabase db = QSqlDatabase::database( dbName );
       
  3086     CHECK_DATABASE( db );
       
  3087     if ( tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 )
       
  3088         QSKIP( "Test requires MySQL >= 5.0", SkipSingle );
       
  3089 
       
  3090     QSqlQuery q(db);
       
  3091     const QString tableName(qTableName("benchmark", __FILE__));
       
  3092 
       
  3093     tst_Databases::safeDropTable( db, tableName );
       
  3094 
       
  3095     QVERIFY_SQL(q, exec("CREATE TABLE "+tableName+"(\n"
       
  3096                         "MainKey INT NOT NULL,\n"
       
  3097                         "OtherTextCol VARCHAR(45) NOT NULL,\n"
       
  3098                         "PRIMARY KEY(`MainKey`))"));
       
  3099 
       
  3100     int i=1;
       
  3101 
       
  3102     QBENCHMARK {
       
  3103         QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" VALUES("+QString::number(i)+", \"Value"+QString::number(i)+"\")"));
       
  3104         i++;
       
  3105     }
       
  3106 
       
  3107     tst_Databases::safeDropTable( db, tableName );
       
  3108 }
       
  3109 #endif
  2987 
  3110 
  2988 QTEST_MAIN( tst_QSqlQuery )
  3111 QTEST_MAIN( tst_QSqlQuery )
  2989 #include "tst_qsqlquery.moc"
  3112 #include "tst_qsqlquery.moc"