[jira] [Commented] (FLINK-17224) Precision of TIME type does not work correctly

2026-03-05 Thread Sergey Nuyanzin (Jira)


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

Sergey Nuyanzin commented on FLINK-17224:
-

Merged as 
[e4d4996551ce3b097a6c15d7d281a17e3d01be56|https://github.com/apache/flink/commit/e4d4996551ce3b097a6c15d7d281a17e3d01be56]

> Precision of TIME type does not work correctly
> --
>
> Key: FLINK-17224
> URL: https://issues.apache.org/jira/browse/FLINK-17224
> Project: Flink
>  Issue Type: Sub-task
>  Components: Table SQL / API
>Reporter: Dawid Wysakowicz
>Assignee: Sergey Nuyanzin
>Priority: Critical
>  Labels: auto-unassigned, pull-request-available, stale-assigned
>
> The support for precision in TIME type does not work correctly causing many 
> different often cryptic problems.
> Precision is completely ignored in {{FlinkTypeFactory:440-446}}:
> {code}
>   case TIME =>
> if (relDataType.getPrecision > 3) {
>   throw new TableException(
> s"TIME precision is not supported: ${relDataType.getPrecision}")
> }
> // blink runner support precision 3, but for consistent with flink 
> runner, we set to 0.
> new TimeType()
> {code}
> Example problem:
> {code}
> @Test
> public void testTimeScalarFunction() throws Exception {
>   int nanoOfDay = 10 * 1_000_000;
>   final List sourceData = Collections.singletonList(
>   Row.of(LocalTime.ofNanoOfDay(nanoOfDay))
>   );
>   final List sinkData = Arrays.asList(
>   Row.of(nanoOfDay)
>   );
>   TestCollectionTableFactory.reset();
>   TestCollectionTableFactory.initData(sourceData);
>   tEnv().sqlUpdate("CREATE TABLE SourceTable(s TIME(2)) WITH ('connector' 
> = 'COLLECTION')");
>   tEnv().sqlUpdate("CREATE TABLE SinkTable(s BIGINT) WITH ('connector' = 
> 'COLLECTION')");
>   tEnv().from("SourceTable")
>   .select(call(new TimeScalarFunction(), $("s")))
>   .insertInto("SinkTable");
>   tEnv().execute("Test Job");
>   assertThat(TestCollectionTableFactory.getResult(), equalTo(sinkData));
> }
> public static class TimeScalarFunction extends ScalarFunction {
>   public Long eval(@DataTypeHint("TIME(1)") LocalTime time) {
>   return time.toNanoOfDay();
>   }
> }
> {code}
> fails with:
> {code}
> org.apache.flink.table.api.ValidationException: Invalid function call:
> org$apache$flink$table$planner$runtime$stream$table$FunctionITCase$TimeScalarFunction$a19cd231ba10cbbc0b55ebeda49e2a77(TIME(0))
>   at 
> org.apache.flink.table.types.inference.TypeInferenceUtil.createInvalidCallException(TypeInferenceUtil.java:198)
>   at 
> org.apache.flink.table.planner.functions.inference.TypeInferenceReturnInference.inferReturnType(TypeInferenceReturnInference.java:73)
>   at 
> org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:486)
>   at 
> org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:277)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:576)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:583)
>   at 
> org.apache.flink.table.planner.expressions.converter.FunctionDefinitionConvertRule.convert(FunctionDefinitionConvertRule.java:67)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:97)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:72)
>   at 
> org.apache.flink.table.expressions.CallExpression.accept(CallExpression.java:122)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.convertExprToRexNode(QueryOperationConverter.java:681)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.access$800(QueryOperationConverter.java:128)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.lambda$convertToRexNodes$2(QueryOperationConverter.java:487)
>   at 
> java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
>   at 
> java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
>   at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
>   at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>   at 
> java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
>   at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>   at 
> java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.convertToRexNodes(QueryOperationConverter.java:488)
>   at 
>

[jira] [Commented] (FLINK-17224) Precision of TIME type does not work correctly

2023-06-18 Thread Sergey Nuyanzin (Jira)


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

Sergey Nuyanzin commented on FLINK-17224:
-

[~dwysakowicz], [~jark] 
I have it supportedincluding json, csv, avro, related time and agg functions in 
PR. Could you please have a look?

