From 0850d990678e1153c8f4765eed75030fc7ec7000 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Wed, 22 Jan 2020 18:25:13 +0100 Subject: [PATCH] Fix spatialite uniquevalues with bigint Fixes #33585 --- .../spatialite/qgsspatialiteprovider.cpp | 2 +- tests/src/python/test_provider_spatialite.py | 22 ++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/providers/spatialite/qgsspatialiteprovider.cpp b/src/providers/spatialite/qgsspatialiteprovider.cpp index 86cb6e533ee6..4ba2c140bb34 100644 --- a/src/providers/spatialite/qgsspatialiteprovider.cpp +++ b/src/providers/spatialite/qgsspatialiteprovider.cpp @@ -3823,7 +3823,7 @@ QSet QgsSpatiaLiteProvider::uniqueValues( int index, int limit ) const switch ( sqlite3_column_type( stmt, 0 ) ) { case SQLITE_INTEGER: - uniqueValues.insert( QVariant( sqlite3_column_int( stmt, 0 ) ) ); + uniqueValues.insert( QVariant( sqlite3_column_int64( stmt, 0 ) ) ); break; case SQLITE_FLOAT: uniqueValues.insert( QVariant( sqlite3_column_double( stmt, 0 ) ) ); diff --git a/tests/src/python/test_provider_spatialite.py b/tests/src/python/test_provider_spatialite.py index 3b24bd175e9a..a41484af24a9 100644 --- a/tests/src/python/test_provider_spatialite.py +++ b/tests/src/python/test_provider_spatialite.py @@ -227,6 +227,18 @@ def setUpClass(cls): sql += "VALUES (8, 'int', GeomFromText('POINT(2 1)', 4326))" cur.execute(sql) + # bigint table + sql = "CREATE TABLE test_bigint (id BIGINT, value INT)" + cur.execute(sql) + sql = "SELECT AddGeometryColumn('test_bigint', 'position', 4326, 'LINESTRING', 'XYM')" + cur.execute(sql) + sql = """ + INSERT INTO test_bigint (id, value, position) VALUES + (987654321012345, 1, ST_GeomFromtext('LINESTRINGM(10.416255 55.3786316 1577093516, 10.516255 55.4786316 157709)', 4326) ), + (987654321012346, 2, ST_GeomFromtext('LINESTRINGM(10.316255 55.3786316 1577093516, 11.216255 56.3786316 157709)', 4326) )""" + + cur.execute(sql) + cur.execute("COMMIT") con.close() @@ -816,7 +828,7 @@ def testEncodeUri(self): filename = '/home/to/path/test.db' registry = QgsProviderRegistry.instance() - parts = {'path', filename, 'layerName': 'test'} + parts = {'path': filename, 'layerName': 'test'} uri = registry.encodeUri('spatialite', parts) self.assertEqual(uri, 'dbname=\'{}\' table="test" (geometry) sql='.format(filename)) @@ -1139,6 +1151,14 @@ def testGeometryTypes(self): self.assertTrue(vl.isValid()) self.assertEqual(vl.wkbType(), qgisType) + def testBigint(self): + """Test unique values bigint, see GH #33585""" + + l = QgsVectorLayer("dbname=%s table='test_bigint' (position) key='id'" % self.dbname, "test_bigint", "spatialite") + self.assertTrue(l.isValid()) + self.assertEqual(l.uniqueValues(1), {1, 2}) + self.assertEqual(l.uniqueValues(0), {987654321012345, 987654321012346}) + if __name__ == '__main__': unittest.main()