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