@@ -449,20 +449,60 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &optio
449449
450450 open( OpenModeInitial );
451451
452+ int nMaxIntLen = 11;
453+ int nMaxInt64Len = 21;
454+ int nMaxDoubleLen = 20;
455+ int nMaxDoublePrec = 15;
456+ int nDateLen = 8;
457+ if ( mGDALDriverName == QLatin1String( " GPKG" ) )
458+ {
459+ // GPKG only supports field length for text (and binary)
460+ nMaxIntLen = 0;
461+ nMaxInt64Len = 0;
462+ nMaxDoubleLen = 0;
463+ nMaxDoublePrec = 0;
464+ nDateLen = 0;
465+ }
466+
452467 QList<NativeType> nativeTypes;
453468 nativeTypes
454- << QgsVectorDataProvider::NativeType( tr( " Whole number (integer)" ), QStringLiteral( " integer" ), QVariant::Int, 0, 11 )
455- << QgsVectorDataProvider::NativeType( tr( " Whole number (integer 64 bit)" ), QStringLiteral( " integer64" ), QVariant::LongLong, 0, 21 )
456- << QgsVectorDataProvider::NativeType( tr( " Decimal number (real)" ), QStringLiteral( " double" ), QVariant::Double, 0, 20, 0, 15 )
457- << QgsVectorDataProvider::NativeType( tr( " Text (string)" ), QStringLiteral( " string" ), QVariant::String, 0, 65535 )
458- << QgsVectorDataProvider::NativeType( tr( " Date" ), QStringLiteral( " date" ), QVariant::Date, 8, 8 );
469+ << QgsVectorDataProvider::NativeType( tr( " Whole number (integer)" ), QStringLiteral( " integer" ), QVariant::Int, 0, nMaxIntLen )
470+ << QgsVectorDataProvider::NativeType( tr( " Whole number (integer 64 bit)" ), QStringLiteral( " integer64" ), QVariant::LongLong, 0, nMaxInt64Len )
471+ << QgsVectorDataProvider::NativeType( tr( " Decimal number (real)" ), QStringLiteral( " double" ), QVariant::Double, 0, nMaxDoubleLen, 0, nMaxDoublePrec )
472+ << QgsVectorDataProvider::NativeType( tr( " Text (string)" ), QStringLiteral( " string" ), QVariant::String, 0, 65535 );
473+
474+ bool supportsDate = true ;
475+ bool supportsTime = mGDALDriverName != QLatin1String( " ESRI Shapefile" ) && mGDALDriverName != QLatin1String( " GPKG" );
476+ bool supportsDateTime = mGDALDriverName != QLatin1String( " ESRI Shapefile" );
477+ const char *pszDataTypes = nullptr ;
478+ if ( mOgrOrigLayer )
479+ {
480+ pszDataTypes = GDALGetMetadataItem ( mOgrOrigLayer ->driver (), GDAL_DMD_CREATIONFIELDDATATYPES, nullptr );
481+ }
482+ // For drivers that advertize their data type, use that instead of the
483+ // above hardcoded defaults.
484+ if ( pszDataTypes )
485+ {
486+ char **papszTokens = CSLTokenizeString2 ( pszDataTypes, " " , 0 );
487+ supportsDate = CSLFindString ( papszTokens, " Date" ) >= 0 ;
488+ supportsTime = CSLFindString ( papszTokens, " Time" ) >= 0 ;
489+ supportsDateTime = CSLFindString ( papszTokens, " DateTime" ) >= 0 ;
490+ CSLDestroy ( papszTokens );
491+ }
459492
460- // Some drivers do not support datetime type
461- // Please help to fill this list
462- if ( mGDALDriverName != QLatin1String( " ESRI Shapefile" ) )
493+ if ( supportsDate )
494+ {
495+ nativeTypes
496+ << QgsVectorDataProvider::NativeType ( tr ( " Date" ), QStringLiteral ( " date" ), QVariant::Date, nDateLen, nDateLen );
497+ }
498+ if ( supportsTime )
499+ {
500+ nativeTypes
501+ << QgsVectorDataProvider::NativeType ( tr ( " Time" ), QStringLiteral ( " time" ), QVariant::Time );
502+ }
503+ if ( supportsDateTime )
463504 {
464505 nativeTypes
465- << QgsVectorDataProvider::NativeType ( tr ( " Time" ), QStringLiteral ( " time" ), QVariant::Time, -1 , -1 )
466506 << QgsVectorDataProvider::NativeType ( tr ( " Date & Time" ), QStringLiteral ( " datetime" ), QVariant::DateTime );
467507 }
468508
@@ -471,8 +511,8 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &optio
471511#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,3,0)
472512 if ( mOgrOrigLayer )
473513 {
474- const char *pszDataTypes = GDALGetMetadataItem ( mOgrOrigLayer ->driver (), GDAL_DMD_CREATIONFIELDDATASUBTYPES, nullptr );
475- if ( pszDataTypes && strstr ( pszDataTypes , " Boolean" ) )
514+ const char *pszDataSubTypes = GDALGetMetadataItem ( mOgrOrigLayer ->driver (), GDAL_DMD_CREATIONFIELDDATASUBTYPES, nullptr );
515+ if ( pszDataSubTypes && strstr ( pszDataSubTypes , " Boolean" ) )
476516 supportsBoolean = true ;
477517 }
478518#else
@@ -492,7 +532,7 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &optio
492532 {
493533 // boolean data type
494534 nativeTypes
495- << QgsVectorDataProvider::NativeType ( tr ( " Boolean" ), QStringLiteral ( " bool" ), QVariant::Bool, - 1 , - 1 , - 1 , - 1 );
535+ << QgsVectorDataProvider::NativeType ( tr ( " Boolean" ), QStringLiteral ( " bool" ), QVariant::Bool );
496536 }
497537
498538 setNativeTypes ( nativeTypes );
0 commit comments