This is an automated email from the ASF dual-hosted git repository.

mihaibudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new 32323f9658 [CALCITE-7656] Result type inferred for VAR_SAMP is 
incorrect
32323f9658 is described below

commit 32323f9658e988d8a4658fb184990545a8548c65
Author: Mihai Budiu <[email protected]>
AuthorDate: Tue Jul 14 20:37:05 2026 -0700

    [CALCITE-7656] Result type inferred for VAR_SAMP is incorrect
    
    Signed-off-by: Mihai Budiu <[email protected]>
---
 .../main/java/org/apache/calcite/sql/type/ReturnTypes.java    |  7 +++++--
 .../test/AggregateReduceFunctionsOnGroupKeysRuleTest.xml      |  6 +++---
 .../resources/org/apache/calcite/test/RelOptRulesTest.xml     |  4 ++--
 .../main/java/org/apache/calcite/test/SqlOperatorTest.java    | 11 ++++-------
 4 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java 
b/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java
index 9e32e0563d..5e5ab2207c 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java
@@ -1581,8 +1581,10 @@ private static RelDataType 
multivalentStringWithSepSumPrecision(
     final RelDataType relDataType =
         typeFactory.getTypeSystem().deriveAvgAggType(typeFactory,
             opBinding.getOperandType(0));
+    final SqlKind kind = opBinding.getOperator().kind;
     if (opBinding.hasEmptyGroup() || opBinding.hasFilter()
-        || opBinding.getOperator().kind == SqlKind.STDDEV_SAMP) {
+        || kind == SqlKind.STDDEV_SAMP
+        || kind == SqlKind.VAR_SAMP) {
       return typeFactory.createTypeWithNullability(relDataType, true);
     } else {
       return relDataType;
@@ -1594,7 +1596,8 @@ private static RelDataType 
multivalentStringWithSepSumPrecision(
     final RelDataType relDataType =
         typeFactory.getTypeSystem().deriveCovarType(typeFactory,
             opBinding.getOperandType(0), opBinding.getOperandType(1));
-    if (opBinding.hasEmptyGroup() || opBinding.hasFilter()) {
+    if (opBinding.hasEmptyGroup() || opBinding.hasFilter()
+        || opBinding.getOperator().kind == SqlKind.COVAR_SAMP) {
       return typeFactory.createTypeWithNullability(relDataType, true);
     } else {
       return relDataType;
diff --git 
a/core/src/test/resources/org/apache/calcite/test/AggregateReduceFunctionsOnGroupKeysRuleTest.xml
 
b/core/src/test/resources/org/apache/calcite/test/AggregateReduceFunctionsOnGroupKeysRuleTest.xml
index 4f7ac67993..bead1ea3bd 100644
--- 
a/core/src/test/resources/org/apache/calcite/test/AggregateReduceFunctionsOnGroupKeysRuleTest.xml
+++ 
b/core/src/test/resources/org/apache/calcite/test/AggregateReduceFunctionsOnGroupKeysRuleTest.xml
@@ -338,7 +338,7 @@ LogicalProject(SAL=[$0], SD=[$2], SDP=[$3], VP=[$4], 
VS=[$5])
     <Resource name="planAfter">
       <![CDATA[
 LogicalProject(SAL=[$0], SD=[$2], SDP=[$3], VP=[$4], VS=[$5])
-  LogicalProject(SAL=[$0], DEPTNO=[$1], SD=[CAST(0):INTEGER], SDP=[0], VP=[0], 
VS=[0])
+  LogicalProject(SAL=[$0], DEPTNO=[$1], SD=[CAST(0):INTEGER], SDP=[0], VP=[0], 
VS=[CAST(0):INTEGER])
     LogicalAggregate(group=[{0, 1}])
       LogicalProject(SAL=[$5], DEPTNO=[$7])
         LogicalTableScan(table=[[CATALOG, SALES, EMP]])
@@ -472,7 +472,7 @@ LogicalProject(SAL=[$0], VS=[$2])
     <Resource name="planAfter">
       <![CDATA[
 LogicalProject(SAL=[$0], VS=[$2])
-  LogicalProject(SAL=[$0], DEPTNO=[$1], VS=[0])
+  LogicalProject(SAL=[$0], DEPTNO=[$1], VS=[CAST(0):INTEGER])
     LogicalAggregate(group=[{0, 1}])
       LogicalProject(SAL=[$5], DEPTNO=[$7])
         LogicalTableScan(table=[[CATALOG, SALES, EMP]])
@@ -569,7 +569,7 @@ LogicalProject(SAL=[$0], VS=[$2])
     <Resource name="planAfter">
       <![CDATA[
 LogicalProject(SAL=[$0], VS=[$2])
-  LogicalProject(SAL=[$0], DEPTNO=[$1], VS=[0])
+  LogicalProject(SAL=[$0], DEPTNO=[$1], VS=[CAST(0):INTEGER])
     LogicalAggregate(group=[{0, 1}])
       LogicalProject(SAL=[$5], DEPTNO=[$7], $f2=[*($5, $7)])
         LogicalTableScan(table=[[CATALOG, SALES, EMP]])
diff --git 
a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml 
b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 64061b8910..24d6a16f3f 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -2055,7 +2055,7 @@ LogicalAggregate(group=[{0}], EXPR$1=[STDDEV_POP($1)], 
EXPR$2=[AVG($1)], EXPR$3=
     </Resource>
     <Resource name="planAfter">
       <![CDATA[
-LogicalProject(NAME=[$0], EXPR$1=[CAST(POWER(/(-($1, /(*($2, $2), $3)), $3), 
0.5:DECIMAL(2, 1))):INTEGER NOT NULL], EXPR$2=[CAST(/($2, $3)):INTEGER NOT 
NULL], EXPR$3=[CAST(POWER(/(-($1, /(*($2, $2), $3)), CASE(=($3, 1), 
null:BIGINT, -($3, 1))), 0.5:DECIMAL(2, 1))):INTEGER], EXPR$4=[CAST(/(-($1, 
/(*($2, $2), $3)), $3)):INTEGER NOT NULL], EXPR$5=[CAST(/(-($1, /(*($2, $2), 
$3)), CASE(=($3, 1), null:BIGINT, -($3, 1)))):INTEGER NOT NULL])
+LogicalProject(NAME=[$0], EXPR$1=[CAST(POWER(/(-($1, /(*($2, $2), $3)), $3), 
0.5:DECIMAL(2, 1))):INTEGER NOT NULL], EXPR$2=[CAST(/($2, $3)):INTEGER NOT 
NULL], EXPR$3=[CAST(POWER(/(-($1, /(*($2, $2), $3)), CASE(=($3, 1), 
null:BIGINT, -($3, 1))), 0.5:DECIMAL(2, 1))):INTEGER], EXPR$4=[CAST(/(-($1, 
/(*($2, $2), $3)), $3)):INTEGER NOT NULL], EXPR$5=[CAST(/(-($1, /(*($2, $2), 
$3)), CASE(=($3, 1), null:BIGINT, -($3, 1)))):INTEGER])
   LogicalAggregate(group=[{0}], agg#0=[$SUM0($2)], agg#1=[$SUM0($1)], 
agg#2=[COUNT()])
     LogicalProject(NAME=[$0], DEPTNO=[$1], $f2=[*($1, $1)])
       LogicalProject(NAME=[$1], DEPTNO=[$0])
@@ -16331,7 +16331,7 @@ LogicalAggregate(group=[{0}], EXPR$1=[STDDEV_POP($1)], 
EXPR$2=[AVG($1)], EXPR$3=
     </Resource>
     <Resource name="planAfter">
       <![CDATA[
-LogicalProject(NAME=[$0], EXPR$1=[CAST(POWER(/(-($1, /(*($2, $2), $3)), $3), 
0.5:DECIMAL(2, 1))):INTEGER NOT NULL], EXPR$2=[CAST(/($2, $3)):INTEGER NOT 
NULL], EXPR$3=[CAST(POWER(/(-($1, /(*($2, $2), $3)), CASE(=($3, 1), 
null:BIGINT, -($3, 1))), 0.5:DECIMAL(2, 1))):INTEGER], EXPR$4=[CAST(/(-($1, 
/(*($2, $2), $3)), $3)):INTEGER NOT NULL], EXPR$5=[CAST(/(-($1, /(*($2, $2), 
$3)), CASE(=($3, 1), null:BIGINT, -($3, 1)))):INTEGER NOT NULL])
+LogicalProject(NAME=[$0], EXPR$1=[CAST(POWER(/(-($1, /(*($2, $2), $3)), $3), 
0.5:DECIMAL(2, 1))):INTEGER NOT NULL], EXPR$2=[CAST(/($2, $3)):INTEGER NOT 
NULL], EXPR$3=[CAST(POWER(/(-($1, /(*($2, $2), $3)), CASE(=($3, 1), 
null:BIGINT, -($3, 1))), 0.5:DECIMAL(2, 1))):INTEGER], EXPR$4=[CAST(/(-($1, 
/(*($2, $2), $3)), $3)):INTEGER NOT NULL], EXPR$5=[CAST(/(-($1, /(*($2, $2), 
$3)), CASE(=($3, 1), null:BIGINT, -($3, 1)))):INTEGER])
   LogicalAggregate(group=[{0}], agg#0=[$SUM0($2)], agg#1=[$SUM0($1)], 
agg#2=[COUNT()])
     LogicalProject(NAME=[$0], DEPTNO=[$1], $f2=[*($1, $1)])
       LogicalProject(NAME=[$1], DEPTNO=[$0])
diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java 
b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
index 2119f79df2..d710b516aa 100644
--- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
+++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
@@ -16083,12 +16083,9 @@ void testTimestampDiff(boolean coercionEnabled) {
         "DECIMAL(19, 9)");
     f.checkType("covar_samp(CAST(NULL AS INTEGER),CAST(NULL AS INTEGER))",
         "INTEGER");
-    f.checkAggType("covar_samp(1.5, 2.5)", "DECIMAL(2, 1) NOT NULL");
-    if (!f.brokenTestsEnabled()) {
-      return;
-    }
+    f.checkAggType("covar_samp(1.5, 2.5)", "DECIMAL(2, 1)");
     // with zero values
-    f.checkAgg("covar_samp(x)", new String[]{}, isNullValue());
+    f.checkAgg("covar_samp(x, x)", new String[]{}, isNullValue());
   }
 
   @Test void testRegrSxxFunc() {
@@ -16264,7 +16261,7 @@ void testTimestampDiff(boolean coercionEnabled) {
             false);
     f.checkType("var_samp(cast(null as varchar(2)))", "DECIMAL(19, 9)");
     f.checkType("var_samp(CAST(NULL AS INTEGER))", "INTEGER");
-    f.checkAggType("var_samp(DISTINCT 1.5)", "DECIMAL(2, 1) NOT NULL");
+    f.checkAggType("var_samp(DISTINCT 1.5)", "DECIMAL(2, 1)");
     final String[] values = {"0", "CAST(null AS FLOAT)", "3", "3"};
     if (!f.brokenTestsEnabled()) {
       return;
@@ -16292,7 +16289,7 @@ void testTimestampDiff(boolean coercionEnabled) {
             false);
     f.checkType("variance(cast(null as varchar(2)))", "DECIMAL(19, 9)");
     f.checkType("variance(CAST(NULL AS INTEGER))", "INTEGER");
-    f.checkAggType("variance(DISTINCT 1.5)", "DECIMAL(2, 1) NOT NULL");
+    f.checkAggType("variance(DISTINCT 1.5)", "DECIMAL(2, 1)");
 
     final String[] values2 = {"cast(64.34 as double)", "64.34", "64.34"};
     f.checkAgg("variance(x)", values2, isExactly(0));

Reply via email to