> Precision of TIME type does not work correctly
> --
>
> Key: FLINK-17224
> URL: https://issues.apache.org/jira/browse/FLINK-17224
> Project: Flink
>  Issue Type: Sub-task
>  Components: Table SQL / API
>Reporter: Dawid Wysakowicz
>Assignee: Sergey Nuyanzin
>Priority: Critical
>  Labels: auto-unassigned, pull-request-available
>
> The support for precision in TIME type does not work correctly causing many 
> different often cryptic problems.
> Precision is completely ignored in {{FlinkTypeFactory:440-446}}:
> {code}
>   case TIME =>
> if (relDataType.getPrecision > 3) {
>   throw new TableException(
> s"TIME precision is not supported: ${relDataType.getPrecision}")
> }
> // blink runner support precision 3, but for consistent with flink 
> runner, we set to 0.
> new TimeType()
> {code}
> Example problem:
> {code}
> @Test
> public void testTimeScalarFunction() throws Exception {
>   int nanoOfDay = 10 * 1_000_000;
>   final List sourceData = Collections.singletonList(
>   Row.of(LocalTime.ofNanoOfDay(nanoOfDay))
>   );
>   final List sinkData = Arrays.asList(
>   Row.of(nanoOfDay)
>   );
>   TestCollectionTableFactory.reset();
>   TestCollectionTableFactory.initData(sourceData);
>   tEnv().sqlUpdate("CREATE TABLE SourceTable(s TIME(2)) WITH ('connector' 
> = 'COLLECTION')");
>   tEnv().sqlUpdate("CREATE TABLE SinkTable(s BIGINT) WITH ('connector' = 
> 'COLLECTION')");
>   tEnv().from("SourceTable")
>   .select(call(new TimeScalarFunction(), $("s")))
>   .insertInto("SinkTable");
>   tEnv().execute("Test Job");
>   assertThat(TestCollectionTableFactory.getResult(), equalTo(sinkData));
> }
> public static class TimeScalarFunction extends ScalarFunction {
>   public Long eval(@DataTypeHint("TIME(1)") LocalTime time) {
>   return time.toNanoOfDay();
>   }
> }
> {code}
> fails with:
> {code}
> org.apache.flink.table.api.ValidationException: Invalid function call:
> org$apache$flink$table$planner$runtime$stream$table$FunctionITCase$TimeScalarFunction$a19cd231ba10cbbc0b55ebeda49e2a77(TIME(0))
>   at 
> org.apache.flink.table.types.inference.TypeInferenceUtil.createInvalidCallException(TypeInferenceUtil.java:198)
>   at 
> org.apache.flink.table.planner.functions.inference.TypeInferenceReturnInference.inferReturnType(TypeInferenceReturnInference.java:73)
>   at 
> org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:486)
>   at 
> org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:277)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:576)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:583)
>   at 
> org.apache.flink.table.planner.expressions.converter.FunctionDefinitionConvertRule.convert(FunctionDefinitionConvertRule.java:67)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:97)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:72)
>   at 
> org.apache.flink.table.expressions.CallExpression.accept(CallExpression.java:122)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.convertExprToRexNode(QueryOperationConverter.java:681)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.access$800(QueryOperationConverter.java:128)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.lambda$convertToRexNodes$2(QueryOperationConverter.java:487)
>   at 
> java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
>   at 
> java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
>   at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
>   at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>   at 
> java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
>   at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>   at 
> java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.convertToRexNodes(QueryOperationConverter.java:488)
>   at 
> org.apach

[jira] [Commented] (FLINK-17224) Precision of TIME type does not work correctly

2023-06-13 Thread Sergey Nuyanzin (Jira)


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

Sergey Nuyanzin commented on FLINK-17224:
-

I would take

