Bug report #13005
QgsOracleFeatureIterator: returns all features if layer has no index
| Status: | Closed | ||
|---|---|---|---|
| Priority: | Normal | ||
| Assignee: | |||
| Category: | Data Provider/Oracle | ||
| Affected QGIS version: | 2.8.2 | Regression?: | No |
| Operating System: | Easy fix?: | No | |
| Pull Request or Patch supplied: | No | Resolution: | |
| Crashes QGIS or corrupts data: | No | Copied to github as #: | 21082 |
Description
Hello,
i'm using QGis to show a view with a computed geometry column (and hence, i don't have a spatial index).
When i try to use the identify tool on this view, QGIS crashes (it tries to select all features in the layer).
- the identify tool uses FilterRect
- in the FilterRect handling, there is a big if:
if ( !mSource->mGeometryColumn.isNull() && mSource->mHasSpatialIndex )
- if hasSpatialIndex is false, it won't enter the if and add no WHERE clause to the query at all, hence all features are selected.
- SDO_FILTER is only used when an index is available, but always together with SDO_RELATE (http://docs.oracle.com/cd/A97630_01/appdev.920/a96630/sdo_operat.htm)
- SDO_RELATE is used in any case (in case when an index is available, and also in case when an index is not available)
i don't fully understand how this might be related to solved bug #11358
Frank
Associated revisions
oracle provider: fix ExactIntersect check if spatial extension is available and there is no spatial index (fixes #13005)
oracle provider: fix dfc2cf0 (fixes #13005; take II)
oracle provider: fix ExactIntersect check if spatial extension is available and there is no spatial index (fixes #13005)
(cherry-picked from dfc2cf0 & 318137a)
History
#1
Updated by Jürgen Fischer over 10 years ago
- Status changed from Open to Closed
Fixed in changeset dfc2cf0bbf7516886d6cbf7cb3211bbc023df19b.
#2
Updated by Jürgen Fischer over 10 years ago
sdo_filter requires a spatial index. sdo_relate is only available with the spatial extension (ie. not in oracle locator).
So in QGIS sdo_filter is used to detect if there is a spatial index (if everything else fails) and to filter in a feature request with FilterRect - but only if there is a spatial index. And if the feature request also has the ExactIntersect flag set and the spatial extension it available it is combined with sdo_relate.
So if there is no spatial index or no spatial extension all features have to be loaded and have to be individually checked against the FilterRect. But tht was only done when there was no spatial extension regardless of the existence of a spatial index. dfc2cf0 should fix that.
#3
Updated by Frank Dekervel over 10 years ago
i tried nightly of today (61d81f0), and it doesn't seem to be solved: qgis still selects all the features when i try to identify one.
i can't find why it doesn't work (the commit looks correct)
i still see that zooming and panning the map goes reasonably quick, even selecting nodes using the selection tool works fine (strange ?).
#4
Updated by Frank Dekervel over 10 years ago
- Status changed from Closed to Reopened
hello,
i think i found the cause why it isn't working yet. inside the "if" you changed in dfc2cf0, there is another check in "line 148":#dfc2cf0bbf7516886d6cbf7cb3211bbc023df19b#diff-3930f82a72360b839dd9bc0a39e4cd97L148 for hasSpatial that needs to be changed too
frank
#5
Updated by Jürgen Fischer over 10 years ago
- Status changed from Reopened to Closed
Fixed in changeset 318137ae5649bb270613287804beb8e0fbab591f.
#6
Updated by Frank Dekervel over 10 years ago
working fine in latest nightly.
thanks for the fix !
Frank