Skip to content

Commit b2f27a8

Browse files
committed
[mssql] Fix empty extent handling
1 parent 490b3cd commit b2f27a8

File tree

3 files changed

+30
-22
lines changed

3 files changed

+30
-22
lines changed

src/providers/mssql/qgsmssqlprovider.cpp

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,10 +1027,20 @@ void QgsMssqlProvider::UpdateStatistics( bool estimate ) const
10271027

10281028
if ( !readAllGeography && query.next() )
10291029
{
1030-
mExtent.setXMinimum( query.value( 0 ).toDouble() );
1031-
mExtent.setYMinimum( query.value( 1 ).toDouble() );
1032-
mExtent.setXMaximum( query.value( 2 ).toDouble() );
1033-
mExtent.setYMaximum( query.value( 3 ).toDouble() );
1030+
if ( QgsVariantUtils::isNull( query.value( 0 ) )
1031+
|| QgsVariantUtils::isNull( query.value( 1 ) )
1032+
|| QgsVariantUtils::isNull( query.value( 2 ) )
1033+
|| QgsVariantUtils::isNull( query.value( 3 ) ) )
1034+
{
1035+
mExtent.setNull();
1036+
}
1037+
else
1038+
{
1039+
mExtent.setXMinimum( query.value( 0 ).toDouble() );
1040+
mExtent.setYMinimum( query.value( 1 ).toDouble() );
1041+
mExtent.setXMaximum( query.value( 2 ).toDouble() );
1042+
mExtent.setYMaximum( query.value( 3 ).toDouble() );
1043+
}
10341044
return;
10351045
}
10361046

@@ -1042,15 +1052,7 @@ void QgsMssqlProvider::UpdateStatistics( bool estimate ) const
10421052
if ( geom )
10431053
{
10441054
const QgsRectangle rect = geom->boundingBox();
1045-
1046-
if ( rect.xMinimum() < mExtent.xMinimum() )
1047-
mExtent.setXMinimum( rect.xMinimum() );
1048-
if ( rect.yMinimum() < mExtent.yMinimum() )
1049-
mExtent.setYMinimum( rect.yMinimum() );
1050-
if ( rect.xMaximum() > mExtent.xMaximum() )
1051-
mExtent.setXMaximum( rect.xMaximum() );
1052-
if ( rect.yMaximum() > mExtent.yMaximum() )
1053-
mExtent.setYMaximum( rect.yMaximum() );
1055+
mExtent.combineExtentWith( rect );
10541056

10551057
mWkbType = geom->wkbType();
10561058
mSRId = mParser.GetSRSId();
@@ -1061,7 +1063,7 @@ void QgsMssqlProvider::UpdateStatistics( bool estimate ) const
10611063
// Return the extent of the layer
10621064
QgsRectangle QgsMssqlProvider::extent() const
10631065
{
1064-
if ( mExtent.isEmpty() )
1066+
if ( mExtent.isNull() )
10651067
UpdateStatistics( mUseEstimatedMetadata );
10661068
return mExtent;
10671069
}

tests/src/python/providertestbase.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -558,10 +558,18 @@ def testMaxValue(self):
558558
def testExtent(self):
559559
reference_extent = self.referenceExtent()
560560
provider_extent = self.source.extent()
561-
self.assertAlmostEqual(provider_extent.xMinimum(), reference_extent.xMinimum())
562-
self.assertAlmostEqual(provider_extent.xMaximum(), reference_extent.xMaximum())
563-
self.assertAlmostEqual(provider_extent.yMinimum(), reference_extent.yMinimum())
564-
self.assertAlmostEqual(provider_extent.yMaximum(), reference_extent.yMaximum())
561+
self.assertAlmostEqual(
562+
provider_extent.xMinimum(), reference_extent.xMinimum(), 5
563+
)
564+
self.assertAlmostEqual(
565+
provider_extent.xMaximum(), reference_extent.xMaximum(), 5
566+
)
567+
self.assertAlmostEqual(
568+
provider_extent.yMinimum(), reference_extent.yMinimum(), 5
569+
)
570+
self.assertAlmostEqual(
571+
provider_extent.yMaximum(), reference_extent.yMaximum(), 5
572+
)
565573

566574
def testExtentSubsetString(self):
567575
if self.source.supportsSubsetString():

tests/src/python/test_provider_mssql.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -746,9 +746,7 @@ def testInvalidGeometries(self):
746746
)
747747
self.assertTrue(vl.isValid())
748748

749-
self.assertEqual(
750-
vl.dataProvider().extent().toString(1), "Empty"
751-
) # HAHA - you asked for it
749+
self.assertTrue(vl.dataProvider().extent().isNull()) # HAHA - you asked for it
752750
# burn through features - don't expect anything wrong here yet
753751
count = 0
754752
for f in vl.dataProvider().getFeatures():
@@ -772,7 +770,7 @@ def testInvalidGeometries(self):
772770
"mssql",
773771
)
774772
self.assertTrue(vl.isValid())
775-
self.assertEqual(vl.dataProvider().extent().toString(1), "Empty")
773+
self.assertTrue(vl.dataProvider().extent().isNull())
776774

777775
def testEvaluateDefaultValueClause(self):
778776

0 commit comments

Comments
 (0)