[mssql] Fix empty extent handling

This commit is contained in:
Nyall Dawson 2025-02-19 10:59:49 +10:00
parent 4dd7d7e969
commit 535b548e55
3 changed files with 30 additions and 22 deletions

View File

@ -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;
}

View File

@ -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():

View File

@ -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):