Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CALCITE-5806] add a String data type (enabled in Apache Spark and BigQuery) #3468

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions core/src/main/codegen/default_config.fmpp
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ parser: {
"SQL_VARCHAR"
"STATE"
"STATEMENT"
"STRING"
"STRING_AGG"
"STRUCTURE"
"STYLE"
Expand Down
3 changes: 3 additions & 0 deletions core/src/main/codegen/templates/Parser.jj
Original file line number Diff line number Diff line change
Expand Up @@ -5757,6 +5757,8 @@ SqlTypeNameSpec SqlTypeName1(Span s) :
[ <PRECISION> ] { sqlTypeName = SqlTypeName.DOUBLE; }
|
<FLOAT> { s.add(this); sqlTypeName = SqlTypeName.FLOAT; }
|
<STRING> { s.add(this); sqlTypeName = SqlTypeName.STRING; }
)
{
return new SqlBasicTypeNameSpec(sqlTypeName, s.end(this));
Expand Down Expand Up @@ -8494,6 +8496,7 @@ SqlPostfixOperator PostfixRowOperator() :
| < SYSTEM: "SYSTEM" >
| < SYSTEM_TIME: "SYSTEM_TIME" >
| < SYSTEM_USER: "SYSTEM_USER" >
| < STRING: "STRING" >
| < TABLE: "TABLE" > { beforeTableName(); }
| < TABLE_NAME: "TABLE_NAME" >
| < TABLESAMPLE: "TABLESAMPLE" >
Expand Down
4 changes: 4 additions & 0 deletions core/src/main/java/org/apache/calcite/rex/RexBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -1629,6 +1629,8 @@ public RexNode makeLiteral(@Nullable Object value, RelDataType type,
} else {
return literal;
}
case STRING:
return makePreciseStringLiteral((String) value);
case BINARY:
return makeBinaryLiteral(
padRight((ByteString) value, type.getPrecision()));
Expand Down Expand Up @@ -1802,6 +1804,8 @@ public RexNode makeLiteral(@Nullable Object value, RelDataType type,
assert type.getCharset() != null : type + ".getCharset() must not be null";
return new NlsString((String) o, type.getCharset().name(),
type.getCollation());
case STRING:
return o;
case TIME:
if (o instanceof TimeString) {
return o;
Expand Down
2 changes: 2 additions & 0 deletions core/src/main/java/org/apache/calcite/rex/RexLiteral.java
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,8 @@ public static boolean valueMatchesType(
return (value instanceof NlsString)
&& (((NlsString) value).getCharset() != null)
&& (((NlsString) value).getCollation() != null);
case STRING:
return value instanceof String;
case SARG:
return value instanceof Sarg;
case SYMBOL:
Expand Down
7 changes: 6 additions & 1 deletion core/src/main/java/org/apache/calcite/sql/SqlDialect.java
Original file line number Diff line number Diff line change
Expand Up @@ -815,7 +815,12 @@ public CalendarPolicy getCalendarPolicy() {

/** Returns whether this dialect supports a given type. */
public boolean supportsDataType(RelDataType type) {
return true;
switch (type.getSqlTypeName()) {
case STRING:
return false;
default:
return true;
}
}

/** Returns SqlNode for type in "cast(column as type)", which might be
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ public BigQuerySqlDialect(SqlDialect.Context context) {
return false;
}

@Override public boolean supportsDataType(RelDataType type) {
return true;
}

@Override public SqlParser.Config configureParser(
SqlParser.Config configBuilder) {
return super.configureParser(configBuilder)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import org.apache.calcite.avatica.util.TimeUnitRange;
import org.apache.calcite.config.NullCollation;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.sql.JoinType;
import org.apache.calcite.sql.SqlBasicFunction;
import org.apache.calcite.sql.SqlCall;
Expand Down Expand Up @@ -67,6 +68,10 @@ public SparkSqlDialect(SqlDialect.Context context) {
return false;
}

@Override public boolean supportsDataType(RelDataType type) {
return true;
}

@Override public JoinType emulateJoinTypeForCrossJoin() {
return JoinType.CROSS;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,9 @@ private SqlTypeAssignmentRule(
rule.add(SqlTypeName.VARCHAR);
rules.add(SqlTypeName.VARCHAR, rule);

// STRING is assignable from...
rules.add(SqlTypeName.STRING, rule);

// BOOLEAN is assignable from...
rules.add(SqlTypeName.BOOLEAN, EnumSet.of(SqlTypeName.BOOLEAN));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,8 @@ public enum SqlTypeName {
* do not flag it 'special' (internal). */
GEOMETRY(PrecScale.NO_NO, false, ExtraSqlTypes.GEOMETRY, SqlTypeFamily.GEO),
MEASURE(PrecScale.NO_NO, true, Types.OTHER, SqlTypeFamily.ANY),
SARG(PrecScale.NO_NO, true, Types.OTHER, SqlTypeFamily.ANY);
SARG(PrecScale.NO_NO, true, Types.OTHER, SqlTypeFamily.ANY),
STRING(PrecScale.NO_NO, true, Types.OTHER, SqlTypeFamily.STRING);

public static final int MAX_DATETIME_PRECISION = 3;

Expand Down Expand Up @@ -159,7 +160,7 @@ public enum SqlTypeName {
INTERVAL_DAY_SECOND, INTERVAL_HOUR, INTERVAL_HOUR_MINUTE,
INTERVAL_HOUR_SECOND, INTERVAL_MINUTE, INTERVAL_MINUTE_SECOND,
INTERVAL_SECOND, TIME_WITH_LOCAL_TIME_ZONE, TIMESTAMP_WITH_LOCAL_TIME_ZONE,
FLOAT, MULTISET, DISTINCT, STRUCTURED, ROW, CURSOR, COLUMN_LIST);
FLOAT, MULTISET, DISTINCT, STRUCTURED, ROW, CURSOR, COLUMN_LIST, STRING);

public static final List<SqlTypeName> BOOLEAN_TYPES =
ImmutableList.of(BOOLEAN);
Expand All @@ -183,7 +184,7 @@ public enum SqlTypeName {
combine(APPROX_TYPES, ImmutableList.of(DECIMAL));

public static final List<SqlTypeName> CHAR_TYPES =
ImmutableList.of(CHAR, VARCHAR);
ImmutableList.of(CHAR, VARCHAR, STRING);

public static final List<SqlTypeName> STRING_TYPES =
combine(CHAR_TYPES, BINARY_TYPES);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2127,7 +2127,8 @@ private SqlDialect nonOrdinalDialect() {
+ "cast(cast(\"employee_id\" as varchar) as decimal), "
+ "cast(cast(\"employee_id\" as varchar) as date), "
+ "cast(cast(\"employee_id\" as varchar) as time), "
+ "cast(cast(\"employee_id\" as varchar) as boolean) "
+ "cast(cast(\"employee_id\" as varchar) as boolean), "
+ "cast(cast(\"employee_id\" as varchar) as string) "
+ "from \"foodmart\".\"reserve_employee\" ";
final String expected = "SELECT CAST(CAST(employee_id AS STRING) AS INT64), "
+ "CAST(CAST(employee_id AS STRING) AS INT64), "
Expand All @@ -2142,7 +2143,8 @@ private SqlDialect nonOrdinalDialect() {
+ "CAST(CAST(employee_id AS STRING) AS NUMERIC), "
+ "CAST(CAST(employee_id AS STRING) AS DATE), "
+ "CAST(CAST(employee_id AS STRING) AS TIME), "
+ "CAST(CAST(employee_id AS STRING) AS BOOL)\n"
+ "CAST(CAST(employee_id AS STRING) AS BOOL), "
+ "CAST(CAST(employee_id AS STRING) AS STRING)\n"
+ "FROM foodmart.reserve_employee";
sql(query).withBigQuery().ok(expected);
}
Expand Down Expand Up @@ -6757,12 +6759,20 @@ private void checkLiteral2(String expression, String expected) {
new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
final RelDataType booleanDataType = typeFactory.createSqlType(SqlTypeName.BOOLEAN);
final RelDataType integerDataType = typeFactory.createSqlType(SqlTypeName.INTEGER);
final RelDataType stringDataType = typeFactory.createSqlType(SqlTypeName.STRING);
final SqlDialect oracleDialect = DatabaseProduct.ORACLE.getDialect();
assertFalse(oracleDialect.supportsDataType(booleanDataType));
assertFalse(oracleDialect.supportsDataType(stringDataType));
assertTrue(oracleDialect.supportsDataType(integerDataType));
assertFalse(oracleDialect.supportsDataType(booleanDataType));
final SqlDialect postgresqlDialect = DatabaseProduct.POSTGRESQL.getDialect();
assertTrue(postgresqlDialect.supportsDataType(booleanDataType));
assertTrue(postgresqlDialect.supportsDataType(integerDataType));
assertFalse(oracleDialect.supportsDataType(stringDataType));
final SqlDialect sparkSqlDialect = DatabaseProduct.SPARK.getDialect();
assertTrue(sparkSqlDialect.supportsDataType(stringDataType));
final SqlDialect bigQuerySqlDialect = DatabaseProduct.BIG_QUERY.getDialect();
assertTrue(bigQuerySqlDialect.supportsDataType(stringDataType));

}

/** Test case for
Expand Down
5 changes: 5 additions & 0 deletions core/src/test/java/org/apache/calcite/rex/RexBuilderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,8 @@ private void checkDate(RexLiteral literal) {
new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
final RelDataType varchar =
typeFactory.createSqlType(SqlTypeName.VARCHAR);
final RelDataType string =
typeFactory.createSqlType(SqlTypeName.STRING);
final RexBuilder builder = new RexBuilder(typeFactory);

final NlsString latin1 = new NlsString("foobar", "LATIN1", SqlCollation.IMPLICIT);
Expand Down Expand Up @@ -737,6 +739,9 @@ private void checkDate(RexLiteral literal) {
assertEquals("_LATIN1'foobar'", literal.toString());
literal = builder.makeLiteral(utf8, varchar);
assertEquals("_UTF8'foobar'", literal.toString());

literal = builder.makeLiteral("foobar", string);
assertEquals("'foobar'", literal.toString());
}

/** Tests {@link RexBuilder#makeExactLiteral(java.math.BigDecimal)}. */
Expand Down
4 changes: 4 additions & 0 deletions core/src/test/java/org/apache/calcite/rex/RexProgramTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2677,6 +2677,9 @@ private SqlOperator getNoDeterministicOperator() {
literals.add(rexBuilder.makeLiteral(true));
literals.add(rexBuilder.makeLiteral(false));
literals.add(rexBuilder.makeLiteral("hello world"));
literals.add(
rexBuilder.makeLiteral("hello string",
typeFactory.createSqlType(SqlTypeName.STRING)));
literals.add(rexBuilder.makeLiteral("1969-07-20 12:34:56"));
literals.add(rexBuilder.makeLiteral("1969-07-20"));
literals.add(rexBuilder.makeLiteral("12:34:45"));
Expand Down Expand Up @@ -2710,6 +2713,7 @@ private SqlOperator getNoDeterministicOperator() {
types.add(typeFactory.createSqlType(SqlTypeName.TIMESTAMP));
types.add(typeFactory.createSqlType(SqlTypeName.TIME));
types.add(typeFactory.createSqlType(SqlTypeName.DATE));
types.add(typeFactory.createSqlType(SqlTypeName.STRING));

for (RelDataType fromType : types) {
for (RelDataType toType : types) {
Expand Down
1 change: 1 addition & 0 deletions site/_docs/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -1010,6 +1010,7 @@ STATEMENT,
**STDDEV_POP**,
**STDDEV_SAMP**,
**STREAM**,
STRING,
STRING_AGG,
STRUCTURE,
STYLE,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1803,6 +1803,8 @@ void checkPeriodPredicate(Checker checker) {
.ok("CAST(`X` AS DECIMAL(1, 1))");
expr("cast(x as char(1))")
.ok("CAST(`X` AS CHAR(1))");
expr("cast(x as string)")
.ok("CAST(`X` AS STRING)");
expr("cast(x as binary(1))")
.ok("CAST(`X` AS BINARY(1))");
expr("cast(x as varbinary(1))")
Expand Down
Loading