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 <[email protected]> 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)); }