> Precision of TIME type does not work correctly
> --
>
> Key: FLINK-17224
> URL: https://issues.apache.org/jira/browse/FLINK-17224
> Project: Flink
>  Issue Type: Sub-task
>  Components: Table SQL / API
>Reporter: Dawid Wysakowicz
>Priority: Critical
>  Labels: auto-unassigned, pull-request-available
>
> The support for precision in TIME type does not work correctly causing many 
> different often cryptic problems.
> Precision is completely ignored in {{FlinkTypeFactory:440-446}}:
> {code}
>   case TIME =>
> if (relDataType.getPrecision > 3) {
>   throw new TableException(
> s"TIME precision is not supported: ${relDataType.getPrecision}")
> }
> // blink runner support precision 3, but for consistent with flink 
> runner, we set to 0.
> new TimeType()
> {code}
> Example problem:
> {code}
> @Test
> public void testTimeScalarFunction() throws Exception {
>   int nanoOfDay = 10 * 1_000_000;
>   final List sourceData = Collections.singletonList(
>   Row.of(LocalTime.ofNanoOfDay(nanoOfDay))
>   );
>   final List sinkData = Arrays.asList(
>   Row.of(nanoOfDay)
>   );
>   TestCollectionTableFactory.reset();
>   TestCollectionTableFactory.initData(sourceData);
>   tEnv().sqlUpdate("CREATE TABLE SourceTable(s TIME(2)) WITH ('connector' 
> = 'COLLECTION')");
>   tEnv().sqlUpdate("CREATE TABLE SinkTable(s BIGINT) WITH ('connector' = 
> 'COLLECTION')");
>   tEnv().from("SourceTable")
>   .select(call(new TimeScalarFunction(), $("s")))
>   .insertInto("SinkTable");
>   tEnv().execute("Test Job");
>   assertThat(TestCollectionTableFactory.getResult(), equalTo(sinkData));
> }
> public static class TimeScalarFunction extends ScalarFunction {
>   public Long eval(@DataTypeHint("TIME(1)") LocalTime time) {
>   return time.toNanoOfDay();
>   }
> }
> {code}
> fails with:
> {code}
> org.apache.flink.table.api.ValidationException: Invalid function call:
> org$apache$flink$table$planner$runtime$stream$table$FunctionITCase$TimeScalarFunction$a19cd231ba10cbbc0b55ebeda49e2a77(TIME(0))
>   at 
> org.apache.flink.table.types.inference.TypeInferenceUtil.createInvalidCallException(TypeInferenceUtil.java:198)
>   at 
> org.apache.flink.table.planner.functions.inference.TypeInferenceReturnInference.inferReturnType(TypeInferenceReturnInference.java:73)
>   at 
> org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:486)
>   at 
> org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:277)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:576)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:583)
>   at 
> org.apache.flink.table.planner.expressions.converter.FunctionDefinitionConvertRule.convert(FunctionDefinitionConvertRule.java:67)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:97)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:72)
>   at 
> org.apache.flink.table.expressions.CallExpression.accept(CallExpression.java:122)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.convertExprToRexNode(QueryOperationConverter.java:681)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.access$800(QueryOperationConverter.java:128)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.lambda$convertToRexNodes$2(QueryOperationConverter.java:487)
>   at 
> java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
>   at 
> java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
>   at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
>   at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>   at 
> java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
>   at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>   at 
> java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.convertToRexNodes(QueryOperationConverter.java:488)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.visit(QueryOperationConverter.java:152)
>   at 
> org.apache.flink.table.planner.plan.QueryOpe

[jira] [Commented] (FLINK-17224) Precision of TIME type does not work correctly

2021-04-29 Thread godfrey he (Jira)


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

godfrey he commented on FLINK-17224:


cc [~jark]

> Precision of TIME type does not work correctly
> --
>
> Key: FLINK-17224
> URL: https://issues.apache.org/jira/browse/FLINK-17224
> Project: Flink
>  Issue Type: Sub-task
>  Components: Table SQL / API
>Reporter: Dawid Wysakowicz
>Priority: Critical
>  Labels: auto-unassigned
>
> The support for precision in TIME type does not work correctly causing many 
> different often cryptic problems.
> Precision is completely ignored in {{FlinkTypeFactory:440-446}}:
> {code}
>   case TIME =>
> if (relDataType.getPrecision > 3) {
>   throw new TableException(
> s"TIME precision is not supported: ${relDataType.getPrecision}")
> }
> // blink runner support precision 3, but for consistent with flink 
> runner, we set to 0.
> new TimeType()
> {code}
> Example problem:
> {code}
> @Test
> public void testTimeScalarFunction() throws Exception {
>   int nanoOfDay = 10 * 1_000_000;
>   final List sourceData = Collections.singletonList(
>   Row.of(LocalTime.ofNanoOfDay(nanoOfDay))
>   );
>   final List sinkData = Arrays.asList(
>   Row.of(nanoOfDay)
>   );
>   TestCollectionTableFactory.reset();
>   TestCollectionTableFactory.initData(sourceData);
>   tEnv().sqlUpdate("CREATE TABLE SourceTable(s TIME(2)) WITH ('connector' 
> = 'COLLECTION')");
>   tEnv().sqlUpdate("CREATE TABLE SinkTable(s BIGINT) WITH ('connector' = 
> 'COLLECTION')");
>   tEnv().from("SourceTable")
>   .select(call(new TimeScalarFunction(), $("s")))
>   .insertInto("SinkTable");
>   tEnv().execute("Test Job");
>   assertThat(TestCollectionTableFactory.getResult(), equalTo(sinkData));
> }
> public static class TimeScalarFunction extends ScalarFunction {
>   public Long eval(@DataTypeHint("TIME(1)") LocalTime time) {
>   return time.toNanoOfDay();
>   }
> }
> {code}
> fails with:
> {code}
> org.apache.flink.table.api.ValidationException: Invalid function call:
> org$apache$flink$table$planner$runtime$stream$table$FunctionITCase$TimeScalarFunction$a19cd231ba10cbbc0b55ebeda49e2a77(TIME(0))
>   at 
> org.apache.flink.table.types.inference.TypeInferenceUtil.createInvalidCallException(TypeInferenceUtil.java:198)
>   at 
> org.apache.flink.table.planner.functions.inference.TypeInferenceReturnInference.inferReturnType(TypeInferenceReturnInference.java:73)
>   at 
> org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:486)
>   at 
> org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:277)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:576)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:583)
>   at 
> org.apache.flink.table.planner.expressions.converter.FunctionDefinitionConvertRule.convert(FunctionDefinitionConvertRule.java:67)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:97)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:72)
>   at 
> org.apache.flink.table.expressions.CallExpression.accept(CallExpression.java:122)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.convertExprToRexNode(QueryOperationConverter.java:681)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.access$800(QueryOperationConverter.java:128)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.lambda$convertToRexNodes$2(QueryOperationConverter.java:487)
>   at 
> java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
>   at 
> java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
>   at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
>   at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>   at 
> java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
>   at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>   at 
> java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.convertToRexNodes(QueryOperationConverter.java:488)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.visit(QueryOperationConverter.java:152)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.vis

