You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Ignite TC Bot (Jira)" <ji...@apache.org> on 2022/11/30 19:19:00 UTC

[jira] [Commented] (IGNITE-17041) Query fields merge process does not consider aliases to determine conflicts.

    [ https://issues.apache.org/jira/browse/IGNITE-17041?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17641509#comment-17641509 ] 

Ignite TC Bot commented on IGNITE-17041:
----------------------------------------

{panel:title=Branch: [pull/10404/head] Base: [master] : No blockers found!|borderStyle=dashed|borderColor=#ccc|titleBGColor=#D6F7C1}{panel}
{panel:title=Branch: [pull/10404/head] Base: [master] : New Tests (4)|borderStyle=dashed|borderColor=#ccc|titleBGColor=#D6F7C1}
{color:#00008b}Continuous Query 4{color} [[tests 4|https://ci.ignite.apache.org/viewLog.html?buildId=6935412]]
* {color:#013220}IgniteCacheQuerySelfTestSuite6: QueryEntityAliasesTest.testTableColumnNamesAfterSuccessfulQueryEntityMerge - PASSED{color}
* {color:#013220}IgniteCacheQuerySelfTestSuite6: QueryEntityAliasesTest.testSqlEscapeFlagMismatch - PASSED{color}
* {color:#013220}IgniteCacheQuerySelfTestSuite6: QueryEntityAliasesTest.testQueryEntityEntityMergeAliasesConflicts - PASSED{color}
* {color:#013220}IgniteCacheQuerySelfTestSuite6: QueryEntityAliasesTest.testQueryEntityAliasesValidation - PASSED{color}

{panel}
[TeamCity *--&gt; Run :: All* Results|https://ci.ignite.apache.org/viewLog.html?buildId=6935043&amp;buildTypeId=IgniteTests24Java8_RunAll]

> Query fields merge process does not consider aliases to determine conflicts.
> ----------------------------------------------------------------------------
>
>                 Key: IGNITE-17041
>                 URL: https://issues.apache.org/jira/browse/IGNITE-17041
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Mikhail Petrov
>            Assignee: Mikhail Petrov
>            Priority: Major
>              Labels: ise
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> Let's consider the following situaiton:
> The first server node is started with the following cache configuration.
> {code:java}
> QueryEntity qryEntity = new QueryEntity(String.class, Person.class)
>             .setTableName("PERSON")
>             .addQueryField("id", Integer.class.getName(), null);
>         CacheConfiguration<?, ?> ccfg = new CacheConfiguration<>(DEFAULT_CACHE_NAME)
>             .setQueryEntities(Collections.singletonList(qryEntity));
> {code}
> Then we add the column manually like that:
> {code:java}
>  srv.cache(DEFAULT_CACHE_NAME).query(new SqlFieldsQuery("ALTER TABLE PERSON ADD data INTEGER")).getAll();
> {code}
> As a result we get  query type descriptor with the following DTO fields -> table columns:
> "id" -> "ID" 
> "DATA" -> "DATA"
> (Note that isSqlEscapeAll flag is disabled in the cache configuraiton so the Ignite automatically creates upper-case aliases for preconfigured entities)
> Then lets start second server node with the following cache confiuration:
> {code:java}
>     QueryEntity qryEntity = new QueryEntity(String.class, Person.class)
>             .setTableName("PERSON")
>             .addQueryField("id", Integer.class.getName(), null)
>             .addQueryField("data", Boolean.class.getName(), null);
>       CacheConfiguration<?, ?> ccfg = new CacheConfiguration<>(DEFAULT_CACHE_NAME)
>             .setQueryEntities(Collections.singletonList(qryEntity));
> {code}
> Note the type of "data" query field is Boolean now
> During the join process of the second node first node validates that cache query fields  that configured on the second node is identical with the local one. If there are unique fields that are not present in the first node's config then configurations from both nodes are merged to complement each other.  If there are some conflicts (e.g. query fields with identical names  has diferent types) joining node will be rejected.
> In the described above example second node joins the cluster with no conflicts.
> And merge process completes succcessflully.
> As a result we get  query type descriptor with the following DTO fields -> table columns:
> "id" -> "ID" 
> "DATA" -> "DATA" of type Integer
> "data" -> "data" of type Boolean
> It happens because 
> 1. During merge conflict resolving process we compare only types of the DTO fields with the same name.
> So "DATA" and "data" is considered different fields and no conflicts are detected.
> 2.  Then we update the cache query configuration on the cluster nodes with the "data" field that is received from the joining node. But we do not update corresponding aliases. As a result we crete TABLE column with the same name as DTO field - "data" in lower case.
> Since isSqlEscapeAll flag is disabled for both configuration it's confusing behaviour.
> The expected behaviour: the second node would be rejected because of column type mistmatch.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)