Paul Jackson created CALCITE-6044:
-------------------------------------
Summary: Column uniqueness for single-row relations
Key: CALCITE-6044
URL: https://issues.apache.org/jira/browse/CALCITE-6044
Project: Calcite
Issue Type: Bug
Components: core
Affects Versions: 1.35.0
Reporter: Paul Jackson
A single-row relation can result from a {{LIMIT 1}} or an aggregation without
{{{}GROUP BY{}}}. Every column in one of these relations should be unique by
virtue of having a max row count of 1.
When joining with a single-row relation on a key field, the join result should
no longer require that key field for uniqueness. For example, suppose the
{{emp}} table had a composite key {{{}(empno,hiredate){}}}. If we join on
{{hiredate=max(hiredate)}} then {{empno}} alone should be a unique column:
{code:java}
SELECT * FROM emp A
JOIN ( SELECT MAX(hiredate) last_hired FROM emp) B
ON A.hiredate = B.last_hired
{code}
{{join(A,B).empno}} should be unique because {{(A.empno,A.hiredate)}} is unique
and {{A.hiredate}} is effectively constant because it is equal to
{{{}B.last_hired{}}}.
Here are some {{RelMetadataTests}} cases that I think should pass.
{code:java}
@Test void testColumnUniquenessForLimit1() {
final String sql = ""
+ "select *\n"
+ "from emp\n"
+ "limit 1";
sql(sql)
.assertThatAreColumnsUnique(bitSetOf(0), is(true))
.assertThatAreColumnsUnique(bitSetOf(1), is(true))
.assertThatAreColumnsUnique(bitSetOf(), is(true));
}
@Test void testColumnUniquenessForJoinOnLimit1() {
final String sql = ""
+ "select *\n"
+ "from emp A\n"
+ "join (\n"
+ " select * from emp\n"
+ " limit 1) B\n"
+ "on A.empno = B.empno";
sql(sql)
.assertThatAreColumnsUnique(bitSetOf(0), is(true))
.assertThatAreColumnsUnique(bitSetOf(1), is(true))
.assertThatAreColumnsUnique(bitSetOf(9), is(true))
.assertThatAreColumnsUnique(bitSetOf(10), is(true))
.assertThatAreColumnsUnique(bitSetOf(), is(true));
}
@Test void testColumnUniquenessForJoinOnAggregation() {
final String sql = ""
+ "select *\n"
+ "from emp A\n"
+ "join (\n"
+ " select max(empno) AS maxno from emp) B\n"
+ "on A.empno = B.maxno";
sql(sql)
.assertThatAreColumnsUnique(bitSetOf(0), is(true))
.assertThatAreColumnsUnique(bitSetOf(9), is(true))
.assertThatAreColumnsUnique(bitSetOf(1), is(true))
.assertThatAreColumnsUnique(bitSetOf(), is(true));
}
@Test void testColumnUniquenessForCorrelatedSubquery() {
final String sql = ""
+ "select *\n"
+ "from emp A\n"
+ "where empno = (\n"
+ " select max(empno) from emp)";
sql(sql)
.assertThatAreColumnsUnique(bitSetOf(0), is(true))
.assertThatAreColumnsUnique(bitSetOf(1), is(true))
.assertThatAreColumnsUnique(bitSetOf(), is(true));
} {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)