Skip to content

Commit

Permalink
[FLINK-3759] [table] Throw exception if NULL literal is encountered i…
Browse files Browse the repository at this point in the history
…n non-null mode.

This closes apache#1892
  • Loading branch information
twalthr authored and fhueske committed Apr 15, 2016
1 parent 1acd844 commit 722155a
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -907,18 +907,15 @@ class CodeGenerator(
val resultTypeTerm = primitiveTypeTermForTypeInfo(resultType)
val defaultValue = primitiveDefaultValue(resultType)

val wrappedCode = if (nullCheck) {
s"""
if (nullCheck) {
val wrappedCode = s"""
|$resultTypeTerm $resultTerm = $defaultValue;
|boolean $nullTerm = true;
|""".stripMargin
GeneratedExpression(resultTerm, nullTerm, wrappedCode, resultType)
} else {
s"""
|$resultTypeTerm $resultTerm = $defaultValue;
|""".stripMargin
throw new CodeGenException("Null literals are not allowed if nullCheck is disabled.")
}

GeneratedExpression(resultTerm, nullTerm, wrappedCode, resultType)
}

// ----------------------------------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.api.table.TableEnvironment;
import org.apache.flink.api.table.codegen.CodeGenException;
import org.apache.flink.api.table.test.utils.TableProgramsTestBase;
import static org.junit.Assert.fail;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
Expand Down Expand Up @@ -104,7 +106,7 @@ public void testComparisons() throws Exception {
@Test
public void testNullLiteral() throws Exception {
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
TableEnvironment tableEnv = getJavaTableEnvironment();
BatchTableEnvironment tableEnv = TableEnvironment.getTableEnvironment(env, config());

DataSource<Tuple2<Integer, Integer>> input =
env.fromElements(new Tuple2<>(1, 0));
Expand All @@ -114,16 +116,20 @@ public void testNullLiteral() throws Exception {

Table result = table.select("a, b, Null(INT), Null(STRING) === ''");

DataSet<Row> ds = tableEnv.toDataSet(result, Row.class);
List<Row> results = ds.collect();
String expected;
if (getConfig().getNullCheck()) {
expected = "1,0,null,null";
try {
DataSet<Row> ds = tableEnv.toDataSet(result, Row.class);
if (!config().getNullCheck()) {
fail("Exception expected if null check is disabled.");
}
List<Row> results = ds.collect();
String expected = "1,0,null,null";
compareResultAsText(results, expected);
}
else {
expected = "1,0,-1,true";
catch (CodeGenException e) {
if (config().getNullCheck()) {
throw e;
}
}
compareResultAsText(results, expected);
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,14 @@
package org.apache.flink.api.scala.sql.test

import org.apache.flink.api.scala.{ExecutionEnvironment, _}
import org.apache.flink.api.table.{TableEnvironment, Row}
import org.apache.flink.api.scala.table._
import org.apache.flink.api.table.Row
import org.apache.flink.api.table.plan.TranslationContext
import org.apache.flink.api.table.codegen.CodeGenException
import org.apache.flink.api.table.test.utils.TableProgramsTestBase
import org.apache.flink.api.table.test.utils.TableProgramsTestBase.TableConfigMode
import org.apache.flink.test.util.MultipleProgramsTestBase.TestExecutionMode
import org.apache.flink.test.util.TestBaseUtils
import org.junit.Assert._
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
Expand All @@ -42,23 +43,30 @@ class ExpressionsITCase(
def testNullLiteral(): Unit = {

val env = ExecutionEnvironment.getExecutionEnvironment
val tEnv = getScalaTableEnvironment
TranslationContext.reset()
val tEnv = TableEnvironment.getTableEnvironment(env, config)

val sqlQuery = "SELECT a, b, CAST(NULL AS INT), CAST(NULL AS VARCHAR) = '' FROM MyTable"

val ds = env.fromElements((1, 0))
tEnv.registerDataSet("MyTable", ds, 'a, 'b)
val t = env.fromElements((1, 0))
tEnv.registerDataSet("MyTable", t, 'a, 'b)

val result = tEnv.sql(sqlQuery)

val expected = if (getConfig.getNullCheck) {
"1,0,null,null"
} else {
"1,0,-1,true"
try {
val ds = result.toDataSet[Row]
if (!config.getNullCheck) {
fail("Exception expected if null check is disabled.")
}
val results = ds.collect()
val expected = "1,0,null,null"
TestBaseUtils.compareResultAsText(results.asJava, expected)
}
catch {
case e: CodeGenException =>
if (config.getNullCheck) {
throw e
}
}
val results = result.toDataSet[Row](getConfig).collect()
TestBaseUtils.compareResultAsText(results.asJava, expected)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,15 @@ import java.util.Date
import org.apache.flink.api.common.typeinfo.BasicTypeInfo
import org.apache.flink.api.scala._
import org.apache.flink.api.scala.table._
import org.apache.flink.api.table.codegen.CodeGenException
import org.apache.flink.api.table.expressions.Null
import org.apache.flink.api.table.{TableEnvironment, Row}
import org.apache.flink.api.table.expressions.Literal
import org.apache.flink.api.table.test.utils.TableProgramsTestBase
import org.apache.flink.api.table.test.utils.TableProgramsTestBase.TableConfigMode
import org.apache.flink.test.util.MultipleProgramsTestBase.TestExecutionMode
import org.apache.flink.test.util.TestBaseUtils
import org.junit.Assert._
import org.junit._
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
Expand Down Expand Up @@ -110,13 +112,21 @@ class ExpressionsITCase(
Null(BasicTypeInfo.INT_TYPE_INFO),
Null(BasicTypeInfo.STRING_TYPE_INFO) === "")

val expected = if (config.getNullCheck) {
"1,0,null,null"
} else {
"1,0,-1,true"
try {
val ds = t.toDataSet[Row]
if (!config.getNullCheck) {
fail("Exception expected if null check is disabled.")
}
val results = ds.collect()
val expected = "1,0,null,null"
TestBaseUtils.compareResultAsText(results.asJava, expected)
}
catch {
case e: CodeGenException =>
if (config.getNullCheck) {
throw e
}
}
val results = t.toDataSet[Row].collect()
TestBaseUtils.compareResultAsText(results.asJava, expected)
}

// Date literals not yet supported
Expand Down

0 comments on commit 722155a

Please sign in to comment.