[jira] [Commented] (FLINK-17224) Precision of TIME type does not work correctly

2021-04-27 Thread Flink Jira Bot (Jira)


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

Flink Jira Bot commented on FLINK-17224:


This issue was marked "stale-assigned" and has not received an update in 7 
days. It is now automatically unassigned. If you are still working on it, you 
can assign it to yourself again. Please also give an update about the status of 
the work.

> Precision of TIME type does not work correctly
> --
>
> Key: FLINK-17224
> URL: https://issues.apache.org/jira/browse/FLINK-17224
> Project: Flink
>  Issue Type: Sub-task
>  Components: Table SQL / Planner
>Reporter: Dawid Wysakowicz
>Assignee: Danny Chen
>Priority: Critical
>  Labels: stale-assigned
>
> The support for precision in TIME type does not work correctly causing many 
> different often cryptic problems.
> Precision is completely ignored in {{FlinkTypeFactory:440-446}}:
> {code}
>   case TIME =>
> if (relDataType.getPrecision > 3) {
>   throw new TableException(
> s"TIME precision is not supported: ${relDataType.getPrecision}")
> }
> // blink runner support precision 3, but for consistent with flink 
> runner, we set to 0.
> new TimeType()
> {code}
> Example problem:
> {code}
> @Test
> public void testTimeScalarFunction() throws Exception {
>   int nanoOfDay = 10 * 1_000_000;
>   final List sourceData = Collections.singletonList(
>   Row.of(LocalTime.ofNanoOfDay(nanoOfDay))
>   );
>   final List sinkData = Arrays.asList(
>   Row.of(nanoOfDay)
>   );
>   TestCollectionTableFactory.reset();
>   TestCollectionTableFactory.initData(sourceData);
>   tEnv().sqlUpdate("CREATE TABLE SourceTable(s TIME(2)) WITH ('connector' 
> = 'COLLECTION')");
>   tEnv().sqlUpdate("CREATE TABLE SinkTable(s BIGINT) WITH ('connector' = 
> 'COLLECTION')");
>   tEnv().from("SourceTable")
>   .select(call(new TimeScalarFunction(), $("s")))
>   .insertInto("SinkTable");
>   tEnv().execute("Test Job");
>   assertThat(TestCollectionTableFactory.getResult(), equalTo(sinkData));
> }
> public static class TimeScalarFunction extends ScalarFunction {
>   public Long eval(@DataTypeHint("TIME(1)") LocalTime time) {
>   return time.toNanoOfDay();
>   }
> }
> {code}
> fails with:
> {code}
> org.apache.flink.table.api.ValidationException: Invalid function call:
> org$apache$flink$table$planner$runtime$stream$table$FunctionITCase$TimeScalarFunction$a19cd231ba10cbbc0b55ebeda49e2a77(TIME(0))
>   at 
> org.apache.flink.table.types.inference.TypeInferenceUtil.createInvalidCallException(TypeInferenceUtil.java:198)
>   at 
> org.apache.flink.table.planner.functions.inference.TypeInferenceReturnInference.inferReturnType(TypeInferenceReturnInference.java:73)
>   at 
> org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:486)
>   at 
> org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:277)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:576)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:583)
>   at 
> org.apache.flink.table.planner.expressions.converter.FunctionDefinitionConvertRule.convert(FunctionDefinitionConvertRule.java:67)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:97)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:72)
>   at 
> org.apache.flink.table.expressions.CallExpression.accept(CallExpression.java:122)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.convertExprToRexNode(QueryOperationConverter.java:681)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.access$800(QueryOperationConverter.java:128)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.lambda$convertToRexNodes$2(QueryOperationConverter.java:487)
>   at 
> java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
>   at 
> java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
>   at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
>   at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>   at 
> java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
>   at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>   at 
> java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisit

[jira] [Commented] (FLINK-17224) Precision of TIME type does not work correctly

2021-04-16 Thread Flink Jira Bot (Jira)


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

Flink Jira Bot commented on FLINK-17224:


