diff --git a/src/providers/mssql/qgsmssqlprovider.cpp b/src/providers/mssql/qgsmssqlprovider.cpp index 8ef32e680dd..ef993d1fc09 100644 --- a/src/providers/mssql/qgsmssqlprovider.cpp +++ b/src/providers/mssql/qgsmssqlprovider.cpp @@ -1027,10 +1027,20 @@ void QgsMssqlProvider::UpdateStatistics( bool estimate ) const if ( !readAllGeography && query.next() ) { - mExtent.setXMinimum( query.value( 0 ).toDouble() ); - mExtent.setYMinimum( query.value( 1 ).toDouble() ); - mExtent.setXMaximum( query.value( 2 ).toDouble() ); - mExtent.setYMaximum( query.value( 3 ).toDouble() ); + if ( QgsVariantUtils::isNull( query.value( 0 ) ) + || QgsVariantUtils::isNull( query.value( 1 ) ) + || QgsVariantUtils::isNull( query.value( 2 ) ) + || QgsVariantUtils::isNull( query.value( 3 ) ) ) + { + mExtent.setNull(); + } + else + { + mExtent.setXMinimum( query.value( 0 ).toDouble() ); + mExtent.setYMinimum( query.value( 1 ).toDouble() ); + mExtent.setXMaximum( query.value( 2 ).toDouble() ); + mExtent.setYMaximum( query.value( 3 ).toDouble() ); + } return; } @@ -1042,15 +1052,7 @@ void QgsMssqlProvider::UpdateStatistics( bool estimate ) const if ( geom ) { const QgsRectangle rect = geom->boundingBox(); - - if ( rect.xMinimum() < mExtent.xMinimum() ) - mExtent.setXMinimum( rect.xMinimum() ); - if ( rect.yMinimum() < mExtent.yMinimum() ) - mExtent.setYMinimum( rect.yMinimum() ); - if ( rect.xMaximum() > mExtent.xMaximum() ) - mExtent.setXMaximum( rect.xMaximum() ); - if ( rect.yMaximum() > mExtent.yMaximum() ) - mExtent.setYMaximum( rect.yMaximum() ); + mExtent.combineExtentWith( rect ); mWkbType = geom->wkbType(); mSRId = mParser.GetSRSId(); @@ -1061,7 +1063,7 @@ void QgsMssqlProvider::UpdateStatistics( bool estimate ) const // Return the extent of the layer QgsRectangle QgsMssqlProvider::extent() const { - if ( mExtent.isEmpty() ) + if ( mExtent.isNull() ) UpdateStatistics( mUseEstimatedMetadata ); return mExtent; } diff --git a/tests/src/python/providertestbase.py b/tests/src/python/providertestbase.py index 6355499210a..b9525c47e0b 100644 --- a/tests/src/python/providertestbase.py +++ b/tests/src/python/providertestbase.py @@ -557,10 +557,18 @@ class ProviderTestCase(FeatureSourceTestCase): def testExtent(self): reference_extent = self.referenceExtent() provider_extent = self.source.extent() - self.assertAlmostEqual(provider_extent.xMinimum(), reference_extent.xMinimum()) - self.assertAlmostEqual(provider_extent.xMaximum(), reference_extent.xMaximum()) - self.assertAlmostEqual(provider_extent.yMinimum(), reference_extent.yMinimum()) - self.assertAlmostEqual(provider_extent.yMaximum(), reference_extent.yMaximum()) + self.assertAlmostEqual( + provider_extent.xMinimum(), reference_extent.xMinimum(), 5 + ) + self.assertAlmostEqual( + provider_extent.xMaximum(), reference_extent.xMaximum(), 5 + ) + self.assertAlmostEqual( + provider_extent.yMinimum(), reference_extent.yMinimum(), 5 + ) + self.assertAlmostEqual( + provider_extent.yMaximum(), reference_extent.yMaximum(), 5 + ) def testExtentSubsetString(self): if self.source.supportsSubsetString(): diff --git a/tests/src/python/test_provider_mssql.py b/tests/src/python/test_provider_mssql.py index dab797efbe6..cca5c266a12 100644 --- a/tests/src/python/test_provider_mssql.py +++ b/tests/src/python/test_provider_mssql.py @@ -746,9 +746,7 @@ class TestPyQgsMssqlProvider(QgisTestCase, ProviderTestCase): ) self.assertTrue(vl.isValid()) - self.assertEqual( - vl.dataProvider().extent().toString(1), "Empty" - ) # HAHA - you asked for it + self.assertTrue(vl.dataProvider().extent().isNull()) # HAHA - you asked for it # burn through features - don't expect anything wrong here yet count = 0 for f in vl.dataProvider().getFeatures(): @@ -772,7 +770,7 @@ class TestPyQgsMssqlProvider(QgisTestCase, ProviderTestCase): "mssql", ) self.assertTrue(vl.isValid()) - self.assertEqual(vl.dataProvider().extent().toString(1), "Empty") + self.assertTrue(vl.dataProvider().extent().isNull()) def testEvaluateDefaultValueClause(self):