Skip to content

Commit

Permalink
Backport #34368 to 3.10
Browse files Browse the repository at this point in the history
  • Loading branch information
uclaros committed May 22, 2020
1 parent e91e3d0 commit 871def2
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
5 changes: 4 additions & 1 deletion src/core/providers/ogr/qgsogrprovider.cpp
Expand Up @@ -4382,7 +4382,10 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, GDALDatasetH ds
}
else
{
OGR_L_SetAttributeFilter( layer, encoding->fromUnicode( subsetString ).constData() );
if ( OGR_L_SetAttributeFilter( layer, encoding->fromUnicode( subsetString ).constData() ) != OGRERR_NONE )
{
return nullptr;
}
subsetLayer = layer;
}

Expand Down
21 changes: 21 additions & 0 deletions tests/src/python/test_provider_shapefile.py
Expand Up @@ -769,6 +769,27 @@ def _lessdigits(s):
self.assertEqual(_lessdigits(subSet_vl.extent().toString()), filtered_extent)
self.assertNotEqual(_lessdigits(subSet_vl.extent().toString()), unfiltered_extent)

def testMalformedSubsetStrings(self):
"""Test that invalid where clauses always return false"""

testPath = TEST_DATA_DIR + '/' + 'lines.shp'

vl = QgsVectorLayer(testPath, 'subset_test', 'ogr')
self.assertTrue(vl.isValid())
self.assertTrue(vl.setSubsetString(''))
self.assertTrue(vl.setSubsetString('"Name" = \'Arterial\''))
self.assertTrue(vl.setSubsetString('select * from lines where "Name" = \'Arterial\''))
self.assertFalse(vl.setSubsetString('this is invalid sql'))
self.assertFalse(vl.setSubsetString('select * from lines where "NonExistentField" = \'someValue\''))
self.assertFalse(vl.setSubsetString('select * from lines where "Name" = \'Arte...'))
self.assertFalse(vl.setSubsetString('select * from lines where "Name" in (\'Arterial\', \'Highway\' '))
self.assertFalse(vl.setSubsetString('select * from NonExistentTable'))
self.assertFalse(vl.setSubsetString('select NonExistentField from lines'))
self.assertFalse(vl.setSubsetString('"NonExistentField" = \'someValue\''))
self.assertFalse(vl.setSubsetString('"Name" = \'Arte...'))
self.assertFalse(vl.setSubsetString('"Name" in (\'Arterial\', \'Highway\' '))
self.assertTrue(vl.setSubsetString(''))

def testMultipatch(self):
"""Check that we can deal with multipatch shapefiles, returned natively by OGR as GeometryCollection of TIN"""

Expand Down

0 comments on commit 871def2

Please sign in to comment.