This issue is assigned but has not received an update in 7 days so it has been 
labeled "stale-assigned". If you are still working on the issue, please give an 
update and remove the label. If you are no longer working on the issue, please 
unassign so someone else may work on it. In 7 days the issue will be 
automatically unassigned.

> Precision of TIME type does not work correctly
> --
>
> Key: FLINK-17224
> URL: https://issues.apache.org/jira/browse/FLINK-17224
> Project: Flink
>  Issue Type: Sub-task
>  Components: Table SQL / Planner
>Reporter: Dawid Wysakowicz
>Assignee: Danny Chen
>Priority: Critical
>  Labels: stale-assigned
>
> The support for precision in TIME type does not work correctly causing many 
> different often cryptic problems.
> Precision is completely ignored in {{FlinkTypeFactory:440-446}}:
> {code}
>   case TIME =>
> if (relDataType.getPrecision > 3) {
>   throw new TableException(
> s"TIME precision is not supported: ${relDataType.getPrecision}")
> }
> // blink runner support precision 3, but for consistent with flink 
> runner, we set to 0.
> new TimeType()
> {code}
> Example problem:
> {code}
> @Test
> public void testTimeScalarFunction() throws Exception {
>   int nanoOfDay = 10 * 1_000_000;
>   final List sourceData = Collections.singletonList(
>   Row.of(LocalTime.ofNanoOfDay(nanoOfDay))
>   );
>   final List sinkData = Arrays.asList(
>   Row.of(nanoOfDay)
>   );
>   TestCollectionTableFactory.reset();
>   TestCollectionTableFactory.initData(sourceData);
>   tEnv().sqlUpdate("CREATE TABLE SourceTable(s TIME(2)) WITH ('connector' 
> = 'COLLECTION')");
>   tEnv().sqlUpdate("CREATE TABLE SinkTable(s BIGINT) WITH ('connector' = 
> 'COLLECTION')");
>   tEnv().from("SourceTable")
>   .select(call(new TimeScalarFunction(), $("s")))
>   .insertInto("SinkTable");
>   tEnv().execute("Test Job");
>   assertThat(TestCollectionTableFactory.getResult(), equalTo(sinkData));
> }
> public static class TimeScalarFunction extends ScalarFunction {
>   public Long eval(@DataTypeHint("TIME(1)") LocalTime time) {
>   return time.toNanoOfDay();
>   }
> }
> {code}
> fails with:
> {code}
> org.apache.flink.table.api.ValidationException: Invalid function call:
> org$apache$flink$table$planner$runtime$stream$table$FunctionITCase$TimeScalarFunction$a19cd231ba10cbbc0b55ebeda49e2a77(TIME(0))
>   at 
> org.apache.flink.table.types.inference.TypeInferenceUtil.createInvalidCallException(TypeInferenceUtil.java:198)
>   at 
> org.apache.flink.table.planner.functions.inference.TypeInferenceReturnInference.inferReturnType(TypeInferenceReturnInference.java:73)
>   at 
> org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:486)
>   at 
> org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:277)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:576)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:583)
>   at 
> org.apache.flink.table.planner.expressions.converter.FunctionDefinitionConvertRule.convert(FunctionDefinitionConvertRule.java:67)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:97)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:72)
>   at 
> org.apache.flink.table.expressions.CallExpression.accept(CallExpression.java:122)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.convertExprToRexNode(QueryOperationConverter.java:681)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.access$800(QueryOperationConverter.java:128)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.lambda$convertToRexNodes$2(QueryOperationConverter.java:487)
>   at 
> java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
>   at 
> java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
>   at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
>   at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>   at 
> java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
>   at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>   at 
> java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:49

[jira] [Commented] (FLINK-17224) Precision of TIME type does not work correctly

2020-04-27 Thread Dawid Wysakowicz (Jira)


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

Dawid Wysakowicz commented on FLINK-17224:
--

[~danny0405] Yes, I am aware of those problems. Sorry if it was not clear in 
the description of this issue, but my intention was to fully fix the support of 
{{TIME}} type. Otherwise we just sweep the problem under the rug.

