Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Won't Fix
-
2.1
Description
Currently it is possible to execute JOIN on non-colocated caches. No exceptions will appear, user just receive incorrect result. We need to detect such situations and throw errors instead.
Proposed solution
Correct SQL result is possible when either distributed joins are enabled, or data is co-located properly. Under proper co-location we mean:
1) Participating PARTITIONED caches use the same affinity function
2) This affinity function doesn't depend on it's own previous state, i.e. it doesn't rely on AffinityFunctionContext.previousAssignment. For instance, RendezvousAffinityFunction doesn't use, while FairAffinityFunction does.
As such, the following procedure should be implemented in order to determine whether SQL can be executed:
1) If distributedJoins are enabled - return, SQL can be executed
2) Get the list of participating caches
3) Exclude REPLICATED caches from that list
4) If all remaining caches belong to the same cache group - return, SQL can be executed
5) Get affinity function of the first cache
6) Check if affinity function doesn't use AffinityFunctionContext.previousAssignment. This could be controlled either through annotation, or through new method on AffinityFunction interface, e.g. boolean isDependOnPreviousState. If false - throw an exception
7) Check if affinity functions of all caches are equal through standard equals() method. If false - throw an exception.
8) Otherwise - SQL can be executed safely.
Attachments
Attachments
Issue Links
- is blocked by
-
IGNITE-6677 Collect QueryDetailMetrics for cache-less SQL queries
- Closed