Ulrich Kramer created CALCITE-6090:
--------------------------------------
Summary: Jdbc adapter may create wrong sql for joins
Key: CALCITE-6090
URL: https://issues.apache.org/jira/browse/CALCITE-6090
Project: Calcite
Issue Type: Bug
Components: core
Affects Versions: 1.35.0
Reporter: Ulrich Kramer
Adding the following unit test to {{JdbcAdapterTest}} leads to an error
{code:java}
@Test void testAmbiguousColumn() {
CalciteAssert.model(JdbcTest.FOODMART_SCOTT_MODEL)
.query("select\n" +
" \"store_id\" \"latest_id\",\n" +
" max(\"store_type\") \"latest_store_type\"\n" +
" from\n" +
" ( SELECT \"store_id\",\"store_type\" FROM
\"foodmart\".\"store\") \n" +
" group by\n" +
" \"store_id\"")
.runs()
.enable(CalciteAssert.DB == CalciteAssert.DatabaseInstance.HSQLDB)
.explainContains("JdbcToEnumerableConverter\n JdbcProject" )
.planHasSql("SELECT MAX(\"region_id\") AS \"latest_region_id\",
\"store_id\" AS \"latest_id\"\nFROM \"foodmart\".\"store\"\nGROUP BY
\"store_id\"");
}
{code}
The projection for the column {{latest_id}} is missing. The problem is related
[here|https://github.com/apache/calcite/blob/590ec85f0fcff7173c288c350c3f60e640976a34/core/src/main/java/org/apache/calcite/tools/RelBuilder.java#L2094-L2095].
If the aggregation doesn't add, remove or twist columns,
{{RexUtil.isIdentity}} returns true. Additionally the {{inputRowType}} already
contains the names of the output columns. Therefore
{{fieldNameList.equals(inputRowType.getFieldNames())}} also returns true.
Normally, this doesn't cause issues. But if this statement is used within a
join like this
{code:sql}
SELECT
DISTINCT "region_id",
"store_id",
"dummy"
FROM
(
SELECT
"region_id",
"store_id",
"dummy"
FROM
(
select
B."store_city" "store_city",
B."store_id" "store_id",
B."region_id" "region_id",
cast(null as integer) "dummy"
from
(
select
A."store_city" "store_city",
A."region_id" "region_id",
A."store_id" "store_id"
from
(
select
max("region_id") "latest_region_id",
"store_id" "latest_id"
from
( SELECT "region_id", "store_id" FROM "foodmart"."store") "C"
group by
"store_id"
) "D"
left outer join "foodmart"."store" A on (
A."store_id" = "D"."latest_id"
and A."region_id" = "D"."latest_region_id"
)
) B
)
WHERE
"store_city" IS NOT NULL
)
{code}
an invalid SQL will be generated because the left an the right side of the join
has a column "store_id". This will be fixed in {{SqlValidatorUtil::addFields}}
by appending a unique number. But in the end this will result in a statement,
which contains a {{GROUP BY ... store_id0 }} and will never be successful.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)