From 2a4ca4789a370dc2c416abf182275c3f643d2ef5 Mon Sep 17 00:00:00 2001 From: Andy Coates <8012398+big-andy-coates@users.noreply.github.com> Date: Fri, 24 Jan 2020 16:36:53 +0000 Subject: [PATCH] fix: floating point comparison was inexact (#4372) * fix: floating point comparison was inexact fixes: https://github.com/confluentinc/ksql/issues/4370 Switches the generated Java code to convert the `double` to a `String`, and then using this to build the `BigDecimal`. This results in an exact `BigDecimal` for the comparison. Without this change a `double` of `0.1` is converted to a `BigDecimal` of `0.1000000000000000055511151231257827021181583404541015625`, which is greater than `0.1`, hence the bug. --- .../ksql/analyzer/AggregateAnalyzerTest.java | 4 +-- .../ksql/analyzer/ExpressionAnalyzerTest.java | 2 +- .../ksql/analyzer/PullQueryValidatorTest.java | 2 +- .../analyzer/QueryAnalyzerFunctionalTest.java | 2 +- .../ksql/codegen/CodeGenRunnerTest.java | 2 +- .../ksql/engine/InsertValuesExecutorTest.java | 1 - .../rewrite/ExpressionTreeRewriterTest.java | 2 +- .../ksql/planner/LogicalPlannerTest.java | 2 +- .../structured/SchemaKGroupedStreamTest.java | 2 +- .../structured/SchemaKGroupedTableTest.java | 2 +- .../ksql/structured/SchemaKStreamTest.java | 2 +- .../ksql/structured/SchemaKTableTest.java | 2 +- .../execution/codegen/SqlToJavaVisitor.java | 11 +++++--- .../codegen/SqlToJavaVisitorTest.java | 6 ++--- .../formatter/ExpressionFormatterTest.java | 2 +- .../ksql/execution/function/UdafUtilTest.java | 2 +- .../execution/testutil/TestExpressions.java | 2 +- .../transform/select/SelectionTest.java | 2 +- .../sqlpredicate/SqlPredicateTest.java | 2 +- .../util/ExpressionTypeManagerTest.java | 2 +- .../floating-point.json | 26 +++++++++++++++++++ .../confluent/ksql/parser/AstBuilderTest.java | 2 +- .../parser/ColumnReferenceParserTest.java | 4 +-- .../parser/json/SelectExpressionTestCase.java | 2 +- .../confluent/ksql/parser/tree/QueryTest.java | 2 +- .../streams/AggregateParamsFactoryTest.java | 2 +- .../streams/StepSchemaResolverTest.java | 2 +- .../streams/StreamAggregateBuilderTest.java | 2 +- .../streams/StreamGroupByBuilderTest.java | 2 +- .../streams/StreamSelectBuilderTest.java | 1 - .../streams/StreamStreamJoinBuilderTest.java | 1 - .../streams/StreamTableJoinBuilderTest.java | 1 - .../streams/TableAggregateBuilderTest.java | 2 +- .../streams/TableGroupByBuilderTest.java | 2 +- .../streams/TableTableJoinBuilderTest.java | 1 - 35 files changed, 64 insertions(+), 42 deletions(-) create mode 100644 ksql-functional-tests/src/test/resources/query-validation-tests/floating-point.json diff --git a/ksql-engine/src/test/java/io/confluent/ksql/analyzer/AggregateAnalyzerTest.java b/ksql-engine/src/test/java/io/confluent/ksql/analyzer/AggregateAnalyzerTest.java index f6e18d7027f1..34304acc9980 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/analyzer/AggregateAnalyzerTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/analyzer/AggregateAnalyzerTest.java @@ -27,12 +27,12 @@ import io.confluent.ksql.execution.expression.tree.Expression; import io.confluent.ksql.execution.expression.tree.FunctionCall; import io.confluent.ksql.execution.expression.tree.QualifiedColumnReferenceExp; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; +import io.confluent.ksql.function.InternalFunctionRegistry; import io.confluent.ksql.name.ColumnName; import io.confluent.ksql.name.FunctionName; import io.confluent.ksql.name.SourceName; import io.confluent.ksql.schema.ksql.ColumnRef; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; -import io.confluent.ksql.function.InternalFunctionRegistry; import io.confluent.ksql.util.KsqlException; import io.confluent.ksql.util.SchemaUtil; import java.util.ArrayList; diff --git a/ksql-engine/src/test/java/io/confluent/ksql/analyzer/ExpressionAnalyzerTest.java b/ksql-engine/src/test/java/io/confluent/ksql/analyzer/ExpressionAnalyzerTest.java index 971294da82cc..4f7e134ab7b5 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/analyzer/ExpressionAnalyzerTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/analyzer/ExpressionAnalyzerTest.java @@ -23,12 +23,12 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.ComparisonExpression; import io.confluent.ksql.execution.expression.tree.ComparisonExpression.Type; import io.confluent.ksql.execution.expression.tree.Expression; import io.confluent.ksql.execution.expression.tree.QualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.StringLiteral; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.name.ColumnName; import io.confluent.ksql.name.SourceName; import io.confluent.ksql.schema.ksql.ColumnRef; diff --git a/ksql-engine/src/test/java/io/confluent/ksql/analyzer/PullQueryValidatorTest.java b/ksql-engine/src/test/java/io/confluent/ksql/analyzer/PullQueryValidatorTest.java index dc5969e43643..977f0a1dbc32 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/analyzer/PullQueryValidatorTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/analyzer/PullQueryValidatorTest.java @@ -20,8 +20,8 @@ import com.google.common.collect.ImmutableList; import io.confluent.ksql.analyzer.Analysis.Into; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.Expression; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.name.ColumnName; import io.confluent.ksql.parser.tree.ResultMaterialization; import io.confluent.ksql.parser.tree.WindowExpression; diff --git a/ksql-engine/src/test/java/io/confluent/ksql/analyzer/QueryAnalyzerFunctionalTest.java b/ksql-engine/src/test/java/io/confluent/ksql/analyzer/QueryAnalyzerFunctionalTest.java index babefbea0ea8..bd38ef25b8b7 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/analyzer/QueryAnalyzerFunctionalTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/analyzer/QueryAnalyzerFunctionalTest.java @@ -28,11 +28,11 @@ import io.confluent.ksql.analyzer.Analysis.AliasedDataSource; import io.confluent.ksql.analyzer.Analysis.Into; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.ComparisonExpression; import io.confluent.ksql.execution.expression.tree.Expression; import io.confluent.ksql.execution.expression.tree.IntegerLiteral; import io.confluent.ksql.execution.expression.tree.QualifiedColumnReferenceExp; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.plan.SelectExpression; import io.confluent.ksql.function.InternalFunctionRegistry; import io.confluent.ksql.function.UserFunctionLoader; diff --git a/ksql-engine/src/test/java/io/confluent/ksql/codegen/CodeGenRunnerTest.java b/ksql-engine/src/test/java/io/confluent/ksql/codegen/CodeGenRunnerTest.java index ae13d1e6872b..de1159f2fdb7 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/codegen/CodeGenRunnerTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/codegen/CodeGenRunnerTest.java @@ -37,9 +37,9 @@ import io.confluent.ksql.execution.codegen.CodeGenRunner; import io.confluent.ksql.execution.codegen.ExpressionMetadata; import io.confluent.ksql.execution.ddl.commands.KsqlTopic; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.Expression; import io.confluent.ksql.execution.expression.tree.QualifiedColumnReferenceExp; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.VisitParentExpressionVisitor; import io.confluent.ksql.function.InternalFunctionRegistry; import io.confluent.ksql.function.KsqlScalarFunction; diff --git a/ksql-engine/src/test/java/io/confluent/ksql/engine/InsertValuesExecutorTest.java b/ksql-engine/src/test/java/io/confluent/ksql/engine/InsertValuesExecutorTest.java index bbd4343e7cb9..1a756aedc0b2 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/engine/InsertValuesExecutorTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/engine/InsertValuesExecutorTest.java @@ -31,7 +31,6 @@ import io.confluent.ksql.execution.ddl.commands.KsqlTopic; import io.confluent.ksql.execution.expression.tree.ArithmeticUnaryExpression; import io.confluent.ksql.execution.expression.tree.BooleanLiteral; -import io.confluent.ksql.execution.expression.tree.CreateArrayExpression; import io.confluent.ksql.execution.expression.tree.DecimalLiteral; import io.confluent.ksql.execution.expression.tree.DoubleLiteral; import io.confluent.ksql.execution.expression.tree.Expression; diff --git a/ksql-engine/src/test/java/io/confluent/ksql/engine/rewrite/ExpressionTreeRewriterTest.java b/ksql-engine/src/test/java/io/confluent/ksql/engine/rewrite/ExpressionTreeRewriterTest.java index 774a971e1855..78ea190a4987 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/engine/rewrite/ExpressionTreeRewriterTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/engine/rewrite/ExpressionTreeRewriterTest.java @@ -33,7 +33,6 @@ import io.confluent.ksql.execution.expression.tree.BetweenPredicate; import io.confluent.ksql.execution.expression.tree.BooleanLiteral; import io.confluent.ksql.execution.expression.tree.Cast; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.ComparisonExpression; import io.confluent.ksql.execution.expression.tree.CreateArrayExpression; import io.confluent.ksql.execution.expression.tree.CreateMapExpression; @@ -62,6 +61,7 @@ import io.confluent.ksql.execution.expression.tree.TimeLiteral; import io.confluent.ksql.execution.expression.tree.TimestampLiteral; import io.confluent.ksql.execution.expression.tree.Type; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.WhenClause; import io.confluent.ksql.function.FunctionRegistry; import io.confluent.ksql.metastore.MetaStore; diff --git a/ksql-engine/src/test/java/io/confluent/ksql/planner/LogicalPlannerTest.java b/ksql-engine/src/test/java/io/confluent/ksql/planner/LogicalPlannerTest.java index 01289b17bed2..7e259d7e9ea2 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/planner/LogicalPlannerTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/planner/LogicalPlannerTest.java @@ -22,9 +22,9 @@ import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.is; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.ComparisonExpression; import io.confluent.ksql.execution.expression.tree.ComparisonExpression.Type; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.plan.SelectExpression; import io.confluent.ksql.function.TestFunctionRegistry; import io.confluent.ksql.metastore.MetaStore; diff --git a/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKGroupedStreamTest.java b/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKGroupedStreamTest.java index c74ed444459c..52436fafb96f 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKGroupedStreamTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKGroupedStreamTest.java @@ -22,8 +22,8 @@ import com.google.common.collect.ImmutableList; import io.confluent.ksql.execution.context.QueryContext; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.FunctionCall; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.plan.ExecutionStep; import io.confluent.ksql.execution.plan.Formats; import io.confluent.ksql.execution.streams.ExecutionStepFactory; diff --git a/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKGroupedTableTest.java b/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKGroupedTableTest.java index f85331198cd5..b377e9ad8a2c 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKGroupedTableTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKGroupedTableTest.java @@ -22,8 +22,8 @@ import com.google.common.collect.ImmutableList; import io.confluent.ksql.execution.context.QueryContext; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.FunctionCall; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.plan.ExecutionStep; import io.confluent.ksql.execution.plan.Formats; import io.confluent.ksql.execution.streams.ExecutionStepFactory; diff --git a/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKStreamTest.java b/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKStreamTest.java index a8735367248d..eb97dc02f5a6 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKStreamTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKStreamTest.java @@ -24,11 +24,11 @@ import com.google.common.collect.ImmutableList; import io.confluent.ksql.execution.builder.KsqlQueryBuilder; import io.confluent.ksql.execution.context.QueryContext; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.ComparisonExpression; import io.confluent.ksql.execution.expression.tree.Expression; import io.confluent.ksql.execution.expression.tree.FunctionCall; import io.confluent.ksql.execution.expression.tree.LongLiteral; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.plan.ExecutionStep; import io.confluent.ksql.execution.plan.Formats; import io.confluent.ksql.execution.plan.JoinType; diff --git a/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKTableTest.java b/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKTableTest.java index d1a88bdd2555..5deae55b41df 100644 --- a/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKTableTest.java +++ b/ksql-engine/src/test/java/io/confluent/ksql/structured/SchemaKTableTest.java @@ -38,10 +38,10 @@ import io.confluent.ksql.execution.builder.KsqlQueryBuilder; import io.confluent.ksql.execution.context.QueryContext; import io.confluent.ksql.execution.ddl.commands.KsqlTopic; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.ComparisonExpression; import io.confluent.ksql.execution.expression.tree.Expression; import io.confluent.ksql.execution.expression.tree.LongLiteral; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.plan.ExecutionStep; import io.confluent.ksql.execution.plan.Formats; import io.confluent.ksql.execution.plan.JoinType; diff --git a/ksql-execution/src/main/java/io/confluent/ksql/execution/codegen/SqlToJavaVisitor.java b/ksql-execution/src/main/java/io/confluent/ksql/execution/codegen/SqlToJavaVisitor.java index 01598538e8fb..d54f703a2bc1 100644 --- a/ksql-execution/src/main/java/io/confluent/ksql/execution/codegen/SqlToJavaVisitor.java +++ b/ksql-execution/src/main/java/io/confluent/ksql/execution/codegen/SqlToJavaVisitor.java @@ -460,11 +460,14 @@ private String visitBytesComparisonExpression( } private String toDecimal(final SqlType schema, final int index) { - if (schema.baseType() == SqlBaseType.DECIMAL) { - return "%" + index + "$s"; + switch (schema.baseType()) { + case DECIMAL: + return "%" + index + "$s"; + case DOUBLE: + return "BigDecimal.valueOf(%" + index + "$s)"; + default: + return "new BigDecimal(%" + index + "$s)"; } - - return "new BigDecimal(%" + index + "$s)"; } private String visitBooleanComparisonExpression(final ComparisonExpression.Type type) { diff --git a/ksql-execution/src/test/java/io/confluent/ksql/execution/codegen/SqlToJavaVisitorTest.java b/ksql-execution/src/test/java/io/confluent/ksql/execution/codegen/SqlToJavaVisitorTest.java index 4df21f036ea5..03d1c28c2151 100644 --- a/ksql-execution/src/test/java/io/confluent/ksql/execution/codegen/SqlToJavaVisitorTest.java +++ b/ksql-execution/src/test/java/io/confluent/ksql/execution/codegen/SqlToJavaVisitorTest.java @@ -37,7 +37,6 @@ import io.confluent.ksql.execution.expression.tree.ArithmeticUnaryExpression; import io.confluent.ksql.execution.expression.tree.ArithmeticUnaryExpression.Sign; import io.confluent.ksql.execution.expression.tree.Cast; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.ComparisonExpression; import io.confluent.ksql.execution.expression.tree.CreateArrayExpression; import io.confluent.ksql.execution.expression.tree.CreateMapExpression; @@ -58,6 +57,7 @@ import io.confluent.ksql.execution.expression.tree.TimeLiteral; import io.confluent.ksql.execution.expression.tree.TimestampLiteral; import io.confluent.ksql.execution.expression.tree.Type; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.WhenClause; import io.confluent.ksql.function.FunctionRegistry; import io.confluent.ksql.function.KsqlScalarFunction; @@ -657,7 +657,7 @@ public void shouldGenerateCorrectCodeForDecimalDoubleEQ() { final String java = sqlToJavaVisitor.process(compExp); // Then: - assertThat(java, containsString("(COL8.compareTo(new BigDecimal(COL3)) == 0))")); + assertThat(java, containsString("(COL8.compareTo(BigDecimal.valueOf(COL3)) == 0))")); } @Test @@ -673,7 +673,7 @@ public void shouldGenerateCorrectCodeForDoubleDecimalEQ() { final String java = sqlToJavaVisitor.process(compExp); // Then: - assertThat(java, containsString("(new BigDecimal(COL3).compareTo(COL8) == 0))")); + assertThat(java, containsString("(BigDecimal.valueOf(COL3).compareTo(COL8) == 0))")); } @Test diff --git a/ksql-execution/src/test/java/io/confluent/ksql/execution/expression/formatter/ExpressionFormatterTest.java b/ksql-execution/src/test/java/io/confluent/ksql/execution/expression/formatter/ExpressionFormatterTest.java index 28539c91407b..19d7aa2ea611 100644 --- a/ksql-execution/src/test/java/io/confluent/ksql/execution/expression/formatter/ExpressionFormatterTest.java +++ b/ksql-execution/src/test/java/io/confluent/ksql/execution/expression/formatter/ExpressionFormatterTest.java @@ -26,7 +26,6 @@ import io.confluent.ksql.execution.expression.tree.BetweenPredicate; import io.confluent.ksql.execution.expression.tree.BooleanLiteral; import io.confluent.ksql.execution.expression.tree.Cast; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.ComparisonExpression; import io.confluent.ksql.execution.expression.tree.CreateArrayExpression; import io.confluent.ksql.execution.expression.tree.CreateMapExpression; @@ -55,6 +54,7 @@ import io.confluent.ksql.execution.expression.tree.TimeLiteral; import io.confluent.ksql.execution.expression.tree.TimestampLiteral; import io.confluent.ksql.execution.expression.tree.Type; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.WhenClause; import io.confluent.ksql.name.ColumnName; import io.confluent.ksql.name.FunctionName; diff --git a/ksql-execution/src/test/java/io/confluent/ksql/execution/function/UdafUtilTest.java b/ksql-execution/src/test/java/io/confluent/ksql/execution/function/UdafUtilTest.java index 7b95f738d2a9..f1dd89c02cb0 100644 --- a/ksql-execution/src/test/java/io/confluent/ksql/execution/function/UdafUtilTest.java +++ b/ksql-execution/src/test/java/io/confluent/ksql/execution/function/UdafUtilTest.java @@ -23,8 +23,8 @@ import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableList; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.FunctionCall; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.function.AggregateFunctionInitArguments; import io.confluent.ksql.function.FunctionRegistry; import io.confluent.ksql.function.KsqlAggregateFunction; diff --git a/ksql-execution/src/test/java/io/confluent/ksql/execution/testutil/TestExpressions.java b/ksql-execution/src/test/java/io/confluent/ksql/execution/testutil/TestExpressions.java index e3d622c380b4..a38885b097ae 100644 --- a/ksql-execution/src/test/java/io/confluent/ksql/execution/testutil/TestExpressions.java +++ b/ksql-execution/src/test/java/io/confluent/ksql/execution/testutil/TestExpressions.java @@ -1,8 +1,8 @@ package io.confluent.ksql.execution.testutil; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.Expression; import io.confluent.ksql.execution.expression.tree.IntegerLiteral; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.name.ColumnName; import io.confluent.ksql.schema.ksql.ColumnRef; import io.confluent.ksql.schema.ksql.LogicalSchema; diff --git a/ksql-execution/src/test/java/io/confluent/ksql/execution/transform/select/SelectionTest.java b/ksql-execution/src/test/java/io/confluent/ksql/execution/transform/select/SelectionTest.java index cd7d2e2494d6..35d03e59c16a 100644 --- a/ksql-execution/src/test/java/io/confluent/ksql/execution/transform/select/SelectionTest.java +++ b/ksql-execution/src/test/java/io/confluent/ksql/execution/transform/select/SelectionTest.java @@ -22,8 +22,8 @@ import com.google.common.collect.ImmutableList; import io.confluent.ksql.execution.expression.tree.ArithmeticBinaryExpression; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.Expression; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.plan.SelectExpression; import io.confluent.ksql.execution.transform.select.SelectValueMapper.SelectInfo; import io.confluent.ksql.function.FunctionRegistry; diff --git a/ksql-execution/src/test/java/io/confluent/ksql/execution/transform/sqlpredicate/SqlPredicateTest.java b/ksql-execution/src/test/java/io/confluent/ksql/execution/transform/sqlpredicate/SqlPredicateTest.java index c9e8e424b39f..7566743d6752 100644 --- a/ksql-execution/src/test/java/io/confluent/ksql/execution/transform/sqlpredicate/SqlPredicateTest.java +++ b/ksql-execution/src/test/java/io/confluent/ksql/execution/transform/sqlpredicate/SqlPredicateTest.java @@ -24,12 +24,12 @@ import com.google.common.collect.ImmutableList; import io.confluent.ksql.GenericRow; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.ComparisonExpression; import io.confluent.ksql.execution.expression.tree.ComparisonExpression.Type; import io.confluent.ksql.execution.expression.tree.Expression; import io.confluent.ksql.execution.expression.tree.IntegerLiteral; import io.confluent.ksql.execution.expression.tree.LongLiteral; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.transform.KsqlProcessingContext; import io.confluent.ksql.execution.transform.KsqlTransformer; import io.confluent.ksql.function.FunctionRegistry; diff --git a/ksql-execution/src/test/java/io/confluent/ksql/execution/util/ExpressionTypeManagerTest.java b/ksql-execution/src/test/java/io/confluent/ksql/execution/util/ExpressionTypeManagerTest.java index 16f07758da10..9b5a0d88de91 100644 --- a/ksql-execution/src/test/java/io/confluent/ksql/execution/util/ExpressionTypeManagerTest.java +++ b/ksql-execution/src/test/java/io/confluent/ksql/execution/util/ExpressionTypeManagerTest.java @@ -36,7 +36,6 @@ import com.google.common.collect.ImmutableMap; import io.confluent.ksql.execution.expression.tree.ArithmeticBinaryExpression; import io.confluent.ksql.execution.expression.tree.BooleanLiteral; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.ComparisonExpression; import io.confluent.ksql.execution.expression.tree.ComparisonExpression.Type; import io.confluent.ksql.execution.expression.tree.CreateArrayExpression; @@ -59,6 +58,7 @@ import io.confluent.ksql.execution.expression.tree.SubscriptExpression; import io.confluent.ksql.execution.expression.tree.TimeLiteral; import io.confluent.ksql.execution.expression.tree.TimestampLiteral; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.WhenClause; import io.confluent.ksql.execution.testutil.TestExpressions; import io.confluent.ksql.function.FunctionRegistry; diff --git a/ksql-functional-tests/src/test/resources/query-validation-tests/floating-point.json b/ksql-functional-tests/src/test/resources/query-validation-tests/floating-point.json new file mode 100644 index 000000000000..04a7284100d4 --- /dev/null +++ b/ksql-functional-tests/src/test/resources/query-validation-tests/floating-point.json @@ -0,0 +1,26 @@ +{ + "comments": [ + "Tests covering working with floating point numbers" + ], + "tests": [ + { + "name": "filter by DOUBLE", + "statements": [ + "CREATE STREAM INPUT (ROWKEY DOUBLE KEY, ID INT) WITH (kafka_topic='test_topic', value_format='JSON');", + "CREATE STREAM OUTPUT AS SELECT * FROM INPUT WHERE ROWKEY > 0.1;" + ], + "inputs": [ + {"topic": "test_topic", "key": 0.0, "value": {"ID": 0}}, + {"topic": "test_topic", "key": 0.099, "value": {"ID": 1}}, + {"topic": "test_topic", "key": 0.1, "value": {"ID": 2}}, + {"topic": "test_topic", "key": 0.10001, "value": {"ID": 3}}, + {"topic": "test_topic", "key": 0.2, "value": {"ID": 4}}, + {"topic": "test_topic", "key": null, "value": {"ID": 5}} + ], + "outputs": [ + {"topic": "OUTPUT", "key": 0.10001, "value": {"ID": 3}}, + {"topic": "OUTPUT", "key": 0.2, "value": {"ID": 4}} + ] + } + ] +} \ No newline at end of file diff --git a/ksql-parser/src/test/java/io/confluent/ksql/parser/AstBuilderTest.java b/ksql-parser/src/test/java/io/confluent/ksql/parser/AstBuilderTest.java index 4560319fcb82..fcd4549deb26 100644 --- a/ksql-parser/src/test/java/io/confluent/ksql/parser/AstBuilderTest.java +++ b/ksql-parser/src/test/java/io/confluent/ksql/parser/AstBuilderTest.java @@ -24,8 +24,8 @@ import static org.mockito.Mockito.mock; import com.google.common.collect.ImmutableList; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.QualifiedColumnReferenceExp; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.function.FunctionRegistry; import io.confluent.ksql.metastore.MetaStore; import io.confluent.ksql.name.ColumnName; diff --git a/ksql-parser/src/test/java/io/confluent/ksql/parser/ColumnReferenceParserTest.java b/ksql-parser/src/test/java/io/confluent/ksql/parser/ColumnReferenceParserTest.java index c62ca6f3fef8..26e838974e61 100644 --- a/ksql-parser/src/test/java/io/confluent/ksql/parser/ColumnReferenceParserTest.java +++ b/ksql-parser/src/test/java/io/confluent/ksql/parser/ColumnReferenceParserTest.java @@ -16,12 +16,10 @@ package io.confluent.ksql.parser; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.is; import io.confluent.ksql.name.ColumnName; -import io.confluent.ksql.name.SourceName; import io.confluent.ksql.schema.ksql.ColumnRef; -import java.util.Optional; import org.junit.Test; public class ColumnReferenceParserTest { diff --git a/ksql-parser/src/test/java/io/confluent/ksql/parser/json/SelectExpressionTestCase.java b/ksql-parser/src/test/java/io/confluent/ksql/parser/json/SelectExpressionTestCase.java index 48add0ab4ea8..4e22f3d99009 100644 --- a/ksql-parser/src/test/java/io/confluent/ksql/parser/json/SelectExpressionTestCase.java +++ b/ksql-parser/src/test/java/io/confluent/ksql/parser/json/SelectExpressionTestCase.java @@ -16,9 +16,9 @@ package io.confluent.ksql.parser.json; import io.confluent.ksql.execution.expression.tree.ArithmeticBinaryExpression; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.DereferenceExpression; import io.confluent.ksql.execution.expression.tree.IntegerLiteral; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.plan.SelectExpression; import io.confluent.ksql.name.ColumnName; import io.confluent.ksql.schema.Operator; diff --git a/ksql-parser/src/test/java/io/confluent/ksql/parser/tree/QueryTest.java b/ksql-parser/src/test/java/io/confluent/ksql/parser/tree/QueryTest.java index 7f70322270eb..ae7c988f20bb 100644 --- a/ksql-parser/src/test/java/io/confluent/ksql/parser/tree/QueryTest.java +++ b/ksql-parser/src/test/java/io/confluent/ksql/parser/tree/QueryTest.java @@ -21,8 +21,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.testing.EqualsTester; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.Expression; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.name.ColumnName; import io.confluent.ksql.name.SourceName; import io.confluent.ksql.parser.NodeLocation; diff --git a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/AggregateParamsFactoryTest.java b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/AggregateParamsFactoryTest.java index 32de5acffd44..8716e055195c 100644 --- a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/AggregateParamsFactoryTest.java +++ b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/AggregateParamsFactoryTest.java @@ -10,8 +10,8 @@ import com.google.common.collect.ImmutableList; import io.confluent.ksql.GenericRow; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.FunctionCall; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.function.TableAggregationFunction; import io.confluent.ksql.execution.function.udaf.KudafAggregator; import io.confluent.ksql.execution.function.udaf.KudafInitializer; diff --git a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StepSchemaResolverTest.java b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StepSchemaResolverTest.java index 03dd79daeeea..fc4358cde72d 100644 --- a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StepSchemaResolverTest.java +++ b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StepSchemaResolverTest.java @@ -25,9 +25,9 @@ import com.google.common.collect.ImmutableList; import io.confluent.ksql.execution.context.QueryContext; import io.confluent.ksql.execution.expression.tree.ArithmeticBinaryExpression; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.Expression; import io.confluent.ksql.execution.expression.tree.FunctionCall; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.plan.ExecutionStep; import io.confluent.ksql.execution.plan.ExecutionStepPropertiesV1; import io.confluent.ksql.execution.plan.Formats; diff --git a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamAggregateBuilderTest.java b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamAggregateBuilderTest.java index dbf20d48331d..309d4c7edd74 100644 --- a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamAggregateBuilderTest.java +++ b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamAggregateBuilderTest.java @@ -32,8 +32,8 @@ import io.confluent.ksql.GenericRow; import io.confluent.ksql.execution.builder.KsqlQueryBuilder; import io.confluent.ksql.execution.context.QueryContext; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.FunctionCall; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.function.udaf.KudafAggregator; import io.confluent.ksql.execution.function.udaf.KudafInitializer; import io.confluent.ksql.execution.materialization.MaterializationInfo; diff --git a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamGroupByBuilderTest.java b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamGroupByBuilderTest.java index 1690b2318483..5a258d27413c 100644 --- a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamGroupByBuilderTest.java +++ b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamGroupByBuilderTest.java @@ -13,8 +13,8 @@ import io.confluent.ksql.GenericRow; import io.confluent.ksql.execution.builder.KsqlQueryBuilder; import io.confluent.ksql.execution.context.QueryContext; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.Expression; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.plan.ExecutionStep; import io.confluent.ksql.execution.plan.ExecutionStepPropertiesV1; import io.confluent.ksql.execution.plan.Formats; diff --git a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamSelectBuilderTest.java b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamSelectBuilderTest.java index 844c8ea5a855..288ac0a7b8dd 100644 --- a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamSelectBuilderTest.java +++ b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamSelectBuilderTest.java @@ -41,7 +41,6 @@ import io.confluent.ksql.logging.processing.ProcessingLogger; import io.confluent.ksql.logging.processing.ProcessingLoggerFactory; import io.confluent.ksql.name.ColumnName; -import io.confluent.ksql.name.SourceName; import io.confluent.ksql.query.QueryId; import io.confluent.ksql.schema.ksql.LogicalSchema; import io.confluent.ksql.schema.ksql.types.SqlTypes; diff --git a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamStreamJoinBuilderTest.java b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamStreamJoinBuilderTest.java index f555487758c0..3f706f644459 100644 --- a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamStreamJoinBuilderTest.java +++ b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamStreamJoinBuilderTest.java @@ -24,7 +24,6 @@ import io.confluent.ksql.execution.plan.PlanBuilder; import io.confluent.ksql.execution.plan.StreamStreamJoin; import io.confluent.ksql.name.ColumnName; -import io.confluent.ksql.name.SourceName; import io.confluent.ksql.schema.ksql.LogicalSchema; import io.confluent.ksql.schema.ksql.PhysicalSchema; import io.confluent.ksql.schema.ksql.types.SqlTypes; diff --git a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamTableJoinBuilderTest.java b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamTableJoinBuilderTest.java index 7e369da383ba..f72ccbccf5f4 100644 --- a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamTableJoinBuilderTest.java +++ b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/StreamTableJoinBuilderTest.java @@ -23,7 +23,6 @@ import io.confluent.ksql.execution.plan.PlanBuilder; import io.confluent.ksql.execution.plan.StreamTableJoin; import io.confluent.ksql.name.ColumnName; -import io.confluent.ksql.name.SourceName; import io.confluent.ksql.schema.ksql.LogicalSchema; import io.confluent.ksql.schema.ksql.PhysicalSchema; import io.confluent.ksql.schema.ksql.types.SqlTypes; diff --git a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableAggregateBuilderTest.java b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableAggregateBuilderTest.java index 2320ab824271..651f5a6a8287 100644 --- a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableAggregateBuilderTest.java +++ b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableAggregateBuilderTest.java @@ -30,8 +30,8 @@ import io.confluent.ksql.GenericRow; import io.confluent.ksql.execution.builder.KsqlQueryBuilder; import io.confluent.ksql.execution.context.QueryContext; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.FunctionCall; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.function.udaf.KudafAggregator; import io.confluent.ksql.execution.function.udaf.KudafInitializer; import io.confluent.ksql.execution.function.udaf.KudafUndoAggregator; diff --git a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableGroupByBuilderTest.java b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableGroupByBuilderTest.java index 07fad0d156bc..33912a7d01d4 100644 --- a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableGroupByBuilderTest.java +++ b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableGroupByBuilderTest.java @@ -13,8 +13,8 @@ import io.confluent.ksql.GenericRow; import io.confluent.ksql.execution.builder.KsqlQueryBuilder; import io.confluent.ksql.execution.context.QueryContext; -import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.expression.tree.Expression; +import io.confluent.ksql.execution.expression.tree.UnqualifiedColumnReferenceExp; import io.confluent.ksql.execution.plan.ExecutionStep; import io.confluent.ksql.execution.plan.ExecutionStepPropertiesV1; import io.confluent.ksql.execution.plan.Formats; diff --git a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableTableJoinBuilderTest.java b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableTableJoinBuilderTest.java index 9a61389a460a..55a29cb901c6 100644 --- a/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableTableJoinBuilderTest.java +++ b/ksql-streams/src/test/java/io/confluent/ksql/execution/streams/TableTableJoinBuilderTest.java @@ -21,7 +21,6 @@ import io.confluent.ksql.execution.plan.PlanBuilder; import io.confluent.ksql.execution.plan.TableTableJoin; import io.confluent.ksql.name.ColumnName; -import io.confluent.ksql.name.SourceName; import io.confluent.ksql.schema.ksql.LogicalSchema; import io.confluent.ksql.schema.ksql.types.SqlTypes; import org.apache.kafka.connect.data.Struct;