Skip to content

Commit

Permalink
[mssql] Fix empty extent handling
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Feb 21, 2025
1 parent 4dd7d7e commit 535b548
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 22 deletions.
30 changes: 16 additions & 14 deletions src/providers/mssql/qgsmssqlprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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();
Expand All @@ -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;
}
Expand Down
16 changes: 12 additions & 4 deletions tests/src/python/providertestbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -557,10 +557,18 @@ def testMaxValue(self):
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():
Expand Down
6 changes: 2 additions & 4 deletions tests/src/python/test_provider_mssql.py
Original file line number Diff line number Diff line change
Expand Up @@ -746,9 +746,7 @@ def testInvalidGeometries(self):
)
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():
Expand All @@ -772,7 +770,7 @@ def testInvalidGeometries(self):
"mssql",
)
self.assertTrue(vl.isValid())
self.assertEqual(vl.dataProvider().extent().toString(1), "Empty")
self.assertTrue(vl.dataProvider().extent().isNull())

def testEvaluateDefaultValueClause(self):

Expand Down

0 comments on commit 535b548

Please sign in to comment.