> Precision of TIME type does not work correctly
> --
>
> Key: FLINK-17224
> URL: https://issues.apache.org/jira/browse/FLINK-17224
> Project: Flink
>  Issue Type: Sub-task
>  Components: Table SQL / Planner
>Reporter: Dawid Wysakowicz
>Assignee: Danny Chen
>Priority: Critical
>
> The support for precision in TIME type does not work correctly causing many 
> different often cryptic problems.
> Precision is completely ignored in {{FlinkTypeFactory:440-446}}:
> {code}
>   case TIME =>
> if (relDataType.getPrecision > 3) {
>   throw new TableException(
> s"TIME precision is not supported: ${relDataType.getPrecision}")
> }
> // blink runner support precision 3, but for consistent with flink 
> runner, we set to 0.
> new TimeType()
> {code}
> Example problem:
> {code}
> @Test
> public void testTimeScalarFunction() throws Exception {
>   int nanoOfDay = 10 * 1_000_000;
>   final List sourceData = Collections.singletonList(
>   Row.of(LocalTime.ofNanoOfDay(nanoOfDay))
>   );
>   final List sinkData = Arrays.asList(
>   Row.of(nanoOfDay)
>   );
>   TestCollectionTableFactory.reset();
>   TestCollectionTableFactory.initData(sourceData);
>   tEnv().sqlUpdate("CREATE TABLE SourceTable(s TIME(2)) WITH ('connector' 
> = 'COLLECTION')");
>   tEnv().sqlUpdate("CREATE TABLE SinkTable(s BIGINT) WITH ('connector' = 
> 'COLLECTION')");
>   tEnv().from("SourceTable")
>   .select(call(new TimeScalarFunction(), $("s")))
>   .insertInto("SinkTable");
>   tEnv().execute("Test Job");
>   assertThat(TestCollectionTableFactory.getResult(), equalTo(sinkData));
> }
> public static class TimeScalarFunction extends ScalarFunction {
>   public Long eval(@DataTypeHint("TIME(1)") LocalTime time) {
>   return time.toNanoOfDay();
>   }
> }
> {code}
> fails with:
> {code}
> org.apache.flink.table.api.ValidationException: Invalid function call:
> org$apache$flink$table$planner$runtime$stream$table$FunctionITCase$TimeScalarFunction$a19cd231ba10cbbc0b55ebeda49e2a77(TIME(0))
>   at 
> org.apache.flink.table.types.inference.TypeInferenceUtil.createInvalidCallException(TypeInferenceUtil.java:198)
>   at 
> org.apache.flink.table.planner.functions.inference.TypeInferenceReturnInference.inferReturnType(TypeInferenceReturnInference.java:73)
>   at 
> org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:486)
>   at 
> org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:277)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:576)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:583)
>   at 
> org.apache.flink.table.planner.expressions.converter.FunctionDefinitionConvertRule.convert(FunctionDefinitionConvertRule.java:67)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:97)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:72)
>   at 
> org.apache.flink.table.expressions.CallExpression.accept(CallExpression.java:122)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.convertExprToRexNode(QueryOperationConverter.java:681)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.access$800(QueryOperationConverter.java:128)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.lambda$convertToRexNodes$2(QueryOperationConverter.java:487)
>   at 
> java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
>   at 
> java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
>   at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
>   at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>   at 
> java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
>   at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>   at 
> java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.convertToRexNodes(QueryOperationConverter.java:488)

[jira] [Commented] (FLINK-17224) Precision of TIME type does not work correctly

2020-04-26 Thread Danny Chen (Jira)


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

Danny Chen commented on FLINK-17224:


[~dwysakowicz] I have fixed the TIME type conversion between our LogicalType 
and RelDataType [1], but there are still 2 problems:

1. we only support TIME type with precision 0 for Blink planner runtime
2. we do not support type conversion of different TIME type yet, either from 
"CAST" expression or output conversion, i.e. from TIME(2) to TIME(1)

[1] 
https://github.com/danny0405/flink/commit/20224ac7203599070105aad34e2b7b74c621f867

