|
8 | 8 | import com.google.common.collect.ImmutableMap; |
9 | 9 | import java.util.Map; |
10 | 10 | import lombok.experimental.Delegate; |
| 11 | +import org.apache.calcite.rel.type.RelDataType; |
| 12 | +import org.apache.calcite.sql.SqlAlienSystemTypeNameSpec; |
11 | 13 | import org.apache.calcite.sql.SqlCall; |
| 14 | +import org.apache.calcite.sql.SqlDataTypeSpec; |
| 15 | +import org.apache.calcite.sql.SqlNode; |
12 | 16 | import org.apache.calcite.sql.SqlWriter; |
13 | 17 | import org.apache.calcite.sql.dialect.SparkSqlDialect; |
| 18 | +import org.apache.calcite.sql.parser.SqlParserPos; |
14 | 19 | import org.apache.calcite.sql.validate.SqlConformance; |
| 20 | +import org.checkerframework.checker.nullness.qual.Nullable; |
| 21 | +import org.opensearch.sql.calcite.utils.OpenSearchTypeFactory; |
15 | 22 |
|
16 | 23 | /** |
17 | 24 | * Custom Spark SQL dialect that extends Calcite's SparkSqlDialect to handle OpenSearch-specific |
@@ -53,6 +60,19 @@ public void unparseCall(SqlWriter writer, SqlCall call, int leftPrec, int rightP |
53 | 60 | } |
54 | 61 | } |
55 | 62 |
|
| 63 | + @Override |
| 64 | + public @Nullable SqlNode getCastSpec(RelDataType type) { |
| 65 | + // ExprIPType has sql type name OTHER, which can not be handled by spark dialect |
| 66 | + if (OpenSearchTypeFactory.isIp(type)) { |
| 67 | + return new SqlDataTypeSpec( |
| 68 | + // It will use SqlTypeName.OTHER by type.getSqlTypeName() as OTHER is "borrowed" to |
| 69 | + // represent IP type (see also: PplTypeCoercionRule.java) |
| 70 | + new SqlAlienSystemTypeNameSpec("IP", type.getSqlTypeName(), SqlParserPos.ZERO), |
| 71 | + SqlParserPos.ZERO); |
| 72 | + } |
| 73 | + return super.getCastSpec(type); |
| 74 | + } |
| 75 | + |
56 | 76 | private void unparseFunction( |
57 | 77 | SqlWriter writer, |
58 | 78 | SqlCall call, |
|
0 commit comments