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 fe5275b

Browse files
elpasogithub-actions[bot]
authored andcommittedJan 30, 2023
Fix PG identity default value with long field names
Fix #51563
1 parent f373f5b commit fe5275b

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
@@ -1417,20 +1417,13 @@ bool QgsPostgresProvider::loadFields()
14171417
&& uniqueMap[tableoid][attnum]
14181418
&& defValMap[tableoid][attnum].isEmpty() )
14191419
{
1420-
const QString seqName { mTableName + '_' + fieldName + QStringLiteral( "_seq" ) };
1421-
const QString seqSql = QStringLiteral( "SELECT c.oid::regclass "
1422-
" FROM pg_class c "
1423-
" LEFT JOIN pg_namespace n "
1424-
" ON ( n.oid = c.relnamespace ) "
1425-
" WHERE c.relkind = 'S' "
1426-
" AND c.relname = %1 "
1427-
" AND n.nspname = %2" )
1428-
.arg( quotedValue( seqName ) )
1429-
.arg( quotedValue( mSchemaName ) );
1420+
const QString seqSql = QStringLiteral( "SELECT pg_get_serial_sequence(%1, %2)" )
1421+
.arg( quotedValue( mQuery ) )
1422+
.arg( quotedValue( fieldName ) );
14301423
QgsPostgresResult seqResult( connectionRO()->PQexec( seqSql ) );
14311424
if ( seqResult.PQntuples() == 1 )
14321425
{
1433-
defValMap[tableoid][attnum] = QStringLiteral( "nextval(%1::regclass)" ).arg( quotedValue( seqResult.PQgetvalue( 0, 0 ) ) );
1426+
defValMap[tableoid][attnum] = QStringLiteral( "nextval(%1)" ).arg( quotedValue( seqResult.PQgetvalue( 0, 0 ) ) );
14341427
}
14351428
}
14361429

‎tests/src/python/test_provider_postgres.py

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

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

26092609
del (vl)
26102610

@@ -2617,6 +2617,22 @@ def testIdentityPk(self):
26172617
feature = next(vl.getFeatures())
26182618
self.assertIsNotNone(feature.id())
26192619

2620+
def testIdentityLongFieldDefaultValue(self):
2621+
"""Test issue GH #51563"""
2622+
2623+
self.execSQLCommand(
2624+
'DROP TABLE IF EXISTS qgis_test."test_IDENTIFIER_name_so_long_it_will_get_truncated" CASCADE')
2625+
self.execSQLCommand("""
2626+
CREATE TABLE qgis_test."test_IDENTIFIER_name_so_long_it_will_get_truncated"(
2627+
"test_IDENTIFIER_so_long_it_will_get_truncated" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
2628+
test_description text
2629+
);""")
2630+
2631+
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')
2632+
self.assertTrue(vl.isValid())
2633+
2634+
self.assertEqual(vl.dataProvider().defaultValueClause(0), 'nextval(\'qgis_test."test_IDENTIFIER_name_so_long__test_IDENTIFIER_so_long_it_wi_seq"\')')
2635+
26202636
def testEvalDefaultOnProviderSide(self):
26212637
"""Test issue GH #50168"""
26222638

0 commit comments

Comments
 (0)
Please sign in to comment.