Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 69bf2af

Browse files
elpasonyalldawson
authored andcommittedMar 5, 2023
Fix PG identity default value with long field names
Fix #51563
1 parent 1e1d4e4 commit 69bf2af

File tree

2 files changed

+21
-12
lines changed

2 files changed

+21
-12
lines changed
 

‎src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1364,20 +1364,13 @@ bool QgsPostgresProvider::loadFields()
13641364
&& uniqueMap[tableoid][attnum]
13651365
&& defValMap[tableoid][attnum].isEmpty() )
13661366
{
1367-
const QString seqName { mTableName + '_' + fieldName + QStringLiteral( "_seq" ) };
1368-
const QString seqSql = QStringLiteral( "SELECT c.oid::regclass "
1369-
" FROM pg_class c "
1370-
" LEFT JOIN pg_namespace n "
1371-
" ON ( n.oid = c.relnamespace ) "
1372-
" WHERE c.relkind = 'S' "
1373-
" AND c.relname = %1 "
1374-
" AND n.nspname = %2" )
1375-
.arg( quotedValue( seqName ) )
1376-
.arg( quotedValue( mSchemaName ) );
1367+
const QString seqSql = QStringLiteral( "SELECT pg_get_serial_sequence(%1, %2)" )
1368+
.arg( quotedValue( mQuery ) )
1369+
.arg( quotedValue( fieldName ) );
13771370
QgsPostgresResult seqResult( connectionRO()->PQexec( seqSql ) );
13781371
if ( seqResult.PQntuples() == 1 )
13791372
{
1380-
defValMap[tableoid][attnum] = QStringLiteral( "nextval(%1::regclass)" ).arg( quotedValue( seqResult.PQgetvalue( 0, 0 ) ) );
1373+
defValMap[tableoid][attnum] = QStringLiteral( "nextval(%1)" ).arg( quotedValue( seqResult.PQgetvalue( 0, 0 ) ) );
13811374
}
13821375
}
13831376

‎tests/src/python/test_provider_postgres.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2602,7 +2602,7 @@ def testIdentityPk(self):
26022602
feature.setGeometry(geom)
26032603
self.assertTrue(vl.dataProvider().addFeature(feature))
26042604

2605-
self.assertEqual(vl.dataProvider().defaultValueClause(0), "nextval('qgis_test.b29560_gid_seq'::regclass)")
2605+
self.assertEqual(vl.dataProvider().defaultValueClause(0), "nextval('qgis_test.b29560_gid_seq')")
26062606

26072607
del (vl)
26082608

@@ -2615,6 +2615,22 @@ def testIdentityPk(self):
26152615
feature = next(vl.getFeatures())
26162616
self.assertIsNotNone(feature.id())
26172617

2618+
def testIdentityLongFieldDefaultValue(self):
2619+
"""Test issue GH #51563"""
2620+
2621+
self.execSQLCommand(
2622+
'DROP TABLE IF EXISTS qgis_test."test_IDENTIFIER_name_so_long_it_will_get_truncated" CASCADE')
2623+
self.execSQLCommand("""
2624+
CREATE TABLE qgis_test."test_IDENTIFIER_name_so_long_it_will_get_truncated"(
2625+
"test_IDENTIFIER_so_long_it_will_get_truncated" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
2626+
test_description text
2627+
);""")
2628+
2629+
vl = QgsVectorLayer(self.dbconn + ' sslmode=disable key=\'test_IDENTIFIER_so_long_it_will_get_truncated\' srid=0 table="qgis_test"."test_IDENTIFIER_name_so_long_it_will_get_truncated" () sql=', 'gh_51563_1', 'postgres')
2630+
self.assertTrue(vl.isValid())
2631+
2632+
self.assertEqual(vl.dataProvider().defaultValueClause(0), 'nextval(\'qgis_test."test_IDENTIFIER_name_so_long__test_IDENTIFIER_so_long_it_wi_seq"\')')
2633+
26182634
def testEvalDefaultOnProviderSide(self):
26192635
"""Test issue GH #50168"""
26202636

0 commit comments

Comments
 (0)
Please sign in to comment.