diff --git a/autotest/ogr/ogr_sql_test.py b/autotest/ogr/ogr_sql_test.py index 4702e824c63a..96838eb953d7 100755 --- a/autotest/ogr/ogr_sql_test.py +++ b/autotest/ogr/ogr_sql_test.py @@ -1863,3 +1863,19 @@ def test_ogr_sql_ilike_utf8(): lyr.SetAttributeFilter("'éven' ILIKE '%xen'") assert lyr.GetFeatureCount() == 0 + + +############################################################################### +# Test error on setting a spatial filter during ExecuteSQL + + +@gdaltest.enable_exceptions() +def test_ogr_sql_test_execute_sql_error_on_spatial_filter_mem_layer(): + + ds = ogr.GetDriverByName("Memory").CreateDataSource("") + ds.CreateLayer("test", geom_type=ogr.wkbNone) + geom = ogr.CreateGeometryFromWkt("POLYGON((0 0,0 1,1 1,1 0,0 0))") + with pytest.raises( + Exception, match="Cannot set spatial filter: no geometry field present in layer" + ): + ds.ExecuteSQL("SELECT 1 FROM test", spatialFilter=geom) diff --git a/gcore/gdaldataset.cpp b/gcore/gdaldataset.cpp index dcfe31e3faa0..49118992ed81 100644 --- a/gcore/gdaldataset.cpp +++ b/gcore/gdaldataset.cpp @@ -6972,15 +6972,19 @@ OGRLayer *GDALDataset::BuildLayerFromSelectInfo( swq_select *psSelectInfo, OGRGeometry *poSpatialFilter, const char *pszDialect, swq_select_parse_options *poSelectParseOptions) { - OGRGenSQLResultsLayer *poResults = nullptr; + std::unique_ptr poResults; GDALSQLParseInfo *psParseInfo = BuildParseInfo(psSelectInfo, poSelectParseOptions); if (psParseInfo) { - poResults = - new OGRGenSQLResultsLayer(this, psSelectInfo, poSpatialFilter, - psParseInfo->pszWHERE, pszDialect); + const auto nErrorCounter = CPLGetErrorCounter(); + poResults = std::make_unique( + this, psSelectInfo, poSpatialFilter, psParseInfo->pszWHERE, + pszDialect); + if (CPLGetErrorCounter() > nErrorCounter && + CPLGetLastErrorType() != CE_None) + poResults.reset(); } else { @@ -6988,7 +6992,7 @@ OGRLayer *GDALDataset::BuildLayerFromSelectInfo( } DestroyParseInfo(psParseInfo); - return poResults; + return poResults.release(); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/generic/ogrlayer.cpp b/ogr/ogrsf_frmts/generic/ogrlayer.cpp index ec865f3c6fdc..0e6c5460b92c 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayer.cpp +++ b/ogr/ogrsf_frmts/generic/ogrlayer.cpp @@ -1487,6 +1487,9 @@ bool OGRLayer::ValidateGeometryFieldIndexForSetSpatialFilter( void OGRLayer::SetSpatialFilter(OGRGeometry *poGeomIn) { + if (poGeomIn && !ValidateGeometryFieldIndexForSetSpatialFilter(0, poGeomIn)) + return; + m_iGeomFieldFilter = 0; if (InstallFilter(poGeomIn)) ResetReading(); @@ -1497,6 +1500,10 @@ void OGRLayer::SetSpatialFilter(int iGeomField, OGRGeometry *poGeomIn) { if (iGeomField == 0) { + if (poGeomIn && + !ValidateGeometryFieldIndexForSetSpatialFilter(0, poGeomIn)) + return; + m_iGeomFieldFilter = iGeomField; SetSpatialFilter(poGeomIn); }