diff --git a/src/providers/spatialite/qgsspatialiteprovider.cpp b/src/providers/spatialite/qgsspatialiteprovider.cpp index a4d3aac0466..0dbe4e9c30d 100644 --- a/src/providers/spatialite/qgsspatialiteprovider.cpp +++ b/src/providers/spatialite/qgsspatialiteprovider.cpp @@ -588,8 +588,23 @@ QgsAbstractFeatureSource* QgsSpatiaLiteProvider::featureSource() const return new QgsSpatiaLiteFeatureSource( this ); } +void QgsSpatiaLiteProvider::updatePrimaryKeyCapabilities() +{ + if ( mPrimaryKey.isEmpty() ) + { + enabledCapabilities &= ~QgsVectorDataProvider::SelectAtId; + enabledCapabilities &= ~QgsVectorDataProvider::SelectGeometryAtId; + } + else + { + enabledCapabilities |= QgsVectorDataProvider::SelectAtId; + enabledCapabilities |= QgsVectorDataProvider::SelectGeometryAtId; + } +} + #ifdef SPATIALITE_VERSION_GE_4_0_0 // only if libspatialite version is >= 4.0.0 + void QgsSpatiaLiteProvider::loadFieldsAbstractInterface( gaiaVectorLayerPtr lyr ) { if ( lyr == nullptr ) @@ -657,6 +672,9 @@ void QgsSpatiaLiteProvider::loadFieldsAbstractInterface( gaiaVectorLayerPtr lyr mPrimaryKeyAttrs << i - 1; } } + + updatePrimaryKeyCapabilities(); + sqlite3_free_table( results ); } #endif @@ -849,6 +867,8 @@ void QgsSpatiaLiteProvider::loadFields() mPrimaryKey = pkName; } + updatePrimaryKeyCapabilities(); + return; error: diff --git a/src/providers/spatialite/qgsspatialiteprovider.h b/src/providers/spatialite/qgsspatialiteprovider.h index 8bf1281bcca..8df16f42647 100644 --- a/src/providers/spatialite/qgsspatialiteprovider.h +++ b/src/providers/spatialite/qgsspatialiteprovider.h @@ -426,6 +426,8 @@ class QgsSpatiaLiteProvider: public QgsVectorDataProvider static int computeMultiWKB3Dsize( const unsigned char *p_in, int little_endian, int endian_arch ); private: + void updatePrimaryKeyCapabilities(); + int computeSizeFromMultiWKB2D( const unsigned char *p_in, int nDims, int little_endian, int endian_arch ); @@ -496,6 +498,7 @@ class QgsSpatiaLiteProvider: public QgsVectorDataProvider QgsSqliteHandle *handle; friend class QgsSpatiaLiteFeatureSource; + }; #endif