Skip to content

Commit 68cb04a

Browse files
committed
[OGR provider] Support full SELECT subset string
This will be useful for DBManager SQL request layer.
1 parent 2655ced commit 68cb04a

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

src/providers/ogr/qgsogrprovider.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3249,8 +3249,14 @@ OGRLayerH QgsOgrProviderUtils::setSubsetString( OGRLayerH layer, OGRDataSourceH
32493249
layerName = encoding->fromUnicode( modifiedLayerName );
32503250
}
32513251
}
3252-
QByteArray sql = "SELECT * FROM " + quotedIdentifier( layerName, ogrDriverName );
3253-
sql += " WHERE " + encoding->fromUnicode( subsetString );
3252+
QByteArray sql;
3253+
if ( subsetString.startsWith( "SELECT ", Qt::CaseInsensitive ) )
3254+
sql = encoding->fromUnicode( subsetString );
3255+
else
3256+
{
3257+
sql = "SELECT * FROM " + quotedIdentifier( layerName, ogrDriverName );
3258+
sql += " WHERE " + encoding->fromUnicode( subsetString );
3259+
}
32543260

32553261
QgsDebugMsg( QString( "SQL: %1" ).arg( encoding->toUnicode( sql ) ) );
32563262
return OGR_DS_ExecuteSQL( ds, sql.constData(), nullptr, nullptr );

tests/src/python/test_provider_ogr_gpkg.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,5 +199,27 @@ def testGeopackageExtentUpdate(self):
199199
self.assertTrue(QgsGeometry.compare(provider_extent.asPolygon()[0], reference.asPolygon()[0], 0.00001),
200200
provider_extent.asPolygon()[0])
201201

202+
def testSelectSubsetString(self):
203+
204+
tmpfile = os.path.join(self.basetestpath, 'testSelectSubsetString.gpkg')
205+
ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile)
206+
lyr = ds.CreateLayer('test', geom_type=ogr.wkbMultiPolygon)
207+
lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString))
208+
f = ogr.Feature(lyr.GetLayerDefn())
209+
f['foo'] = 'bar'
210+
lyr.CreateFeature(f)
211+
f = None
212+
f = ogr.Feature(lyr.GetLayerDefn())
213+
f['foo'] = 'baz'
214+
lyr.CreateFeature(f)
215+
f = None
216+
ds = None
217+
218+
vl = QgsVectorLayer('{}|layerid=0'.format(tmpfile), 'test', 'ogr')
219+
vl.setSubsetString("SELECT fid, foo FROM test WHERE foo = 'baz'")
220+
got = [feat for feat in vl.getFeatures()]
221+
self.assertEqual(len(got), 1)
222+
223+
202224
if __name__ == '__main__':
203225
unittest.main()

0 commit comments

Comments
 (0)