> Precision of TIME type does not work correctly
> --
>
> Key: FLINK-17224
> URL: https://issues.apache.org/jira/browse/FLINK-17224
> Project: Flink
>  Issue Type: Sub-task
>  Components: Table SQL / Planner
>Reporter: Dawid Wysakowicz
>Assignee: Danny Chen
>Priority: Critical
>
> The support for precision in TIME type does not work correctly causing many 
> different often cryptic problems.
> Precision is completely ignored in {{FlinkTypeFactory:440-446}}:
> {code}
>   case TIME =>
> if (relDataType.getPrecision > 3) {
>   throw new TableException(
> s"TIME precision is not supported: ${relDataType.getPrecision}")
> }
> // blink runner support precision 3, but for consistent with flink 
> runner, we set to 0.
> new TimeType()
> {code}
> Example problem:
> {code}
> @Test
> public void testTimeScalarFunction() throws Exception {
>   int nanoOfDay = 10 * 1_000_000;
>   final List sourceData = Collections.singletonList(
>   Row.of(LocalTime.ofNanoOfDay(nanoOfDay))
>   );
>   final List sinkData = Arrays.asList(
>   Row.of(nanoOfDay)
>   );
>   TestCollectionTableFactory.reset();
>   TestCollectionTableFactory.initData(sourceData);
>   tEnv().sqlUpdate("CREATE TABLE SourceTable(s TIME(2)) WITH ('connector' 
> = 'COLLECTION')");
>   tEnv().sqlUpdate("CREATE TABLE SinkTable(s BIGINT) WITH ('connector' = 
> 'COLLECTION')");
>   tEnv().from("SourceTable")
>   .select(call(new TimeScalarFunction(), $("s")))
>   .insertInto("SinkTable");
>   tEnv().execute("Test Job");
>   assertThat(TestCollectionTableFactory.getResult(), equalTo(sinkData));
> }
> public static class TimeScalarFunction extends ScalarFunction {
>   public Long eval(@DataTypeHint("TIME(1)") LocalTime time) {
>   return time.toNanoOfDay();
>   }
> }
> {code}
> fails with:
> {code}
> org.apache.flink.table.api.ValidationException: Invalid function call:
> org$apache$flink$table$planner$runtime$stream$table$FunctionITCase$TimeScalarFunction$a19cd231ba10cbbc0b55ebeda49e2a77(TIME(0))
>   at 
> org.apache.flink.table.types.inference.TypeInferenceUtil.createInvalidCallException(TypeInferenceUtil.java:198)
>   at 
> org.apache.flink.table.planner.functions.inference.TypeInferenceReturnInference.inferReturnType(TypeInferenceReturnInference.java:73)
>   at 
> org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:486)
>   at 
> org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:277)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:576)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:583)
>   at 
> org.apache.flink.table.planner.expressions.converter.FunctionDefinitionConvertRule.convert(FunctionDefinitionConvertRule.java:67)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:97)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:72)
>   at 
> org.apache.flink.table.expressions.CallExpression.accept(CallExpression.java:122)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.convertExprToRexNode(QueryOperationConverter.java:681)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.access$800(QueryOperationConverter.java:128)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.lambda$convertToRexNodes$2(QueryOperationConverter.java:487)
>   at 
> java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
>   at 
> java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
>   at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
>   at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>   at 
> java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
>   at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>   at 
> java.util.s

[jira] [Commented] (FLINK-17224) Precision of TIME type does not work correctly

2020-04-17 Thread Danny Chen (Jira)


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

Danny Chen commented on FLINK-17224:


Hi Dawid, I would like to take this issue.

