Skip to content

Commit abcf953

Browse files
elpasonyalldawson
authored andcommitted
Fix vector file writer field length
Backported from master commit 2174577
1 parent 979debc commit abcf953

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

src/core/qgsvectorfilewriter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ void QgsVectorFileWriter::init( QString vectorFileName,
538538
}
539539
case QVariant::String:
540540
ogrType = OFTString;
541-
if ( ogrWidth <= 0 || ogrWidth > 255 )
541+
if ( ( ogrWidth <= 0 || ogrWidth > 255 ) && mOgrDriverName == QLatin1String( "ESRI Shapefile" ) )
542542
ogrWidth = 255;
543543
break;
544544

tests/src/core/testqgsvectorfilewriter.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ class TestQgsVectorFileWriter: public QObject
8282
void regression1141();
8383
//! Test prepareWriteAsVectorFormat
8484
void prepareWriteAsVectorFormat();
85+
//! Test regression #21714 (Exported GeoPackages have wrong field definitions)
86+
void testTextFieldLength();
8587

8688
private:
8789
// a little util fn used by all tests
@@ -491,5 +493,43 @@ void TestQgsVectorFileWriter::prepareWriteAsVectorFormat()
491493
QCOMPARE( details.providerUriParams.value( "path" ).toString(), fileName );
492494
}
493495

496+
497+
void TestQgsVectorFileWriter::testTextFieldLength()
498+
{
499+
QTemporaryFile tmpFile( QDir::tempPath() + "/test_qgsvectorfilewriter2_XXXXXX.gpkg" );
500+
tmpFile.open();
501+
QString fileName( tmpFile.fileName( ) );
502+
QgsVectorLayer vl( "Point?field=firstfield:string(1024)", "test", "memory" );
503+
QCOMPARE( vl.fields().at( 0 ).length(), 1024 );
504+
QgsVectorFileWriter w( fileName,
505+
QStringLiteral( "UTF-8" ),
506+
vl.fields(),
507+
QgsWkbTypes::Point,
508+
vl.crs() );
509+
QgsFeature f { vl.fields() };
510+
f.setAttribute( 0, QString( 1024, 'x' ) );
511+
f.setGeometry( QgsGeometry::fromWkt( QStringLiteral( "point(9 45)" ) ) );
512+
QVERIFY( vl.startEditing() );
513+
QVERIFY( vl.addFeature( f ) );
514+
QgsVectorFileWriter::SaveVectorOptions options;
515+
options.driverName = "GPKG";
516+
options.layerName = "test";
517+
QString errorMessage;
518+
QgsVectorFileWriter::WriterError error( QgsVectorFileWriter::writeAsVectorFormat(
519+
&vl,
520+
fileName,
521+
options,
522+
&errorMessage ) );
523+
QCOMPARE( error, QgsVectorFileWriter::WriterError::NoError );
524+
QCOMPARE( errorMessage, fileName );
525+
QgsVectorLayer vl2( QStringLiteral( "%1|layername=test" ).arg( fileName ), "src_test", "ogr" );
526+
QVERIFY( vl2.isValid() );
527+
QCOMPARE( vl2.featureCount(), 1L );
528+
QCOMPARE( vl2.fields().at( 1 ).length(), 1024 );
529+
QCOMPARE( vl2.getFeature( 1 ).attribute( 1 ).toString(), QString( 1024, 'x' ) );
530+
531+
}
532+
533+
494534
QGSTEST_MAIN( TestQgsVectorFileWriter )
495535
#include "testqgsvectorfilewriter.moc"

0 commit comments

Comments
 (0)