Gideon Zhao created DERBY-7140:
----------------------------------

             Summary: Wrong result when joining a table multiple times and 
using count()
                 Key: DERBY-7140
                 URL: https://issues.apache.org/jira/browse/DERBY-7140
             Project: Derby
          Issue Type: Bug
          Components: SQL
         Environment: ------------------ Java Information ------------------
Java Version:    11
Java Vendor:     Oracle Corporation
Java home:       C:\Libs\jdk-11
Java classpath:  .\Console2.jar
OS name:         Windows 10
OS architecture: amd64
OS version:      10.0
Java user name:  gideo
Java user home:  C:\Users\gideo
Java user dir:   C:\Users\gideo\IdeaProjects\Console2\out\artifacts\Console2_jar
java.specification.name: Java Platform API Specification
java.specification.version: 11
java.runtime.version: 11+28
--------- Derby Information --------
[C:\Users\gideo\IdeaProjects\Console2\out\artifacts\Console2_jar\Console2.jar] 
10.12.1.1 - (1704137)
------------------------------------------------------
----------------- Locale Information -----------------
------------------------------------------------------
------------------------------------------------------
            Reporter: Gideon Zhao


If the SQL has 3 tables and uses the count(), and has a WHERE clause, then the 
data of the third table will be wrong. Here is the sample code.

 
{code:java}
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection connection = 
DriverManager.getConnection("jdbc:derby:test.db;create=true");
Statement statement = connection.createStatement();
try {
  statement.execute("DROP TABLE TEST1");
} catch (Throwable ex){}
try {
  statement.execute("DROP TABLE TEST2");
} catch (Throwable ex){}
statement.execute("CREATE TABLE TEST1 (\n" +
    "ID INTEGER,\n" +
    "COL1 VARCHAR(250),\n" +
    "COL2 VARCHAR(30)\n" +
    ")");
statement.execute("INSERT INTO TEST1(ID, COL1, COL2) VALUES(1, 'join_key', 
'test2_col2_value2')");

statement.execute("CREATE TABLE TEST2 (\n" +
    "ID INTEGER,\n" +
    "COL1 VARCHAR(250),\n" +
    "COL2 VARCHAR(250),\n" +
    "COL3 VARCHAR(250)\n" +
    ")");
statement.execute("INSERT INTO TEST2(ID, COL1, COL2, COL3) VALUES(1, 
'join_key', 'test2_col2_value1', 'test2_col3_value1')");
statement.execute("INSERT INTO TEST2(ID, COL1, COL2, COL3) VALUES(2, 
'join_key', 'test2_col2_value2', 'test2_col3_value2')");
statement.execute("INSERT INTO TEST2(ID, COL1, COL2, COL3) VALUES(3, 
'join_key', 'test2_col2_value3', 'test2_col3_value3')");

String sql = "" +
    "SELECT \n" +
    "    TEST1.COL2 AS TEST1_COL2,  \n" +
    "    COUNT(*) AS COUNT,\n" +
    "    TEST2_1.COL3 AS TEST2_1_COL3, \n" +
    "    TEST2_2.COL3 AS TEST2_2_COL3, \n" +
    "    TEST2_3.COL3 AS TEST2_3_COL3\n" +
    "FROM \n" +
    "    TEST1 \n" +
    "    LEFT JOIN TEST2 AS TEST2_3 ON (TEST2_3.COL1 = TEST1.COL1) AND 
(TEST2_3.COL2 = 'test2_col2_value3')\n" +
    "    LEFT JOIN TEST2 AS TEST2_2 ON (TEST2_2.COL1 = TEST1.COL1) AND 
(TEST2_2.COL2 = 'test2_col2_value2') \n" +
    "    LEFT JOIN TEST2 AS TEST2_1 ON (TEST2_1.COL1 = TEST1.COL1) AND 
(TEST2_1.COL2 = 'test2_col2_value1') \n" +
    "WHERE TEST2_1.COL3 = 'test2_col3_value1'\n" +
    "GROUP BY \n" +
    "    TEST1.COL2, \n" +
    "    TEST2_1.COL3, \n" +
    "    TEST2_2.COL3, \n" +
    "    TEST2_3.COL3";
ResultSet resultSet = statement.executeQuery(sql);
ResultSetMetaData metaData = resultSet.getMetaData();
for (int i = 0; i < metaData.getColumnCount(); i++) {
  System.out.print(metaData.getColumnLabel(i + 1) + "  ");
}
System.out.println();
while (resultSet.next()) {
  for (int i = 0; i < metaData.getColumnCount(); i++) {
    System.out.print(resultSet.getString(i + 1) + "  ");
  }
  System.out.println();
} {code}
The output will be this:

 

 
||TEST1_COL2||TEST2_1_COL3||TEST2_2_COL3||TEST2_3_COL3||
|test2_col2_value2|test2_col3_value1|test2_col3_value2|test2_col3_value2|

You can see the 4th value is wrong, it should be "test2_col3_value3".

Note that if I remove the "count(*)" or the WHERE clause, the result will be 
right.

 



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to