Skip to content

Commit 0ddb530

Browse files
authoredMay 24, 2020
Merge pull request #35991 from uclaros/postgres-group-delete
Group postgres DELETE statements to a single query
2 parents b93161a + 193a2e9 commit 0ddb530

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed
 

‎src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,11 @@ QString QgsPostgresProvider::whereClause( QgsFeatureId featureId ) const
547547
return QgsPostgresUtils::whereClause( featureId, mAttributeFields, connectionRO(), mPrimaryKeyType, mPrimaryKeyAttrs, mShared );
548548
}
549549

550+
QString QgsPostgresProvider::whereClause( QgsFeatureIds featureIds ) const
551+
{
552+
return QgsPostgresUtils::whereClause( featureIds, mAttributeFields, connectionRO(), mPrimaryKeyType, mPrimaryKeyAttrs, mShared );
553+
}
554+
550555

551556
QString QgsPostgresUtils::whereClause( QgsFeatureId featureId, const QgsFields &fields, QgsPostgresConn *conn, QgsPostgresPrimaryKeyType pkType, const QList<int> &pkAttrs, const std::shared_ptr<QgsPostgresSharedData> &sharedData )
552557
{
@@ -2537,8 +2542,11 @@ bool QgsPostgresProvider::addFeatures( QgsFeatureList &flist, Flags flags )
25372542
return returnvalue;
25382543
}
25392544

2540-
bool QgsPostgresProvider::deleteFeatures( const QgsFeatureIds &id )
2545+
bool QgsPostgresProvider::deleteFeatures( const QgsFeatureIds &ids )
25412546
{
2547+
if ( ids.isEmpty() )
2548+
return true;
2549+
25422550
bool returnvalue = true;
25432551

25442552
if ( mIsQuery )
@@ -2558,18 +2566,29 @@ bool QgsPostgresProvider::deleteFeatures( const QgsFeatureIds &id )
25582566
{
25592567
conn->begin();
25602568

2561-
for ( QgsFeatureIds::const_iterator it = id.begin(); it != id.end(); ++it )
2569+
QgsFeatureIds chunkIds;
2570+
const QgsFeatureIds::const_iterator lastId = --ids.end();
2571+
for ( QgsFeatureIds::const_iterator it = ids.begin(); it != ids.end(); ++it )
25622572
{
2563-
QString sql = QStringLiteral( "DELETE FROM %1 WHERE %2" )
2564-
.arg( mQuery, whereClause( *it ) );
2573+
// create chunks of fids to delete, the last chunk may be smaller
2574+
chunkIds.insert( *it );
2575+
if ( chunkIds.size() < 5000 && it != lastId )
2576+
continue;
2577+
2578+
const QString sql = QStringLiteral( "DELETE FROM %1 WHERE %2" )
2579+
.arg( mQuery, whereClause( chunkIds ) );
25652580
QgsDebugMsgLevel( "delete sql: " + sql, 2 );
25662581

25672582
//send DELETE statement and do error handling
25682583
QgsPostgresResult result( conn->PQexec( sql ) );
25692584
if ( result.PQresultStatus() != PGRES_COMMAND_OK && result.PQresultStatus() != PGRES_TUPLES_OK )
25702585
throw PGException( result );
25712586

2572-
mShared->removeFid( *it );
2587+
for ( QgsFeatureIds::const_iterator chunkIt = chunkIds.begin(); chunkIt != chunkIds.end(); ++chunkIt )
2588+
{
2589+
mShared->removeFid( *chunkIt );
2590+
}
2591+
chunkIds.clear();
25732592
}
25742593

25752594
returnvalue &= conn->commit();
@@ -2587,7 +2606,7 @@ bool QgsPostgresProvider::deleteFeatures( const QgsFeatureIds &id )
25872606
dropOrphanedTopoGeoms();
25882607
}
25892608

2590-
mShared->addFeaturesCounted( -id.size() );
2609+
mShared->addFeaturesCounted( -ids.size() );
25912610
}
25922611
catch ( PGException &e )
25932612
{

0 commit comments

Comments
 (0)
Please sign in to comment.