Skip to content

Commit b6cc2f7

Browse files
committed
[CALCITE-7267] CHAR_LENGTH function is not support in Oracle
1 parent 8b5c17e commit b6cc2f7

File tree

7 files changed

+22
-17
lines changed

7 files changed

+22
-17
lines changed

core/src/main/java/org/apache/calcite/sql/dialect/DerbySqlDialect.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@
1919
import org.apache.calcite.sql.SqlCall;
2020
import org.apache.calcite.sql.SqlDialect;
2121
import org.apache.calcite.sql.SqlWriter;
22-
import org.apache.calcite.sql.fun.SqlLibraryOperators;
23-
import org.apache.calcite.sql.parser.SqlParserPos;
22+
import org.apache.calcite.util.RelToSqlConverterUtil;
2423

2524
/**
2625
* A <code>SqlDialect</code> implementation for the Apache Derby database.
@@ -40,9 +39,7 @@ public DerbySqlDialect(Context context) {
4039
final int rightPrec) {
4140
switch (call.getKind()) {
4241
case CHAR_LENGTH:
43-
SqlCall lengthCall = SqlLibraryOperators.LENGTH
44-
.createCall(SqlParserPos.ZERO, call.getOperandList());
45-
super.unparseCall(writer, lengthCall, leftPrec, rightPrec);
42+
RelToSqlConverterUtil.convertCharLengthToLength(writer, call, leftPrec, rightPrec);
4643
break;
4744
default:
4845
super.unparseCall(writer, call, leftPrec, rightPrec);

core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
3939
import org.apache.calcite.sql.parser.SqlParserPos;
4040
import org.apache.calcite.sql.type.SqlTypeName;
41+
import org.apache.calcite.util.RelToSqlConverterUtil;
4142

4243
import com.google.common.collect.ImmutableList;
4344

@@ -196,6 +197,9 @@ public OracleSqlDialect(Context context) {
196197
}
197198
writer.endFunCall(frame);
198199
break;
200+
case CHAR_LENGTH:
201+
RelToSqlConverterUtil.convertCharLengthToLength(writer, call, leftPrec, rightPrec);
202+
break;
199203
case FLOOR:
200204
if (call.operandCount() != 2) {
201205
super.unparseCall(writer, call, leftPrec, rightPrec);

core/src/main/java/org/apache/calcite/sql/dialect/PrestoSqlDialect.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import org.apache.calcite.sql.SqlNode;
3838
import org.apache.calcite.sql.SqlWriter;
3939
import org.apache.calcite.sql.fun.SqlArrayValueConstructor;
40-
import org.apache.calcite.sql.fun.SqlLibraryOperators;
4140
import org.apache.calcite.sql.fun.SqlMapValueConstructor;
4241
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
4342
import org.apache.calcite.sql.parser.SqlParserPos;
@@ -252,9 +251,7 @@ private static void unparseUsingLimit(SqlWriter writer, @Nullable SqlNode offset
252251
}
253252
break;
254253
case CHAR_LENGTH:
255-
SqlCall lengthCall = SqlLibraryOperators.LENGTH
256-
.createCall(SqlParserPos.ZERO, call.getOperandList());
257-
super.unparseCall(writer, lengthCall, leftPrec, rightPrec);
254+
RelToSqlConverterUtil.convertCharLengthToLength(writer, call, leftPrec, rightPrec);
258255
break;
259256
case TRIM:
260257
RelToSqlConverterUtil.unparseTrimLR(writer, call, leftPrec, rightPrec);

core/src/main/java/org/apache/calcite/sql/dialect/SnowflakeSqlDialect.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.calcite.sql.fun.SqlLibraryOperators;
2929
import org.apache.calcite.sql.parser.SqlParserPos;
3030
import org.apache.calcite.sql.type.SqlTypeName;
31+
import org.apache.calcite.util.RelToSqlConverterUtil;
3132

3233
import org.checkerframework.checker.nullness.qual.Nullable;
3334

@@ -62,9 +63,7 @@ public SnowflakeSqlDialect(Context context) {
6263
super.unparseCall(writer, bitOrCall, leftPrec, rightPrec);
6364
break;
6465
case CHAR_LENGTH:
65-
SqlCall lengthCall = SqlLibraryOperators.LENGTH
66-
.createCall(SqlParserPos.ZERO, call.getOperandList());
67-
super.unparseCall(writer, lengthCall, leftPrec, rightPrec);
66+
RelToSqlConverterUtil.convertCharLengthToLength(writer, call, leftPrec, rightPrec);
6867
break;
6968
case ENDS_WITH:
7069
SqlCall endsWithCall = SqlLibraryOperators.ENDSWITH

core/src/main/java/org/apache/calcite/sql/dialect/SqliteSqlDialect.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import org.apache.calcite.sql.SqlDialect;
2222
import org.apache.calcite.sql.SqlNode;
2323
import org.apache.calcite.sql.SqlWriter;
24-
import org.apache.calcite.sql.fun.SqlLibraryOperators;
25-
import org.apache.calcite.sql.parser.SqlParserPos;
2624
import org.apache.calcite.util.RelToSqlConverterUtil;
2725

2826
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -58,9 +56,7 @@ public SqliteSqlDialect(SqlDialect.Context context) {
5856
int leftPrec, int rightPrec) {
5957
switch (call.getKind()) {
6058
case CHAR_LENGTH:
61-
SqlCall lengthCall = SqlLibraryOperators.LENGTH
62-
.createCall(SqlParserPos.ZERO, call.getOperandList());
63-
super.unparseCall(writer, lengthCall, leftPrec, rightPrec);
59+
RelToSqlConverterUtil.convertCharLengthToLength(writer, call, leftPrec, rightPrec);
6460
break;
6561
case TRIM:
6662
RelToSqlConverterUtil.unparseTrimLR(writer, call, leftPrec, rightPrec);

core/src/main/java/org/apache/calcite/util/RelToSqlConverterUtil.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.apache.calcite.sql.SqlSpecialOperator;
3535
import org.apache.calcite.sql.SqlTypeNameSpec;
3636
import org.apache.calcite.sql.SqlWriter;
37+
import org.apache.calcite.sql.fun.SqlLibraryOperators;
3738
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
3839
import org.apache.calcite.sql.fun.SqlTrimFunction;
3940
import org.apache.calcite.sql.parser.SqlParserPos;
@@ -78,6 +79,16 @@ public static void unparseHiveTrim(
7879
}
7980
}
8081

82+
/**
83+
* Convert CHAR_LENGTH to LENGTH for some Dialects such as Oracle which not support CHAR_LENGTH.
84+
*/
85+
public static void convertCharLengthToLength(SqlWriter writer, SqlCall call, int leftPrec,
86+
int rightPrec) {
87+
SqlCall lengthCall = SqlLibraryOperators.LENGTH
88+
.createCall(SqlParserPos.ZERO, call.getOperandList());
89+
lengthCall.getOperator().unparse(writer, lengthCall, leftPrec, rightPrec);
90+
}
91+
8192
/**
8293
* For usage of TRIM(LEADING 'A' FROM 'ABCA') convert to TRIM, LTRIM and RTRIM,
8394
* can refer to BigQuery and Presto documents:

core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8274,6 +8274,7 @@ private void checkLiteral2(String expression, String expected) {
82748274
final String expected = "SELECT LENGTH(\"brand_name\")\n"
82758275
+ "FROM \"foodmart\".\"product\"";
82768276
sql(query)
8277+
.withOracle().ok(expected)
82778278
.withPresto().ok(expected)
82788279
.withTrino().ok(expected);
82798280
}

0 commit comments

Comments
 (0)