Vladimir Ozerov created IGNITE-6195: ---------------------------------------
Summary: SQL: Do not allow JOINs on caches with different affinity functions Key: IGNITE-6195 URL: https://issues.apache.org/jira/browse/IGNITE-6195 Project: Ignite Issue Type: Task Components: sql Affects Versions: 2.1 Reporter: Vladimir Ozerov Fix For: 2.2 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. -- This message was sent by Atlassian JIRA (v6.4.14#64029)