Skip to content

Commit

Permalink
[FLINK-18325] [table-common] fix potential NPE when calling SqlDataTy…
Browse files Browse the repository at this point in the history
…peSpec#getNullable.
  • Loading branch information
Aaaaaaron committed Oct 29, 2020
1 parent 69c3373 commit 394a442
Show file tree
Hide file tree
Showing 9 changed files with 22 additions and 14 deletions.
Expand Up @@ -181,7 +181,8 @@ private static SqlDataTypeSpec convertDataTypes(SqlDataTypeSpec typeSpec) throws
SqlTypeNameSpec nameSpec = typeSpec.getTypeNameSpec();
SqlTypeNameSpec convertedNameSpec = convertDataTypes(nameSpec);
if (nameSpec != convertedNameSpec) {
typeSpec = new SqlDataTypeSpec(convertedNameSpec, typeSpec.getTimeZone(), typeSpec.getNullable(),
boolean nullable = typeSpec.getNullable() == null ? true : typeSpec.getNullable();
typeSpec = new SqlDataTypeSpec(convertedNameSpec, typeSpec.getTimeZone(), nullable,
typeSpec.getParserPosition());
}
return typeSpec;
Expand Down
Expand Up @@ -55,7 +55,7 @@ public void unparse(SqlWriter writer, int leftPrec, int rightPrec) {
writer.sep(",", false);
p.left.unparse(writer, 0, 0);
p.right.unparse(writer, leftPrec, rightPrec);
if (!p.right.getNullable()) {
if (p.right.getNullable() != null && !p.right.getNullable()) {
writer.keyword("NOT NULL");
}
if (getComments().get(i) != null) {
Expand Down
Expand Up @@ -124,7 +124,7 @@ public Optional<SqlTableConstraint> getConstraint() {
@Override
protected void unparseColumn(SqlWriter writer, int leftPrec, int rightPrec) {
type.unparse(writer, leftPrec, rightPrec);
if (!type.getNullable()) {
if (this.type.getNullable() != null && !this.type.getNullable()) {
// Default is nullable.
writer.keyword("NOT NULL");
}
Expand Down Expand Up @@ -179,7 +179,7 @@ public boolean isVirtual() {
@Override
protected void unparseColumn(SqlWriter writer, int leftPrec, int rightPrec) {
type.unparse(writer, leftPrec, rightPrec);
if (!type.getNullable()) {
if (this.type.getNullable() != null && !this.type.getNullable()) {
// Default is nullable.
writer.keyword("NOT NULL");
}
Expand Down
Expand Up @@ -111,7 +111,7 @@ public void unparse(SqlWriter writer, int leftPrec, int rightPrec) {
writer.sep(",", false);
p.left.unparse(writer, 0, 0);
p.right.unparse(writer, leftPrec, rightPrec);
if (!p.right.getNullable()) {
if (p.right.getNullable() != null && !p.right.getNullable()) {
writer.keyword("NOT NULL");
}
if (comments.get(i) != null) {
Expand Down
Expand Up @@ -78,13 +78,13 @@ public void unparse(SqlWriter writer, int leftPrec, int rightPrec) {
writer.sep(","); // configures the writer
keyType.unparse(writer, leftPrec, rightPrec);
// Default is nullable.
if (!keyType.getNullable()) {
if (keyType.getNullable() != null && !keyType.getNullable()) {
writer.keyword("NOT NULL");
}
writer.sep(",");
valType.unparse(writer, leftPrec, rightPrec);
// Default is nullable.
if (!valType.getNullable()) {
if (valType.getNullable() != null && !valType.getNullable()) {
writer.keyword("NOT NULL");
}
writer.endList(frame);
Expand Down
Expand Up @@ -452,7 +452,7 @@ public void checkUnparsed(String sql, String expectedUnparsed) {
// SqlDataTypeSpec does not take care of the nullable attribute unparse,
// So we unparse nullable attribute specifically, this unparsing logic should
// keep sync with SqlTableColumn.
if (!dataTypeSpec.getNullable()) {
if (dataTypeSpec.getNullable() != null && !dataTypeSpec.getNullable()) {
sqlWriter.keyword("NOT NULL");
}
assertEquals(expectedUnparsed, sqlWriter.toSqlString().getSql());
Expand Down
Expand Up @@ -43,6 +43,7 @@

import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeField;
import org.apache.calcite.sql.SqlDataTypeSpec;
import org.apache.calcite.sql.SqlIdentifier;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.validate.SqlValidator;
Expand Down Expand Up @@ -432,8 +433,9 @@ private void appendDerivedColumns(
}
}

final RelDataType relType = metadataColumn.getType()
.deriveType(sqlValidator, metadataColumn.getType().getNullable());
SqlDataTypeSpec type = metadataColumn.getType();
boolean nullable = type.getNullable() == null ? true : type.getNullable();
RelDataType relType = type.deriveType(sqlValidator, nullable);
column = TableColumn.metadata(
name,
fromLogicalToDataType(toLogicalType(relType)),
Expand All @@ -457,8 +459,9 @@ private void collectPhysicalFieldsTypes(List<SqlNode> derivedColumns) {
"A column named '%s' already exists in the base table.",
name));
}
RelDataType relType = regularColumn.getType()
.deriveType(sqlValidator, regularColumn.getType().getNullable());
SqlDataTypeSpec type = regularColumn.getType();
boolean nullable = type.getNullable() == null ? true : type.getNullable();
RelDataType relType = type.deriveType(sqlValidator, nullable);
// add field name and field type to physical field list
physicalFieldNamesToTypes.put(name, relType);
}
Expand Down
Expand Up @@ -173,8 +173,9 @@ private static TableColumn toTableColumn(SqlTableColumn tableColumn, SqlValidato
SqlRegularColumn regularColumn = (SqlRegularColumn) tableColumn;
String name = regularColumn.getName().getSimple();
SqlDataTypeSpec typeSpec = regularColumn.getType();
boolean nullable = typeSpec.getNullable() == null ? true : typeSpec.getNullable();
LogicalType logicalType = FlinkTypeFactory.toLogicalType(
typeSpec.deriveType(sqlValidator, typeSpec.getNullable()));
typeSpec.deriveType(sqlValidator, nullable));
DataType dataType = TypeConversions.fromLogicalToDataType(logicalType);
return TableColumn.physical(name, dataType);
}
Expand Down
Expand Up @@ -97,6 +97,7 @@

import org.apache.calcite.rel.RelRoot;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.sql.SqlDataTypeSpec;
import org.apache.calcite.sql.SqlDialect;
import org.apache.calcite.sql.SqlExplain;
import org.apache.calcite.sql.SqlExplainFormat;
Expand Down Expand Up @@ -621,10 +622,12 @@ private TableSchema createTableSchema(SqlCreateTable sqlCreateTable) {
.map(SqlRegularColumn.class::cast)
.collect(Collectors.toList());
for (SqlRegularColumn regularColumn : physicalColumns) {
SqlDataTypeSpec type = regularColumn.getType();
boolean nullable = type.getNullable() == null ? true : type.getNullable();
final RelDataType relType = regularColumn.getType()
.deriveType(
flinkPlanner.getOrCreateSqlValidator(),
regularColumn.getType().getNullable());
nullable);
builder.field(regularColumn.getName().getSimple(),
TypeConversions.fromLegacyInfoToDataType(FlinkTypeFactory.toTypeInfo(relType)));
}
Expand Down

0 comments on commit 394a442

Please sign in to comment.