summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill King <bill.king@nokia.com>2010-04-20 02:07:22 (GMT)
committerBill King <bill.king@nokia.com>2010-04-20 02:07:22 (GMT)
commitdd478a4b829921c9dfeb23110177a30f32eca5af (patch)
tree4acb0bd7f0eaa61c2380580ff4835f74f0913ec7
parent84f0ae22f4b1e7882f4c0fff2a1f5bc47ebceb37 (diff)
downloadQt-dd478a4b829921c9dfeb23110177a30f32eca5af.zip
Qt-dd478a4b829921c9dfeb23110177a30f32eca5af.tar.gz
Qt-dd478a4b829921c9dfeb23110177a30f32eca5af.tar.bz2
Fix sqlite driver doesn't return error message RAISE by a trigger.
Task-number: QTBUG-7988 Reviewed-by: Justin McPherson
-rw-r--r--src/sql/drivers/sqlite/qsql_sqlite.cpp1
-rw-r--r--tests/auto/qsqlquery/tst_qsqlquery.cpp27
2 files changed, 28 insertions, 0 deletions
diff --git a/src/sql/drivers/sqlite/qsql_sqlite.cpp b/src/sql/drivers/sqlite/qsql_sqlite.cpp
index d3be304..9b9d30b 100644
--- a/src/sql/drivers/sqlite/qsql_sqlite.cpp
+++ b/src/sql/drivers/sqlite/qsql_sqlite.cpp
@@ -259,6 +259,7 @@ bool QSQLiteResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int i
q->setAt(QSql::AfterLastRow);
sqlite3_reset(stmt);
return false;
+ case SQLITE_CONSTRAINT:
case SQLITE_ERROR:
// SQLITE_ERROR is a generic error code and we must call sqlite3_reset()
// to get the specific error message.
diff --git a/tests/auto/qsqlquery/tst_qsqlquery.cpp b/tests/auto/qsqlquery/tst_qsqlquery.cpp
index db3a929..c7a61a5 100644
--- a/tests/auto/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/qsqlquery/tst_qsqlquery.cpp
@@ -209,6 +209,8 @@ private slots:
void QTBUG_6852();
void QTBUG_5765_data() { generic_data("QMYSQL"); }
void QTBUG_5765();
+ void sqlite_constraint_data() { generic_data("QSQLITE"); }
+ void sqlite_constraint();
#if 0
void benchmark_data() { generic_data(); }
@@ -3078,6 +3080,31 @@ void tst_QSqlQuery::QTBUG_5765()
QCOMPARE(q.value(0).toInt(), 123);
}
+void tst_QSqlQuery::sqlite_constraint()
+{
+ QFETCH( QString, dbName );
+ QSqlDatabase db = QSqlDatabase::database( dbName );
+ CHECK_DATABASE( db );
+
+ if (db.driverName() != QLatin1String("QSQLITE")) {
+ QSKIP("Sqlite3 specific test", SkipSingle);
+ return;
+ }
+
+ QSqlQuery q(db);
+ const QString trigger(qTableName("test_constraint", __FILE__));
+
+ QVERIFY_SQL(q, exec("CREATE TEMP TRIGGER "+trigger+" BEFORE DELETE ON "+qtest+
+ "\nFOR EACH ROW "
+ "\nBEGIN"
+ "\n SELECT RAISE(ABORT, 'Raised Abort successfully');"
+ "\nEND;"
+ ));
+
+ QVERIFY(!q.exec("DELETE FROM "+qtest));
+ QCOMPARE(q.lastError().databaseText(), QLatin1String("Raised Abort successfully"));
+}
+
#if 0
void tst_QSqlQuery::benchmark()
{