312 } else if(tst_Databases::isPostgreSQL(db)) |
314 } else if(tst_Databases::isPostgreSQL(db)) |
313 QVERIFY_SQL( q, exec("set client_min_messages='warning'")); |
315 QVERIFY_SQL( q, exec("set client_min_messages='warning'")); |
314 |
316 |
315 // please never ever change this table; otherwise fix all tests ;) |
317 // please never ever change this table; otherwise fix all tests ;) |
316 if (tst_Databases::isMSAccess(db)) { |
318 if (tst_Databases::isMSAccess(db)) { |
317 QVERIFY_SQL(q, exec("create table " + qTableName("qtest") + |
319 QVERIFY_SQL(q, exec("create table " + qTableName("qtest", __FILE__) + |
318 " (id int not null, t_varchar varchar(40) not null, t_char char(40), " |
320 " (id int not null, t_varchar varchar(40) not null, t_char char(40), " |
319 "t_numeric number, primary key (id, t_varchar))")); |
321 "t_numeric number, primary key (id, t_varchar))")); |
320 } else { |
322 } else { |
321 QVERIFY_SQL(q, exec("create table " + qTableName("qtest") + |
323 QVERIFY_SQL(q, exec("create table " + qTableName("qtest", __FILE__) + |
322 " (id integer not null, t_varchar varchar(40) not null, " |
324 " (id integer not null, t_varchar varchar(40) not null, " |
323 "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar))")); |
325 "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar))")); |
324 } |
326 } |
325 |
327 |
326 if (testWhiteSpaceNames(db.driverName())) { |
328 if (testWhiteSpaceNames(db.driverName())) { |
327 QString qry = "create table " |
329 QString qry = "create table " |
328 + db.driver()->escapeIdentifier(qTableName("qtest") + " test", QSqlDriver::TableName) |
330 + db.driver()->escapeIdentifier(qTableName("qtest", __FILE__) + " test", QSqlDriver::TableName) |
329 + '(' |
331 + '(' |
330 + db.driver()->escapeIdentifier(QLatin1String("test test"), QSqlDriver::FieldName) |
332 + db.driver()->escapeIdentifier(QLatin1String("test test"), QSqlDriver::FieldName) |
331 + " int not null primary key)"; |
333 + " int not null primary key)"; |
332 QVERIFY_SQL(q, exec(qry)); |
334 QVERIFY_SQL(q, exec(qry)); |
333 } |
335 } |
342 QSqlQuery q(db); |
344 QSqlQuery q(db); |
343 QVERIFY_SQL( q, exec("set client_min_messages='warning'")); |
345 QVERIFY_SQL( q, exec("set client_min_messages='warning'")); |
344 } |
346 } |
345 |
347 |
346 // drop the view first, otherwise we'll get dependency problems |
348 // drop the view first, otherwise we'll get dependency problems |
347 tst_Databases::safeDropViews(db, QStringList() << qTableName("qtest_view") << qTableName("qtest_view2")); |
349 tst_Databases::safeDropViews(db, QStringList() << qTableName("qtest_view", __FILE__) << qTableName("qtest_view2", __FILE__)); |
348 |
350 |
349 QStringList tableNames; |
351 QStringList tableNames; |
350 tableNames << qTableName("qtest") |
352 tableNames << qTableName("qtest", __FILE__) |
351 << qTableName("qtestfields") |
353 << qTableName("qtestfields", __FILE__) |
352 << qTableName("qtestalter") |
354 << qTableName("qtestalter", __FILE__) |
353 << qTableName("qtest_temp") |
355 << qTableName("qtest_temp", __FILE__) |
354 << qTableName("qtest_bigint") |
356 << qTableName("qtest_bigint", __FILE__) |
355 << qTableName("qtest_xmltype") |
357 << qTableName("qtest_xmltype", __FILE__) |
356 << qTableName("latin1table") |
358 << qTableName("latin1table", __FILE__) |
357 << qTableName("qtest_sqlguid") |
359 << qTableName("qtest_sqlguid", __FILE__) |
358 << qTableName("batable") |
360 << qTableName("batable", __FILE__) |
359 << qTableName("qtest_prec") |
361 << qTableName("qtest_prec", __FILE__) |
360 << qTableName("uint") |
362 << qTableName("uint", __FILE__) |
361 << qTableName("strings") |
363 << qTableName("strings", __FILE__) |
362 << qTableName("numericfields") |
364 << qTableName("numericfields", __FILE__) |
363 << qTableName("qtest_ibaseblobs") |
365 << qTableName("qtest_ibaseblobs", __FILE__) |
364 << qTableName("qtestBindBool") |
366 << qTableName("qtestBindBool", __FILE__) |
365 << qTableName("testqGetString") |
367 << qTableName("testqGetString", __FILE__) |
366 << qTableName("qtest_sqlguid") |
368 << qTableName("qtest_sqlguid", __FILE__) |
367 << qTableName("uint_table") |
369 << qTableName("uint_table", __FILE__) |
368 << qTableName("uint_test") |
370 << qTableName("uint_test", __FILE__) |
369 << qTableName("bug_249059"); |
371 << qTableName("bug_249059", __FILE__); |
370 |
372 |
371 QSqlQuery q(0, db); |
373 QSqlQuery q(0, db); |
372 if (db.driverName().startsWith("QPSQL")) { |
374 if (db.driverName().startsWith("QPSQL")) { |
373 q.exec("drop schema " + qTableName("qtestschema") + " cascade"); |
375 q.exec("drop schema " + qTableName("qtestschema", __FILE__) + " cascade"); |
374 q.exec("drop schema " + qTableName("qtestScHeMa") + " cascade"); |
376 q.exec("drop schema " + qTableName("qtestScHeMa", __FILE__) + " cascade"); |
375 } |
377 } |
376 |
378 |
377 if (testWhiteSpaceNames(db.driverName())) |
379 if (testWhiteSpaceNames(db.driverName())) |
378 tableNames << db.driver()->escapeIdentifier(qTableName("qtest") + " test", QSqlDriver::TableName); |
380 tableNames << db.driver()->escapeIdentifier(qTableName("qtest", __FILE__) + " test", QSqlDriver::TableName); |
379 |
381 |
380 tst_Databases::safeDropTables(db, tableNames); |
382 tst_Databases::safeDropTables(db, tableNames); |
381 |
383 |
382 if (db.driverName().startsWith("QOCI")) { |
384 if (db.driverName().startsWith("QOCI")) { |
383 q.exec("drop user "+qTableName("CREATOR")+" cascade"); |
385 q.exec("drop user "+qTableName("CREATOR", __FILE__)+" cascade"); |
384 q.exec("drop user "+qTableName("APPUSER")+" cascade"); |
386 q.exec("drop user "+qTableName("APPUSER", __FILE__)+" cascade"); |
385 q.exec("DROP TABLE system."+qTableName("mypassword")); |
387 q.exec("DROP TABLE system."+qTableName("mypassword", __FILE__)); |
386 |
388 |
387 } |
389 } |
388 } |
390 } |
389 |
391 |
390 void tst_QSqlDatabase::populateTestTables(QSqlDatabase db) |
392 void tst_QSqlDatabase::populateTestTables(QSqlDatabase db) |
391 { |
393 { |
392 if (!db.isValid()) |
394 if (!db.isValid()) |
393 return; |
395 return; |
394 QSqlQuery q(db); |
396 QSqlQuery q(db); |
395 |
397 const QString qtest(qTableName("qtest", __FILE__)); |
396 q.exec("delete from " + qTableName("qtest")); //non-fatal |
398 |
397 QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (0, 'VarChar0', 'Char0', 1.1)")); |
399 q.exec("delete from " + qtest); //non-fatal |
398 QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (1, 'VarChar1', 'Char1', 2.2)")); |
400 QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (0, 'VarChar0', 'Char0', 1.1)")); |
399 QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (2, 'VarChar2', 'Char2', 3.3)")); |
401 QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (1, 'VarChar1', 'Char1', 2.2)")); |
400 QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (3, 'VarChar3', 'Char3', 4.4)")); |
402 QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (2, 'VarChar2', 'Char2', 3.3)")); |
401 QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (4, 'VarChar4', NULL, NULL)")); |
403 QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (3, 'VarChar3', 'Char3', 4.4)")); |
|
404 QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (4, 'VarChar4', NULL, NULL)")); |
402 } |
405 } |
403 |
406 |
404 void tst_QSqlDatabase::initTestCase() |
407 void tst_QSqlDatabase::initTestCase() |
405 { |
408 { |
406 dbs.open(); |
409 dbs.open(); |
508 { |
511 { |
509 QFETCH(QString, dbName); |
512 QFETCH(QString, dbName); |
510 QSqlDatabase db = QSqlDatabase::database(dbName); |
513 QSqlDatabase db = QSqlDatabase::database(dbName); |
511 CHECK_DATABASE(db); |
514 CHECK_DATABASE(db); |
512 |
515 |
|
516 const QString qtest(qTableName("qtest", __FILE__)), qtest_view(qTableName("qtest_view", __FILE__)), temp_tab(qTableName("test_tab", __FILE__)); |
|
517 |
513 bool views = true; |
518 bool views = true; |
514 bool tempTables = false; |
519 bool tempTables = false; |
515 |
520 |
516 QSqlQuery q(db); |
521 QSqlQuery q(db); |
517 if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) |
522 if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) |
518 QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); |
523 QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); |
519 |
524 |
520 |
525 |
521 if (!q.exec("CREATE VIEW " + qTableName("qtest_view") + " as select * from " + qTableName("qtest"))) { |
526 if (!q.exec("CREATE VIEW " + qtest_view + " as select * from " + qtest)) { |
522 qDebug(QString("DBMS '%1' cannot handle VIEWs: %2").arg( |
527 qDebug(QString("DBMS '%1' cannot handle VIEWs: %2").arg( |
523 tst_Databases::dbToString(db)).arg(QString(tst_Databases::printError(q.lastError()))).toLatin1()); |
528 tst_Databases::dbToString(db)).arg(QString(tst_Databases::printError(q.lastError()))).toLatin1()); |
524 views = false; |
529 views = false; |
525 } |
530 } |
526 |
531 |
527 if (db.driverName().startsWith("QSQLITE3")) { |
532 if (db.driverName().startsWith("QSQLITE3")) { |
528 QVERIFY_SQL(q, exec("CREATE TEMPORARY TABLE " + qTableName("temp_tab") + " (id int)")); |
533 QVERIFY_SQL(q, exec("CREATE TEMPORARY TABLE " + temp_tab + " (id int)")); |
529 tempTables = true; |
534 tempTables = true; |
530 } |
535 } |
531 |
536 |
532 QStringList tables = db.tables(QSql::Tables); |
537 QStringList tables = db.tables(QSql::Tables); |
533 QVERIFY(tables.contains(qTableName("qtest"), Qt::CaseInsensitive)); |
538 QVERIFY(tables.contains(qtest, Qt::CaseInsensitive)); |
534 QVERIFY(!tables.contains("sql_features", Qt::CaseInsensitive)); //check for postgres 7.4 internal tables |
539 QVERIFY(!tables.contains("sql_features", Qt::CaseInsensitive)); //check for postgres 7.4 internal tables |
535 if (views) { |
540 if (views) { |
536 QVERIFY(!tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive)); |
541 QVERIFY(!tables.contains(qtest_view, Qt::CaseInsensitive)); |
537 } |
542 } |
538 if (tempTables) |
543 if (tempTables) |
539 QVERIFY(tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive)); |
544 QVERIFY(tables.contains(temp_tab, Qt::CaseInsensitive)); |
540 |
545 |
541 tables = db.tables(QSql::Views); |
546 tables = db.tables(QSql::Views); |
542 if (views) { |
547 if (views) { |
543 if(!tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive)) |
548 if(!tables.contains(qtest_view, Qt::CaseInsensitive)) |
544 qDebug() << "failed to find" << qTableName("qtest_view") << "in" << tables; |
549 qDebug() << "failed to find" << qtest_view << "in" << tables; |
545 QVERIFY(tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive)); |
550 QVERIFY(tables.contains(qtest_view, Qt::CaseInsensitive)); |
546 } |
551 } |
547 if (tempTables) |
552 if (tempTables) |
548 QVERIFY(!tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive)); |
553 QVERIFY(!tables.contains(temp_tab, Qt::CaseInsensitive)); |
549 QVERIFY(!tables.contains(qTableName("qtest"), Qt::CaseInsensitive)); |
554 QVERIFY(!tables.contains(qtest, Qt::CaseInsensitive)); |
550 |
555 |
551 tables = db.tables(QSql::SystemTables); |
556 tables = db.tables(QSql::SystemTables); |
552 QVERIFY(!tables.contains(qTableName("qtest"), Qt::CaseInsensitive)); |
557 QVERIFY(!tables.contains(qtest, Qt::CaseInsensitive)); |
553 QVERIFY(!tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive)); |
558 QVERIFY(!tables.contains(qtest_view, Qt::CaseInsensitive)); |
554 QVERIFY(!tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive)); |
559 QVERIFY(!tables.contains(temp_tab, Qt::CaseInsensitive)); |
555 |
560 |
556 tables = db.tables(QSql::AllTables); |
561 tables = db.tables(QSql::AllTables); |
557 if (views) |
562 if (views) |
558 QVERIFY(tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive)); |
563 QVERIFY(tables.contains(qtest_view, Qt::CaseInsensitive)); |
559 if (tempTables) |
564 if (tempTables) |
560 QVERIFY(tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive)); |
565 QVERIFY(tables.contains(temp_tab, Qt::CaseInsensitive)); |
561 QVERIFY(tables.contains(qTableName("qtest"), Qt::CaseInsensitive)); |
566 QVERIFY(tables.contains(qtest, Qt::CaseInsensitive)); |
562 |
567 |
563 if (db.driverName().startsWith("QPSQL")) { |
568 if (db.driverName().startsWith("QPSQL")) { |
564 QVERIFY(tables.contains(qTableName("qtest") + " test")); |
569 QVERIFY(tables.contains(qtest + " test")); |
565 } |
570 } |
566 } |
571 } |
567 |
572 |
568 void tst_QSqlDatabase::whitespaceInIdentifiers() |
573 void tst_QSqlDatabase::whitespaceInIdentifiers() |
569 { |
574 { |
570 QFETCH(QString, dbName); |
575 QFETCH(QString, dbName); |
571 QSqlDatabase db = QSqlDatabase::database(dbName); |
576 QSqlDatabase db = QSqlDatabase::database(dbName); |
572 CHECK_DATABASE(db); |
577 CHECK_DATABASE(db); |
573 |
578 |
574 if (testWhiteSpaceNames(db.driverName())) { |
579 if (testWhiteSpaceNames(db.driverName())) { |
575 QString tableName = qTableName("qtest") + " test"; |
580 const QString tableName(qTableName("qtest", __FILE__) + " test"); |
576 QVERIFY(db.tables().contains(tableName, Qt::CaseInsensitive)); |
581 QVERIFY(db.tables().contains(tableName, Qt::CaseInsensitive)); |
577 |
582 |
578 QSqlRecord rec = db.record(db.driver()->escapeIdentifier(tableName, QSqlDriver::TableName)); |
583 QSqlRecord rec = db.record(db.driver()->escapeIdentifier(tableName, QSqlDriver::TableName)); |
579 QCOMPARE(rec.count(), 1); |
584 QCOMPARE(rec.count(), 1); |
580 QCOMPARE(rec.fieldName(0), QString("test test")); |
585 QCOMPARE(rec.fieldName(0), QString("test test")); |
726 { |
732 { |
727 CHECK_DATABASE(db); |
733 CHECK_DATABASE(db); |
728 |
734 |
729 // check whether recordInfo returns the right types |
735 // check whether recordInfo returns the right types |
730 #ifdef QT3_SUPPORT |
736 #ifdef QT3_SUPPORT |
731 Q3SqlRecordInfo inf = db.recordInfo(qTableName("qtestfields")); |
737 Q3SqlRecordInfo inf = db.recordInfo(qTableName("qtestfields", __FILE__)); |
732 QCOMPARE((int)inf.count(), fieldCount+1); |
738 QCOMPARE((int)inf.count(), fieldCount+1); |
733 testRecordInfo(fieldDefs, inf); |
739 testRecordInfo(fieldDefs, inf); |
734 #endif |
740 #endif |
735 |
741 |
736 QSqlRecord rec = db.record(qTableName("qtestfields")); |
742 QSqlRecord rec = db.record(qTableName("qtestfields", __FILE__)); |
737 QCOMPARE((int)rec.count(), fieldCount+1); |
743 QCOMPARE((int)rec.count(), fieldCount+1); |
738 testRecord(fieldDefs, rec, db); |
744 testRecord(fieldDefs, rec, db); |
739 |
745 |
740 QSqlQuery q(db); |
746 QSqlQuery q(db); |
741 QVERIFY_SQL(q, exec("select * from " + qTableName("qtestfields"))); |
747 QVERIFY_SQL(q, exec("select * from " + qTableName("qtestfields", __FILE__))); |
742 |
748 |
743 #ifdef QT3_SUPPORT |
749 #ifdef QT3_SUPPORT |
744 inf = db.recordInfo(q); |
750 inf = db.recordInfo(q); |
745 QCOMPARE((int)inf.count(), fieldCount+1); |
751 QCOMPARE((int)inf.count(), fieldCount+1); |
746 testRecordInfo(fieldDefs, inf); |
752 testRecordInfo(fieldDefs, inf); |
901 QFETCH(QString, dbName); |
907 QFETCH(QString, dbName); |
902 QSqlDatabase db = QSqlDatabase::database(dbName); |
908 QSqlDatabase db = QSqlDatabase::database(dbName); |
903 CHECK_DATABASE(db); |
909 CHECK_DATABASE(db); |
904 |
910 |
905 // runtime check for Oracle version since V8 doesn't support TIMESTAMPs |
911 // runtime check for Oracle version since V8 doesn't support TIMESTAMPs |
906 if (tst_Databases::getOraVersion(db) >= 9) { |
912 if (tst_Databases::getOraVersion(db) >= 9) |
907 qDebug("Detected Oracle >= 9, TIMESTAMP test enabled"); |
913 hasTimeStamp = true; |
908 hasTimeStamp = true; |
|
909 } else { |
|
910 qDebug("Detected Oracle < 9, TIMESTAMP test disabled"); |
|
911 } |
|
912 |
914 |
913 FieldDef tsdef; |
915 FieldDef tsdef; |
914 FieldDef tstzdef; |
916 FieldDef tstzdef; |
915 FieldDef tsltzdef; |
917 FieldDef tsltzdef; |
916 FieldDef intytm; |
918 FieldDef intytm; |
917 FieldDef intdts; |
919 FieldDef intdts; |
918 |
920 |
919 static const QDateTime dt(QDate::currentDate(), QTime(1, 2, 3, 0)); |
921 static const QDateTime dt(QDate::currentDate(), QTime(1, 2, 3, 0)); |
920 |
922 |
921 if (hasTimeStamp) { |
923 if (hasTimeStamp) { |
922 tsdef = FieldDef("timestamp", QVariant::DateTime, dt); |
924 tsdef = FieldDef("timestamp", QVariant::DateTime, dt); |
923 tstzdef = FieldDef("timestamp with time zone", QVariant::DateTime, dt); |
925 tstzdef = FieldDef("timestamp with time zone", QVariant::DateTime, dt); |
924 tsltzdef = FieldDef("timestamp with local time zone", QVariant::DateTime, dt); |
926 tsltzdef = FieldDef("timestamp with local time zone", QVariant::DateTime, dt); |
925 intytm = FieldDef("interval year to month", QVariant::String, QString("+01-01")); |
927 intytm = FieldDef("interval year to month", QVariant::String, QString("+01-01")); |
926 intdts = FieldDef("interval day to second", QVariant::String, QString("+01 00:00:01.000000")); |
928 intdts = FieldDef("interval day to second", QVariant::String, QString("+01 00:00:01.000000")); |
927 } |
929 } |
928 |
930 |
929 const FieldDef fieldDefs[] = { |
931 const FieldDef fieldDefs[] = { |
930 FieldDef("char(20)", QVariant::String, QString("blah1")), |
932 FieldDef("char(20)", QVariant::String, QString("blah1")), |
931 FieldDef("varchar(20)", QVariant::String, QString("blah2")), |
933 FieldDef("varchar(20)", QVariant::String, QString("blah2")), |
936 FieldDef("long raw", QVariant::ByteArray, QByteArray("blah5")), |
938 FieldDef("long raw", QVariant::ByteArray, QByteArray("blah5")), |
937 FieldDef("raw(2000)", QVariant::ByteArray, QByteArray("blah6"), false), |
939 FieldDef("raw(2000)", QVariant::ByteArray, QByteArray("blah6"), false), |
938 FieldDef("blob", QVariant::ByteArray, QByteArray("blah7")), |
940 FieldDef("blob", QVariant::ByteArray, QByteArray("blah7")), |
939 FieldDef("clob", QVariant::String, QString("blah8")), |
941 FieldDef("clob", QVariant::String, QString("blah8")), |
940 FieldDef("nclob", QVariant::String, QString("blah9")), |
942 FieldDef("nclob", QVariant::String, QString("blah9")), |
941 FieldDef("bfile", QVariant::ByteArray, QByteArray("blah10")), |
943 // FieldDef("bfile", QVariant::ByteArray, QByteArray("blah10")), |
942 |
944 |
943 intytm, |
945 intytm, |
944 // intdts, |
946 intdts, |
945 // tsdef, |
947 tsdef, |
946 // tstzdef, |
948 tstzdef, |
947 // tsltzdef, |
949 tsltzdef, |
948 FieldDef() |
950 FieldDef() |
949 }; |
951 }; |
950 |
952 |
951 const int fieldCount = createFieldTable(fieldDefs, db); |
953 const int fieldCount = createFieldTable(fieldDefs, db); |
952 QVERIFY(fieldCount > 0); |
954 QVERIFY(fieldCount > 0); |
953 |
955 |
954 commonFieldTest(fieldDefs, db, fieldCount); |
956 commonFieldTest(fieldDefs, db, fieldCount); |
955 checkNullValues(fieldDefs, db); |
957 checkNullValues(fieldDefs, db); |
956 for (int i = 0; i < ITERATION_COUNT; ++i) { |
958 for (int i = 0; i < ITERATION_COUNT; ++i) |
957 checkValues(fieldDefs, db); |
959 checkValues(fieldDefs, db); |
958 } |
|
959 |
960 |
960 // some additional tests |
961 // some additional tests |
961 QSqlRecord rec = db.record(qTableName("qtestfields")); |
962 QSqlRecord rec = db.record(qTableName("qtestfields", __FILE__)); |
962 QCOMPARE(rec.field("T_NUMBER").length(), 10); |
963 QCOMPARE(rec.field("T_NUMBER").length(), 10); |
963 QCOMPARE(rec.field("T_NUMBER").precision(), 5); |
964 QCOMPARE(rec.field("T_NUMBER").precision(), 5); |
964 |
965 |
965 QSqlQuery q(db); |
966 QSqlQuery q(db); |
966 QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtestfields"))); |
967 QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtestfields", __FILE__))); |
967 rec = q.record(); |
968 rec = q.record(); |
968 QCOMPARE(rec.field("T_NUMBER").length(), 10); |
969 QCOMPARE(rec.field("T_NUMBER").length(), 10); |
969 QCOMPARE(rec.field("T_NUMBER").precision(), 5); |
970 QCOMPARE(rec.field("T_NUMBER").precision(), 5); |
970 } |
971 } |
971 |
972 |
1326 void tst_QSqlDatabase::transaction() |
1327 void tst_QSqlDatabase::transaction() |
1327 { |
1328 { |
1328 QFETCH(QString, dbName); |
1329 QFETCH(QString, dbName); |
1329 QSqlDatabase db = QSqlDatabase::database(dbName); |
1330 QSqlDatabase db = QSqlDatabase::database(dbName); |
1330 CHECK_DATABASE(db); |
1331 CHECK_DATABASE(db); |
|
1332 const QString qtest(qTableName("qtest", __FILE__)); |
1331 |
1333 |
1332 if (!db.driver()->hasFeature(QSqlDriver::Transactions)) { |
1334 if (!db.driver()->hasFeature(QSqlDriver::Transactions)) { |
1333 QSKIP("DBMS not transaction capable", SkipSingle); |
1335 QSKIP("DBMS not transaction capable", SkipSingle); |
1334 } |
1336 } |
1335 |
1337 |
1336 QVERIFY(db.transaction()); |
1338 QVERIFY(db.transaction()); |
1337 |
1339 |
1338 QSqlQuery q(db); |
1340 QSqlQuery q(db); |
1339 QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " values (40, 'VarChar40', 'Char40', 40.40)")); |
1341 QVERIFY_SQL(q, exec("insert into " + qtest + " values (40, 'VarChar40', 'Char40', 40.40)")); |
1340 QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 40")); |
1342 QVERIFY_SQL(q, exec("select * from " + qtest + " where id = 40")); |
1341 QVERIFY(q.next()); |
1343 QVERIFY(q.next()); |
1342 QCOMPARE(q.value(0).toInt(), 40); |
1344 QCOMPARE(q.value(0).toInt(), 40); |
1343 q.clear(); |
1345 q.clear(); |
1344 |
1346 |
1345 QVERIFY(db.commit()); |
1347 QVERIFY(db.commit()); |
1346 |
1348 |
1347 QVERIFY(db.transaction()); |
1349 QVERIFY(db.transaction()); |
1348 QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 40")); |
1350 QVERIFY_SQL(q, exec("select * from " + qtest + " where id = 40")); |
1349 QVERIFY(q.next()); |
1351 QVERIFY(q.next()); |
1350 QCOMPARE(q.value(0).toInt(), 40); |
1352 QCOMPARE(q.value(0).toInt(), 40); |
1351 q.clear(); |
1353 q.clear(); |
1352 QVERIFY(db.commit()); |
1354 QVERIFY(db.commit()); |
1353 |
1355 |
1354 QVERIFY(db.transaction()); |
1356 QVERIFY(db.transaction()); |
1355 QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " values (41, 'VarChar41', 'Char41', 41.41)")); |
1357 QVERIFY_SQL(q, exec("insert into " + qtest + " values (41, 'VarChar41', 'Char41', 41.41)")); |
1356 QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 41")); |
1358 QVERIFY_SQL(q, exec("select * from " + qtest + " where id = 41")); |
1357 QVERIFY(q.next()); |
1359 QVERIFY(q.next()); |
1358 QCOMPARE(q.value(0).toInt(), 41); |
1360 QCOMPARE(q.value(0).toInt(), 41); |
1359 q.clear(); // for SQLite which does not allow any references on rows that shall be rolled back |
1361 q.clear(); // for SQLite which does not allow any references on rows that shall be rolled back |
1360 if (!db.rollback()) { |
1362 if (!db.rollback()) { |
1361 if (db.driverName().startsWith("QMYSQL")) { |
1363 if (db.driverName().startsWith("QMYSQL")) { |
1378 { |
1380 { |
1379 QFETCH(QString, dbName); |
1381 QFETCH(QString, dbName); |
1380 QSqlDatabase db = QSqlDatabase::database(dbName); |
1382 QSqlDatabase db = QSqlDatabase::database(dbName); |
1381 CHECK_DATABASE(db); |
1383 CHECK_DATABASE(db); |
1382 QString drvName = db.driverName(); |
1384 QString drvName = db.driverName(); |
|
1385 const QString qtest_bigint(qTableName("qtest_bigint", __FILE__)); |
1383 |
1386 |
1384 QSqlQuery q(db); |
1387 QSqlQuery q(db); |
1385 q.setForwardOnly(true); |
1388 q.setForwardOnly(true); |
1386 if (drvName.startsWith("QOCI")) |
1389 if (drvName.startsWith("QOCI")) |
1387 q.setNumericalPrecisionPolicy(QSql::LowPrecisionInt64); |
1390 q.setNumericalPrecisionPolicy(QSql::LowPrecisionInt64); |
1388 |
1391 |
1389 if (drvName.startsWith("QMYSQL")) { |
1392 if (drvName.startsWith("QMYSQL")) { |
1390 QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + " (id int, t_s64bit bigint, t_u64bit bigint unsigned)")); |
1393 QVERIFY_SQL(q, exec("create table " + qtest_bigint + " (id int, t_s64bit bigint, t_u64bit bigint unsigned)")); |
1391 } else if (drvName.startsWith("QPSQL") |
1394 } else if (drvName.startsWith("QPSQL") |
1392 || drvName.startsWith("QDB2") |
1395 || drvName.startsWith("QDB2") |
1393 || tst_Databases::isSqlServer(db)) { |
1396 || tst_Databases::isSqlServer(db)) { |
1394 QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + "(id int, t_s64bit bigint, t_u64bit bigint)")); |
1397 QVERIFY_SQL(q, exec("create table " + qtest_bigint + "(id int, t_s64bit bigint, t_u64bit bigint)")); |
1395 } else if (drvName.startsWith("QOCI")) { |
1398 } else if (drvName.startsWith("QOCI")) { |
1396 QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + " (id int, t_s64bit int, t_u64bit int)")); |
1399 QVERIFY_SQL(q, exec("create table " + qtest_bigint + " (id int, t_s64bit int, t_u64bit int)")); |
1397 //} else if (drvName.startsWith("QIBASE")) { |
1400 //} else if (drvName.startsWith("QIBASE")) { |
1398 // QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + " (id int, t_s64bit int64, t_u64bit int64)")); |
1401 // QVERIFY_SQL(q, exec("create table " + qtest_bigint + " (id int, t_s64bit int64, t_u64bit int64)")); |
1399 } else { |
1402 } else { |
1400 QSKIP("no 64 bit integer support", SkipAll); |
1403 QSKIP("no 64 bit integer support", SkipAll); |
1401 } |
1404 } |
1402 QVERIFY(q.prepare("insert into " + qTableName("qtest_bigint") + " values (?, ?, ?)")); |
1405 QVERIFY(q.prepare("insert into " + qtest_bigint + " values (?, ?, ?)")); |
1403 qlonglong ll = Q_INT64_C(9223372036854775807); |
1406 qlonglong ll = Q_INT64_C(9223372036854775807); |
1404 qulonglong ull = Q_UINT64_C(18446744073709551615); |
1407 qulonglong ull = Q_UINT64_C(18446744073709551615); |
1405 |
1408 |
1406 if (drvName.startsWith("QMYSQL") || drvName.startsWith("QOCI")) { |
1409 if (drvName.startsWith("QMYSQL") || drvName.startsWith("QOCI")) { |
1407 q.bindValue(0, 0); |
1410 q.bindValue(0, 0); |
1448 || db.driverName().startsWith("QSQLITE") |
1451 || db.driverName().startsWith("QSQLITE") |
1449 || db.driverName().startsWith("QTDS") |
1452 || db.driverName().startsWith("QTDS") |
1450 || db.driverName().startsWith("QODBC")) |
1453 || db.driverName().startsWith("QODBC")) |
1451 cs = true; |
1454 cs = true; |
1452 |
1455 |
1453 QSqlRecord rec = db.record(qTableName("qtest")); |
1456 QSqlRecord rec = db.record(qTableName("qtest", __FILE__)); |
1454 QVERIFY((int)rec.count() > 0); |
1457 QVERIFY((int)rec.count() > 0); |
1455 if (!cs) { |
1458 if (!cs) { |
1456 rec = db.record(qTableName("QTEST").toUpper()); |
1459 rec = db.record(qTableName("QTEST", __FILE__).toUpper()); |
1457 QVERIFY((int)rec.count() > 0); |
1460 QVERIFY((int)rec.count() > 0); |
1458 rec = db.record(qTableName("qTesT")); |
1461 rec = db.record(qTableName("qTesT", __FILE__)); |
1459 QVERIFY((int)rec.count() > 0); |
1462 QVERIFY((int)rec.count() > 0); |
1460 } |
1463 } |
1461 |
1464 |
1462 #ifdef QT3_SUPPORT |
1465 #ifdef QT3_SUPPORT |
1463 Q3SqlRecordInfo rInf = db.recordInfo(qTableName("qtest")); |
1466 Q3SqlRecordInfo rInf = db.recordInfo(qTableName("qtest", __FILE__)); |
1464 QVERIFY((int)rInf.count() > 0); |
1467 QVERIFY((int)rInf.count() > 0); |
1465 if (!cs) { |
1468 if (!cs) { |
1466 rInf = db.recordInfo(qTableName("QTEST").upper()); |
1469 rInf = db.recordInfo(qTableName("QTEST", __FILE__).upper()); |
1467 QVERIFY((int)rInf.count() > 0); |
1470 QVERIFY((int)rInf.count() > 0); |
1468 rInf = db.recordInfo(qTableName("qTesT")); |
1471 rInf = db.recordInfo(qTableName("qTesT", __FILE__)); |
1469 QVERIFY((int)rInf.count() > 0); |
1472 QVERIFY((int)rInf.count() > 0); |
1470 } |
1473 } |
1471 #endif |
1474 #endif |
1472 |
1475 |
1473 rec = db.primaryIndex(qTableName("qtest")); |
1476 rec = db.primaryIndex(qTableName("qtest", __FILE__)); |
1474 QVERIFY((int)rec.count() > 0); |
1477 QVERIFY((int)rec.count() > 0); |
1475 if (!cs) { |
1478 if (!cs) { |
1476 rec = db.primaryIndex(qTableName("QTEST").toUpper()); |
1479 rec = db.primaryIndex(qTableName("QTEST", __FILE__).toUpper()); |
1477 QVERIFY((int)rec.count() > 0); |
1480 QVERIFY((int)rec.count() > 0); |
1478 rec = db.primaryIndex(qTableName("qTesT")); |
1481 rec = db.primaryIndex(qTableName("qTesT", __FILE__)); |
1479 QVERIFY((int)rec.count() > 0); |
1482 QVERIFY((int)rec.count() > 0); |
1480 } |
1483 } |
1481 } |
1484 } |
1482 |
1485 |
1483 void tst_QSqlDatabase::noEscapedFieldNamesInRecord() |
1486 void tst_QSqlDatabase::noEscapedFieldNamesInRecord() |
1577 QCOMPARE(rec.field(0).type(), QVariant::Int); |
1580 QCOMPARE(rec.field(0).type(), QVariant::Int); |
1578 |
1581 |
1579 q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName)); |
1582 q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName)); |
1580 } |
1583 } |
1581 |
1584 |
1582 |
|
1583 void tst_QSqlDatabase::psql_escapeBytea() |
1585 void tst_QSqlDatabase::psql_escapeBytea() |
1584 { |
1586 { |
1585 QFETCH(QString, dbName); |
1587 QFETCH(QString, dbName); |
1586 QSqlDatabase db = QSqlDatabase::database(dbName); |
1588 QSqlDatabase db = QSqlDatabase::database(dbName); |
1587 CHECK_DATABASE(db); |
1589 CHECK_DATABASE(db); |
1588 |
1590 |
1589 const char dta[4] = {'\x71', '\x14', '\x32', '\x81'}; |
1591 const char dta[4] = {'\x71', '\x14', '\x32', '\x81'}; |
1590 QByteArray ba(dta, 4); |
1592 QByteArray ba(dta, 4); |
1591 |
1593 |
1592 QSqlQuery q(db); |
1594 QSqlQuery q(db); |
1593 QString tableName = qTableName("batable"); |
1595 const QString tableName(qTableName("batable", __FILE__)); |
1594 QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (ba bytea)").arg(tableName))); |
1596 QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (ba bytea)").arg(tableName))); |
1595 |
1597 |
1596 QSqlQuery iq(db); |
1598 QSqlQuery iq(db); |
1597 QVERIFY_SQL(iq, prepare(QString("INSERT INTO %1 VALUES (?)").arg(tableName))); |
1599 QVERIFY_SQL(iq, prepare(QString("INSERT INTO %1 VALUES (?)").arg(tableName))); |
1598 iq.bindValue(0, QVariant(ba)); |
1600 iq.bindValue(0, QVariant(ba)); |
1779 QSKIP("MS Access specific test", SkipSingle); |
1781 QSKIP("MS Access specific test", SkipSingle); |
1780 return; |
1782 return; |
1781 } |
1783 } |
1782 |
1784 |
1783 QSqlQuery q(db); |
1785 QSqlQuery q(db); |
1784 QString tableName = qTableName("strings"); |
1786 const QString tableName(qTableName("strings", __FILE__)); |
1785 QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (aStr memo, bStr memo, cStr memo, dStr memo" |
1787 QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (aStr memo, bStr memo, cStr memo, dStr memo" |
1786 ", eStr memo, fStr memo, gStr memo, hStr memo)").arg(tableName))); |
1788 ", eStr memo, fStr memo, gStr memo, hStr memo)").arg(tableName))); |
1787 |
1789 |
1788 QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES (?, ?, ?, ?, ?, ?, ?, ?)").arg(tableName))); |
1790 QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES (?, ?, ?, ?, ?, ?, ?, ?)").arg(tableName))); |
1789 QString aStr, bStr, cStr, dStr, eStr, fStr, gStr, hStr; |
1791 QString aStr, bStr, cStr, dStr, eStr, fStr, gStr, hStr; |
1817 QFETCH(QString, dbName); |
1819 QFETCH(QString, dbName); |
1818 QSqlDatabase db = QSqlDatabase::database(dbName); |
1820 QSqlDatabase db = QSqlDatabase::database(dbName); |
1819 CHECK_DATABASE(db); |
1821 CHECK_DATABASE(db); |
1820 |
1822 |
1821 QSqlQuery q(db); |
1823 QSqlQuery q(db); |
1822 QString tableName = qTableName("numericfields"); |
1824 const QString tableName(qTableName("numericfields", __FILE__)); |
1823 QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (id int not null, num1 NUMERIC(2,1), " |
1825 QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (id int not null, num1 NUMERIC(2,1), " |
1824 "num2 NUMERIC(5,2), num3 NUMERIC(10,3), " |
1826 "num2 NUMERIC(5,2), num3 NUMERIC(10,3), " |
1825 "num4 NUMERIC(18,4))").arg(tableName))); |
1827 "num4 NUMERIC(18,4))").arg(tableName))); |
1826 |
1828 |
1827 QVERIFY_SQL(q, exec(QString("INSERT INTO %1 VALUES (1, 1.1, 123.45, 1234567.123, 10203040506070.8090)").arg(tableName))); |
1829 QVERIFY_SQL(q, exec(QString("INSERT INTO %1 VALUES (1, 1.1, 123.45, 1234567.123, 10203040506070.8090)").arg(tableName))); |
1982 QSqlDatabase db = QSqlDatabase::database(dbName); |
1984 QSqlDatabase db = QSqlDatabase::database(dbName); |
1983 CHECK_DATABASE(db); |
1985 CHECK_DATABASE(db); |
1984 |
1986 |
1985 QSqlQuery q(db); |
1987 QSqlQuery q(db); |
1986 |
1988 |
1987 QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (50, 'Trim Test ', 'Trim Test 2 ')").arg(qTableName("qtest")))); |
1989 QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (50, 'Trim Test ', 'Trim Test 2 ')").arg(qTableName("qtest", __FILE__)))); |
1988 QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (51, 'TrimTest', 'Trim Test 2')").arg(qTableName("qtest")))); |
1990 QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (51, 'TrimTest', 'Trim Test 2')").arg(qTableName("qtest", __FILE__)))); |
1989 QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (52, ' ', ' ')").arg(qTableName("qtest")))); |
1991 QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (52, ' ', ' ')").arg(qTableName("qtest", __FILE__)))); |
1990 |
1992 |
1991 QVERIFY_SQL(q, exec(QString("SELECT t_varchar, t_char FROM %1 WHERE id >= 50 AND id <= 52 ORDER BY id").arg(qTableName("qtest")))); |
1993 QVERIFY_SQL(q, exec(QString("SELECT t_varchar, t_char FROM %1 WHERE id >= 50 AND id <= 52 ORDER BY id").arg(qTableName("qtest", __FILE__)))); |
1992 |
1994 |
1993 QVERIFY_SQL(q, next()); |
1995 QVERIFY_SQL(q, next()); |
1994 |
1996 |
1995 QCOMPARE(db.driver()->formatValue(q.record().field(0), true), QString("'Trim Test'")); |
1997 QCOMPARE(db.driver()->formatValue(q.record().field(0), true), QString("'Trim Test'")); |
1996 QCOMPARE(db.driver()->formatValue(q.record().field(1), true), QString("'Trim Test 2'")); |
1998 QCOMPARE(db.driver()->formatValue(q.record().field(1), true), QString("'Trim Test 2'")); |
2030 QSKIP("MySql has inconsistent behaviour of bit field type across versions.", SkipSingle); |
2032 QSKIP("MySql has inconsistent behaviour of bit field type across versions.", SkipSingle); |
2031 return; |
2033 return; |
2032 } |
2034 } |
2033 |
2035 |
2034 QSqlQuery q(db); |
2036 QSqlQuery q(db); |
2035 QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("qtestBindBool") + "(id int, boolvalue bit)")); |
2037 QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("qtestBindBool", __FILE__) + "(id int, boolvalue bit)")); |
2036 |
2038 |
2037 // Bind and insert |
2039 // Bind and insert |
2038 QVERIFY_SQL(q, prepare("INSERT INTO " + qTableName("qtestBindBool") + " VALUES(?, ?)")); |
2040 QVERIFY_SQL(q, prepare("INSERT INTO " + qTableName("qtestBindBool", __FILE__) + " VALUES(?, ?)")); |
2039 q.bindValue(0, 1); |
2041 q.bindValue(0, 1); |
2040 q.bindValue(1, true); |
2042 q.bindValue(1, true); |
2041 QVERIFY_SQL(q, exec()); |
2043 QVERIFY_SQL(q, exec()); |
2042 q.bindValue(0, 2); |
2044 q.bindValue(0, 2); |
2043 q.bindValue(1, false); |
2045 q.bindValue(1, false); |
2044 QVERIFY_SQL(q, exec()); |
2046 QVERIFY_SQL(q, exec()); |
2045 |
2047 |
2046 // Retrive |
2048 // Retrive |
2047 QVERIFY_SQL(q, exec("SELECT id, boolvalue FROM " + qTableName("qtestBindBool") + " ORDER BY id")); |
2049 QVERIFY_SQL(q, exec("SELECT id, boolvalue FROM " + qTableName("qtestBindBool", __FILE__) + " ORDER BY id")); |
2048 QVERIFY_SQL(q, next()); |
2050 QVERIFY_SQL(q, next()); |
2049 QCOMPARE(q.value(0).toInt(), 1); |
2051 QCOMPARE(q.value(0).toInt(), 1); |
2050 QCOMPARE(q.value(1).toBool(), true); |
2052 QCOMPARE(q.value(1).toBool(), true); |
2051 QVERIFY_SQL(q, next()); |
2053 QVERIFY_SQL(q, next()); |
2052 QCOMPARE(q.value(0).toInt(), 2); |
2054 QCOMPARE(q.value(0).toInt(), 2); |
2056 void tst_QSqlDatabase::odbc_testqGetString() |
2058 void tst_QSqlDatabase::odbc_testqGetString() |
2057 { |
2059 { |
2058 QFETCH(QString, dbName); |
2060 QFETCH(QString, dbName); |
2059 QSqlDatabase db = QSqlDatabase::database(dbName); |
2061 QSqlDatabase db = QSqlDatabase::database(dbName); |
2060 CHECK_DATABASE(db); |
2062 CHECK_DATABASE(db); |
|
2063 const QString testqGetString(qTableName("testqGetString", __FILE__)); |
2061 |
2064 |
2062 QSqlQuery q(db); |
2065 QSqlQuery q(db); |
2063 if (tst_Databases::isSqlServer(db)) |
2066 if (tst_Databases::isSqlServer(db)) |
2064 QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue varchar(MAX))")); |
2067 QVERIFY_SQL(q, exec("CREATE TABLE " + testqGetString + "(id int, vcvalue varchar(MAX))")); |
2065 else if(tst_Databases::isMSAccess(db)) |
2068 else if(tst_Databases::isMSAccess(db)) |
2066 QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue memo)")); |
2069 QVERIFY_SQL(q, exec("CREATE TABLE " + testqGetString + "(id int, vcvalue memo)")); |
2067 else |
2070 else |
2068 QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue varchar(65538))")); |
2071 QVERIFY_SQL(q, exec("CREATE TABLE " + testqGetString + "(id int, vcvalue varchar(65538))")); |
2069 |
2072 |
2070 QString largeString; |
2073 QString largeString; |
2071 largeString.fill('A', 65536); |
2074 largeString.fill('A', 65536); |
2072 |
2075 |
2073 // Bind and insert |
2076 // Bind and insert |
2074 QVERIFY_SQL(q, prepare("INSERT INTO " + qTableName("testqGetString") + " VALUES(?, ?)")); |
2077 QVERIFY_SQL(q, prepare("INSERT INTO " + testqGetString + " VALUES(?, ?)")); |
2075 q.bindValue(0, 1); |
2078 q.bindValue(0, 1); |
2076 q.bindValue(1, largeString); |
2079 q.bindValue(1, largeString); |
2077 QVERIFY_SQL(q, exec()); |
2080 QVERIFY_SQL(q, exec()); |
2078 q.bindValue(0, 2); |
2081 q.bindValue(0, 2); |
2079 q.bindValue(1, largeString+QLatin1Char('B')); |
2082 q.bindValue(1, largeString+QLatin1Char('B')); |
2099 void tst_QSqlDatabase::mysql_multiselect() |
2102 void tst_QSqlDatabase::mysql_multiselect() |
2100 { |
2103 { |
2101 QFETCH(QString, dbName); |
2104 QFETCH(QString, dbName); |
2102 QSqlDatabase db = QSqlDatabase::database(dbName); |
2105 QSqlDatabase db = QSqlDatabase::database(dbName); |
2103 CHECK_DATABASE(db); |
2106 CHECK_DATABASE(db); |
|
2107 const QString qtest(qTableName("qtest", __FILE__)); |
2104 |
2108 |
2105 QSqlQuery q(db); |
2109 QSqlQuery q(db); |
2106 QString version=tst_Databases::getMySqlVersion( db ); |
2110 QString version=tst_Databases::getMySqlVersion( db ); |
2107 double ver=version.section(QChar::fromLatin1('.'),0,1).toDouble(); |
2111 double ver=version.section(QChar::fromLatin1('.'),0,1).toDouble(); |
2108 if (ver < 4.1) |
2112 if (ver < 4.1) |
2109 QSKIP("Test requires MySQL >= 4.1", SkipSingle); |
2113 QSKIP("Test requires MySQL >= 4.1", SkipSingle); |
2110 |
2114 |
2111 QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtest") + "; SELECT * FROM " + qTableName("qtest"))); |
2115 QVERIFY_SQL(q, exec("SELECT * FROM " + qtest + "; SELECT * FROM " + qtest)); |
2112 QVERIFY_SQL(q, next()); |
2116 QVERIFY_SQL(q, next()); |
2113 QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtest") + "; SELECT * FROM " + qTableName("qtest"))); |
2117 QVERIFY_SQL(q, exec("SELECT * FROM " + qtest + "; SELECT * FROM " + qtest)); |
2114 QVERIFY_SQL(q, next()); |
2118 QVERIFY_SQL(q, next()); |
2115 QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtest"))); |
2119 QVERIFY_SQL(q, exec("SELECT * FROM " + qtest)); |
2116 } |
2120 } |
2117 |
2121 |
2118 void tst_QSqlDatabase::ibase_useCustomCharset() |
2122 void tst_QSqlDatabase::ibase_useCustomCharset() |
2119 { |
2123 { |
2120 QFETCH(QString, dbName); |
2124 QFETCH(QString, dbName); |
2472 if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 1 ).toDouble()<4.1 ) |
2476 if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 1 ).toDouble()<4.1 ) |
2473 QSKIP( "Test requires MySQL >= 4.1", SkipSingle ); |
2477 QSKIP( "Test requires MySQL >= 4.1", SkipSingle ); |
2474 |
2478 |
2475 QSqlQuery q(db); |
2479 QSqlQuery q(db); |
2476 QVERIFY_SQL(q, exec("begin")); |
2480 QVERIFY_SQL(q, exec("begin")); |
2477 QVERIFY_SQL(q, exec("insert into "+qTableName("qtest")+" VALUES (54, 'foo', 'foo', 54.54)")); |
2481 QVERIFY_SQL(q, exec("insert into "+qTableName("qtest", __FILE__)+" VALUES (54, 'foo', 'foo', 54.54)")); |
2478 QVERIFY_SQL(q, exec("savepoint foo")); |
2482 QVERIFY_SQL(q, exec("savepoint foo")); |
2479 } |
2483 } |
2480 |
2484 |
2481 void tst_QSqlDatabase::oci_tables() |
2485 void tst_QSqlDatabase::oci_tables() |
2482 { |
2486 { |
2483 QFETCH(QString, dbName); |
2487 QFETCH(QString, dbName); |
2484 QSqlDatabase db = QSqlDatabase::database(dbName); |
2488 QSqlDatabase db = QSqlDatabase::database(dbName); |
2485 CHECK_DATABASE(db); |
2489 CHECK_DATABASE(db); |
2486 QSqlQuery q(db); |
2490 QSqlQuery q(db); |
2487 QString systemTableName("system."+qTableName("mypassword")); |
2491 const QString systemTableName("system."+qTableName("mypassword", __FILE__)); |
2488 QVERIFY_SQL(q, exec("CREATE TABLE "+systemTableName+"(name VARCHAR(20))")); |
2492 QVERIFY_SQL(q, exec("CREATE TABLE "+systemTableName+"(name VARCHAR(20))")); |
2489 QVERIFY(!db.tables().contains(systemTableName.toUpper())); |
2493 QVERIFY(!db.tables().contains(systemTableName.toUpper())); |
2490 QVERIFY(db.tables(QSql::SystemTables).contains(systemTableName.toUpper())); |
2494 QVERIFY(db.tables(QSql::SystemTables).contains(systemTableName.toUpper())); |
2491 } |
2495 } |
2492 |
2496 |
|
2497 void tst_QSqlDatabase::sqlite_enable_cache_mode() |
|
2498 { |
|
2499 QFETCH(QString, dbName); |
|
2500 if(dbName.endsWith(":memory:")) |
|
2501 QSKIP( "cache mode is meaningless for :memory: databases", SkipSingle ); |
|
2502 QSqlDatabase db = QSqlDatabase::database(dbName); |
|
2503 CHECK_DATABASE(db); |
|
2504 db.close(); |
|
2505 db.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); |
|
2506 QVERIFY_SQL(db, open()); |
|
2507 QSqlDatabase db2 = QSqlDatabase::cloneDatabase(db, dbName+":cachemodeconn2"); |
|
2508 db2.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); |
|
2509 QVERIFY_SQL(db2, open()); |
|
2510 QSqlQuery q(db), q2(db2); |
|
2511 QVERIFY_SQL(q, exec("select * from "+qTableName("qtest", __FILE__))); |
|
2512 QVERIFY_SQL(q2, exec("select * from "+qTableName("qtest", __FILE__))); |
|
2513 } |
|
2514 |
2493 QTEST_MAIN(tst_QSqlDatabase) |
2515 QTEST_MAIN(tst_QSqlDatabase) |
2494 #include "tst_qsqldatabase.moc" |
2516 #include "tst_qsqldatabase.moc" |