@@ -309,14 +309,14 @@ def test_ogr_gpkg_1(gpkg_ds, tmp_path):
309
309
310
310
def test_ogr_gpkg_2 (gpkg_ds ):
311
311
312
- # Should default to GPKG 1.2
312
+ # Should default to GPKG 1.4
313
313
with gpkg_ds .ExecuteSQL ("PRAGMA application_id" ) as sql_lyr :
314
314
f = sql_lyr .GetNextFeature ()
315
315
assert f ["application_id" ] == 1196444487
316
316
317
317
with gpkg_ds .ExecuteSQL ("PRAGMA user_version" ) as sql_lyr :
318
318
f = sql_lyr .GetNextFeature ()
319
- assert f ["user_version" ] == 10200
319
+ assert f ["user_version" ] == 10400
320
320
321
321
322
322
###############################################################################
@@ -4758,6 +4758,30 @@ def test_ogr_gpkg_47c(tmp_vsimem):
4758
4758
assert gdal .GetLastErrorMsg () == ""
4759
4759
4760
4760
4761
+ def test_ogr_gpkg_47c2 (tmp_vsimem ):
4762
+
4763
+ dbname = tmp_vsimem / "ogr_gpkg_47.gpkg"
4764
+
4765
+ # Set GPKG 1.4.0
4766
+ gdaltest .gpkg_dr .CreateDataSource (dbname , options = {"VERSION" : "1.4" })
4767
+ # Check user_version
4768
+ fp = gdal .VSIFOpenL (dbname , "rb" )
4769
+ gdal .VSIFSeekL (fp , 60 , 0 )
4770
+ assert struct .unpack (">I" , gdal .VSIFReadL (4 , 1 , fp ))[0 ] == 10400
4771
+ gdal .VSIFCloseL (fp )
4772
+
4773
+ gdal .ErrorReset ()
4774
+ ds = ogr .Open (dbname , update = 1 )
4775
+ assert ds is not None
4776
+ assert gdal .GetLastErrorMsg () == ""
4777
+ ds = None
4778
+
4779
+ gdal .ErrorReset ()
4780
+ with gdal .config_option ("GPKG_WARN_UNRECOGNIZED_APPLICATION_ID" , "NO" ):
4781
+ ogr .Open (dbname )
4782
+ assert gdal .GetLastErrorMsg () == ""
4783
+
4784
+
4761
4785
def test_ogr_gpkg_47d (tmp_vsimem ):
4762
4786
4763
4787
dbname = tmp_vsimem / "ogr_gpkg_47.gpkg"
@@ -5897,7 +5921,9 @@ def test_ogr_gpkg_prelude_statements_after_spatialite_loading(tmp_vsimem):
5897
5921
def test_ogr_gpkg_datetime_timezones (tmp_vsimem ):
5898
5922
5899
5923
filename = tmp_vsimem / "test_ogr_gpkg_datetime_timezones.gpkg"
5900
- ds = gdaltest .gpkg_dr .CreateDataSource (filename , options = ["DATETIME_FORMAT=UTC" ])
5924
+ ds = gdaltest .gpkg_dr .CreateDataSource (
5925
+ filename , options = ["DATETIME_FORMAT=UTC" , "VERSION=1.2" ]
5926
+ )
5901
5927
lyr = ds .CreateLayer ("test" )
5902
5928
lyr .CreateField (ogr .FieldDefn ("dt" , ogr .OFTDateTime ))
5903
5929
for val in [
@@ -5926,6 +5952,44 @@ def test_ogr_gpkg_datetime_timezones(tmp_vsimem):
5926
5952
ds = None
5927
5953
5928
5954
5955
+ ###############################################################################
5956
+ # Test DATETIME_FORMAT
5957
+
5958
+
5959
+ def test_ogr_gpkg_datetime_timezones_gpkg_1_4 (tmp_vsimem ):
5960
+
5961
+ filename = tmp_vsimem / "test_ogr_gpkg_datetime_timezones.gpkg"
5962
+ ds = gdaltest .gpkg_dr .CreateDataSource (
5963
+ filename , options = ["DATETIME_FORMAT=UTC" , "VERSION=1.4" ]
5964
+ )
5965
+ lyr = ds .CreateLayer ("test" )
5966
+ lyr .CreateField (ogr .FieldDefn ("dt" , ogr .OFTDateTime ))
5967
+ for val in [
5968
+ "2020/01/01 01:34:56" ,
5969
+ "2020/01/01 01:34:56+00" ,
5970
+ "2020/01/01 01:34:56.789+02" ,
5971
+ ]:
5972
+ f = ogr .Feature (lyr .GetLayerDefn ())
5973
+ f .SetField ("dt" , val )
5974
+ lyr .CreateFeature (f )
5975
+ ds = None
5976
+
5977
+ ds = ogr .Open (filename )
5978
+ lyr = ds .GetLayer (0 )
5979
+ f = lyr .GetNextFeature ()
5980
+ assert f .GetField ("dt" ) == "2020/01/01 01:34:56+00"
5981
+ f = lyr .GetNextFeature ()
5982
+ assert f .GetField ("dt" ) == "2020/01/01 01:34:56+00"
5983
+ f = lyr .GetNextFeature ()
5984
+ assert f .GetField ("dt" ) == "2019/12/31 23:34:56.789+00"
5985
+
5986
+ with ds .ExecuteSQL ("SELECT dt || '' FROM test" ) as sql_lyr :
5987
+ f = sql_lyr .GetNextFeature ()
5988
+ # check that milliseconds are not written, since it is not required since GPKG 1.4
5989
+ assert f .GetField (0 ) == "2020-01-01T01:34:56Z"
5990
+ ds = None
5991
+
5992
+
5929
5993
###############################################################################
5930
5994
# Test AbortSQL
5931
5995
@@ -10825,17 +10889,19 @@ def test_gpkg_secure_delete(tmp_vsimem):
10825
10889
10826
10890
10827
10891
@pytest .mark .parametrize (
10828
- "src_filename" ,
10892
+ "src_filename,options " ,
10829
10893
[
10830
- # Generated with: ogr2ogr autotest/ogr/data/gpkg/poly_golden.gpkg autotest/ogr/data/poly.shp --config OGR_CURRENT_DATE="2000-01-01T:00:00:00.000Z" -nomd
10831
- "data/gpkg/poly_golden.gpkg" ,
10894
+ # Generated with: ogr2ogr autotest/ogr/data/gpkg/poly_golden.gpkg autotest/ogr/data/poly.shp --config OGR_CURRENT_DATE="2000-01-01T:00:00:00.000Z" -nomd -dsco VERSION=1.2
10895
+ ("data/gpkg/poly_golden.gpkg" , ["VERSION=1.2" ]),
10896
+ # Generated with: ogr2ogr autotest/ogr/data/gpkg/poly_golden_gpkg_1_4.gpkg autotest/ogr/data/poly.shp --config OGR_CURRENT_DATE="2000-01-01T:00:00:00.000Z" -nomd -dsco VERSION=1.4
10897
+ ("data/gpkg/poly_golden_gpkg_1_4.gpkg" , ["VERSION=1.4" ]),
10832
10898
],
10833
10899
)
10834
- def test_ogr_gpkg_write_check_golden_file (tmp_path , src_filename ):
10900
+ def test_ogr_gpkg_write_check_golden_file (tmp_path , src_filename , options ):
10835
10901
10836
10902
out_filename = str (tmp_path / "test.gpkg" )
10837
10903
with gdal .config_option ("OGR_CURRENT_DATE" , "2000-01-01T:00:00:00.000Z" ):
10838
- gdal .VectorTranslate (out_filename , src_filename )
10904
+ gdal .VectorTranslate (out_filename , src_filename , datasetCreationOptions = options )
10839
10905
10840
10906
# Compare first sqlite3 dump if sqlite3 binary available
10841
10907
import subprocess
@@ -10902,8 +10968,8 @@ def test_ogr_gpkg_arrow_stream_numpy_datetime_as_string(tmp_vsimem):
10902
10968
assert len (batch ["datetime" ]) == 4
10903
10969
assert batch ["datetime" ][0 ] == b""
10904
10970
assert batch ["datetime" ][1 ] == b"2022-05-31T12:34:56.789Z"
10905
- assert batch ["datetime" ][2 ] == b"2022-05-31T12:34:56.000 "
10906
- assert batch ["datetime" ][3 ] == b"2022-05-31T12:34:56.000 +12:30"
10971
+ assert batch ["datetime" ][2 ] == b"2022-05-31T12:34:56"
10972
+ assert batch ["datetime" ][3 ] == b"2022-05-31T12:34:56+12:30"
10907
10973
10908
10974
# Setting a filer tests the use of the less optimized
10909
10975
# OGRGeoPackageTableLayer::GetNextArray() implementation
@@ -10918,8 +10984,8 @@ def test_ogr_gpkg_arrow_stream_numpy_datetime_as_string(tmp_vsimem):
10918
10984
assert len (batch ["datetime" ]) == 4
10919
10985
assert batch ["datetime" ][0 ] == b""
10920
10986
assert batch ["datetime" ][1 ] == b"2022-05-31T12:34:56.789Z"
10921
- assert batch ["datetime" ][2 ] == b"2022-05-31T12:34:56.000 "
10922
- assert batch ["datetime" ][3 ] == b"2022-05-31T12:34:56.000 +12:30"
10987
+ assert batch ["datetime" ][2 ] == b"2022-05-31T12:34:56"
10988
+ assert batch ["datetime" ][3 ] == b"2022-05-31T12:34:56+12:30"
10923
10989
10924
10990
with ds .ExecuteSQL ("SELECT * FROM test" ) as sql_lyr :
10925
10991
stream = sql_lyr .GetArrowStreamAsNumPy (
@@ -10931,8 +10997,8 @@ def test_ogr_gpkg_arrow_stream_numpy_datetime_as_string(tmp_vsimem):
10931
10997
assert len (batch ["datetime" ]) == 4
10932
10998
assert batch ["datetime" ][0 ] == b""
10933
10999
assert batch ["datetime" ][1 ] == b"2022-05-31T12:34:56.789Z"
10934
- assert batch ["datetime" ][2 ] == b"2022-05-31T12:34:56.000 "
10935
- assert batch ["datetime" ][3 ] == b"2022-05-31T12:34:56.000 +12:30"
11000
+ assert batch ["datetime" ][2 ] == b"2022-05-31T12:34:56"
11001
+ assert batch ["datetime" ][3 ] == b"2022-05-31T12:34:56+12:30"
10936
11002
10937
11003
10938
11004
###############################################################################
0 commit comments