284 |
295 |
285 void tst_QSqlQuery::dropTestTables( QSqlDatabase db ) |
296 void tst_QSqlQuery::dropTestTables( QSqlDatabase db ) |
286 { |
297 { |
287 QStringList tablenames; |
298 QStringList tablenames; |
288 // drop all the table in case a testcase failed |
299 // drop all the table in case a testcase failed |
289 tablenames << qTableName( "qtest" ) |
300 tablenames << qtest |
290 << qTableName( "qtest_null" ) |
301 << qTableName( "qtest_null", __FILE__ ) |
291 << qTableName( "qtest_blob" ) |
302 << qTableName( "qtest_blob", __FILE__ ) |
292 << qTableName( "qtest_bittest" ) |
303 << qTableName( "qtest_bittest", __FILE__ ) |
293 << qTableName( "qtest_nullblob" ) |
304 << qTableName( "qtest_nullblob", __FILE__ ) |
294 << qTableName( "qtest_rawtest" ) |
305 << qTableName( "qtest_rawtest", __FILE__ ) |
295 << qTableName( "qtest_precision" ) |
306 << qTableName( "qtest_precision", __FILE__ ) |
296 << qTableName( "qtest_prepare" ) |
307 << qTableName( "qtest_prepare", __FILE__ ) |
297 << qTableName( "qtestj1" ) |
308 << qTableName( "qtestj1", __FILE__ ) |
298 << qTableName( "qtestj2" ) |
309 << qTableName( "qtestj2", __FILE__ ) |
299 << qTableName( "char1Select" ) |
310 << qTableName( "char1Select", __FILE__ ) |
300 << qTableName( "char1SelectUnicode" ) |
311 << qTableName( "char1SU", __FILE__ ) |
301 << qTableName( "qxmltest" ) |
312 << qTableName( "qxmltest", __FILE__ ) |
302 << qTableName( "qtest_exerr" ) |
313 << qTableName( "qtest_exerr", __FILE__ ) |
303 << qTableName( "qtest_empty" ) |
314 << qTableName( "qtest_empty", __FILE__ ) |
304 << qTableName( "clobby" ) |
315 << qTableName( "clobby", __FILE__ ) |
305 << qTableName( "bindtest" ) |
316 << qTableName( "bindtest", __FILE__ ) |
306 << qTableName( "more_results" ) |
317 << qTableName( "more_results", __FILE__ ) |
307 << qTableName( "blobstest" ) |
318 << qTableName( "blobstest", __FILE__ ) |
308 << qTableName( "oraRowId" ) |
319 << qTableName( "oraRowId", __FILE__ ) |
309 << qTableName( "qtest_batch" ) |
320 << qTableName( "qtest_batch", __FILE__ ) |
310 << qTableName(QLatin1String("bug6421")).toUpper(); |
321 << qTableName("bug6421", __FILE__).toUpper() |
|
322 << qTableName("bug5765", __FILE__) |
|
323 << qTableName("bug6852", __FILE__) |
|
324 << qTableName( "qtest_lockedtable", __FILE__ ) |
|
325 << qTableName( "Planet", __FILE__ ) |
|
326 << qTableName( "task_250026", __FILE__ ) |
|
327 << qTableName( "task_234422", __FILE__ ) |
|
328 << qTableName("test141895", __FILE__); |
311 |
329 |
312 if ( db.driverName().startsWith("QPSQL") ) |
330 if ( db.driverName().startsWith("QPSQL") ) |
313 tablenames << qTableName("task_233829"); |
331 tablenames << qTableName("task_233829", __FILE__); |
314 |
332 |
315 if ( db.driverName().startsWith("QSQLITE") ) |
333 if ( db.driverName().startsWith("QSQLITE") ) |
316 tablenames << qTableName( "record_sqlite" ); |
334 tablenames << qTableName( "record_sqlite", __FILE__ ); |
317 |
335 |
318 if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QOCI" ) ) |
336 if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QOCI" ) ) |
319 tablenames << qTableName( "qtest_longstr" ); |
337 tablenames << qTableName( "qtest_longstr", __FILE__ ); |
320 |
338 |
321 tablenames << qTableName( "qtest_lockedtable" ); |
339 if (tst_Databases::isSqlServer( db )) |
322 |
340 db.exec("DROP PROCEDURE " + qTableName("test141895_proc", __FILE__)); |
323 tablenames << qTableName( "Planet" ); |
341 |
324 |
342 if (tst_Databases::isMySQL( db )) |
325 tablenames << qTableName( "task_250026" ); |
343 db.exec("DROP PROCEDURE IF EXISTS "+qTableName("bug6852_proc", __FILE__)); |
326 tablenames << qTableName( "task_234422" ); |
|
327 |
|
328 if (tst_Databases::isSqlServer( db )) { |
|
329 QSqlQuery q( db ); |
|
330 q.exec("DROP PROCEDURE " + qTableName("test141895_proc")); |
|
331 } |
|
332 |
|
333 tablenames << qTableName("test141895"); |
|
334 |
344 |
335 tst_Databases::safeDropTables( db, tablenames ); |
345 tst_Databases::safeDropTables( db, tablenames ); |
336 |
346 |
337 if ( db.driverName().startsWith( "QOCI" ) ) { |
347 if ( db.driverName().startsWith( "QOCI" ) ) { |
338 QSqlQuery q( db ); |
348 QSqlQuery q( db ); |
339 q.exec( "DROP PACKAGE " + qTableName("pkg") ); |
349 q.exec( "DROP PACKAGE " + qTableName("pkg", __FILE__) ); |
340 } |
350 } |
341 } |
351 } |
342 |
352 |
343 void tst_QSqlQuery::createTestTables( QSqlDatabase db ) |
353 void tst_QSqlQuery::createTestTables( QSqlDatabase db ) |
344 { |
354 { |
350 q.exec( "set table_type=innodb" ); |
360 q.exec( "set table_type=innodb" ); |
351 else if(tst_Databases::isPostgreSQL(db)) |
361 else if(tst_Databases::isPostgreSQL(db)) |
352 QVERIFY_SQL( q, exec("set client_min_messages='warning'")); |
362 QVERIFY_SQL( q, exec("set client_min_messages='warning'")); |
353 |
363 |
354 if(tst_Databases::isPostgreSQL(db)) |
364 if(tst_Databases::isPostgreSQL(db)) |
355 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest" ) + " (id serial NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id)) WITH OIDS" ) ); |
365 QVERIFY_SQL( q, exec( "create table " + qtest + " (id serial NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id)) WITH OIDS" ) ); |
356 else |
366 else |
357 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest" ) + " (id int "+tst_Databases::autoFieldName(db) +" NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id))" ) ); |
367 QVERIFY_SQL( q, exec( "create table " + qtest + " (id int "+tst_Databases::autoFieldName(db) +" NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id))" ) ); |
358 |
368 |
359 if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) ) |
369 if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) ) |
360 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null" ) + " (id int null, t_varchar varchar(20) null)" ) ); |
370 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null", __FILE__ ) + " (id int null, t_varchar varchar(20) null)" ) ); |
361 else |
371 else |
362 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null" ) + " (id int, t_varchar varchar(20))" ) ); |
372 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null", __FILE__ ) + " (id int, t_varchar varchar(20))" ) ); |
363 } |
373 } |
364 |
374 |
365 void tst_QSqlQuery::populateTestTables( QSqlDatabase db ) |
375 void tst_QSqlQuery::populateTestTables( QSqlDatabase db ) |
366 { |
376 { |
367 QSqlQuery q( db ); |
377 QSqlQuery q( db ); |
368 q.exec( "delete from " + qTableName( "qtest" ) ); |
378 const QString qtest_null(qTableName( "qtest_null", __FILE__ )); |
369 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (1, 'VarChar1', 'Char1')" ) ); |
379 q.exec( "delete from " + qtest ); |
370 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (2, 'VarChar2', 'Char2')" ) ); |
380 QVERIFY_SQL( q, exec( "insert into " + qtest + " values (1, 'VarChar1', 'Char1')" ) ); |
371 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (3, 'VarChar3', 'Char3')" ) ); |
381 QVERIFY_SQL( q, exec( "insert into " + qtest + " values (2, 'VarChar2', 'Char2')" ) ); |
372 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (4, 'VarChar4', 'Char4')" ) ); |
382 QVERIFY_SQL( q, exec( "insert into " + qtest + " values (3, 'VarChar3', 'Char3')" ) ); |
373 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (5, 'VarChar5', 'Char5')" ) ); |
383 QVERIFY_SQL( q, exec( "insert into " + qtest + " values (4, 'VarChar4', 'Char4')" ) ); |
374 |
384 QVERIFY_SQL( q, exec( "insert into " + qtest + " values (5, 'VarChar5', 'Char5')" ) ); |
375 q.exec( "delete from " + qTableName( "qtest_null" ) ); |
385 |
376 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (0, NULL)" ) ); |
386 q.exec( "delete from " + qtest_null ); |
377 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (1, 'n')" ) ); |
387 QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (0, NULL)" ) ); |
378 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (2, 'i')" ) ); |
388 QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (1, 'n')" ) ); |
379 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (3, NULL)" ) ); |
389 QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (2, 'i')" ) ); |
|
390 QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (3, NULL)" ) ); |
380 } |
391 } |
381 |
392 |
382 // There were problems with char fields of size 1 |
393 // There were problems with char fields of size 1 |
383 void tst_QSqlQuery::char1Select() |
394 void tst_QSqlQuery::char1Select() |
384 { |
395 { |
417 |
428 |
418 if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) |
429 if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) |
419 QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); |
430 QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); |
420 |
431 |
421 QString createQuery; |
432 QString createQuery; |
|
433 const QString char1SelectUnicode(qTableName( "char1SU", __FILE__ )); |
422 |
434 |
423 if ( tst_Databases::isSqlServer( db ) ) |
435 if ( tst_Databases::isSqlServer( db ) ) |
424 createQuery = "create table " + qTableName( "char1SelectUnicode" ) + "(id nchar(1))"; |
436 createQuery = "create table " + char1SelectUnicode + "(id nchar(1))"; |
425 else if ( db.driverName().startsWith( "QDB2" ) |
437 else if ( db.driverName().startsWith( "QDB2" ) |
426 || db.driverName().startsWith( "QOCI" ) |
438 || db.driverName().startsWith( "QOCI" ) |
427 || db.driverName().startsWith( "QPSQL" ) ) |
439 || db.driverName().startsWith( "QPSQL" ) ) |
428 createQuery = "create table " + qTableName( "char1SelectUnicode" ) + " (id char(3))"; |
440 createQuery = "create table " + char1SelectUnicode + " (id char(3))"; |
429 else if ( db.driverName().startsWith( "QIBASE" ) ) |
441 else if ( db.driverName().startsWith( "QIBASE" ) ) |
430 createQuery = "create table " + qTableName( "char1SelectUnicode" ) + |
442 createQuery = "create table " + char1SelectUnicode + |
431 " (id char(1) character set unicode_fss)"; |
443 " (id char(1) character set unicode_fss)"; |
432 else if ( db.driverName().startsWith( "QMYSQL" ) ) |
444 else if ( db.driverName().startsWith( "QMYSQL" ) ) |
433 createQuery = "create table " + qTableName( "char1SelectUnicode" ) + " (id char(1)) " |
445 createQuery = "create table " + char1SelectUnicode + " (id char(1)) " |
434 "default character set 'utf8'"; |
446 "default character set 'utf8'"; |
435 else |
447 else |
436 createQuery = "create table " + qTableName( "char1SelectUnicode" ) + " (id char(1))"; |
448 createQuery = "create table " + char1SelectUnicode + " (id char(1))"; |
437 |
449 |
438 QVERIFY_SQL( q, exec( createQuery ) ); |
450 QVERIFY_SQL( q, exec( createQuery ) ); |
439 |
451 |
440 QVERIFY_SQL( q, prepare( "insert into " + qTableName( "char1SelectUnicode" ) + " values(?)" ) ); |
452 QVERIFY_SQL( q, prepare( "insert into " + char1SelectUnicode + " values(?)" ) ); |
441 |
453 |
442 q.bindValue( 0, uniStr ); |
454 q.bindValue( 0, uniStr ); |
443 |
455 |
444 QVERIFY_SQL( q, exec() ); |
456 QVERIFY_SQL( q, exec() ); |
445 |
457 |
446 QVERIFY_SQL( q, exec( "select * from " + qTableName( "char1SelectUnicode" ) ) ); |
458 QVERIFY_SQL( q, exec( "select * from " + char1SelectUnicode ) ); |
447 |
459 |
448 QVERIFY( q.next() ); |
460 QVERIFY( q.next() ); |
449 |
461 |
450 if ( !q.value( 0 ).toString().isEmpty() ) |
462 if ( !q.value( 0 ).toString().isEmpty() ) |
451 QCOMPARE( q.value( 0 ).toString()[ 0 ].unicode(), uniStr[0].unicode() ); |
463 QCOMPARE( q.value( 0 ).toString()[ 0 ].unicode(), uniStr[0].unicode() ); |
461 void tst_QSqlQuery::oraRowId() |
473 void tst_QSqlQuery::oraRowId() |
462 { |
474 { |
463 QFETCH( QString, dbName ); |
475 QFETCH( QString, dbName ); |
464 QSqlDatabase db = QSqlDatabase::database( dbName ); |
476 QSqlDatabase db = QSqlDatabase::database( dbName ); |
465 CHECK_DATABASE( db ); |
477 CHECK_DATABASE( db ); |
466 |
478 const QString oraRowId(qTableName("oraRowId", __FILE__)); |
467 QSqlQuery q( db ); |
479 |
468 QVERIFY_SQL( q, exec( "select rowid from " + qTableName( "qtest" ) ) ); |
480 QSqlQuery q( db ); |
|
481 QVERIFY_SQL( q, exec( "select rowid from " + qtest ) ); |
469 QVERIFY( q.next() ); |
482 QVERIFY( q.next() ); |
470 QCOMPARE( q.value( 0 ).type(), QVariant::String ); |
483 QCOMPARE( q.value( 0 ).type(), QVariant::String ); |
471 QVERIFY( !q.value( 0 ).toString().isEmpty() ); |
484 QVERIFY( !q.value( 0 ).toString().isEmpty() ); |
472 |
485 |
473 QVERIFY_SQL( q, exec( "create table " + qTableName( "oraRowId" ) + " (id char(1))" ) ); |
486 QVERIFY_SQL( q, exec( "create table " + oraRowId + " (id char(1))" ) ); |
474 |
487 |
475 QVERIFY_SQL( q, exec( "insert into " + qTableName( "oraRowId" ) + " values('a')" ) ); |
488 QVERIFY_SQL( q, exec( "insert into " + oraRowId + " values('a')" ) ); |
476 QVariant v1 = q.lastInsertId(); |
489 QVariant v1 = q.lastInsertId(); |
477 QVERIFY( v1.isValid() ); |
490 QVERIFY( v1.isValid() ); |
478 |
491 |
479 QVERIFY_SQL( q, exec( "insert into " + qTableName( "oraRowId" ) + " values('b')" ) ); |
492 QVERIFY_SQL( q, exec( "insert into " + oraRowId + " values('b')" ) ); |
480 QVariant v2 = q.lastInsertId(); |
493 QVariant v2 = q.lastInsertId(); |
481 QVERIFY( v2.isValid() ); |
494 QVERIFY( v2.isValid() ); |
482 |
495 |
483 QVERIFY_SQL( q, prepare( "select * from " + qTableName( "oraRowId" ) + " where rowid = ?" ) ); |
496 QVERIFY_SQL( q, prepare( "select * from " + oraRowId + " where rowid = ?" ) ); |
484 q.addBindValue( v1 ); |
497 q.addBindValue( v1 ); |
485 QVERIFY_SQL( q, exec() ); |
498 QVERIFY_SQL( q, exec() ); |
486 QVERIFY( q.next() ); |
499 QVERIFY( q.next() ); |
487 QCOMPARE( q.value( 0 ).toString(), QString( "a" ) ); |
500 QCOMPARE( q.value( 0 ).toString(), QString( "a" ) ); |
488 |
501 |
495 void tst_QSqlQuery::mysqlOutValues() |
508 void tst_QSqlQuery::mysqlOutValues() |
496 { |
509 { |
497 QFETCH( QString, dbName ); |
510 QFETCH( QString, dbName ); |
498 QSqlDatabase db = QSqlDatabase::database( dbName ); |
511 QSqlDatabase db = QSqlDatabase::database( dbName ); |
499 CHECK_DATABASE( db ); |
512 CHECK_DATABASE( db ); |
|
513 const QString hello(qTableName( "hello", __FILE__ )), qtestproc(qTableName( "qtestproc", __FILE__ )); |
500 |
514 |
501 QSqlQuery q( db ); |
515 QSqlQuery q( db ); |
502 |
516 |
503 if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) |
517 if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) |
504 QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); |
518 QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); |
505 |
519 |
506 q.exec( "drop function " + qTableName( "hello" ) ); |
520 q.exec( "drop function " + hello ); |
507 |
521 |
508 QVERIFY_SQL( q, exec( "create function " + qTableName( "hello" ) + " (s char(20)) returns varchar(50) return concat('Hello ', s)" ) ); |
522 QVERIFY_SQL( q, exec( "create function " + hello + " (s char(20)) returns varchar(50) return concat('Hello ', s)" ) ); |
509 |
523 |
510 QVERIFY_SQL( q, exec( "select " + qTableName( "hello" ) + "('world')" ) ); |
524 QVERIFY_SQL( q, exec( "select " + hello + "('world')" ) ); |
511 QVERIFY_SQL( q, next() ); |
525 QVERIFY_SQL( q, next() ); |
512 |
526 |
513 QCOMPARE( q.value( 0 ).toString(), QString( "Hello world" ) ); |
527 QCOMPARE( q.value( 0 ).toString(), QString( "Hello world" ) ); |
514 |
528 |
515 QVERIFY_SQL( q, prepare( "select " + qTableName( "hello" ) + "('harald')" ) ); |
529 QVERIFY_SQL( q, prepare( "select " + hello + "('harald')" ) ); |
516 QVERIFY_SQL( q, exec() ); |
530 QVERIFY_SQL( q, exec() ); |
517 QVERIFY_SQL( q, next() ); |
531 QVERIFY_SQL( q, next() ); |
518 |
532 |
519 QCOMPARE( q.value( 0 ).toString(), QString( "Hello harald" ) ); |
533 QCOMPARE( q.value( 0 ).toString(), QString( "Hello harald" ) ); |
520 |
534 |
521 QVERIFY_SQL( q, exec( "drop function " + qTableName( "hello" ) ) ); |
535 QVERIFY_SQL( q, exec( "drop function " + hello ) ); |
522 |
536 |
523 q.exec( "drop procedure " + qTableName( "qtestproc" ) ); |
537 q.exec( "drop procedure " + qtestproc ); |
524 |
538 |
525 QVERIFY_SQL( q, exec( "create procedure " + qTableName( "qtestproc" ) + " () " |
539 QVERIFY_SQL( q, exec( "create procedure " + qtestproc + " () " |
526 "BEGIN select * from " + qTableName( "qtest" ) + " order by id; END" ) ); |
540 "BEGIN select * from " + qtest + " order by id; END" ) ); |
527 QVERIFY_SQL( q, exec( "call " + qTableName( "qtestproc" ) + "()" ) ); |
541 QVERIFY_SQL( q, exec( "call " + qtestproc + "()" ) ); |
528 QVERIFY_SQL( q, next() ); |
542 QVERIFY_SQL( q, next() ); |
529 QCOMPARE( q.value( 1 ).toString(), QString( "VarChar1" ) ); |
543 QCOMPARE( q.value( 1 ).toString(), QString( "VarChar1" ) ); |
530 |
544 |
531 QVERIFY_SQL( q, exec( "drop procedure " + qTableName( "qtestproc" ) ) ); |
545 QVERIFY_SQL( q, exec( "drop procedure " + qtestproc ) ); |
532 |
546 |
533 QVERIFY_SQL( q, exec( "create procedure " + qTableName( "qtestproc" ) + " (OUT param1 INT) " |
547 QVERIFY_SQL( q, exec( "create procedure " + qtestproc + " (OUT param1 INT) " |
534 "BEGIN set param1 = 42; END" ) ); |
548 "BEGIN set param1 = 42; END" ) ); |
535 |
549 |
536 QVERIFY_SQL( q, exec( "call " + qTableName( "qtestproc" ) + " (@out)" ) ); |
550 QVERIFY_SQL( q, exec( "call " + qtestproc + " (@out)" ) ); |
537 QVERIFY_SQL( q, exec( "select @out" ) ); |
551 QVERIFY_SQL( q, exec( "select @out" ) ); |
538 QCOMPARE( q.record().fieldName( 0 ), QString( "@out" ) ); |
552 QCOMPARE( q.record().fieldName( 0 ), QString( "@out" ) ); |
539 QVERIFY_SQL( q, next() ); |
553 QVERIFY_SQL( q, next() ); |
540 QCOMPARE( q.value( 0 ).toInt(), 42 ); |
554 QCOMPARE( q.value( 0 ).toInt(), 42 ); |
541 |
555 |
542 QVERIFY_SQL( q, exec( "drop procedure " + qTableName( "qtestproc" ) ) ); |
556 QVERIFY_SQL( q, exec( "drop procedure " + qtestproc ) ); |
543 } |
557 } |
544 |
558 |
545 void tst_QSqlQuery::oraOutValues() |
559 void tst_QSqlQuery::oraOutValues() |
546 { |
560 { |
547 QFETCH( QString, dbName ); |
561 QFETCH( QString, dbName ); |
548 QSqlDatabase db = QSqlDatabase::database( dbName ); |
562 QSqlDatabase db = QSqlDatabase::database( dbName ); |
549 CHECK_DATABASE( db ); |
563 CHECK_DATABASE( db ); |
|
564 const QString tst_outValues(qTableName("tst_outValues", __FILE__)); |
550 |
565 |
551 if ( !db.driver()->hasFeature( QSqlDriver::PreparedQueries ) ) { |
566 if ( !db.driver()->hasFeature( QSqlDriver::PreparedQueries ) ) { |
552 QSKIP( "Test requires prepared query support", SkipSingle ); |
567 QSKIP( "Test requires prepared query support", SkipSingle ); |
553 return; |
568 return; |
554 } |
569 } |
572 QVERIFY_SQL( q, exec() ); |
587 QVERIFY_SQL( q, exec() ); |
573 QCOMPARE( q.boundValue( 0 ).toInt(), 42 ); |
588 QCOMPARE( q.boundValue( 0 ).toInt(), 42 ); |
574 QVERIFY( !q.boundValue( 0 ).isNull() ); |
589 QVERIFY( !q.boundValue( 0 ).isNull() ); |
575 |
590 |
576 /*** outvalue varchar ***/ |
591 /*** outvalue varchar ***/ |
577 QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x out varchar) is\n" |
592 QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x out varchar) is\n" |
578 "begin\n" |
593 "begin\n" |
579 " x := 'blah';\n" |
594 " x := 'blah';\n" |
580 "end;\n" ) ); |
595 "end;\n" ) ); |
581 QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); |
596 QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); |
582 QString s1( "12345" ); |
597 QString s1( "12345" ); |
583 s1.reserve( 512 ); |
598 s1.reserve( 512 ); |
584 q.addBindValue( s1, QSql::Out ); |
599 q.addBindValue( s1, QSql::Out ); |
585 QVERIFY_SQL( q, exec() ); |
600 QVERIFY_SQL( q, exec() ); |
586 QCOMPARE( q.boundValue( 0 ).toString(), QString( "blah" ) ); |
601 QCOMPARE( q.boundValue( 0 ).toString(), QString( "blah" ) ); |
587 |
602 |
588 /*** in/outvalue numeric ***/ |
603 /*** in/outvalue numeric ***/ |
589 QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out numeric) is\n" |
604 QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out numeric) is\n" |
590 "begin\n" |
605 "begin\n" |
591 " x := x + 10;\n" |
606 " x := x + 10;\n" |
592 "end;\n" ) ); |
607 "end;\n" ) ); |
593 QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); |
608 QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); |
594 q.addBindValue( 10, QSql::Out ); |
609 q.addBindValue( 10, QSql::Out ); |
595 QVERIFY_SQL( q, exec() ); |
610 QVERIFY_SQL( q, exec() ); |
596 QCOMPARE( q.boundValue( 0 ).toInt(), 20 ); |
611 QCOMPARE( q.boundValue( 0 ).toInt(), 20 ); |
597 |
612 |
598 /*** in/outvalue varchar ***/ |
613 /*** in/outvalue varchar ***/ |
599 QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out varchar) is\n" |
614 QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out varchar) is\n" |
600 "begin\n" |
615 "begin\n" |
601 " x := 'homer';\n" |
616 " x := 'homer';\n" |
602 "end;\n" ) ); |
617 "end;\n" ) ); |
603 QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); |
618 QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); |
604 q.addBindValue( QString( "maggy" ), QSql::Out ); |
619 q.addBindValue( QString( "maggy" ), QSql::Out ); |
605 QVERIFY_SQL( q, exec() ); |
620 QVERIFY_SQL( q, exec() ); |
606 QCOMPARE( q.boundValue( 0 ).toString(), QString( "homer" ) ); |
621 QCOMPARE( q.boundValue( 0 ).toString(), QString( "homer" ) ); |
607 |
622 |
608 /*** in/outvalue varchar ***/ |
623 /*** in/outvalue varchar ***/ |
609 QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out varchar) is\n" |
624 QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out varchar) is\n" |
610 "begin\n" |
625 "begin\n" |
611 " x := NULL;\n" |
626 " x := NULL;\n" |
612 "end;\n" ) ); |
627 "end;\n" ) ); |
613 QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); |
628 QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); |
614 q.addBindValue( QString( "maggy" ), QSql::Out ); |
629 q.addBindValue( QString( "maggy" ), QSql::Out ); |
615 QVERIFY_SQL( q, exec() ); |
630 QVERIFY_SQL( q, exec() ); |
616 QVERIFY( q.boundValue( 0 ).isNull() ); |
631 QVERIFY( q.boundValue( 0 ).isNull() ); |
617 |
632 |
618 /*** in/outvalue int ***/ |
633 /*** in/outvalue int ***/ |
619 QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out int) is\n" |
634 QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out int) is\n" |
620 "begin\n" |
635 "begin\n" |
621 " x := NULL;\n" |
636 " x := NULL;\n" |
622 "end;\n" ) ); |
637 "end;\n" ) ); |
623 QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); |
638 QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); |
624 q.addBindValue( 42, QSql::Out ); |
639 q.addBindValue( 42, QSql::Out ); |
625 QVERIFY_SQL( q, exec() ); |
640 QVERIFY_SQL( q, exec() ); |
626 QVERIFY( q.boundValue( 0 ).isNull() ); |
641 QVERIFY( q.boundValue( 0 ).isNull() ); |
627 |
642 |
628 /*** in/outvalue varchar ***/ |
643 /*** in/outvalue varchar ***/ |
629 QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in varchar, y out varchar) is\n" |
644 QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in varchar, y out varchar) is\n" |
630 "begin\n" |
645 "begin\n" |
631 " y := x||'bubulalakikikokololo';\n" |
646 " y := x||'bubulalakikikokololo';\n" |
632 "end;\n" ) ); |
647 "end;\n" ) ); |
633 QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?, ?)" ) ); |
648 QVERIFY( q.prepare( "call " + tst_outValues + "(?, ?)" ) ); |
634 q.addBindValue( QString( "fifi" ), QSql::In ); |
649 q.addBindValue( QString( "fifi" ), QSql::In ); |
635 QString out; |
650 QString out; |
636 out.reserve( 50 ); |
651 out.reserve( 50 ); |
637 q.addBindValue( out, QSql::Out ); |
652 q.addBindValue( out, QSql::Out ); |
638 QVERIFY_SQL( q, exec() ); |
653 QVERIFY_SQL( q, exec() ); |
642 void tst_QSqlQuery::oraClob() |
657 void tst_QSqlQuery::oraClob() |
643 { |
658 { |
644 QFETCH( QString, dbName ); |
659 QFETCH( QString, dbName ); |
645 QSqlDatabase db = QSqlDatabase::database( dbName ); |
660 QSqlDatabase db = QSqlDatabase::database( dbName ); |
646 CHECK_DATABASE( db ); |
661 CHECK_DATABASE( db ); |
|
662 const QString clobby(qTableName("clobby", __FILE__)); |
647 |
663 |
648 QSqlQuery q( db ); |
664 QSqlQuery q( db ); |
649 |
665 |
650 // simple short string |
666 // simple short string |
651 QVERIFY_SQL( q, exec( "create table " + qTableName( "clobby" ) + "(id int primary key, cl clob, bl blob)" ) ); |
667 QVERIFY_SQL( q, exec( "create table " + clobby + "(id int primary key, cl clob, bl blob)" ) ); |
652 QVERIFY_SQL( q, prepare( "insert into " + qTableName( "clobby" ) + " (id, cl, bl) values(?, ?, ?)" ) ); |
668 QVERIFY_SQL( q, prepare( "insert into " + clobby + " (id, cl, bl) values(?, ?, ?)" ) ); |
653 q.addBindValue( 1 ); |
669 q.addBindValue( 1 ); |
654 q.addBindValue( "bubu" ); |
670 q.addBindValue( "bubu" ); |
655 q.addBindValue( QByteArray("bubu") ); |
671 q.addBindValue( QByteArray("bubu") ); |
656 QVERIFY_SQL( q, exec() ); |
672 QVERIFY_SQL( q, exec() ); |
657 |
673 |
658 QVERIFY_SQL( q, exec( "select bl, cl from " + qTableName( "clobby" ) + " where id = 1" ) ); |
674 QVERIFY_SQL( q, exec( "select bl, cl from " + clobby + " where id = 1" ) ); |
659 QVERIFY( q.next() ); |
675 QVERIFY( q.next() ); |
660 QCOMPARE( q.value( 0 ).toString(), QString( "bubu" ) ); |
676 QCOMPARE( q.value( 0 ).toString(), QString( "bubu" ) ); |
661 QCOMPARE( q.value( 1 ).toString(), QString( "bubu" ) ); |
677 QCOMPARE( q.value( 1 ).toString(), QString( "bubu" ) ); |
662 |
678 |
663 // simple short string with binding |
679 // simple short string with binding |
664 QVERIFY_SQL( q, prepare( "insert into " + qTableName( "clobby" ) + " (id, cl, bl) values(?, ?, ?)" ) ); |
680 QVERIFY_SQL( q, prepare( "insert into " + clobby + " (id, cl, bl) values(?, ?, ?)" ) ); |
665 q.addBindValue( 2 ); |
681 q.addBindValue( 2 ); |
666 q.addBindValue( "lala", QSql::Binary ); |
682 q.addBindValue( "lala", QSql::Binary ); |
667 q.addBindValue( QByteArray("lala"), QSql::Binary ); |
683 q.addBindValue( QByteArray("lala"), QSql::Binary ); |
668 QVERIFY_SQL( q, exec() ); |
684 QVERIFY_SQL( q, exec() ); |
669 |
685 |
670 QVERIFY_SQL( q, exec( "select bl, cl from " + qTableName( "clobby" ) + " where id = 2" ) ); |
686 QVERIFY_SQL( q, exec( "select bl, cl from " + clobby + " where id = 2" ) ); |
671 QVERIFY( q.next() ); |
687 QVERIFY( q.next() ); |
672 QCOMPARE( q.value( 0 ).toString(), QString( "lala" ) ); |
688 QCOMPARE( q.value( 0 ).toString(), QString( "lala" ) ); |
673 QCOMPARE( q.value( 1 ).toString(), QString( "lala" ) ); |
689 QCOMPARE( q.value( 1 ).toString(), QString( "lala" ) ); |
674 |
690 |
675 // loooong string |
691 // loooong string |
676 QString loong; |
692 QString loong; |
677 loong.fill( QLatin1Char( 'A' ), 25000 ); |
693 loong.fill( QLatin1Char( 'A' ), 25000 ); |
678 QVERIFY_SQL( q, prepare( "insert into " + qTableName( "clobby" ) + " (id, cl, bl) values(?, ?, ?)" ) ); |
694 QVERIFY_SQL( q, prepare( "insert into " + clobby + " (id, cl, bl) values(?, ?, ?)" ) ); |
679 q.addBindValue( 3 ); |
695 q.addBindValue( 3 ); |
680 q.addBindValue( loong, QSql::Binary ); |
696 q.addBindValue( loong, QSql::Binary ); |
681 q.addBindValue( loong.toLatin1(), QSql::Binary ); |
697 q.addBindValue( loong.toLatin1(), QSql::Binary ); |
682 QVERIFY_SQL( q, exec() ); |
698 QVERIFY_SQL( q, exec() ); |
683 |
699 |
684 QVERIFY_SQL( q, exec( "select bl, cl from " + qTableName( "clobby" ) + " where id = 3" ) ); |
700 QVERIFY_SQL( q, exec( "select bl, cl from " + clobby + " where id = 3" ) ); |
685 QVERIFY( q.next() ); |
701 QVERIFY( q.next() ); |
686 QCOMPARE( q.value( 0 ).toString().count(), loong.count() ); |
702 QCOMPARE( q.value( 0 ).toString().count(), loong.count() ); |
687 QVERIFY( q.value( 0 ).toString() == loong ); |
703 QVERIFY( q.value( 0 ).toString() == loong ); |
688 QCOMPARE( q.value( 1 ).toByteArray().count(), loong.toLatin1().count() ); |
704 QCOMPARE( q.value( 1 ).toByteArray().count(), loong.toLatin1().count() ); |
689 QVERIFY( q.value( 1 ).toByteArray() == loong.toLatin1() ); |
705 QVERIFY( q.value( 1 ).toByteArray() == loong.toLatin1() ); |
694 QFETCH( QString, dbName ); |
710 QFETCH( QString, dbName ); |
695 QSqlDatabase db = QSqlDatabase::database( dbName ); |
711 QSqlDatabase db = QSqlDatabase::database( dbName ); |
696 CHECK_DATABASE( db ); |
712 CHECK_DATABASE( db ); |
697 |
713 |
698 QSqlQuery q( db ); |
714 QSqlQuery q( db ); |
699 q.exec( "drop procedure " + qTableName( "TESTPROC" ) ); |
715 q.exec( "drop procedure " + qTableName( "TESTPROC", __FILE__ ) ); |
700 |
716 |
701 QVERIFY_SQL( q, exec( "create procedure " + qTableName( "TESTPROC" ) + |
717 QVERIFY_SQL( q, exec( "create procedure " + qTableName( "TESTPROC", __FILE__ ) + |
702 " RETURNS (x integer, y varchar(20)) " |
718 " RETURNS (x integer, y varchar(20)) " |
703 "AS BEGIN " |
719 "AS BEGIN " |
704 " x = 42; " |
720 " x = 42; " |
705 " y = 'Hello Anders'; " |
721 " y = 'Hello Anders'; " |
706 "END" ) ); |
722 "END" ) ); |
707 |
723 |
708 QVERIFY_SQL( q, prepare( "execute procedure " + qTableName( "TestProc" ) ) ); |
724 QVERIFY_SQL( q, prepare( "execute procedure " + qTableName( "TestProc", __FILE__ ) ) ); |
709 QVERIFY_SQL( q, exec() ); |
725 QVERIFY_SQL( q, exec() ); |
710 |
726 |
711 // check for a valid result set |
727 // check for a valid result set |
712 QSqlRecord rec = q.record(); |
728 QSqlRecord rec = q.record(); |
713 QCOMPARE( rec.count(), 2 ); |
729 QCOMPARE( rec.count(), 2 ); |
738 |
754 |
739 QSqlQuery q( db ); |
755 QSqlQuery q( db ); |
740 |
756 |
741 q.setForwardOnly( true ); |
757 q.setForwardOnly( true ); |
742 |
758 |
743 q.exec( "drop procedure " + qTableName( "tst_outValues" ) ); //non-fatal |
759 q.exec( "drop procedure " + qTableName( "tst_outValues", __FILE__ ) ); //non-fatal |
744 QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + qTableName( "tst_outValues" ) + |
760 QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + qTableName( "tst_outValues", __FILE__ ) + |
745 " (OUT x int, OUT x2 double, OUT x3 char(20))\n" |
761 " (OUT x int, OUT x2 double, OUT x3 char(20))\n" |
746 "LANGUAGE SQL\n" |
762 "LANGUAGE SQL\n" |
747 "P1: BEGIN\n" |
763 "P1: BEGIN\n" |
748 " SET x = 42;\n" |
764 " SET x = 42;\n" |
749 " SET x2 = 4.2;\n" |
765 " SET x2 = 4.2;\n" |
750 " SET x3 = 'Homer';\n" |
766 " SET x3 = 'Homer';\n" |
751 "END P1" ) ); |
767 "END P1" ) ); |
752 |
768 |
753 QVERIFY_SQL( q, prepare( "call " + qTableName( "tst_outValues" ) + "(?, ?, ?)" ) ); |
769 QVERIFY_SQL( q, prepare( "call " + qTableName( "tst_outValues", __FILE__ ) + "(?, ?, ?)" ) ); |
754 |
770 |
755 q.addBindValue( 0, QSql::Out ); |
771 q.addBindValue( 0, QSql::Out ); |
756 q.addBindValue( 0.0, QSql::Out ); |
772 q.addBindValue( 0.0, QSql::Out ); |
757 q.addBindValue( "Simpson", QSql::Out ); |
773 q.addBindValue( "Simpson", QSql::Out ); |
758 |
774 |
777 QSqlQuery q( db ); |
794 QSqlQuery q( db ); |
778 |
795 |
779 q.setForwardOnly( true ); |
796 q.setForwardOnly( true ); |
780 |
797 |
781 if ( db.driverName().startsWith( "QOCI" ) ) { |
798 if ( db.driverName().startsWith( "QOCI" ) ) { |
782 QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x out int) is\n" |
799 QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x out int) is\n" |
783 "begin\n" |
800 "begin\n" |
784 " x := 42;\n" |
801 " x := 42;\n" |
785 "end;\n" ) ); |
802 "end;\n" ) ); |
786 QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); |
803 QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); |
787 } else if ( db.driverName().startsWith( "QDB2" ) ) { |
804 } else if ( db.driverName().startsWith( "QDB2" ) ) { |
788 q.exec( "drop procedure " + qTableName( "tst_outValues" ) ); //non-fatal |
805 q.exec( "drop procedure " + tst_outValues ); //non-fatal |
789 QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + qTableName( "tst_outValues" ) + " (OUT x int)\n" |
806 QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + tst_outValues + " (OUT x int)\n" |
790 "LANGUAGE SQL\n" |
807 "LANGUAGE SQL\n" |
791 "P1: BEGIN\n" |
808 "P1: BEGIN\n" |
792 " SET x = 42;\n" |
809 " SET x = 42;\n" |
793 "END P1" ) ); |
810 "END P1" ) ); |
794 QVERIFY( q.prepare( "call " + qTableName( "tst_outValues" ) + "(?)" ) ); |
811 QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); |
795 } else if ( tst_Databases::isSqlServer( db ) ) { |
812 } else if ( tst_Databases::isSqlServer( db ) ) { |
796 q.exec( "drop procedure " + qTableName( "tst_outValues" ) ); //non-fatal |
813 q.exec( "drop procedure " + tst_outValues ); //non-fatal |
797 QVERIFY_SQL( q, exec( "create procedure " + qTableName( "tst_outValues" ) + " (@x int out) as\n" |
814 QVERIFY_SQL( q, exec( "create procedure " + tst_outValues + " (@x int out) as\n" |
798 "begin\n" |
815 "begin\n" |
799 " set @x = 42\n" |
816 " set @x = 42\n" |
800 "end\n" ) ); |
817 "end\n" ) ); |
801 QVERIFY( q.prepare( "{call " + qTableName( "tst_outvalues" ) + "(?)}" ) ); |
818 QVERIFY( q.prepare( "{call " + tst_outValues + "(?)}" ) ); |
802 } else { |
819 } else { |
803 QSKIP( "Don't know how to create a stored procedure for this database server, please fix this test", SkipSingle ); |
820 QSKIP( "Don't know how to create a stored procedure for this database server, please fix this test", SkipSingle ); |
804 return; |
821 return; |
805 } |
822 } |
806 |
823 |
833 |
850 |
834 QSqlQuery q( db ); |
851 QSqlQuery q( db ); |
835 |
852 |
836 q.setForwardOnly( true ); |
853 q.setForwardOnly( true ); |
837 |
854 |
838 QString queryString = QString( "create table " + qTableName( "qtest_blob" ) + |
855 QString queryString = QString( "create table " + qTableName( "qtest_blob", __FILE__ ) + |
839 " (id int not null primary key, t_blob %1)" ).arg( tst_Databases::blobTypeName( db, BLOBSIZE ) ); |
856 " (id int not null primary key, t_blob %1)" ).arg( tst_Databases::blobTypeName( db, BLOBSIZE ) ); |
840 QVERIFY_SQL( q, exec( queryString ) ); |
857 QVERIFY_SQL( q, exec( queryString ) ); |
841 |
858 |
842 QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_blob" ) + " (id, t_blob) values (?, ?)" ) ); |
859 QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_blob", __FILE__ ) + " (id, t_blob) values (?, ?)" ) ); |
843 |
860 |
844 for ( i = 0; i < BLOBCOUNT; ++i ) { |
861 for ( i = 0; i < BLOBCOUNT; ++i ) { |
845 q.addBindValue( i ); |
862 q.addBindValue( i ); |
846 q.addBindValue( ba ); |
863 q.addBindValue( ba ); |
847 QVERIFY_SQL( q, exec() ); |
864 QVERIFY_SQL( q, exec() ); |
848 } |
865 } |
849 |
866 |
850 QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_blob" ) ) ); |
867 QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_blob", __FILE__ ) ) ); |
851 |
868 |
852 for ( i = 0; i < BLOBCOUNT; ++i ) { |
869 for ( i = 0; i < BLOBCOUNT; ++i ) { |
853 QVERIFY( q.next() ); |
870 QVERIFY( q.next() ); |
854 QByteArray res = q.value( 1 ).toByteArray(); |
871 QByteArray res = q.value( 1 ).toByteArray(); |
855 QVERIFY2( res.size() >= ba.size(), |
872 QVERIFY2( res.size() >= ba.size(), |
937 QSqlDatabase db = QSqlDatabase::database( dbName ); |
954 QSqlDatabase db = QSqlDatabase::database( dbName ); |
938 CHECK_DATABASE( db ); |
955 CHECK_DATABASE( db ); |
939 |
956 |
940 QSqlQuery q( db ); |
957 QSqlQuery q( db ); |
941 QVERIFY( !q.isActive() ); |
958 QVERIFY( !q.isActive() ); |
942 QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); |
959 QVERIFY_SQL( q, exec( "select * from " + qtest ) ); |
943 QVERIFY( q.isActive() ); |
960 QVERIFY( q.isActive() ); |
944 QVERIFY( q.last() ); |
961 QVERIFY( q.last() ); |
945 |
962 |
946 if ( !tst_Databases::isMSAccess( db ) ) |
963 if ( !tst_Databases::isMSAccess( db ) ) |
947 // Access is stupid enough to let you scroll over boundaries |
964 // Access is stupid enough to let you scroll over boundaries |
948 QVERIFY( !q.next() ); |
965 QVERIFY( !q.next() ); |
949 |
966 |
950 QVERIFY( q.isActive() ); |
967 QVERIFY( q.isActive() ); |
951 |
968 |
952 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (41, 'VarChar41', 'Char41')" ) ); |
969 QVERIFY_SQL( q, exec( "insert into " + qtest + " values (41, 'VarChar41', 'Char41')" ) ); |
953 |
970 |
954 QVERIFY( q.isActive() ); |
971 QVERIFY( q.isActive() ); |
955 |
972 |
956 QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = 42 where id = 41" ) ); |
973 QVERIFY_SQL( q, exec( "update " + qtest + " set id = 42 where id = 41" ) ); |
957 |
974 |
958 QVERIFY( q.isActive() ); |
975 QVERIFY( q.isActive() ); |
959 |
976 |
960 QVERIFY_SQL( q, exec( "delete from " + qTableName( "qtest" ) + " where id = 42" ) ); |
977 QVERIFY_SQL( q, exec( "delete from " + qtest + " where id = 42" ) ); |
961 |
978 |
962 QVERIFY( q.isActive() ); |
979 QVERIFY( q.isActive() ); |
963 } |
980 } |
964 |
981 |
965 void tst_QSqlQuery::numRowsAffected() |
982 void tst_QSqlQuery::numRowsAffected() |
983 if ( q.numRowsAffected() != -1 && q.numRowsAffected() != 0 && q.numRowsAffected() != i ) { |
1000 if ( q.numRowsAffected() != -1 && q.numRowsAffected() != 0 && q.numRowsAffected() != i ) { |
984 // the value is undefined for SELECT, this check is just here for curiosity |
1001 // the value is undefined for SELECT, this check is just here for curiosity |
985 qDebug( "Expected numRowsAffected to be -1, 0 or %d, got %d", i, q.numRowsAffected() ); |
1002 qDebug( "Expected numRowsAffected to be -1, 0 or %d, got %d", i, q.numRowsAffected() ); |
986 } |
1003 } |
987 |
1004 |
988 QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = 100 where id = 1" ) ); |
1005 QVERIFY_SQL( q, exec( "update " + qtest + " set id = 100 where id = 1" ) ); |
989 |
1006 |
990 QCOMPARE( q.numRowsAffected(), 1 ); |
1007 QCOMPARE( q.numRowsAffected(), 1 ); |
991 QCOMPARE( q.numRowsAffected(), 1 ); // yes, we check twice |
1008 QCOMPARE( q.numRowsAffected(), 1 ); // yes, we check twice |
992 |
1009 |
993 QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = id + 100" ) ); |
1010 QVERIFY_SQL( q, exec( "update " + qtest + " set id = id + 100" ) ); |
994 QCOMPARE( q.numRowsAffected(), i ); |
1011 QCOMPARE( q.numRowsAffected(), i ); |
995 QCOMPARE( q.numRowsAffected(), i ); // yes, we check twice |
1012 QCOMPARE( q.numRowsAffected(), i ); // yes, we check twice |
996 |
1013 |
997 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (42000, 'homer', 'marge')" ) ); |
1014 QVERIFY_SQL( q, exec( "insert into " + qtest + " values (42000, 'homer', 'marge')" ) ); |
998 QCOMPARE( q.numRowsAffected(), 1 ); |
1015 QCOMPARE( q.numRowsAffected(), 1 ); |
999 QCOMPARE( q.numRowsAffected(), 1 ); // yes, we check twice |
1016 QCOMPARE( q.numRowsAffected(), 1 ); // yes, we check twice |
1000 |
1017 |
1001 QSqlQuery q2( db ); |
1018 QSqlQuery q2( db ); |
1002 QVERIFY_SQL( q2, exec( "insert into " + qTableName( "qtest" ) + " values (42001, 'homer', 'marge')" ) ); |
1019 QVERIFY_SQL( q2, exec( "insert into " + qtest + " values (42001, 'homer', 'marge')" ) ); |
1003 |
1020 |
1004 if ( !db.driverName().startsWith( "QSQLITE2" ) ) { |
1021 if ( !db.driverName().startsWith( "QSQLITE2" ) ) { |
1005 // SQLite 2.x accumulates changed rows in nested queries. See task 33794 |
1022 // SQLite 2.x accumulates changed rows in nested queries. See task 33794 |
1006 QCOMPARE( q2.numRowsAffected(), 1 ); |
1023 QCOMPARE( q2.numRowsAffected(), 1 ); |
1007 QCOMPARE( q2.numRowsAffected(), 1 ); // yes, we check twice |
1024 QCOMPARE( q2.numRowsAffected(), 1 ); // yes, we check twice |
1029 } else { |
1046 } else { |
1030 QCOMPARE( q.size(), -1 ); |
1047 QCOMPARE( q.size(), -1 ); |
1031 QCOMPARE( q.size(), -1 ); // yes, twice |
1048 QCOMPARE( q.size(), -1 ); // yes, twice |
1032 } |
1049 } |
1033 |
1050 |
1034 QSqlQuery q2( "select * from " + qTableName( "qtest" ), db ); |
1051 QSqlQuery q2( "select * from " + qtest, db ); |
1035 |
1052 |
1036 if ( db.driver()->hasFeature( QSqlDriver::QuerySize ) ) |
1053 if ( db.driver()->hasFeature( QSqlDriver::QuerySize ) ) |
1037 QCOMPARE( q.size(), i ); |
1054 QCOMPARE( q.size(), i ); |
1038 else |
1055 else |
1039 QCOMPARE( q.size(), -1 ); |
1056 QCOMPARE( q.size(), -1 ); |
1040 |
1057 |
1041 q2.clear(); |
1058 q2.clear(); |
1042 |
1059 |
1043 QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = 100 where id = 1" ) ); |
1060 QVERIFY_SQL( q, exec( "update " + qtest + " set id = 100 where id = 1" ) ); |
1044 QCOMPARE( q.size(), -1 ); |
1061 QCOMPARE( q.size(), -1 ); |
1045 QCOMPARE( q.size(), -1 ); // yes, twice |
1062 QCOMPARE( q.size(), -1 ); // yes, twice |
1046 } |
1063 } |
1047 |
1064 |
1048 void tst_QSqlQuery::isSelect() |
1065 void tst_QSqlQuery::isSelect() |
1108 QSqlDatabase db = QSqlDatabase::database( dbName ); |
1125 QSqlDatabase db = QSqlDatabase::database( dbName ); |
1109 CHECK_DATABASE( db ); |
1126 CHECK_DATABASE( db ); |
1110 |
1127 |
1111 QSqlQuery q( db ); |
1128 QSqlQuery q( db ); |
1112 QCOMPARE( q.at(), int( QSql::BeforeFirstRow ) ); |
1129 QCOMPARE( q.at(), int( QSql::BeforeFirstRow ) ); |
1113 QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); |
1130 QVERIFY_SQL( q, exec( "select * from " + qtest ) ); |
1114 int i = 0; |
1131 int i = 0; |
1115 |
1132 |
1116 while ( q.next() ) |
1133 while ( q.next() ) |
1117 i++; |
1134 i++; |
1118 |
1135 |
1119 QCOMPARE( q.at(), int( QSql::AfterLastRow ) ); |
1136 QCOMPARE( q.at(), int( QSql::AfterLastRow ) ); |
1120 |
1137 |
1121 QVERIFY( q.last() ); |
1138 QVERIFY( q.last() ); |
1122 |
1139 |
1123 if ( !tst_Databases::isMSAccess( db ) ) |
1140 QSet<int> validReturns(QSet<int>() << -1 << i-1); |
1124 // Access doesn't return the correct position |
1141 QVERIFY( validReturns.contains(q.at()) ); |
1125 QCOMPARE( q.at(), ( i-1 ) ); |
1142 |
1126 |
1143 QSqlQuery q2( "select * from " + qtest, db ); |
1127 QSqlQuery q2( "select * from " + qTableName( "qtest" ), db ); |
|
1128 |
1144 |
1129 QVERIFY( q2.last() ); |
1145 QVERIFY( q2.last() ); |
1130 |
1146 |
1131 if ( !tst_Databases::isMSAccess( db ) ) |
1147 QVERIFY( validReturns.contains(q.at()) ); |
1132 // Access doesn't return the correct position |
|
1133 QCOMPARE( q.at(), ( i-1 ) ); |
|
1134 } |
1148 } |
1135 |
1149 |
1136 void tst_QSqlQuery::seek() |
1150 void tst_QSqlQuery::seek() |
1137 { |
1151 { |
1138 QFETCH( QString, dbName ); |
1152 QFETCH( QString, dbName ); |
1139 QSqlDatabase db = QSqlDatabase::database( dbName ); |
1153 QSqlDatabase db = QSqlDatabase::database( dbName ); |
1140 CHECK_DATABASE( db ); |
1154 CHECK_DATABASE( db ); |
1141 QSqlQuery q( db ); |
1155 QSqlQuery q( db ); |
1142 QVERIFY( q.at() == QSql::BeforeFirstRow ); |
1156 QVERIFY( q.at() == QSql::BeforeFirstRow ); |
1143 QVERIFY_SQL( q, exec( QString( "select id from %1 order by id" ).arg( qTableName( "qtest" ) ) ) ); |
1157 QVERIFY_SQL( q, exec( QString( "select id from %1 order by id" ).arg( qtest ) ) ); |
1144 |
1158 |
1145 // NB! The order of the calls below are important! |
1159 // NB! The order of the calls below are important! |
1146 QVERIFY( q.last() ); |
1160 QVERIFY( q.last() ); |
1147 QVERIFY( !q.seek( QSql::BeforeFirstRow ) ); |
1161 QVERIFY( !q.seek( QSql::BeforeFirstRow ) ); |
1148 QCOMPARE( q.at(), int( QSql::BeforeFirstRow ) ); |
1162 QCOMPARE( q.at(), int( QSql::BeforeFirstRow ) ); |
1359 void tst_QSqlQuery::nullBlob() |
1373 void tst_QSqlQuery::nullBlob() |
1360 { |
1374 { |
1361 QFETCH( QString, dbName ); |
1375 QFETCH( QString, dbName ); |
1362 QSqlDatabase db = QSqlDatabase::database( dbName ); |
1376 QSqlDatabase db = QSqlDatabase::database( dbName ); |
1363 CHECK_DATABASE( db ); |
1377 CHECK_DATABASE( db ); |
1364 |
1378 const QString qtest_nullblob(qTableName("qtest_nullblob", __FILE__)); |
1365 QSqlQuery q( db ); |
1379 |
1366 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_nullblob" ) + " (id int primary key, bb blob)" ) ); |
1380 QSqlQuery q( db ); |
1367 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_nullblob" ) + " values (0, EMPTY_BLOB())" ) ); |
1381 QVERIFY_SQL( q, exec( "create table " + qtest_nullblob + " (id int primary key, bb blob)" ) ); |
1368 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_nullblob" ) + " values (1, NULL)" ) ); |
1382 QVERIFY_SQL( q, exec( "insert into " + qtest_nullblob + " values (0, EMPTY_BLOB())" ) ); |
1369 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_nullblob" ) + " values (2, 'aabbcc00112233445566')" ) ); |
1383 QVERIFY_SQL( q, exec( "insert into " + qtest_nullblob + " values (1, NULL)" ) ); |
|
1384 QVERIFY_SQL( q, exec( "insert into " + qtest_nullblob + " values (2, 'aabbcc00112233445566')" ) ); |
1370 // necessary otherwise oracle will bombard you with internal errors |
1385 // necessary otherwise oracle will bombard you with internal errors |
1371 q.setForwardOnly( true ); |
1386 q.setForwardOnly( true ); |
1372 QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_nullblob" ) + " order by id" ) ); |
1387 QVERIFY_SQL( q, exec( "select * from " + qtest_nullblob + " order by id" ) ); |
1373 |
1388 |
1374 QVERIFY( q.next() ); |
1389 QVERIFY( q.next() ); |
1375 QCOMPARE(( int )q.value( 1 ).toByteArray().size(), 0 ); |
1390 QCOMPARE(( int )q.value( 1 ).toByteArray().size(), 0 ); |
1376 QVERIFY( !q.isNull( 1 ) ); |
1391 QVERIFY( !q.isNull( 1 ) ); |
1377 |
1392 |
1388 void tst_QSqlQuery::rawField() |
1403 void tst_QSqlQuery::rawField() |
1389 { |
1404 { |
1390 QFETCH( QString, dbName ); |
1405 QFETCH( QString, dbName ); |
1391 QSqlDatabase db = QSqlDatabase::database( dbName ); |
1406 QSqlDatabase db = QSqlDatabase::database( dbName ); |
1392 CHECK_DATABASE( db ); |
1407 CHECK_DATABASE( db ); |
|
1408 const QString qtest_rawtest(qTableName("qtest_rawtest", __FILE__)); |
1393 |
1409 |
1394 QSqlQuery q( db ); |
1410 QSqlQuery q( db ); |
1395 q.setForwardOnly( true ); |
1411 q.setForwardOnly( true ); |
1396 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_rawtest" ) + |
1412 QVERIFY_SQL( q, exec( "create table " + qtest_rawtest + |
1397 " (id int, col raw(20))" ) ); |
1413 " (id int, col raw(20))" ) ); |
1398 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_rawtest" ) + " values (0, NULL)" ) ); |
1414 QVERIFY_SQL( q, exec( "insert into " + qtest_rawtest + " values (0, NULL)" ) ); |
1399 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_rawtest" ) + " values (1, '00aa1100ddeeff')" ) ); |
1415 QVERIFY_SQL( q, exec( "insert into " + qtest_rawtest + " values (1, '00aa1100ddeeff')" ) ); |
1400 QVERIFY_SQL( q, exec( "select col from " + qTableName( "qtest_rawtest" ) + " order by id" ) ); |
1416 QVERIFY_SQL( q, exec( "select col from " + qtest_rawtest + " order by id" ) ); |
1401 QVERIFY( q.next() ); |
1417 QVERIFY( q.next() ); |
1402 QVERIFY( q.isNull( 0 ) ); |
1418 QVERIFY( q.isNull( 0 ) ); |
1403 QCOMPARE(( int )q.value( 0 ).toByteArray().size(), 0 ); |
1419 QCOMPARE(( int )q.value( 0 ).toByteArray().size(), 0 ); |
1404 QVERIFY( q.next() ); |
1420 QVERIFY( q.next() ); |
1405 QVERIFY( !q.isNull( 0 ) ); |
1421 QVERIFY( !q.isNull( 0 ) ); |
1503 QSqlQuery q2( db ); |
1520 QSqlQuery q2( db ); |
1504 |
1521 |
1505 // test a working transaction |
1522 // test a working transaction |
1506 q.exec( startTransactionStr ); |
1523 q.exec( startTransactionStr ); |
1507 |
1524 |
1508 QVERIFY_SQL( q, exec( "insert into" + qTableName( "qtest" ) + " values (40, 'VarChar40', 'Char40')" ) ); |
1525 QVERIFY_SQL( q, exec( "insert into" + qtest + " values (40, 'VarChar40', 'Char40')" ) ); |
1509 |
1526 |
1510 QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 40" ) ); |
1527 QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 40" ) ); |
1511 |
1528 |
1512 QVERIFY( q.next() ); |
1529 QVERIFY( q.next() ); |
1513 |
1530 |
1514 QCOMPARE( q.value( 0 ).toInt(), 40 ); |
1531 QCOMPARE( q.value( 0 ).toInt(), 40 ); |
1515 |
1532 |
1516 QVERIFY_SQL( q, exec( "commit" ) ); |
1533 QVERIFY_SQL( q, exec( "commit" ) ); |
1517 |
1534 |
1518 QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 40" ) ); |
1535 QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 40" ) ); |
1519 |
1536 |
1520 QVERIFY( q.next() ); |
1537 QVERIFY( q.next() ); |
1521 |
1538 |
1522 QCOMPARE( q.value( 0 ).toInt(), 40 ); |
1539 QCOMPARE( q.value( 0 ).toInt(), 40 ); |
1523 |
1540 |
1524 // test a rollback |
1541 // test a rollback |
1525 q.exec( startTransactionStr ); |
1542 q.exec( startTransactionStr ); |
1526 |
1543 |
1527 QVERIFY_SQL( q, exec( "insert into" + qTableName( "qtest" ) + " values (41, 'VarChar41', 'Char41')" ) ); |
1544 QVERIFY_SQL( q, exec( "insert into" + qtest + " values (41, 'VarChar41', 'Char41')" ) ); |
1528 |
1545 |
1529 QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 41" ) ); |
1546 QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 41" ) ); |
1530 |
1547 |
1531 QVERIFY( q.next() ); |
1548 QVERIFY( q.next() ); |
1532 |
1549 |
1533 QCOMPARE( q.value( 0 ).toInt(), 41 ); |
1550 QCOMPARE( q.value( 0 ).toInt(), 41 ); |
1534 |
1551 |
1538 QSKIP( "MySQL transaction failed ", SkipSingle ); //non-fatal |
1555 QSKIP( "MySQL transaction failed ", SkipSingle ); //non-fatal |
1539 } else |
1556 } else |
1540 QFAIL( "Could not rollback transaction: " + tst_Databases::printError( q.lastError() ) ); |
1557 QFAIL( "Could not rollback transaction: " + tst_Databases::printError( q.lastError() ) ); |
1541 } |
1558 } |
1542 |
1559 |
1543 QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 41" ) ); |
1560 QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 41" ) ); |
1544 |
1561 |
1545 QVERIFY( q.next() == false ); |
1562 QVERIFY( q.next() == false ); |
1546 |
1563 |
1547 // test concurrent access |
1564 // test concurrent access |
1548 q.exec( startTransactionStr ); |
1565 q.exec( startTransactionStr ); |
1549 QVERIFY_SQL( q, exec( "insert into" + qTableName( "qtest" ) + " values (42, 'VarChar42', 'Char42')" ) ); |
1566 QVERIFY_SQL( q, exec( "insert into" + qtest + " values (42, 'VarChar42', 'Char42')" ) ); |
1550 QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 42" ) ); |
1567 QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 42" ) ); |
1551 QVERIFY( q.next() ); |
1568 QVERIFY( q.next() ); |
1552 QCOMPARE( q.value( 0 ).toInt(), 42 ); |
1569 QCOMPARE( q.value( 0 ).toInt(), 42 ); |
1553 |
1570 |
1554 QVERIFY_SQL( q2, exec( "select * from" + qTableName( "qtest" ) + " where id = 42" ) ); |
1571 QVERIFY_SQL( q2, exec( "select * from" + qtest + " where id = 42" ) ); |
1555 |
1572 |
1556 if ( q2.next() ) |
1573 if ( q2.next() ) |
1557 qDebug( QString( "DBMS '%1' doesn't support query based transactions with concurrent access" ).arg( |
1574 qDebug( QString( "DBMS '%1' doesn't support query based transactions with concurrent access" ).arg( |
1558 tst_Databases::dbToString( db ) ).toLatin1() ); |
1575 tst_Databases::dbToString( db ) ).toLatin1() ); |
1559 |
1576 |
1560 QVERIFY_SQL( q, exec( "commit" ) ); |
1577 QVERIFY_SQL( q, exec( "commit" ) ); |
1561 |
1578 |
1562 QVERIFY_SQL( q2, exec( "select * from" + qTableName( "qtest" ) + " where id = 42" ) ); |
1579 QVERIFY_SQL( q2, exec( "select * from" + qtest + " where id = 42" ) ); |
1563 |
1580 |
1564 QVERIFY( q2.next() ); |
1581 QVERIFY( q2.next() ); |
1565 |
1582 |
1566 QCOMPARE( q2.value( 0 ).toInt(), 42 ); |
1583 QCOMPARE( q2.value( 0 ).toInt(), 42 ); |
1567 } |
1584 } |
1582 return; |
1600 return; |
1583 } |
1601 } |
1584 |
1602 |
1585 QSqlQuery q( db ); |
1603 QSqlQuery q( db ); |
1586 |
1604 |
1587 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtestj1" ) + " (id1 int, id2 int)" ) ); |
1605 QVERIFY_SQL( q, exec( "create table " + qtestj1 + " (id1 int, id2 int)" ) ); |
1588 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtestj2" ) + " (id int, name varchar(20))" ) ); |
1606 QVERIFY_SQL( q, exec( "create table " + qtestj2 + " (id int, name varchar(20))" ) ); |
1589 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj1" ) + " values (1, 1)" ) ); |
1607 QVERIFY_SQL( q, exec( "insert into " + qtestj1 + " values (1, 1)" ) ); |
1590 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj1" ) + " values (1, 2)" ) ); |
1608 QVERIFY_SQL( q, exec( "insert into " + qtestj1 + " values (1, 2)" ) ); |
1591 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj2" ) + " values(1, 'trenton')" ) ); |
1609 QVERIFY_SQL( q, exec( "insert into " + qtestj2 + " values(1, 'trenton')" ) ); |
1592 QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj2" ) + " values(2, 'marius')" ) ); |
1610 QVERIFY_SQL( q, exec( "insert into " + qtestj2 + " values(2, 'marius')" ) ); |
1593 |
1611 |
1594 QVERIFY_SQL( q, exec( "select qtestj1.id1, qtestj1.id2, qtestj2.id, qtestj2.name, qtestj3.id, qtestj3.name " |
1612 QVERIFY_SQL( q, exec( "select qtestj1.id1, qtestj1.id2, qtestj2.id, qtestj2.name, qtestj3.id, qtestj3.name " |
1595 "from " + qTableName( "qtestj1" ) + " qtestj1 left outer join " + qTableName( "qtestj2" ) + |
1613 "from " + qtestj1 + " qtestj1 left outer join " + qtestj2 + |
1596 " qtestj2 on (qtestj1.id1 = qtestj2.id) " |
1614 " qtestj2 on (qtestj1.id1 = qtestj2.id) " |
1597 "left outer join " + qTableName( "qtestj2" ) + " as qtestj3 on (qtestj1.id2 = qtestj3.id)" ) ); |
1615 "left outer join " + qtestj2 + " as qtestj3 on (qtestj1.id2 = qtestj3.id)" ) ); |
1598 |
1616 |
1599 QVERIFY( q.next() ); |
1617 QVERIFY( q.next() ); |
1600 QCOMPARE( q.value( 0 ).toInt(), 1 ); |
1618 QCOMPARE( q.value( 0 ).toInt(), 1 ); |
1601 QCOMPARE( q.value( 1 ).toInt(), 1 ); |
1619 QCOMPARE( q.value( 1 ).toInt(), 1 ); |
1602 QCOMPARE( q.value( 2 ).toInt(), 1 ); |
1620 QCOMPARE( q.value( 2 ).toInt(), 1 ); |
1661 |
1681 |
1662 if(tst_Databases::isPostgreSQL(db)) |
1682 if(tst_Databases::isPostgreSQL(db)) |
1663 QVERIFY_SQL( q, exec("set client_min_messages='warning'")); |
1683 QVERIFY_SQL( q, exec("set client_min_messages='warning'")); |
1664 |
1684 |
1665 if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) ) |
1685 if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) ) |
1666 createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int primary key, name nvarchar(200) null)"; |
1686 createQuery = "create table " + qtest_prepare + " (id int primary key, name nvarchar(200) null)"; |
1667 else if ( tst_Databases::isMySQL(db) && useUnicode ) |
1687 else if ( tst_Databases::isMySQL(db) && useUnicode ) |
1668 createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int not null primary key, name varchar(200) character set utf8)"; |
1688 createQuery = "create table " + qtest_prepare + " (id int not null primary key, name varchar(200) character set utf8)"; |
1669 else |
1689 else |
1670 createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int not null primary key, name varchar(200))"; |
1690 createQuery = "create table " + qtest_prepare + " (id int not null primary key, name varchar(200))"; |
1671 |
1691 |
1672 QVERIFY_SQL( q, exec( createQuery ) ); |
1692 QVERIFY_SQL( q, exec( createQuery ) ); |
1673 |
1693 |
1674 QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (:id, :name)" ) ); |
1694 QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (:id, :name)" ) ); |
1675 int i; |
1695 int i; |
1676 |
1696 |
1677 for ( i = 0; i < 6; ++i ) { |
1697 for ( i = 0; i < 6; ++i ) { |
1678 q.bindValue( ":name", values[i] ); |
1698 q.bindValue( ":name", values[i] ); |
1679 q.bindValue( ":id", i ); |
1699 q.bindValue( ":id", i ); |
1711 QVERIFY_SQL( q, next() ); |
1731 QVERIFY_SQL( q, next() ); |
1712 |
1732 |
1713 QCOMPARE( q.value( 0 ).toInt(), 8 ); |
1733 QCOMPARE( q.value( 0 ).toInt(), 8 ); |
1714 QCOMPARE( q.value( 1 ).toString(), values[5] ); |
1734 QCOMPARE( q.value( 1 ).toString(), values[5] ); |
1715 |
1735 |
1716 QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (:id, 'Bart')" ) ); |
1736 QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (:id, 'Bart')" ) ); |
1717 q.bindValue( ":id", 99 ); |
1737 q.bindValue( ":id", 99 ); |
1718 QVERIFY_SQL( q, exec() ); |
1738 QVERIFY_SQL( q, exec() ); |
1719 q.bindValue( ":id", 100 ); |
1739 q.bindValue( ":id", 100 ); |
1720 QVERIFY_SQL( q, exec() ); |
1740 QVERIFY_SQL( q, exec() ); |
1721 QVERIFY( q.exec( "select * from " + qTableName( "qtest_prepare" ) + " where id > 98 order by id" ) ); |
1741 QVERIFY( q.exec( "select * from " + qtest_prepare + " where id > 98 order by id" ) ); |
1722 |
1742 |
1723 for ( i = 99; i <= 100; ++i ) { |
1743 for ( i = 99; i <= 100; ++i ) { |
1724 QVERIFY( q.next() ); |
1744 QVERIFY( q.next() ); |
1725 QCOMPARE( q.value( 0 ).toInt(), i ); |
1745 QCOMPARE( q.value( 0 ).toInt(), i ); |
1726 QCOMPARE( q.value( 1 ).toString().trimmed(), QString( "Bart" ) ); |
1746 QCOMPARE( q.value( 1 ).toString().trimmed(), QString( "Bart" ) ); |
1727 } |
1747 } |
1728 |
1748 |
1729 /*** SELECT stuff ***/ |
1749 /*** SELECT stuff ***/ |
1730 QVERIFY( q.prepare( "select * from " + qTableName( "qtest_prepare" ) + " where id = :id" ) ); |
1750 QVERIFY( q.prepare( "select * from " + qtest_prepare + " where id = :id" ) ); |
1731 |
1751 |
1732 for ( i = 0; i < 6; ++i ) { |
1752 for ( i = 0; i < 6; ++i ) { |
1733 q.bindValue( ":id", i ); |
1753 q.bindValue( ":id", i ); |
1734 QVERIFY_SQL( q, exec() ); |
1754 QVERIFY_SQL( q, exec() ); |
1735 QVERIFY_SQL( q, next() ); |
1755 QVERIFY_SQL( q, next() ); |
1740 QCOMPARE( rInf.field( 0 ).name().toUpper(), QString( "ID" ) ); |
1760 QCOMPARE( rInf.field( 0 ).name().toUpper(), QString( "ID" ) ); |
1741 QCOMPARE( rInf.field( 1 ).name().toUpper(), QString( "NAME" ) ); |
1761 QCOMPARE( rInf.field( 1 ).name().toUpper(), QString( "NAME" ) ); |
1742 QVERIFY( !q.next() ); |
1762 QVERIFY( !q.next() ); |
1743 } |
1763 } |
1744 |
1764 |
1745 QVERIFY_SQL( q, exec( "DELETE FROM " + qTableName( "qtest_prepare" ) ) ); |
1765 QVERIFY_SQL( q, exec( "DELETE FROM " + qtest_prepare ) ); |
1746 |
1766 |
1747 QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (?, ?)" ) ); |
1767 QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (?, ?)" ) ); |
1748 q.bindValue( 0, 0 ); |
1768 q.bindValue( 0, 0 ); |
1749 q.bindValue( 1, values[ 0 ] ); |
1769 q.bindValue( 1, values[ 0 ] ); |
1750 QVERIFY_SQL( q, exec() ); |
1770 QVERIFY_SQL( q, exec() ); |
1751 q.addBindValue( 1 ); |
1771 q.addBindValue( 1 ); |
1752 q.addBindValue( values[ 1 ] ); |
1772 q.addBindValue( values[ 1 ] ); |
1790 QVERIFY( q.next() ); |
1810 QVERIFY( q.next() ); |
1791 QCOMPARE( q.value( 0 ).toInt(), 7 ); |
1811 QCOMPARE( q.value( 0 ).toInt(), 7 ); |
1792 QCOMPARE( q.value( 1 ).toString(), utf8str ); |
1812 QCOMPARE( q.value( 1 ).toString(), utf8str ); |
1793 } |
1813 } |
1794 |
1814 |
1795 QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (?, 'Bart')" ) ); |
1815 QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (?, 'Bart')" ) ); |
1796 |
1816 |
1797 q.bindValue( 0, 99 ); |
1817 q.bindValue( 0, 99 ); |
1798 QVERIFY_SQL( q, exec() ); |
1818 QVERIFY_SQL( q, exec() ); |
1799 q.addBindValue( 100 ); |
1819 q.addBindValue( 100 ); |
1800 QVERIFY_SQL( q, exec() ); |
1820 QVERIFY_SQL( q, exec() ); |
1801 QVERIFY( q.exec( "select * from " + qTableName( "qtest_prepare" ) + " where id > 98 order by id" ) ); |
1821 QVERIFY( q.exec( "select * from " + qtest_prepare + " where id > 98 order by id" ) ); |
1802 |
1822 |
1803 for ( i = 99; i <= 100; ++i ) { |
1823 for ( i = 99; i <= 100; ++i ) { |
1804 QVERIFY( q.next() ); |
1824 QVERIFY( q.next() ); |
1805 QCOMPARE( q.value( 0 ).toInt(), i ); |
1825 QCOMPARE( q.value( 0 ).toInt(), i ); |
1806 QCOMPARE( q.value( 1 ).toString().trimmed(), QString( "Bart" ) ); |
1826 QCOMPARE( q.value( 1 ).toString().trimmed(), QString( "Bart" ) ); |
1807 } |
1827 } |
1808 |
1828 |
1809 /* insert a duplicate id and make sure the db bails out */ |
1829 /* insert a duplicate id and make sure the db bails out */ |
1810 QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (?, ?)" ) ); |
1830 QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (?, ?)" ) ); |
1811 |
1831 |
1812 q.addBindValue( 99 ); |
1832 q.addBindValue( 99 ); |
1813 |
1833 |
1814 q.addBindValue( "something silly" ); |
1834 q.addBindValue( "something silly" ); |
1815 |
1835 |
2091 QSqlDatabase db = QSqlDatabase::database( dbName ); |
2111 QSqlDatabase db = QSqlDatabase::database( dbName ); |
2092 CHECK_DATABASE( db ); |
2112 CHECK_DATABASE( db ); |
2093 |
2113 |
2094 QSqlQuery q( db ); |
2114 QSqlQuery q( db ); |
2095 |
2115 |
2096 QVERIFY_SQL( q, exec( "create table "+qTableName( "record_sqlite" )+"(id integer primary key, name varchar, title int)" ) ); |
2116 QVERIFY_SQL( q, exec( "create table "+qTableName( "record_sqlite", __FILE__ )+"(id integer primary key, name varchar, title int)" ) ); |
2097 |
2117 |
2098 QSqlRecord rec = db.record( qTableName( "record_sqlite" ) ); |
2118 QSqlRecord rec = db.record( qTableName( "record_sqlite", __FILE__ ) ); |
2099 |
2119 |
2100 QCOMPARE( rec.count(), 3 ); |
2120 QCOMPARE( rec.count(), 3 ); |
2101 QCOMPARE( rec.field( 0 ).type(), QVariant::Int ); |
2121 QCOMPARE( rec.field( 0 ).type(), QVariant::Int ); |
2102 QCOMPARE( rec.field( 1 ).type(), QVariant::String ); |
2122 QCOMPARE( rec.field( 1 ).type(), QVariant::String ); |
2103 QCOMPARE( rec.field( 2 ).type(), QVariant::Int ); |
2123 QCOMPARE( rec.field( 2 ).type(), QVariant::Int ); |
2104 |
2124 |
2105 /* important - select from an empty table */ |
2125 /* important - select from an empty table */ |
2106 QVERIFY_SQL( q, exec( "select id, name, title from "+qTableName( "record_sqlite" ) ) ); |
2126 QVERIFY_SQL( q, exec( "select id, name, title from "+qTableName( "record_sqlite", __FILE__ ) ) ); |
2107 |
2127 |
2108 rec = q.record(); |
2128 rec = q.record(); |
2109 QCOMPARE( rec.count(), 3 ); |
2129 QCOMPARE( rec.count(), 3 ); |
2110 QCOMPARE( rec.field( 0 ).type(), QVariant::Int ); |
2130 QCOMPARE( rec.field( 0 ).type(), QVariant::Int ); |
2111 QCOMPARE( rec.field( 1 ).type(), QVariant::String ); |
2131 QCOMPARE( rec.field( 1 ).type(), QVariant::String ); |
2120 |
2140 |
2121 QSqlQuery q( db ); |
2141 QSqlQuery q( db ); |
2122 |
2142 |
2123 QString aLotOfText( 127000, QLatin1Char( 'H' ) ); |
2143 QString aLotOfText( 127000, QLatin1Char( 'H' ) ); |
2124 |
2144 |
2125 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_longstr" ) + " (id int primary key, astr long)" ) ); |
2145 QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_longstr", __FILE__ ) + " (id int primary key, astr long)" ) ); |
2126 QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_longstr" ) + " (id, astr) values (?, ?)" ) ); |
2146 QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_longstr", __FILE__ ) + " (id, astr) values (?, ?)" ) ); |
2127 q.addBindValue( 1 ); |
2147 q.addBindValue( 1 ); |
2128 q.addBindValue( aLotOfText ); |
2148 q.addBindValue( aLotOfText ); |
2129 QVERIFY_SQL( q, exec() ); |
2149 QVERIFY_SQL( q, exec() ); |
2130 |
2150 |
2131 QVERIFY_SQL( q, exec( "select id,astr from " + qTableName( "qtest_longstr" ) ) ); |
2151 QVERIFY_SQL( q, exec( "select id,astr from " + qTableName( "qtest_longstr", __FILE__ ) ) ); |
2132 |
2152 |
2133 QVERIFY( q.next() ); |
2153 QVERIFY( q.next() ); |
2134 QCOMPARE( q.value( 0 ).toInt(), 1 ); |
2154 QCOMPARE( q.value( 0 ).toInt(), 1 ); |
2135 QCOMPARE( q.value( 1 ).toString(), aLotOfText ); |
2155 QCOMPARE( q.value( 1 ).toString(), aLotOfText ); |
2136 } |
2156 } |
2665 { |
2685 { |
2666 QFETCH( QString, dbName ); |
2686 QFETCH( QString, dbName ); |
2667 QSqlDatabase db = QSqlDatabase::database( dbName ); |
2687 QSqlDatabase db = QSqlDatabase::database( dbName ); |
2668 CHECK_DATABASE( db ); |
2688 CHECK_DATABASE( db ); |
2669 QSqlQuery q( db ); |
2689 QSqlQuery q( db ); |
2670 |
2690 const QString Planet(qTableName( "Planet", __FILE__)); |
2671 QVERIFY_SQL( q, exec( "create table " + qTableName( "Planet" ) + " (Name varchar(20))" ) ); |
2691 |
2672 QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Mercury')" ) ); |
2692 QVERIFY_SQL( q, exec( "create table " + Planet + " (Name varchar(20))" ) ); |
2673 QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Venus')" ) ); |
2693 QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Mercury')" ) ); |
2674 QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Earth')" ) ); |
2694 QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Venus')" ) ); |
2675 QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Mars')" ) ); |
2695 QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Earth')" ) ); |
2676 |
2696 QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Mars')" ) ); |
2677 QVERIFY_SQL( q, exec( "SELECT Name FROM "+qTableName( "Planet" ) ) ); |
2697 |
|
2698 QVERIFY_SQL( q, exec( "SELECT Name FROM " + Planet ) ); |
2678 QVERIFY_SQL( q, seek( 3 ) ); |
2699 QVERIFY_SQL( q, seek( 3 ) ); |
2679 QCOMPARE( q.value( 0 ).toString(), QString( "Mars" ) ); |
2700 QCOMPARE( q.value( 0 ).toString(), QString( "Mars" ) ); |
2680 QVERIFY_SQL( q, seek( 1 ) ); |
2701 QVERIFY_SQL( q, seek( 1 ) ); |
2681 QCOMPARE( q.value( 0 ).toString(), QString( "Venus" ) ); |
2702 QCOMPARE( q.value( 0 ).toString(), QString( "Venus" ) ); |
2682 QVERIFY_SQL( q, exec( "SELECT Name FROM "+qTableName( "Planet" ) ) ); |
2703 QVERIFY_SQL( q, exec( "SELECT Name FROM " + Planet ) ); |
2683 QVERIFY_SQL( q, seek( 3 ) ); |
2704 QVERIFY_SQL( q, seek( 3 ) ); |
2684 QCOMPARE( q.value( 0 ).toString(), QString( "Mars" ) ); |
2705 QCOMPARE( q.value( 0 ).toString(), QString( "Mars" ) ); |
2685 QVERIFY_SQL( q, seek( 0 ) ); |
2706 QVERIFY_SQL( q, seek( 0 ) ); |
2686 QCOMPARE( q.value( 0 ).toString(), QString( "Mercury" ) ); |
2707 QCOMPARE( q.value( 0 ).toString(), QString( "Mercury" ) ); |
2687 QVERIFY_SQL( q, seek( 1 ) ); |
2708 QVERIFY_SQL( q, seek( 1 ) ); |
2913 void tst_QSqlQuery::QTBUG_5251() |
2934 void tst_QSqlQuery::QTBUG_5251() |
2914 { |
2935 { |
2915 QFETCH( QString, dbName ); |
2936 QFETCH( QString, dbName ); |
2916 QSqlDatabase db = QSqlDatabase::database( dbName ); |
2937 QSqlDatabase db = QSqlDatabase::database( dbName ); |
2917 CHECK_DATABASE( db ); |
2938 CHECK_DATABASE( db ); |
|
2939 const QString timetest(qTableName("timetest", __FILE__)); |
2918 |
2940 |
2919 if (!db.driverName().startsWith( "QPSQL" )) return; |
2941 if (!db.driverName().startsWith( "QPSQL" )) return; |
2920 |
2942 |
2921 QSqlQuery q(db); |
2943 QSqlQuery q(db); |
2922 q.exec("DROP TABLE " + qTableName("timetest")); |
2944 q.exec("DROP TABLE " + timetest); |
2923 QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("timetest") + " (t TIME)")); |
2945 QVERIFY_SQL(q, exec("CREATE TABLE " + timetest + " (t TIME)")); |
2924 QVERIFY_SQL(q, exec("INSERT INTO " + qTableName("timetest") + " VALUES ('1:2:3.666')")); |
2946 QVERIFY_SQL(q, exec("INSERT INTO " + timetest + " VALUES ('1:2:3.666')")); |
2925 |
2947 |
2926 QSqlTableModel timetestModel(0,db); |
2948 QSqlTableModel timetestModel(0,db); |
2927 timetestModel.setEditStrategy(QSqlTableModel::OnManualSubmit); |
2949 timetestModel.setEditStrategy(QSqlTableModel::OnManualSubmit); |
2928 timetestModel.setTable(qTableName("timetest")); |
2950 timetestModel.setTable(timetest); |
2929 QVERIFY_SQL(timetestModel, select()); |
2951 QVERIFY_SQL(timetestModel, select()); |
2930 |
2952 |
2931 QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("01:02:03.666")); |
2953 QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("01:02:03.666")); |
2932 QVERIFY_SQL(timetestModel,setData(timetestModel.index(0, 0), QTime(0,12,34,500))); |
2954 QVERIFY_SQL(timetestModel,setData(timetestModel.index(0, 0), QTime(0,12,34,500))); |
2933 QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:12:34.500")); |
2955 QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:12:34.500")); |
2934 QVERIFY_SQL(timetestModel, submitAll()); |
2956 QVERIFY_SQL(timetestModel, submitAll()); |
2935 QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:12:34.500")); |
2957 QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:12:34.500")); |
2936 |
2958 |
2937 QVERIFY_SQL(q, exec("UPDATE " + qTableName("timetest") + " SET t = '0:11:22.33'")); |
2959 QVERIFY_SQL(q, exec("UPDATE " + timetest + " SET t = '0:11:22.33'")); |
2938 QVERIFY_SQL(timetestModel, select()); |
2960 QVERIFY_SQL(timetestModel, select()); |
2939 QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:11:22.330")); |
2961 QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:11:22.330")); |
2940 |
2962 |
2941 } |
2963 } |
2942 |
2964 |
2970 CHECK_DATABASE( db ); |
2992 CHECK_DATABASE( db ); |
2971 if (!tst_Databases::isSqlServer( db )) |
2993 if (!tst_Databases::isSqlServer( db )) |
2972 QSKIP("SQL Server specific test", SkipSingle); |
2994 QSKIP("SQL Server specific test", SkipSingle); |
2973 |
2995 |
2974 QSqlQuery q(db); |
2996 QSqlQuery q(db); |
2975 q.exec( "drop procedure " + qTableName( "tst_raiseError" ) ); //non-fatal |
2997 q.exec( "drop procedure " + qTableName( "tst_raiseError", __FILE__ ) ); //non-fatal |
2976 QString errorString; |
2998 QString errorString; |
2977 for (int i=0;i<110;i++) |
2999 for (int i=0;i<110;i++) |
2978 errorString+="reallylong"; |
3000 errorString+="reallylong"; |
2979 errorString+=" error"; |
3001 errorString+=" error"; |
2980 QVERIFY_SQL( q, exec("create procedure " + qTableName( "tst_raiseError" ) + " as\n" |
3002 QVERIFY_SQL( q, exec("create procedure " + qTableName( "tst_raiseError", __FILE__ ) + " as\n" |
2981 "begin\n" |
3003 "begin\n" |
2982 " raiserror('" + errorString + "', 16, 1)\n" |
3004 " raiserror('" + errorString + "', 16, 1)\n" |
2983 "end\n" )); |
3005 "end\n" )); |
2984 q.exec( "{call " + qTableName( "tst_raiseError" ) + "}" ); |
3006 q.exec( "{call " + qTableName( "tst_raiseError", __FILE__ ) + "}" ); |
2985 QVERIFY(q.lastError().text().contains(errorString)); |
3007 QVERIFY(q.lastError().text().contains(errorString)); |
2986 } |
3008 } |
|
3009 |
|
3010 void tst_QSqlQuery::QTBUG_6852() |
|
3011 { |
|
3012 QFETCH( QString, dbName ); |
|
3013 QSqlDatabase db = QSqlDatabase::database( dbName ); |
|
3014 CHECK_DATABASE( db ); |
|
3015 if ( tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) |
|
3016 QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); |
|
3017 |
|
3018 QSqlQuery q(db); |
|
3019 const QString tableName(qTableName("bug6852", __FILE__)), procName(qTableName("bug6852_proc", __FILE__)); |
|
3020 |
|
3021 QVERIFY_SQL(q, exec("DROP PROCEDURE IF EXISTS "+procName)); |
|
3022 QVERIFY_SQL(q, exec("CREATE TABLE "+tableName+"(\n" |
|
3023 "MainKey INT NOT NULL,\n" |
|
3024 "OtherTextCol VARCHAR(45) NOT NULL,\n" |
|
3025 "PRIMARY KEY(`MainKey`))")); |
|
3026 QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" VALUES(0, \"Disabled\")")); |
|
3027 QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" VALUES(5, \"Error Only\")")); |
|
3028 QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" VALUES(10, \"Enabled\")")); |
|
3029 QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" VALUES(15, \"Always\")")); |
|
3030 QVERIFY_SQL(q, exec("CREATE PROCEDURE "+procName+"()\n" |
|
3031 "READS SQL DATA\n" |
|
3032 "BEGIN\n" |
|
3033 " SET @st = 'SELECT MainKey, OtherTextCol from "+tableName+"';\n" |
|
3034 " PREPARE stmt from @st;\n" |
|
3035 " EXECUTE stmt;\n" |
|
3036 "END;")); |
|
3037 |
|
3038 QVERIFY_SQL(q, exec("CALL "+procName+"()")); |
|
3039 QVERIFY_SQL(q, next()); |
|
3040 QCOMPARE(q.value(0).toInt(), 0); |
|
3041 QCOMPARE(q.value(1).toString(), QLatin1String("Disabled")); |
|
3042 } |
|
3043 |
|
3044 void tst_QSqlQuery::QTBUG_5765() |
|
3045 { |
|
3046 QFETCH( QString, dbName ); |
|
3047 QSqlDatabase db = QSqlDatabase::database( dbName ); |
|
3048 CHECK_DATABASE( db ); |
|
3049 if ( tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 1 ).toFloat()<4.1 ) |
|
3050 QSKIP( "Test requires MySQL >= 4.1", SkipSingle ); |
|
3051 |
|
3052 QSqlQuery q(db); |
|
3053 const QString tableName(qTableName("bug5765", __FILE__)); |
|
3054 |
|
3055 QVERIFY_SQL(q, exec("CREATE TABLE "+tableName+"(testval TINYINT(1) DEFAULT 0)")); |
|
3056 q.prepare("INSERT INTO "+tableName+" SET testval = :VALUE"); |
|
3057 q.bindValue(":VALUE", 1); |
|
3058 QVERIFY_SQL(q, exec()); |
|
3059 q.bindValue(":VALUE", 12); |
|
3060 QVERIFY_SQL(q, exec()); |
|
3061 q.bindValue(":VALUE", 123); |
|
3062 QVERIFY_SQL(q, exec()); |
|
3063 QString sql="select testval from "+tableName; |
|
3064 QVERIFY_SQL(q, exec(sql)); |
|
3065 QVERIFY_SQL(q, next()); |
|
3066 QCOMPARE(q.value(0).toInt(), 1); |
|
3067 QVERIFY_SQL(q, next()); |
|
3068 QCOMPARE(q.value(0).toInt(), 12); |
|
3069 QVERIFY_SQL(q, next()); |
|
3070 QCOMPARE(q.value(0).toInt(), 123); |
|
3071 QVERIFY_SQL(q, prepare(sql)); |
|
3072 QVERIFY_SQL(q, exec()); |
|
3073 QVERIFY_SQL(q, next()); |
|
3074 QCOMPARE(q.value(0).toInt(), 1); |
|
3075 QVERIFY_SQL(q, next()); |
|
3076 QCOMPARE(q.value(0).toInt(), 12); |
|
3077 QVERIFY_SQL(q, next()); |
|
3078 QCOMPARE(q.value(0).toInt(), 123); |
|
3079 } |
|
3080 |
|
3081 #if 0 |
|
3082 void tst_QSqlQuery::benchmark() |
|
3083 { |
|
3084 QFETCH( QString, dbName ); |
|
3085 QSqlDatabase db = QSqlDatabase::database( dbName ); |
|
3086 CHECK_DATABASE( db ); |
|
3087 if ( tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) |
|
3088 QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); |
|
3089 |
|
3090 QSqlQuery q(db); |
|
3091 const QString tableName(qTableName("benchmark", __FILE__)); |
|
3092 |
|
3093 tst_Databases::safeDropTable( db, tableName ); |
|
3094 |
|
3095 QVERIFY_SQL(q, exec("CREATE TABLE "+tableName+"(\n" |
|
3096 "MainKey INT NOT NULL,\n" |
|
3097 "OtherTextCol VARCHAR(45) NOT NULL,\n" |
|
3098 "PRIMARY KEY(`MainKey`))")); |
|
3099 |
|
3100 int i=1; |
|
3101 |
|
3102 QBENCHMARK { |
|
3103 QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" VALUES("+QString::number(i)+", \"Value"+QString::number(i)+"\")")); |
|
3104 i++; |
|
3105 } |
|
3106 |
|
3107 tst_Databases::safeDropTable( db, tableName ); |
|
3108 } |
|
3109 #endif |
2987 |
3110 |
2988 QTEST_MAIN( tst_QSqlQuery ) |
3111 QTEST_MAIN( tst_QSqlQuery ) |
2989 #include "tst_qsqlquery.moc" |
3112 #include "tst_qsqlquery.moc" |