Merge pull request #31841 from elpaso/bugfix-gh31799-tid-in-views

PG views: be tolerant for unsupported field type ...
This commit is contained in:
Alessandro Pasotti 2019-09-18 11:21:48 +02:00 committed by GitHub
commit 3be3984e8e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 8 deletions

View File

@ -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 )
{

View File

@ -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):

View File

@ -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));