diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp index de585580ec6a..deb2b24b91b8 100644 --- a/src/providers/postgres/qgspostgresprovider.cpp +++ b/src/providers/postgres/qgspostgresprovider.cpp @@ -3479,7 +3479,11 @@ bool QgsPostgresProvider::changeFeatures( const QgsChangedAttributesMap &attr_ma result = conn->PQexecPrepared( QStringLiteral( "updatefeature" ), params ); if ( result.PQresultStatus() != PGRES_COMMAND_OK && result.PQresultStatus() != PGRES_TUPLES_OK ) + { + conn->rollback(); + conn->PQexecNR( QStringLiteral( "DEALLOCATE updatefeature" ) ); throw PGException( result ); + } conn->PQexecNR( QStringLiteral( "DEALLOCATE updatefeature" ) ); } diff --git a/tests/src/python/test_provider_postgres.py b/tests/src/python/test_provider_postgres.py index 4ff9af6241c6..2d3a36d257f5 100644 --- a/tests/src/python/test_provider_postgres.py +++ b/tests/src/python/test_provider_postgres.py @@ -2065,6 +2065,18 @@ def testReadExtentOnTable(self): vl2.readLayerXml(elem, QgsReadWriteContext()) self.assertEqual(vl2.extent(), originalExtent) + def testPreparedFailure(self): + """Test error from issue GH #45100""" + + layer = self.getEditableLayerWithCheckConstraint() + self.assertTrue(layer.startEditing()) + old_value = layer.getFeature(1).attribute('i_will_fail_on_no_name') + layer.changeAttributeValue(1, 1, 'no name') + layer.changeGeometry(1, QgsGeometry.fromWkt('point(7 45)')) + self.assertFalse(layer.commitChanges()) + layer.changeAttributeValue(1, 1, old_value) + self.assertTrue(layer.commitChanges()) + def testDeterminePkey(self): """Test primary key auto-determination"""