You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2021/10/13 19:09:16 UTC
[calcite] 09/11: Refactor: Introduce field
SqlUtil.GENERATED_EXPR_ALIAS_PREFIX
This is an automated email from the ASF dual-hosted git repository.
jhyde pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
commit 8a0de7a7cd2d8d4179f9786b57ede04dd12a9279
Author: hannerwang <ha...@tencent.com>
AuthorDate: Wed Aug 25 16:48:09 2021 +0800
Refactor: Introduce field SqlUtil.GENERATED_EXPR_ALIAS_PREFIX
---
.../calcite/rel/rel2sql/RelToSqlConverter.java | 3 +--
.../apache/calcite/rel/rel2sql/SqlImplementor.java | 4 +---
.../main/java/org/apache/calcite/sql/SqlUtil.java | 20 +++++++++++++++++---
.../calcite/sql/validate/SqlValidatorUtil.java | 3 ++-
.../apache/calcite/sql2rel/SqlToRelConverter.java | 4 ++--
.../java/org/apache/calcite/tools/RelBuilder.java | 3 ++-
.../java/org/apache/calcite/test/RelBuilderTest.java | 2 +-
7 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
index b0d980c..a8173fd 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
@@ -105,7 +105,6 @@ import java.util.Collections;
import java.util.Deque;
import java.util.LinkedHashSet;
import java.util.List;
-import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
@@ -1163,7 +1162,7 @@ public class RelToSqlConverter extends SqlImplementor
result.add(leftOperand);
result.add(new SqlIdentifier(alias, POS));
Ord.forEach(rowType.getFieldNames(), (fieldName, i) -> {
- if (fieldName.toLowerCase(Locale.ROOT).startsWith("expr$")) {
+ if (SqlUtil.isGeneratedAlias(fieldName)) {
fieldName = "col_" + i;
}
result.add(new SqlIdentifier(fieldName, POS));
diff --git a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
index ce6d1fb..5e35f4f 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
@@ -116,7 +116,6 @@ import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
-import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
@@ -1888,8 +1887,7 @@ public abstract class SqlImplementor {
if (n.getKind() == SqlKind.AS) {
final SqlCall call = (SqlCall) n;
final SqlIdentifier identifier = call.operand(1);
- if (identifier.getSimple().toLowerCase(Locale.ROOT)
- .startsWith("expr$")) {
+ if (SqlUtil.isGeneratedAlias(identifier.getSimple())) {
nodeList.set(i, call.operand(0));
}
}
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
index b15f89f..ad7aae2 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
@@ -77,6 +77,12 @@ import static org.apache.calcite.util.Static.RESOURCE;
* Contains utility functions related to SQL parsing, all static.
*/
public abstract class SqlUtil {
+ //~ Constants --------------------------------------------------------------
+
+ /** Prefix for generated column aliases. Ends with '$' so that human-written
+ * queries are unlikely to accidentally reference the generated name. */
+ public static final String GENERATED_EXPR_ALIAS_PREFIX = "EXPR$";
+
//~ Methods ----------------------------------------------------------------
/** Returns the AND of two expressions.
@@ -816,9 +822,17 @@ public abstract class SqlUtil {
}
public static String deriveAliasFromOrdinal(int ordinal) {
- // Use a '$' so that queries can't easily reference the
- // generated name.
- return "EXPR$" + ordinal;
+ return GENERATED_EXPR_ALIAS_PREFIX + ordinal;
+ }
+
+ /**
+ * Whether the alias is generated by calcite.
+ * @param alias not null
+ * @return true if alias is generated by calcite, otherwise false
+ */
+ public static boolean isGeneratedAlias(String alias) {
+ assert alias != null;
+ return alias.toUpperCase(Locale.ROOT).startsWith(GENERATED_EXPR_ALIAS_PREFIX);
}
/**
diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorUtil.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorUtil.java
index 8138f86..e3564ce 100644
--- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorUtil.java
+++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorUtil.java
@@ -1332,7 +1332,8 @@ public class SqlValidatorUtil {
}
public static final Suggester EXPR_SUGGESTER =
- (original, attempt, size) -> Util.first(original, "EXPR$") + attempt;
+ (original, attempt, size) ->
+ Util.first(original, SqlUtil.GENERATED_EXPR_ALIAS_PREFIX) + attempt;
public static final Suggester F_SUGGESTER =
(original, attempt, size) -> Util.first(original, "$f")
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index 88a326d..edf9636 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -4378,8 +4378,8 @@ public class SqlToRelConverter {
Collection<String> aliases,
final int ordinal) {
String alias = validator().deriveAlias(node, ordinal);
- if ((alias == null) || aliases.contains(alias)) {
- String aliasBase = (alias == null) ? "EXPR$" : alias;
+ if (alias == null || aliases.contains(alias)) {
+ final String aliasBase = Util.first(alias, SqlUtil.GENERATED_EXPR_ALIAS_PREFIX);
for (int j = 0;; j++) {
alias = aliasBase + j;
if (!aliases.contains(alias)) {
diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
index 45cc395..f8eb7b0 100644
--- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
+++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
@@ -86,6 +86,7 @@ import org.apache.calcite.schema.impl.ListTransientTable;
import org.apache.calcite.sql.SqlAggFunction;
import org.apache.calcite.sql.SqlKind;
import org.apache.calcite.sql.SqlOperator;
+import org.apache.calcite.sql.SqlUtil;
import org.apache.calcite.sql.SqlWindow;
import org.apache.calcite.sql.fun.SqlCountAggFunction;
import org.apache.calcite.sql.fun.SqlLikeOperator;
@@ -2686,7 +2687,7 @@ public class RelBuilder {
assert tupleList.size() == rowCount;
final List<String> fieldNameList =
Util.transformIndexed(Arrays.asList(fieldNames), (name, i) ->
- name != null ? name : "expr$" + i);
+ name != null ? name : SqlUtil.deriveAliasFromOrdinal(i));
return values(tupleList, fieldNameList);
}
diff --git a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
index a6c6232..96fed2e 100644
--- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
@@ -3043,7 +3043,7 @@ public class RelBuilderTest {
"LogicalValues(tuples=[[{ null, 1, 'abc' }, { false, null, 'longer string' }]])\n";
assertThat(root, hasTree(expected));
final String expectedType =
- "RecordType(BOOLEAN a, INTEGER expr$1, CHAR(13) NOT NULL c) NOT NULL";
+ "RecordType(BOOLEAN a, INTEGER EXPR$1, CHAR(13) NOT NULL c) NOT NULL";
assertThat(root.getRowType().getFullTypeString(), is(expectedType));
}