Navigation Menu

Skip to content

Commit

Permalink
Fix PG identity default value with long field names
Browse files Browse the repository at this point in the history
Fix #51563
  • Loading branch information
elpaso authored and github-actions[bot] committed Jan 30, 2023
1 parent f373f5b commit fe5275b
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 12 deletions.
15 changes: 4 additions & 11 deletions src/providers/postgres/qgspostgresprovider.cpp
Expand Up @@ -1417,20 +1417,13 @@ bool QgsPostgresProvider::loadFields()
&& uniqueMap[tableoid][attnum]
&& defValMap[tableoid][attnum].isEmpty() )
{
const QString seqName { mTableName + '_' + fieldName + QStringLiteral( "_seq" ) };
const QString seqSql = QStringLiteral( "SELECT c.oid::regclass "
" FROM pg_class c "
" LEFT JOIN pg_namespace n "
" ON ( n.oid = c.relnamespace ) "
" WHERE c.relkind = 'S' "
" AND c.relname = %1 "
" AND n.nspname = %2" )
.arg( quotedValue( seqName ) )
.arg( quotedValue( mSchemaName ) );
const QString seqSql = QStringLiteral( "SELECT pg_get_serial_sequence(%1, %2)" )
.arg( quotedValue( mQuery ) )
.arg( quotedValue( fieldName ) );
QgsPostgresResult seqResult( connectionRO()->PQexec( seqSql ) );
if ( seqResult.PQntuples() == 1 )
{
defValMap[tableoid][attnum] = QStringLiteral( "nextval(%1::regclass)" ).arg( quotedValue( seqResult.PQgetvalue( 0, 0 ) ) );
defValMap[tableoid][attnum] = QStringLiteral( "nextval(%1)" ).arg( quotedValue( seqResult.PQgetvalue( 0, 0 ) ) );
}
}

Expand Down
18 changes: 17 additions & 1 deletion tests/src/python/test_provider_postgres.py
Expand Up @@ -2604,7 +2604,7 @@ def testIdentityPk(self):
feature.setGeometry(geom)
self.assertTrue(vl.dataProvider().addFeature(feature))

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

del (vl)

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

def testIdentityLongFieldDefaultValue(self):
"""Test issue GH #51563"""

self.execSQLCommand(
'DROP TABLE IF EXISTS qgis_test."test_IDENTIFIER_name_so_long_it_will_get_truncated" CASCADE')
self.execSQLCommand("""
CREATE TABLE qgis_test."test_IDENTIFIER_name_so_long_it_will_get_truncated"(
"test_IDENTIFIER_so_long_it_will_get_truncated" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
test_description text
);""")

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')
self.assertTrue(vl.isValid())

self.assertEqual(vl.dataProvider().defaultValueClause(0), 'nextval(\'qgis_test."test_IDENTIFIER_name_so_long__test_IDENTIFIER_so_long_it_wi_seq"\')')

def testEvalDefaultOnProviderSide(self):
"""Test issue GH #50168"""

Expand Down

0 comments on commit fe5275b

Please sign in to comment.