> Precision of TIME type does not work correctly
> --
>
> Key: FLINK-17224
> URL: https://issues.apache.org/jira/browse/FLINK-17224
> Project: Flink
>  Issue Type: Sub-task
>  Components: Table SQL / Planner
>Reporter: Dawid Wysakowicz
>Priority: Critical
>
> The support for precision in TIME type does not work correctly causing many 
> different often cryptic problems.
> Precision is completely ignored in {{FlinkTypeFactory:440-446}}:
> {code}
>   case TIME =>
> if (relDataType.getPrecision > 3) {
>   throw new TableException(
> s"TIME precision is not supported: ${relDataType.getPrecision}")
> }
> // blink runner support precision 3, but for consistent with flink 
> runner, we set to 0.
> new TimeType()
> {code}
> Example problem:
> {code}
> @Test
> public void testTimeScalarFunction() throws Exception {
>   int nanoOfDay = 10 * 1_000_000;
>   final List sourceData = Collections.singletonList(
>   Row.of(LocalTime.ofNanoOfDay(nanoOfDay))
>   );
>   final List sinkData = Arrays.asList(
>   Row.of(nanoOfDay)
>   );
>   TestCollectionTableFactory.reset();
>   TestCollectionTableFactory.initData(sourceData);
>   tEnv().sqlUpdate("CREATE TABLE SourceTable(s TIME(2)) WITH ('connector' 
> = 'COLLECTION')");
>   tEnv().sqlUpdate("CREATE TABLE SinkTable(s BIGINT) WITH ('connector' = 
> 'COLLECTION')");
>   tEnv().from("SourceTable")
>   .select(call(new TimeScalarFunction(), $("s")))
>   .insertInto("SinkTable");
>   tEnv().execute("Test Job");
>   assertThat(TestCollectionTableFactory.getResult(), equalTo(sinkData));
> }
> public static class TimeScalarFunction extends ScalarFunction {
>   public Long eval(@DataTypeHint("TIME(1)") LocalTime time) {
>   return time.toNanoOfDay();
>   }
> }
> {code}
> fails with:
> {code}
> org.apache.flink.table.api.ValidationException: Invalid function call:
> org$apache$flink$table$planner$runtime$stream$table$FunctionITCase$TimeScalarFunction$a19cd231ba10cbbc0b55ebeda49e2a77(TIME(0))
>   at 
> org.apache.flink.table.types.inference.TypeInferenceUtil.createInvalidCallException(TypeInferenceUtil.java:198)
>   at 
> org.apache.flink.table.planner.functions.inference.TypeInferenceReturnInference.inferReturnType(TypeInferenceReturnInference.java:73)
>   at 
> org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:486)
>   at 
> org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:277)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:576)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:583)
>   at 
> org.apache.flink.table.planner.expressions.converter.FunctionDefinitionConvertRule.convert(FunctionDefinitionConvertRule.java:67)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:97)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:72)
>   at 
> org.apache.flink.table.expressions.CallExpression.accept(CallExpression.java:122)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.convertExprToRexNode(QueryOperationConverter.java:681)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.access$800(QueryOperationConverter.java:128)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.lambda$convertToRexNodes$2(QueryOperationConverter.java:487)
>   at 
> java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
>   at 
> java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
>   at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
>   at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>   at 
> java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
>   at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>   at 
> java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.convertToRexNodes(QueryOperationConverter.java:488)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.visit(QueryOperationConverter.java:152)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.visit(

[jira] [Commented] (FLINK-17224) Precision of TIME type does not work correctly

2020-04-17 Thread Jark Wu (Jira)


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

Jark Wu commented on FLINK-17224:
-

cc [~docete]

> Precision of TIME type does not work correctly
> --
>
> Key: FLINK-17224
> URL: https://issues.apache.org/jira/browse/FLINK-17224
> Project: Flink
>  Issue Type: Sub-task
>  Components: Table SQL / Planner
>Reporter: Dawid Wysakowicz
>Priority: Critical
>
> The support for precision in TIME type does not work correctly causing many 
> different often cryptic problems.
> Precision is completely ignored in {{FlinkTypeFactory:440-446}}:
> {code}
>   case TIME =>
> if (relDataType.getPrecision > 3) {
>   throw new TableException(
> s"TIME precision is not supported: ${relDataType.getPrecision}")
> }
> // blink runner support precision 3, but for consistent with flink 
> runner, we set to 0.
> new TimeType()
> {code}
> Example problem:
> {code}
> @Test
> public void testTimeScalarFunction() throws Exception {
>   int nanoOfDay = 10 * 1_000_000;
>   final List sourceData = Collections.singletonList(
>   Row.of(LocalTime.ofNanoOfDay(nanoOfDay))
>   );
>   final List sinkData = Arrays.asList(
>   Row.of(nanoOfDay)
>   );
>   TestCollectionTableFactory.reset();
>   TestCollectionTableFactory.initData(sourceData);
>   tEnv().sqlUpdate("CREATE TABLE SourceTable(s TIME(2)) WITH ('connector' 
> = 'COLLECTION')");
>   tEnv().sqlUpdate("CREATE TABLE SinkTable(s BIGINT) WITH ('connector' = 
> 'COLLECTION')");
>   tEnv().from("SourceTable")
>   .select(call(new TimeScalarFunction(), $("s")))
>   .insertInto("SinkTable");
>   tEnv().execute("Test Job");
>   assertThat(TestCollectionTableFactory.getResult(), equalTo(sinkData));
> }
> public static class TimeScalarFunction extends ScalarFunction {
>   public Long eval(@DataTypeHint("TIME(1)") LocalTime time) {
>   return time.toNanoOfDay();
>   }
> }
> {code}
> fails with:
> {code}
> org.apache.flink.table.api.ValidationException: Invalid function call:
> org$apache$flink$table$planner$runtime$stream$table$FunctionITCase$TimeScalarFunction$a19cd231ba10cbbc0b55ebeda49e2a77(TIME(0))
>   at 
> org.apache.flink.table.types.inference.TypeInferenceUtil.createInvalidCallException(TypeInferenceUtil.java:198)
>   at 
> org.apache.flink.table.planner.functions.inference.TypeInferenceReturnInference.inferReturnType(TypeInferenceReturnInference.java:73)
>   at 
> org.apache.calcite.sql.SqlOperator.inferReturnType(SqlOperator.java:486)
>   at 
> org.apache.calcite.rex.RexBuilder.deriveReturnType(RexBuilder.java:277)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:576)
>   at org.apache.calcite.tools.RelBuilder.call(RelBuilder.java:583)
>   at 
> org.apache.flink.table.planner.expressions.converter.FunctionDefinitionConvertRule.convert(FunctionDefinitionConvertRule.java:67)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:97)
>   at 
> org.apache.flink.table.planner.expressions.converter.ExpressionConverter.visit(ExpressionConverter.java:72)
>   at 
> org.apache.flink.table.expressions.CallExpression.accept(CallExpression.java:122)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.convertExprToRexNode(QueryOperationConverter.java:681)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter.access$800(QueryOperationConverter.java:128)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.lambda$convertToRexNodes$2(QueryOperationConverter.java:487)
>   at 
> java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
>   at 
> java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
>   at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
>   at 
> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>   at 
> java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
>   at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
>   at 
> java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.convertToRexNodes(QueryOperationConverter.java:488)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.visit(QueryOperationConverter.java:152)
>   at 
> org.apache.flink.table.planner.plan.QueryOperationConverter$SingleRelVisitor.visit(QueryOperationConverter.java:148)
>