You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by mi...@apache.org on 2019/01/18 16:53:19 UTC
[impala] 02/04: IMPALA-7679: Improve error message when adding NULL
column in CTAS, CREATE VIEW and ALTER VIEW
This is an automated email from the ASF dual-hosted git repository.
mikeb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git
commit 663e9ccc9e4b5167d73c5e28ac4becbd0813afca
Author: Fredy Wijaya <fw...@cloudera.com>
AuthorDate: Fri Jan 11 08:32:20 2019 -0800
IMPALA-7679: Improve error message when adding NULL column in CTAS, CREATE VIEW and ALTER VIEW
This patch improves the error message to be more helpful when inserting
a NULL column in CTAS, CREATE VIEW, and ALTER VIEW without an explicit
cast due to the inability to infer the column type.
Testing:
- Added new FE tests
- Ran all FE tests
Change-Id: Ia2fe1fc96f0650477c0e897c010be3fadabfaf82
Reviewed-on: http://gerrit.cloudera.org:8080/12217
Reviewed-by: Impala Public Jenkins <im...@cloudera.com>
Tested-by: Impala Public Jenkins <im...@cloudera.com>
---
.../impala/analysis/CreateOrAlterViewStmtBase.java | 6 +++++
.../impala/analysis/CreateTableAsSelectStmt.java | 5 ++++
.../org/apache/impala/analysis/AnalyzeDDLTest.java | 27 ++++++++++++++++++++++
3 files changed, 38 insertions(+)
diff --git a/fe/src/main/java/org/apache/impala/analysis/CreateOrAlterViewStmtBase.java b/fe/src/main/java/org/apache/impala/analysis/CreateOrAlterViewStmtBase.java
index 850fd3b..bef1c22 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CreateOrAlterViewStmtBase.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CreateOrAlterViewStmtBase.java
@@ -21,6 +21,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import org.apache.impala.catalog.Type;
import org.apache.impala.common.AnalysisException;
import org.apache.impala.thrift.TCreateOrAlterViewParams;
import org.apache.impala.thrift.TTableName;
@@ -133,6 +134,11 @@ public abstract class CreateOrAlterViewStmtBase extends StatementBase {
// duplicate column names.
Set<String> distinctColNames = new HashSet<>();
for (ColumnDef colDesc: finalColDefs_) {
+ if (colDesc.getType() == Type.NULL) {
+ throw new AnalysisException(String.format("Unable to infer the column type " +
+ "for column '%s'. Use cast() to explicitly specify the column type for " +
+ "column '%s'.", colDesc.getColName(), colDesc.getColName()));
+ }
colDesc.analyze(null);
if (!distinctColNames.add(colDesc.getColName().toLowerCase())) {
throw new AnalysisException("Duplicate column name: " + colDesc.getColName());
diff --git a/fe/src/main/java/org/apache/impala/analysis/CreateTableAsSelectStmt.java b/fe/src/main/java/org/apache/impala/analysis/CreateTableAsSelectStmt.java
index ca311c6..372cfce 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CreateTableAsSelectStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CreateTableAsSelectStmt.java
@@ -185,6 +185,11 @@ public class CreateTableAsSelectStmt extends StatementBase {
ColumnDef colDef = new ColumnDef(tmpQueryStmt.getColLabels().get(i), null,
Collections.<ColumnDef.Option, Object>emptyMap());
colDef.setType(tmpQueryStmt.getBaseTblResultExprs().get(i).getType());
+ if (colDef.getType() == Type.NULL) {
+ throw new AnalysisException(String.format("Unable to infer the column type " +
+ "for column '%s'. Use cast() to explicitly specify the column type for " +
+ "column '%s'.", colDef.getColName(), colDef.getColName()));
+ }
createStmt_.getColumnDefs().add(colDef);
}
createStmt_.analyze(analyzer);
diff --git a/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java b/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java
index 2c40545..05bd855 100644
--- a/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java
+++ b/fe/src/test/java/org/apache/impala/analysis/AnalyzeDDLTest.java
@@ -1216,6 +1216,17 @@ public class AnalyzeDDLTest extends FrontendTestBase {
"select * from temp_view union distinct " +
"select tinyint_col, int_col, bigint_col from functional.alltypes",
"Self-reference not allowed on view: functional.alltypes_view");
+
+ // IMPALA-7679: Inserting a null column type without an explicit type should
+ // throw an error.
+ AnalyzesOk("alter view functional.alltypes_view as " +
+ "select cast(null as int) as new_col");
+ AnalyzesOk("alter view functional.alltypes_view as " +
+ "select cast(null as int) as null_col, 1 as one_col");
+ AnalysisError("alter view functional.alltypes_view " +
+ "as select null as new_col", "Unable to infer the column type for " +
+ "column 'new_col'. Use cast() to explicitly specify the column type for " +
+ "column 'new_col'.");
}
@Test
@@ -1930,6 +1941,14 @@ public class AnalyzeDDLTest extends FrontendTestBase {
" stored as kudu as SELECT INT_COL, SMALLINT_COL, ID, BIGINT_COL," +
" DATE_STRING_COL, STRING_COL, TIMESTAMP_COL, YEAR, MONTH FROM " +
" functional.alltypes");
+
+ // IMPALA-7679: Inserting a null column type without an explicit type should
+ // throw an error.
+ AnalyzesOk("create table t as select cast(null as int) as new_col");
+ AnalyzesOk("create table t as select cast(null as int) as null_col, 1 as one_col");
+ AnalysisError("create table t as select null as new_col",
+ "Unable to infer the column type for column 'new_col'. Use cast() to " +
+ "explicitly specify the column type for column 'new_col'.");
}
@Test
@@ -3131,6 +3150,14 @@ public class AnalyzeDDLTest extends FrontendTestBase {
"from functional.allcomplextypes",
"Expr 'int_array_col' in select list returns a complex type 'ARRAY<INT>'.\n" +
"Only scalar types are allowed in the select list.");
+
+ // IMPALA-7679: Inserting a null column type without an explicit type should
+ // throw an error.
+ AnalyzesOk("create view v as select cast(null as int) as new_col");
+ AnalyzesOk("create view v as select cast(null as int) as null_col, 1 as one_col");
+ AnalysisError("create view v as select null as new_col",
+ "Unable to infer the column type for column 'new_col'. Use cast() to " +
+ "explicitly specify the column type for column 'new_col'.");
}
@Test