mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-28 00:17:30 -05:00
Merge pull request #31841 from elpaso/bugfix-gh31799-tid-in-views
PG views: be tolerant for unsupported field type ...
This commit is contained in:
commit
3be3984e8e
@ -179,7 +179,7 @@ QgsPostgresProvider::QgsPostgresProvider( QString const &uri, const ProviderOpti
|
||||
if ( !getGeometryDetails() ) // gets srid, geometry and data type
|
||||
{
|
||||
// the table is not a geometry table
|
||||
QgsMessageLog::logMessage( tr( "invalid PostgreSQL layer" ), tr( "PostGIS" ) );
|
||||
QgsMessageLog::logMessage( tr( "Invalid PostgreSQL layer" ), tr( "PostGIS" ) );
|
||||
disconnectDb();
|
||||
return;
|
||||
}
|
||||
@ -191,7 +191,7 @@ QgsPostgresProvider::QgsPostgresProvider( QString const &uri, const ProviderOpti
|
||||
{
|
||||
if ( !getTopoLayerInfo() ) // gets topology name and layer id
|
||||
{
|
||||
QgsMessageLog::logMessage( tr( "invalid PostgreSQL topology layer" ), tr( "PostGIS" ) );
|
||||
QgsMessageLog::logMessage( tr( "Invalid PostgreSQL topology layer" ), tr( "PostGIS" ) );
|
||||
mValid = false;
|
||||
disconnectDb();
|
||||
return;
|
||||
@ -939,7 +939,7 @@ bool QgsPostgresProvider::loadFields()
|
||||
}
|
||||
else if ( formattedFieldType != QLatin1String( "numeric" ) )
|
||||
{
|
||||
QgsMessageLog::logMessage( tr( "unexpected formatted field type '%1' for field %2" )
|
||||
QgsMessageLog::logMessage( tr( "Unexpected formatted field type '%1' for field %2" )
|
||||
.arg( formattedFieldType,
|
||||
fieldName ),
|
||||
tr( "PostGIS" ) );
|
||||
@ -1010,7 +1010,7 @@ bool QgsPostgresProvider::loadFields()
|
||||
}
|
||||
else
|
||||
{
|
||||
QgsDebugMsg( QStringLiteral( "unexpected formatted field type '%1' for field %2" )
|
||||
QgsDebugMsg( QStringLiteral( "Unexpected formatted field type '%1' for field %2" )
|
||||
.arg( formattedFieldType,
|
||||
fieldName ) );
|
||||
fieldSize = -1;
|
||||
@ -1028,7 +1028,7 @@ bool QgsPostgresProvider::loadFields()
|
||||
}
|
||||
else
|
||||
{
|
||||
QgsMessageLog::logMessage( tr( "unexpected formatted field type '%1' for field %2" )
|
||||
QgsMessageLog::logMessage( tr( "Unexpected formatted field type '%1' for field %2" )
|
||||
.arg( formattedFieldType,
|
||||
fieldName ) );
|
||||
fieldSize = -1;
|
||||
@ -1049,8 +1049,19 @@ bool QgsPostgresProvider::loadFields()
|
||||
}
|
||||
else
|
||||
{
|
||||
QgsMessageLog::logMessage( tr( "Field %1 ignored, because of unsupported type %2" ).arg( fieldName, fieldTypeName ), tr( "PostGIS" ) );
|
||||
continue;
|
||||
// be tolerant in case of views: this might be a field used as a key
|
||||
const QgsPostgresProvider::Relkind type = relkind();
|
||||
if ( ( type == Relkind::View || type == Relkind::MaterializedView ) && parseUriKey( mUri.keyColumn( ) ).contains( fieldName ) )
|
||||
{
|
||||
// Assume it is convertible to text
|
||||
fieldType = QVariant::String;
|
||||
fieldSize = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
QgsMessageLog::logMessage( tr( "Field %1 ignored, because of unsupported type %2" ).arg( fieldName, fieldTType ), tr( "PostGIS" ) );
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isArray )
|
||||
@ -1368,7 +1379,7 @@ bool QgsPostgresProvider::determinePrimaryKey()
|
||||
// If the relation is a view try to find a suitable column to use as
|
||||
// the primary key.
|
||||
|
||||
QgsPostgresProvider::Relkind type = relkind();
|
||||
const QgsPostgresProvider::Relkind type = relkind();
|
||||
|
||||
if ( type == Relkind::OrdinaryTable || type == Relkind::PartitionedTable )
|
||||
{
|
||||
|
@ -1405,6 +1405,16 @@ class TestPyQgsPostgresProvider(unittest.TestCase, ProviderTestCase):
|
||||
self.assertFalse(vl.isValid())
|
||||
self.assertEqual(vl.dataProvider().discoverRelations(vl, []), [])
|
||||
|
||||
def testCheckTidPkOnViews(self):
|
||||
"""Test vector layer based on a view with `ctid` as a key"""
|
||||
|
||||
# This is valid
|
||||
vl0 = QgsVectorLayer(self.dbconn + ' checkPrimaryKeyUnicity=\'0\' sslmode=disable key=\'ctid\' srid=4326 type=POINT table="qgis_test"."b31799_test_view_ctid" (geom) sql=', 'test', 'postgres')
|
||||
self.assertTrue(vl0.isValid())
|
||||
self.assertEqual(vl0.featureCount(), 10)
|
||||
for f in vl0.getFeatures():
|
||||
self.assertNotEqual(f.attribute(0), NULL)
|
||||
|
||||
|
||||
class TestPyQgsPostgresProviderCompoundKey(unittest.TestCase, ProviderTestCase):
|
||||
|
||||
|
9
tests/testdata/provider/testdata_pg.sql
vendored
9
tests/testdata/provider/testdata_pg.sql
vendored
@ -653,3 +653,12 @@ CREATE VIEW qgis_test.some_poly_data_shift_bbox AS
|
||||
0.0
|
||||
) AS shiftbox
|
||||
FROM qgis_test.some_poly_data;
|
||||
|
||||
|
||||
---------------------------------------------
|
||||
--
|
||||
-- View with tid PK field
|
||||
--
|
||||
|
||||
CREATE TABLE qgis_test.b31799_test_table AS (SELECT (ST_DumpPoints(ST_GeneratePoints(ST_Expand('SRID=4326;POINT(0 0)'::geometry,90),10))).geom, random());
|
||||
CREATE VIEW qgis_test.b31799_test_view_ctid AS (SELECT ctid, geom, random() FROM qgis_test.b31799_test_table, pg_sleep(0.1));
|
Loading…
x
Reference in New Issue
Block a user