You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Maksim Timonin (Jira)" <ji...@apache.org> on 2021/04/08 08:59:00 UTC

[jira] [Comment Edited] (IGNITE-13019) Unexpected JOIN result when querying a single-node cluster

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

Maksim Timonin edited comment on IGNITE-13019 at 4/8/21, 8:58 AM:
------------------------------------------------------------------

[~slukyanov] hi!
  
 I'm working on this ticket. And found weird behavior of GridH2Table.affKeyCol. I've created a table with the query:
 "CREATE TABLE A (ID INT PRIMARY KEY, TITLE VARCHAR) WITH \"AFFINITY_KEY=ID\"
  
 then I'm expecting that *GridH2Table.affKeyCol* stored ID column, but actually it was KEY. I've debugged and found that we lost info about affinity column in     *QueryUtils#typeForQueryEntity* [1]. At this line *qryEntity.getKeyFields()* is empty, because we skip it here *CommandProcessor#toQueryEntity* [2]. At this line we go to the if block and then fill _keyFieldName_ only, but _keyFields_ is filled in the else block only. 
  
 I don't understand is it expected behavior?

[1] [QueryUtils#L557|https://github.com/apache/ignite/blob/55e57173adc5fa2a891fb6a9d8d8fefdaab87ba9/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java#L557]
 [2] [CommandProcessor#L1129|https://github.com/apache/ignite/blob/55e57173adc5fa2a891fb6a9d8d8fefdaab87ba9/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/CommandProcessor.java#L1129] (edited) 
  


was (Author: timonin.maksim):
[~slukyanov] hi!
 
I'm working on this ticket. And found weird behavior of GridH2Table.affKeyCol. I've created a table with the query:
"CREATE TABLE A (ID INT PRIMARY KEY, TITLE VARCHAR) WITH \"AFFINITY_KEY=ID\"
 
then I'm expecting that *GridH2Table.affKeyCol* stored ID column, but actually it was _KEY. I've debugged and found that we lost info about affinity column in     *QueryUtils#typeForQueryEntity* [1]. At this line *qryEntity.getKeyFields()* is empty, because we skip it here *CommandProcessor#toQueryEntity* [2]. At this line we go to the if block and then fill _keyFieldName_ only, but _keyFields_ is filled in the else block only. 
 
I don't understand is it expected behavior?

[1] [QueryUtils#L557|https://github.com/apache/ignite/blob/55e57173adc5fa2a891fb6a9d8d8fefdaab87ba9/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java#L557]
[2] [CommandProcessor#L1129|https://github.com/apache/ignite/blob/55e57173adc5fa2a891fb6a9d8d8fefdaab87ba9/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/CommandProcessor.java#L1129] (edited) 
 

> Unexpected JOIN result when querying a single-node cluster
> ----------------------------------------------------------
>
>                 Key: IGNITE-13019
>                 URL: https://issues.apache.org/jira/browse/IGNITE-13019
>             Project: Ignite
>          Issue Type: Bug
>          Components: sql
>    Affects Versions: 2.8
>            Reporter: Stanilovsky Evgeny
>            Assignee: Maksim Timonin
>            Priority: Major
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Check reproducer near,
> seems something wrong with pkey logic , if we change it - results will be ok. 
> {code:java}
>     @Test
>     public void test() throws Exception {
>         inlineSize = 10;
>         startGrid(0);
>         String t1 = "CREATE TABLE dept\n" +
>             " (\n" +
>             "deptno LONG,\n" +
>             "dname VARCHAR,\n" +
>             "loc VARCHAR,\n" +
>             "CONSTRAINT pk_dept PRIMARY KEY (deptno)\n" +
>             " );";
>         execSql(t1);
>         String t2 = "CREATE TABLE emp\n" +
>             " (\n" +
>             "empno LONG,\n" +
>             "ename VARCHAR,\n" +
>             "job VARCHAR,\n" +
>             "mgr INTEGER,\n" +
>             "hiredate DATE,\n" +
>             "sal LONG,\n" +
>             "comm LONG,\n" +
>             "deptno LONG,\n" +
>             "CONSTRAINT pk_emp PRIMARY KEY (empno)\n" +
>             " );";
>         execSql(t2);
>         execSql("insert into dept (deptno, dname, loc) values (10, 'ACCOUNTING', 'NEW YORK');");
>         execSql("insert into dept (deptno, dname, loc) values(20, 'RESEARCH', 'DALLAS');");
>         execSql("insert into dept (deptno, dname, loc) values(30, 'SALES', 'CHICAGO');");
>         execSql("insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values(7839, 'KING', 'PRESIDENT', null, to_date('17-11-1981','dd-mm-yyyy'), 5000, null, 10);");
>         execSql("insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values( 7698, 'BLAKE', 'MANAGER', 7839, to_date('1-5-1981','dd-mm-yyyy'), 2850, null, 30);");
>         execSql("insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values(7782, 'CLARK', 'MANAGER', 7839, to_date('9-6-1981','dd-mm-yyyy'), 2450, null, 10);");
>         List<List<?>> vals1 = execSql("SELECT d.deptno,\n" +
>             "e.ename\n" +
>             "FROM EMP e\n" +
>             "INNER JOIN dept d\n" +
>             "ON e.deptno = d.deptno AND e.deptno = 10;");
>         assertEquals(vals1.size(), 2);
>         List<List<?>> vals2 = execSql("SELECT d.deptno,\n" +
>             "e.ename\n" +
>             "FROM EMP e\n" +
>             "INNER JOIN dept d\n" +
>             "ON e.deptno = d.deptno AND d.DEPTNO = 10;");
>         //assertEquals(vals2.size(), 2); <--* uncomment for fail*
>         execSql("drop table dept");
>         String t3 = "CREATE TABLE dept\n" +
>             " (\n" +
>             "deptno LONG,\n" +
>             "dname VARCHAR,\n" +
>             "loc VARCHAR,\n" +
>             "CONSTRAINT pk_dept PRIMARY KEY (deptno, dname)\n" +
>             " );";
>         execSql(t3);
>         execSql("insert into dept (deptno, dname, loc) values (10, 'ACCOUNTING', 'NEW YORK');");
>         execSql("insert into dept (deptno, dname, loc) values(20, 'RESEARCH', 'DALLAS');");
>         execSql("insert into dept (deptno, dname, loc) values(30, 'SALES', 'CHICAGO');");
>         List<List<?>> vals11 = execSql("SELECT d.deptno,\n" +
>             "e.ename\n" +
>             "FROM EMP e\n" +
>             "INNER JOIN dept d\n" +
>             "ON e.deptno = d.deptno AND e.deptno = 10;");
>         assertEquals(vals11.size(), 2);
>         List<List<?>> vals22 = execSql("SELECT d.deptno,\n" +
>             "e.ename\n" +
>             "FROM EMP e\n" +
>             "INNER JOIN dept d\n" +
>             "ON e.deptno = d.deptno AND d.DEPTNO = 10;");
>         assertEquals(vals22.size(), 2);
>     }
>     /** */
>     private List<List<?>> execSql(String qry) {
>         return grid(0).context().query()
>             .querySqlFields(new SqlFieldsQuery(qry).setLazy(true), false)
>             .getAll();
>     }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)