Skip to content

Commit 1689c93

Browse files
committedFeb 19, 2019
Fix unique values on GPKG pk
Fixes #21311
1 parent 7fa9bc1 commit 1689c93

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed
 

‎src/providers/ogr/qgsogrprovider.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3618,7 +3618,15 @@ QSet<QVariant> QgsOgrProvider::uniqueValues( int index, int limit ) const
36183618
return uniqueValues; //not a provider field
36193619
}
36203620

3621+
36213622
QByteArray sql = "SELECT DISTINCT " + quotedIdentifier( textEncoding()->fromUnicode( fld.name() ) );
3623+
3624+
// GPKG fid
3625+
if ( mGDALDriverName == QLatin1String( "GPKG" ) && mFirstFieldIsFid && index == 0 )
3626+
{
3627+
sql += ", " + quotedIdentifier( textEncoding()->fromUnicode( fld.name() ) ) + " AS fid2";
3628+
}
3629+
36223630
sql += " FROM " + quotedIdentifier( mOgrLayer->name() );
36233631

36243632
if ( !mSubsetString.isEmpty() )

‎tests/src/python/test_provider_ogr_gpkg.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,6 +1322,28 @@ def testGeopackageLayerMetadata(self):
13221322
self.assertEqual(vl1.metadata().title(), 'my title')
13231323
self.assertEqual(vl1.metadata().abstract(), 'my desc')
13241324

1325+
def testUniqueValuesOnFidColumn(self):
1326+
"""Test regression #21311 OGR provider returns an empty set for GPKG uniqueValues"""
1327+
1328+
tmpfile = os.path.join(self.basetestpath, 'testGeopackageUniqueValuesOnFidColumn.gpkg')
1329+
ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile)
1330+
lyr = ds.CreateLayer('test', geom_type=ogr.wkbPolygon)
1331+
lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString))
1332+
f = ogr.Feature(lyr.GetLayerDefn())
1333+
f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,1 0,0 0))'))
1334+
f.SetField('str_field', 'one')
1335+
lyr.CreateFeature(f)
1336+
f = ogr.Feature(lyr.GetLayerDefn())
1337+
f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 2,2 2,2 0,0 0))'))
1338+
f.SetField('str_field', 'two')
1339+
lyr.CreateFeature(f)
1340+
f = None
1341+
ds = None
1342+
vl1 = QgsVectorLayer('{}'.format(tmpfile) + "|layername=" + "test", 'test', 'ogr')
1343+
self.assertTrue(vl1.isValid())
1344+
self.assertEqual(vl1.uniqueValues(0), {1, 2})
1345+
self.assertEqual(vl1.uniqueValues(1), {'one', 'two'})
1346+
13251347

13261348
if __name__ == '__main__':
13271349
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.