From 3e9b762e76cbccc091c94e3dcf328f1eaee8f65f Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Sun, 20 Oct 2024 17:45:02 +0200 Subject: [PATCH] [PostgreSQL provider] Add support for BIT and BIT VARYING data types Fixes #59129 --- .../postgres/qgspostgresprovider.cpp | 4 +++- tests/src/python/test_provider_postgres.py | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp index 2036634dc604..ae17d52c5c15 100644 --- a/src/providers/postgres/qgspostgresprovider.cpp +++ b/src/providers/postgres/qgspostgresprovider.cpp @@ -1235,6 +1235,8 @@ bool QgsPostgresProvider::loadFields() fieldTypeName == QLatin1String( "ltree" ) || fieldTypeName == QLatin1String( "uuid" ) || fieldTypeName == QLatin1String( "xml" ) || + fieldTypeName == QLatin1String( "bit" ) || + fieldTypeName == QLatin1String( "varbit" ) || fieldTypeName.startsWith( QLatin1String( "time" ) ) || fieldTypeName.startsWith( QLatin1String( "date" ) ) ) { @@ -1323,7 +1325,7 @@ bool QgsPostgresProvider::loadFields() } else { - QgsMessageLog::logMessage( tr( "Field %1 ignored, because of unsupported type %2" ).arg( fieldName, fieldTType ), tr( "PostGIS" ) ); + QgsMessageLog::logMessage( tr( "Field %1 ignored, because of unsupported type %2" ).arg( fieldName, fieldTypeName ), tr( "PostGIS" ) ); continue; } } diff --git a/tests/src/python/test_provider_postgres.py b/tests/src/python/test_provider_postgres.py index c44ecdea0972..bd6aa3d75301 100644 --- a/tests/src/python/test_provider_postgres.py +++ b/tests/src/python/test_provider_postgres.py @@ -3507,6 +3507,28 @@ def testColumnRestrictedLayerIsEditable(self): self.assertTrue(vl.isValid(), "qgis_issue_gh_28835 is an invalid layer") self.assertTrue(vl.startEditing(), "qgis_issue_gh_28835 is not editable by qgis_test_unprivileged_user after restricted-column insert grant") + def testBitAndBitVarying(self): + """Test issue GH #59129""" + + self.execSQLCommand( + 'ALTER TABLE IF EXISTS qgis_test."bit_and_bit_varying" DROP CONSTRAINT IF EXISTS pk_bit_and_bit_varying;') + self.execSQLCommand( + 'DROP TABLE IF EXISTS qgis_test."bit_and_bit_varying" CASCADE;') + self.execSQLCommand( + 'CREATE TABLE qgis_test."bit_and_bit_varying" ( "T_Id" integer NOT NULL, a BIT(3), b BIT VARYING(5) );') + self.execSQLCommand( + """INSERT INTO qgis_test."bit_and_bit_varying" VALUES (1, B'101', B'00');""") + self.execSQLCommand( + 'ALTER TABLE qgis_test."bit_and_bit_varying" ADD CONSTRAINT pk_gh_bit_and_bit_varying PRIMARY KEY ("T_Id");') + + vl = QgsVectorLayer(self.dbconn + ' sslmode=disable key=\'id\' table="qgis_test"."bit_and_bit_varying" () sql=', 'bit_and_bit_varying', 'postgres') + self.assertTrue(vl.isValid()) + + feat = next(vl.getFeatures()) + self.assertTrue(feat.isValid()) + self.assertEqual(feat["a"], "101") + self.assertEqual(feat["b"], "00") + class TestPyQgsPostgresProviderCompoundKey(QgisTestCase, ProviderTestCase):