diff --git a/autotest/ogr/ogr_gpkg.py b/autotest/ogr/ogr_gpkg.py index 92882c408c04..0446a813c27d 100755 --- a/autotest/ogr/ogr_gpkg.py +++ b/autotest/ogr/ogr_gpkg.py @@ -5869,6 +5869,27 @@ def test_ogr_gpkg_prelude_statements(tmp_vsimem): assert sql_lyr.GetFeatureCount() == 10 +############################################################################### +# Test PRELUDE_STATEMENTS open option + + +def test_ogr_gpkg_prelude_statements_after_spatialite_loading(tmp_vsimem): + + gdal.VectorTranslate(tmp_vsimem / "test.gpkg", "data/poly.shp", format="GPKG") + + with ogr.Open(tmp_vsimem / "test.gpkg") as ds: + if not _has_spatialite_4_3_or_later(ds): + pytest.skip("spatialite missing") + + with gdal.OpenEx( + tmp_vsimem / "test.gpkg", + open_options=["PRELUDE_STATEMENTS=SELECT setdecimalprecision(1)"], + ) as ds: + with ds.ExecuteSQL("SELECT ST_AsText(geom) FROM poly LIMIT 1") as sql_lyr: + f = sql_lyr.GetNextFeature() + assert f[0].startswith("POLYGON((479819.8 4765180.5,") + + ############################################################################### # Test DATETIME_FORMAT diff --git a/ogr/ogrsf_frmts/gpkg/ogrgeopackagedatasource.cpp b/ogr/ogrsf_frmts/gpkg/ogrgeopackagedatasource.cpp index 304455e05361..8165f9b41842 100644 --- a/ogr/ogrsf_frmts/gpkg/ogrgeopackagedatasource.cpp +++ b/ogr/ogrsf_frmts/gpkg/ogrgeopackagedatasource.cpp @@ -9643,6 +9643,14 @@ bool GDALGeoPackageDataset::OpenOrCreateDB(int flags) } } + const char *pszPreludeStatements = + CSLFetchNameValue(papszOpenOptions, "PRELUDE_STATEMENTS"); + if (pszPreludeStatements) + { + if (SQLCommand(hDB, pszPreludeStatements) != OGRERR_NONE) + return false; + } + return true; } diff --git a/ogr/ogrsf_frmts/sqlite/ogrsqlitedatasource.cpp b/ogr/ogrsf_frmts/sqlite/ogrsqlitedatasource.cpp index 05203909798e..8e021fe54137 100644 --- a/ogr/ogrsf_frmts/sqlite/ogrsqlitedatasource.cpp +++ b/ogr/ogrsf_frmts/sqlite/ogrsqlitedatasource.cpp @@ -1557,14 +1557,6 @@ bool OGRSQLiteBaseDataSource::OpenOrCreateDB(int flagsIn, } #endif - const char *pszPreludeStatements = - CSLFetchNameValue(papszOpenOptions, "PRELUDE_STATEMENTS"); - if (pszPreludeStatements) - { - if (SQLCommand(hDB, pszPreludeStatements) != OGRERR_NONE) - return false; - } - if (pszSqlitePragma != nullptr) { char **papszTokens = @@ -1821,6 +1813,14 @@ bool OGRSQLiteDataSource::OpenOrCreateDB(int flagsIn, // above OGR2SQLITE_Setup() LoadExtensions(); + const char *pszPreludeStatements = + CSLFetchNameValue(papszOpenOptions, "PRELUDE_STATEMENTS"); + if (pszPreludeStatements) + { + if (SQLCommand(hDB, pszPreludeStatements) != OGRERR_NONE) + return false; + } + return true; }