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 2017/03/04 21:03:24 UTC
[05/10] calcite git commit: [CALCITE-1667] Forbid calls to JDK APIs
that use the default locale, time zone or character set
[CALCITE-1667] Forbid calls to JDK APIs that use the default locale, time zone or character set
Use the "forbidden-apis" maven plugin to detect calls to such APIs.
Eliminate calls to such APIs.
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/75152c5b
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/75152c5b
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/75152c5b
Branch: refs/heads/master
Commit: 75152c5b7fd62f60c6cdfb86605af8b34a129898
Parents: c90fddf
Author: Julian Hyde <jh...@apache.org>
Authored: Fri Mar 3 00:05:23 2017 -0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Mar 3 11:04:28 2017 -0800
----------------------------------------------------------------------
core/src/main/codegen/templates/Parser.jj | 9 ++-
.../apache/calcite/adapter/jdbc/JdbcSchema.java | 3 +-
.../config/CalciteConnectionProperty.java | 28 +++++++++-
.../apache/calcite/interpreter/Interpreter.java | 3 +-
.../org/apache/calcite/jdbc/CalciteSchema.java | 7 ++-
.../calcite/materialize/TileSuggester.java | 4 +-
.../org/apache/calcite/rel/core/Correlate.java | 2 +-
.../java/org/apache/calcite/rel/core/Join.java | 2 +-
.../apache/calcite/rel/core/JoinRelType.java | 5 ++
.../calcite/rel/externalize/RelJsonReader.java | 4 +-
.../calcite/rel/rel2sql/RelToSqlConverter.java | 8 ++-
.../calcite/rel/rel2sql/SqlImplementor.java | 3 +-
.../calcite/rel/rules/DateRangeRules.java | 4 +-
.../rel/rules/MultiJoinOptimizeBushyRule.java | 5 +-
.../java/org/apache/calcite/rex/RexBuilder.java | 6 +-
.../org/apache/calcite/runtime/HttpUtils.java | 8 ++-
.../apache/calcite/runtime/SqlFunctions.java | 8 ++-
.../java/org/apache/calcite/sql/JoinType.java | 5 ++
.../org/apache/calcite/sql/SemiJoinType.java | 5 ++
.../org/apache/calcite/sql/SqlAccessType.java | 6 +-
.../org/apache/calcite/sql/SqlCollation.java | 3 +-
.../java/org/apache/calcite/sql/SqlDialect.java | 7 ++-
.../java/org/apache/calcite/sql/SqlKind.java | 4 ++
.../java/org/apache/calcite/sql/SqlUtil.java | 10 ++--
.../apache/calcite/sql/advise/SqlAdvisor.java | 4 +-
.../calcite/sql/advise/SqlSimpleParser.java | 3 +-
.../calcite/sql/parser/SqlParserUtil.java | 6 +-
.../calcite/sql/pretty/SqlPrettyWriter.java | 10 +++-
.../apache/calcite/sql/type/SqlTypeName.java | 7 +--
.../sql/util/ReflectiveSqlOperatorTable.java | 3 +-
.../calcite/sql/validate/SqlValidatorImpl.java | 3 +-
.../org/apache/calcite/tools/RelBuilder.java | 3 +-
.../org/apache/calcite/util/ConversionUtil.java | 11 ++--
.../java/org/apache/calcite/util/NameMap.java | 4 +-
.../org/apache/calcite/util/NameMultimap.java | 4 +-
.../java/org/apache/calcite/util/NameSet.java | 6 +-
.../java/org/apache/calcite/util/NlsString.java | 3 +-
.../org/apache/calcite/util/NumberUtil.java | 16 ++++--
.../java/org/apache/calcite/util/Sources.java | 12 +---
.../java/org/apache/calcite/util/Template.java | 8 +--
.../java/org/apache/calcite/util/Unsafe.java | 54 ++++++++++++++++++
.../main/java/org/apache/calcite/util/Util.java | 58 +++++++++++++++++++-
.../apache/calcite/util/ZonelessDatetime.java | 3 +-
.../calcite/util/javac/JaninoCompiler.java | 3 +-
.../calcite/util/trace/CalciteTimingTracer.java | 4 +-
.../calcite/jdbc/CalciteRemoteDriverTest.java | 31 +++++++----
.../org/apache/calcite/rex/RexExecutorTest.java | 6 +-
.../calcite/sql/parser/SqlParserTest.java | 10 ++--
.../calcite/sql/test/SqlOperatorBaseTest.java | 12 ++--
.../sql/validate/SqlValidatorUtilTest.java | 10 ++--
.../org/apache/calcite/test/CalciteAssert.java | 13 +++--
.../org/apache/calcite/test/DiffRepository.java | 3 +-
.../org/apache/calcite/test/DiffTestCase.java | 55 ++++++-------------
.../java/org/apache/calcite/test/JdbcTest.java | 15 ++---
.../org/apache/calcite/test/QuidemTest.java | 12 ++--
.../calcite/test/RexImplicationCheckerTest.java | 7 ++-
.../org/apache/calcite/test/RexProgramTest.java | 3 +-
.../apache/calcite/test/SqlFunctionsTest.java | 4 +-
.../org/apache/calcite/test/SqlLimitsTest.java | 6 +-
.../org/apache/calcite/test/SqlLineTest.java | 13 +++--
.../org/apache/calcite/test/SqlTestGen.java | 5 +-
.../apache/calcite/test/SqlValidatorTest.java | 4 +-
.../ConcurrentTestCommandExecutor.java | 6 +-
.../concurrent/ConcurrentTestCommandScript.java | 45 +++++++--------
.../java/org/apache/calcite/util/Smalls.java | 14 +++--
.../java/org/apache/calcite/util/UtilTest.java | 17 +++---
.../adapter/druid/DruidConnectionImpl.java | 11 +++-
.../calcite/adapter/druid/DruidQuery.java | 2 +-
.../calcite/adapter/druid/Granularity.java | 4 +-
.../elasticsearch/ElasticsearchFilter.java | 4 +-
.../calcite/adapter/csv/CsvSchemaFactory.java | 3 +-
.../java/org/apache/calcite/test/CsvTest.java | 3 +-
.../apache/calcite/example/maze/MazeTable.java | 3 +-
.../apache/calcite/adapter/file/FileReader.java | 8 +--
.../calcite/adapter/file/FileRowConverter.java | 28 ++++++----
.../apache/calcite/linq4j/test/Linq4jTest.java | 33 ++++++-----
.../calcite/adapter/tpcds/TpcdsSchema.java | 5 +-
.../apache/calcite/adapter/tpch/TpchSchema.java | 13 +++--
pom.xml | 57 ++++++++++++++++++-
.../calcite/adapter/spark/SparkHandlerImpl.java | 16 +++---
.../calcite/adapter/spark/SparkRules.java | 3 +-
.../splunk/search/SplunkConnectionImpl.java | 32 ++++++-----
src/main/config/forbidden-apis/signatures.txt | 42 ++++++++++++++
83 files changed, 622 insertions(+), 310 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/codegen/templates/Parser.jj
----------------------------------------------------------------------
diff --git a/core/src/main/codegen/templates/Parser.jj b/core/src/main/codegen/templates/Parser.jj
index dcc0558..b070530 100644
--- a/core/src/main/codegen/templates/Parser.jj
+++ b/core/src/main/codegen/templates/Parser.jj
@@ -115,6 +115,7 @@ import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
+import java.util.Locale;
import static org.apache.calcite.util.Static.RESOURCE;
@@ -3036,7 +3037,8 @@ SqlSetOption SqlSetOption(SqlParserPos pos, String scope) :
|
<ON> {
// OFF is handled by SimpleIdentifier, ON handled here.
- val = new SqlIdentifier(token.image.toUpperCase(), getPos());
+ val = new SqlIdentifier(token.image.toUpperCase(Locale.ROOT),
+ getPos());
}
)
{
@@ -3050,7 +3052,8 @@ SqlSetOption SqlSetOption(SqlParserPos pos, String scope) :
name = CompoundIdentifier()
|
<ALL> {
- name = new SqlIdentifier(token.image.toUpperCase(), getPos());
+ name = new SqlIdentifier(token.image.toUpperCase(Locale.ROOT),
+ getPos());
}
)
{
@@ -3092,7 +3095,7 @@ String Scope() :
{
}
{
- ( <SYSTEM> | <SESSION> ) { return token.image.toUpperCase(); }
+ ( <SYSTEM> | <SESSION> ) { return token.image.toUpperCase(Locale.ROOT); }
}
<#if parser.createStatementParserMethods?size != 0>
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcSchema.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcSchema.java
index 5ac3a38..faf0e94 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcSchema.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcSchema.java
@@ -46,6 +46,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.sql.DataSource;
@@ -210,7 +211,7 @@ public class JdbcSchema implements Schema {
final String tableTypeName2 =
tableTypeName == null
? null
- : tableTypeName.toUpperCase().replace(' ', '_');
+ : tableTypeName.toUpperCase(Locale.ROOT).replace(' ', '_');
final TableType tableType =
Util.enumVal(TableType.OTHER, tableTypeName2);
if (tableType == TableType.OTHER && tableTypeName2 != null) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/config/CalciteConnectionProperty.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/config/CalciteConnectionProperty.java b/core/src/main/java/org/apache/calcite/config/CalciteConnectionProperty.java
index 86fbb6a..b576aac 100644
--- a/core/src/main/java/org/apache/calcite/config/CalciteConnectionProperty.java
+++ b/core/src/main/java/org/apache/calcite/config/CalciteConnectionProperty.java
@@ -21,13 +21,15 @@ import org.apache.calcite.avatica.util.Casing;
import org.apache.calcite.avatica.util.Quoting;
import org.apache.calcite.model.JsonSchema;
import org.apache.calcite.sql.validate.SqlConformanceEnum;
+import org.apache.calcite.util.Bug;
import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import static org.apache.calcite.avatica.ConnectionConfigImpl.PropEnv;
-import static org.apache.calcite.avatica.ConnectionConfigImpl.parse;
/**
* Properties that may be specified on the JDBC connect string.
@@ -151,7 +153,7 @@ public enum CalciteConnectionProperty implements ConnectionProperty {
static {
NAME_TO_PROPS = new HashMap<>();
for (CalciteConnectionProperty p : CalciteConnectionProperty.values()) {
- NAME_TO_PROPS.put(p.camelName.toUpperCase(), p);
+ NAME_TO_PROPS.put(p.camelName.toUpperCase(Locale.ROOT), p);
NAME_TO_PROPS.put(p.name(), p);
}
}
@@ -194,7 +196,27 @@ public enum CalciteConnectionProperty implements ConnectionProperty {
}
public PropEnv wrap(Properties properties) {
- return new PropEnv(parse(properties, NAME_TO_PROPS), this);
+ return new PropEnv(parse2(properties, NAME_TO_PROPS), this);
+ }
+
+ /** Fixed version of
+ * {@link org.apache.calcite.avatica.ConnectionConfigImpl#parse}
+ * until we upgrade Avatica. */
+ private static Map<ConnectionProperty, String> parse2(Properties properties,
+ Map<String, ? extends ConnectionProperty> nameToProps) {
+ Bug.upgrade("avatica-1.10");
+ final Map<ConnectionProperty, String> map = new LinkedHashMap<>();
+ for (String name : properties.stringPropertyNames()) {
+ final ConnectionProperty connectionProperty =
+ nameToProps.get(name.toUpperCase(Locale.ROOT));
+ if (connectionProperty == null) {
+ // For now, don't throw. It messes up sub-projects.
+ //throw new RuntimeException("Unknown property '" + name + "'");
+ continue;
+ }
+ map.put(connectionProperty, properties.getProperty(name));
+ }
+ return map;
}
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java b/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java
index 0e154eb..51aa082 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java
@@ -49,6 +49,7 @@ import com.google.common.collect.Maps;
import java.math.BigDecimal;
import java.util.ArrayDeque;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.NoSuchElementException;
@@ -211,7 +212,7 @@ public class Interpreter extends AbstractEnumerable<Object[]>
if (s0 == null) {
return null;
}
- return s0.toUpperCase();
+ return s0.toUpperCase(Locale.ROOT);
}
if (call.getOperator() == SqlStdOperatorTable.SUBSTRING) {
argScalar.execute(context, args);
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/jdbc/CalciteSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteSchema.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteSchema.java
index cb61627..4b1bc02 100644
--- a/core/src/main/java/org/apache/calcite/jdbc/CalciteSchema.java
+++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteSchema.java
@@ -40,6 +40,7 @@ import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.NavigableMap;
import java.util.NavigableSet;
@@ -347,14 +348,16 @@ public abstract class CalciteSchema {
protected static <V> NavigableMap<String, V> find(NavigableMap<String, V> map,
String s) {
assert map.comparator() == NameSet.COMPARATOR;
- return map.subMap(s.toUpperCase(), true, s.toLowerCase(), true);
+ return map.subMap(s.toUpperCase(Locale.ROOT), true,
+ s.toLowerCase(Locale.ROOT), true);
}
/** Returns a subset of a set whose values match the given string
* case-insensitively. */
protected static Iterable<String> find(NavigableSet<String> set, String name) {
assert set.comparator() == NameSet.COMPARATOR;
- return set.subSet(name.toUpperCase(), true, name.toLowerCase(), true);
+ return set.subSet(name.toUpperCase(Locale.ROOT), true,
+ name.toLowerCase(Locale.ROOT), true);
}
/** Creates a root schema.
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/materialize/TileSuggester.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/materialize/TileSuggester.java b/core/src/main/java/org/apache/calcite/materialize/TileSuggester.java
index 29b54b9..e94781d 100644
--- a/core/src/main/java/org/apache/calcite/materialize/TileSuggester.java
+++ b/core/src/main/java/org/apache/calcite/materialize/TileSuggester.java
@@ -16,6 +16,8 @@
*/
package org.apache.calcite.materialize;
+import org.apache.calcite.util.Util;
+
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -59,7 +61,7 @@ public class TileSuggester {
public Iterable<? extends Lattice.Tile> tiles() {
final Algorithm algorithm = new MonteCarloAlgorithm();
- final PrintWriter pw = new PrintWriter(System.out);
+ final PrintWriter pw = Util.printWriter(System.out);
final Progress progress = new ArgumentUtils.TextProgress(pw);
final StatisticsProvider statisticsProvider =
new StatisticsProviderImpl(lattice);
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/rel/core/Correlate.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Correlate.java b/core/src/main/java/org/apache/calcite/rel/core/Correlate.java
index 1af9f80..6f218b1 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Correlate.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Correlate.java
@@ -156,7 +156,7 @@ public abstract class Correlate extends BiRel {
@Override public RelWriter explainTerms(RelWriter pw) {
return super.explainTerms(pw)
.item("correlation", correlationId)
- .item("joinType", joinType.name().toLowerCase())
+ .item("joinType", joinType.lowerName)
.item("requiredColumns", requiredColumns.toString());
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/rel/core/Join.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Join.java b/core/src/main/java/org/apache/calcite/rel/core/Join.java
index 2952fd1..a9e0441 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Join.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Join.java
@@ -204,7 +204,7 @@ public abstract class Join extends BiRel {
@Override public RelWriter explainTerms(RelWriter pw) {
return super.explainTerms(pw)
.item("condition", condition)
- .item("joinType", joinType.name().toLowerCase())
+ .item("joinType", joinType.lowerName)
.itemIf(
"systemFields",
getSystemFieldList(),
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/rel/core/JoinRelType.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/JoinRelType.java b/core/src/main/java/org/apache/calcite/rel/core/JoinRelType.java
index 677021e..5d75742 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/JoinRelType.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/JoinRelType.java
@@ -16,12 +16,17 @@
*/
package org.apache.calcite.rel.core;
+import java.util.Locale;
+
/**
* Enumeration of join types.
*/
public enum JoinRelType {
INNER, LEFT, RIGHT, FULL;
+ /** Lower-case name. */
+ public final String lowerName = name().toLowerCase(Locale.ROOT);
+
/**
* Returns whether a join of this type may generate NULL values on the
* right-hand side.
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java b/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java
index 57a7f76..a3d6dd4 100644
--- a/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java
+++ b/core/src/main/java/org/apache/calcite/rel/externalize/RelJsonReader.java
@@ -46,6 +46,7 @@ import java.util.AbstractList;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
/**
@@ -188,7 +189,8 @@ public class RelJsonReader {
}
public <E extends Enum<E>> E getEnum(String tag, Class<E> enumClass) {
- return Util.enumVal(enumClass, getString(tag).toUpperCase());
+ return Util.enumVal(enumClass,
+ getString(tag).toUpperCase(Locale.ROOT));
}
public List<RexNode> getExpressionList(String tag) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
----------------------------------------------------------------------
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 c2fe284..96cfac7 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
@@ -65,6 +65,7 @@ import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
/**
@@ -358,9 +359,10 @@ public class RelToSqlConverter extends SqlImplementor
RelDataType rowType) {
String name = rowType.getFieldNames().get(selectList.size());
String alias = SqlValidatorUtil.getAlias(node, -1);
- if (name.toLowerCase().startsWith("expr$")) {
- //Put it in ordinalMap
- ordinalMap.put(name.toLowerCase(), node);
+ final String lowerName = name.toLowerCase(Locale.ROOT);
+ if (lowerName.startsWith("expr$")) {
+ // Put it in ordinalMap
+ ordinalMap.put(lowerName, node);
} else if (alias == null || !alias.equals(name)) {
node = SqlStdOperatorTable.AS.createCall(
POS, node, new SqlIdentifier(name, POS));
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
----------------------------------------------------------------------
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 206716b..3c92f29 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
@@ -84,6 +84,7 @@ 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;
@@ -831,7 +832,7 @@ public abstract class SqlImplementor {
if (ordinal < fields.size()) {
RelDataTypeField field = fields.get(ordinal);
final SqlNode mappedSqlNode =
- ordinalMap.get(field.getName().toLowerCase());
+ ordinalMap.get(field.getName().toLowerCase(Locale.ROOT));
if (mappedSqlNode != null) {
return mappedSqlNode;
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java b/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java
index a052140..3102f42 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/DateRangeRules.java
@@ -16,7 +16,6 @@
*/
package org.apache.calcite.rel.rules;
-import org.apache.calcite.avatica.util.DateTimeUtils;
import org.apache.calcite.avatica.util.TimeUnitRange;
import org.apache.calcite.plan.RelOptRule;
import org.apache.calcite.plan.RelOptRuleCall;
@@ -36,6 +35,7 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.tools.RelBuilder;
import org.apache.calcite.tools.RelBuilderFactory;
import org.apache.calcite.util.Bug;
+import org.apache.calcite.util.Util;
import com.google.common.base.Predicate;
import com.google.common.collect.BoundType;
@@ -290,7 +290,7 @@ public abstract class DateRangeRules {
final Calendar c;
switch (timeUnit) {
case YEAR:
- c = Calendar.getInstance(DateTimeUtils.GMT_ZONE);
+ c = Util.calendar();
c.clear();
c.set(v, Calendar.JANUARY, 1);
s2.add(baz(timeUnit, comparison, c));
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java
index b63e3a4..790aed7 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java
@@ -69,8 +69,9 @@ public class MultiJoinOptimizeBushyRule extends RelOptRule {
public static final MultiJoinOptimizeBushyRule INSTANCE =
new MultiJoinOptimizeBushyRule(RelFactories.LOGICAL_BUILDER);
- private final PrintWriter pw =
- CalcitePrepareImpl.DEBUG ? new PrintWriter(System.out, true) : null;
+ private final PrintWriter pw = CalcitePrepareImpl.DEBUG
+ ? Util.printWriter(System.out)
+ : null;
/** Creates an MultiJoinOptimizeBushyRule. */
public MultiJoinOptimizeBushyRule(RelBuilderFactory relBuilderFactory) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
index 3e34ec9..2a4667c 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
@@ -1402,14 +1402,14 @@ public class RexBuilder {
if (o instanceof Calendar) {
return o;
}
- calendar = Calendar.getInstance(DateTimeUtils.GMT_ZONE);
+ calendar = Util.calendar();
calendar.setTimeInMillis((Integer) o);
return calendar;
case DATE:
if (o instanceof Calendar) {
return o;
}
- calendar = Calendar.getInstance(DateTimeUtils.GMT_ZONE);
+ calendar = Util.calendar();
calendar.setTimeInMillis(0);
calendar.add(Calendar.DAY_OF_YEAR, (Integer) o);
return calendar;
@@ -1417,7 +1417,7 @@ public class RexBuilder {
if (o instanceof Calendar) {
return o;
}
- calendar = Calendar.getInstance(DateTimeUtils.GMT_ZONE);
+ calendar = Util.calendar();
calendar.setTimeInMillis((Long) o);
return calendar;
default:
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java b/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java
index 50deeef..bc790d6 100644
--- a/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java
+++ b/core/src/main/java/org/apache/calcite/runtime/HttpUtils.java
@@ -25,6 +25,7 @@ import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
import java.util.Map;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
@@ -67,8 +68,8 @@ public class HttpUtils {
if (i++ != 0) {
out.append("&");
}
- out.append(URLEncoder.encode(me.getKey(), "UTF-8"));
- out.append("=")
+ out.append(URLEncoder.encode(me.getKey(), "UTF-8"))
+ .append("=")
.append(URLEncoder.encode(me.getValue(), "UTF-8"));
}
} catch (UnsupportedEncodingException ignore) {
@@ -136,7 +137,8 @@ public class HttpUtils {
return conn.getInputStream();
}
conn.setDoOutput(true);
- try (Writer w = new OutputStreamWriter(conn.getOutputStream())) {
+ try (Writer w = new OutputStreamWriter(conn.getOutputStream(),
+ StandardCharsets.UTF_8)) {
w.write(data.toString());
w.flush(); // Get the response
return conn.getInputStream();
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
index 634067c..baa2c6f 100644
--- a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
+++ b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
@@ -32,6 +32,7 @@ import org.apache.calcite.linq4j.function.NonDeterministic;
import org.apache.calcite.linq4j.tree.Primitive;
import org.apache.calcite.runtime.FlatLists.ComparableList;
import org.apache.calcite.util.Bug;
+import org.apache.calcite.util.NumberUtil;
import java.math.BigDecimal;
import java.math.BigInteger;
@@ -45,6 +46,7 @@ import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TimeZone;
@@ -66,7 +68,7 @@ import java.util.regex.Pattern;
@Deterministic
public class SqlFunctions {
private static final DecimalFormat DOUBLE_FORMAT =
- new DecimalFormat("0.0E0");
+ NumberUtil.decimalFormat("0.0E0");
private static final TimeZone LOCAL_TZ = TimeZone.getDefault();
@@ -138,12 +140,12 @@ public class SqlFunctions {
/** SQL UPPER(string) function. */
public static String upper(String s) {
- return s.toUpperCase();
+ return s.toUpperCase(Locale.ROOT);
}
/** SQL LOWER(string) function. */
public static String lower(String s) {
- return s.toLowerCase();
+ return s.toLowerCase(Locale.ROOT);
}
/** SQL INITCAP(string) function. */
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/JoinType.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/JoinType.java b/core/src/main/java/org/apache/calcite/sql/JoinType.java
index 0e4cc05..4759324 100644
--- a/core/src/main/java/org/apache/calcite/sql/JoinType.java
+++ b/core/src/main/java/org/apache/calcite/sql/JoinType.java
@@ -18,6 +18,8 @@ package org.apache.calcite.sql;
import org.apache.calcite.sql.parser.SqlParserPos;
+import java.util.Locale;
+
/**
* Enumerates the types of join.
*/
@@ -54,6 +56,9 @@ public enum JoinType {
*/
COMMA;
+ /** Lower-case name. */
+ public final String lowerName = name().toLowerCase(Locale.ROOT);
+
/**
* Creates a parse-tree node representing an occurrence of this
* condition type keyword at a particular position in the parsed
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/SemiJoinType.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SemiJoinType.java b/core/src/main/java/org/apache/calcite/sql/SemiJoinType.java
index 38cabba..473e812 100644
--- a/core/src/main/java/org/apache/calcite/sql/SemiJoinType.java
+++ b/core/src/main/java/org/apache/calcite/sql/SemiJoinType.java
@@ -20,6 +20,8 @@ import org.apache.calcite.linq4j.CorrelateJoinType;
import org.apache.calcite.rel.core.JoinRelType;
import org.apache.calcite.sql.parser.SqlParserPos;
+import java.util.Locale;
+
/**
* Enumeration representing different join types used in correlation
* relations.
@@ -48,6 +50,9 @@ public enum SemiJoinType {
*/
ANTI;
+ /** Lower-case name. */
+ public final String lowerName = name().toLowerCase(Locale.ROOT);
+
/**
* Creates a parse-tree node representing an occurrence of this
* condition type keyword at a particular position in the parsed
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/SqlAccessType.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlAccessType.java b/core/src/main/java/org/apache/calcite/sql/SqlAccessType.java
index 5da1b56..5efab84 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlAccessType.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlAccessType.java
@@ -17,6 +17,7 @@
package org.apache.calcite.sql;
import java.util.EnumSet;
+import java.util.Locale;
/**
* SqlAccessType is represented by a set of allowed access types
@@ -54,10 +55,9 @@ public class SqlAccessType {
public static SqlAccessType create(String[] accessNames) {
assert accessNames != null;
EnumSet<SqlAccessEnum> enumSet = EnumSet.noneOf(SqlAccessEnum.class);
- for (int i = 0; i < accessNames.length; i++) {
+ for (String accessName : accessNames) {
enumSet.add(
- SqlAccessEnum.valueOf(
- accessNames[i].trim().toUpperCase()));
+ SqlAccessEnum.valueOf(accessName.trim().toUpperCase(Locale.ROOT)));
}
return new SqlAccessType(enumSet);
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/SqlCollation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlCollation.java b/core/src/main/java/org/apache/calcite/sql/SqlCollation.java
index 66fd7ac..a3ac712 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlCollation.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlCollation.java
@@ -88,7 +88,8 @@ public class SqlCollation implements Serializable {
this.wrappedCharset = SerializableCharset.forCharset(charset);
locale = parseValues.getLocale();
strength = parseValues.getStrength();
- String c = charset.name().toUpperCase() + "$" + locale.toString();
+ String c =
+ charset.name().toUpperCase(Locale.ROOT) + "$" + locale.toString();
if ((strength != null) && (strength.length() > 0)) {
c += "$" + strength;
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
index d3ea0f7..3f9e6b0 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
@@ -27,6 +27,7 @@ import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.List;
+import java.util.Locale;
import java.util.regex.Pattern;
/**
@@ -183,7 +184,8 @@ public class SqlDialect {
public static DatabaseProduct getProduct(
String productName,
String productVersion) {
- final String upperProductName = productName.toUpperCase().trim();
+ final String upperProductName =
+ productName.toUpperCase(Locale.ROOT).trim();
switch (upperProductName) {
case "ACCESS":
return DatabaseProduct.ACCESS;
@@ -470,7 +472,8 @@ public class SqlDialect {
public String quoteTimestampLiteral(Timestamp timestamp) {
final SimpleDateFormat format =
new SimpleDateFormat(
- "'TIMESTAMP' ''yyyy-MM-DD HH:mm:SS''");
+ "'TIMESTAMP' ''yyyy-MM-DD HH:mm:SS''",
+ Locale.ROOT);
format.setTimeZone(DateTimeUtils.GMT_ZONE);
return format.format(timestamp);
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/SqlKind.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlKind.java b/core/src/main/java/org/apache/calcite/sql/SqlKind.java
index e3cff7c..8dbb55ef 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlKind.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlKind.java
@@ -18,6 +18,7 @@ package org.apache.calcite.sql;
import java.util.Collection;
import java.util.EnumSet;
+import java.util.Locale;
import java.util.Set;
/**
@@ -1006,6 +1007,9 @@ public enum SqlKind {
LESS_THAN, GREATER_THAN,
GREATER_THAN_OR_EQUAL, LESS_THAN_OR_EQUAL);
+ /** Lower-case name. */
+ public final String lowerName = name().toLowerCase(Locale.ROOT);
+
/** Returns the kind that corresponds to this operator but in the opposite
* direction. Or returns this, if this kind is not reversible.
*
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
----------------------------------------------------------------------
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 71e79c7..98e7f0e 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java
@@ -54,6 +54,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import static org.apache.calcite.util.Static.RESOURCE;
@@ -743,8 +744,8 @@ public abstract class SqlUtil {
if (i > 0) {
ret.append(", ");
}
- ret.append("<").append(
- typeList.get(i).toString().toUpperCase()).append(">");
+ final String t = typeList.get(i).toString().toUpperCase(Locale.ROOT);
+ ret.append("<").append(t).append(">");
}
ret.append(")'");
} else {
@@ -752,9 +753,10 @@ public abstract class SqlUtil {
values[0] = opName;
ret.append("'");
for (int i = 0; i < typeList.size(); i++) {
- values[i + 1] = "<" + typeList.get(i).toString().toUpperCase() + ">";
+ final String t = typeList.get(i).toString().toUpperCase(Locale.ROOT);
+ values[i + 1] = "<" + t + ">";
}
- ret.append(MessageFormat.format(template, values));
+ ret.append(new MessageFormat(template, Locale.ROOT).format(values));
ret.append("'");
assert (typeList.size() + 1) == values.length;
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
index 1b2481e..0216cc3 100644
--- a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
+++ b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
@@ -44,6 +44,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Locale;
/**
* An assistant which offers hints and corrections to a partially-formed SQL
@@ -54,7 +55,8 @@ public class SqlAdvisor {
public static final Logger LOGGER = CalciteTrace.PARSER_LOGGER;
private static final String HINT_TOKEN = "_suggest_";
- private static final String UPPER_HINT_TOKEN = HINT_TOKEN.toUpperCase();
+ private static final String UPPER_HINT_TOKEN =
+ HINT_TOKEN.toUpperCase(Locale.ROOT);
//~ Instance fields --------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/advise/SqlSimpleParser.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/advise/SqlSimpleParser.java b/core/src/main/java/org/apache/calcite/sql/advise/SqlSimpleParser.java
index 85dfa10..f9a0d31 100644
--- a/core/src/main/java/org/apache/calcite/sql/advise/SqlSimpleParser.java
+++ b/core/src/main/java/org/apache/calcite/sql/advise/SqlSimpleParser.java
@@ -21,6 +21,7 @@ import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
+import java.util.Locale;
import java.util.Map;
/**
@@ -379,7 +380,7 @@ public class SqlSimpleParser {
}
}
String name = sql.substring(start, pos);
- TokenType tokenType = map.get(name.toUpperCase());
+ TokenType tokenType = map.get(name.toUpperCase(Locale.ROOT));
if (tokenType == null) {
return new IdToken(TokenType.ID, name);
} else {
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
index 228b5f7..d4b7237 100644
--- a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
+++ b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
@@ -135,7 +135,7 @@ public final class SqlParserUtil {
* @param pattern {@link SimpleDateFormat} pattern
*/
public static void checkDateFormat(String pattern) {
- SimpleDateFormat df = new SimpleDateFormat(pattern);
+ SimpleDateFormat df = new SimpleDateFormat(pattern, Locale.ROOT);
Util.discard(df);
}
@@ -279,9 +279,9 @@ public final class SqlParserUtil {
}
switch (casing) {
case TO_UPPER:
- return s.toUpperCase();
+ return s.toUpperCase(Locale.ROOT);
case TO_LOWER:
- return s.toLowerCase();
+ return s.toLowerCase(Locale.ROOT);
default:
return s;
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java b/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java
index c2b206a..ec78b04 100644
--- a/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java
+++ b/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java
@@ -22,6 +22,7 @@ import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlWriter;
import org.apache.calcite.sql.util.SqlBuilder;
import org.apache.calcite.sql.util.SqlString;
+import org.apache.calcite.util.Unsafe;
import org.apache.calcite.util.Util;
import org.apache.calcite.util.trace.CalciteLogger;
@@ -37,6 +38,7 @@ import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
@@ -275,7 +277,7 @@ public class SqlPrettyWriter implements SqlWriter {
public void reset() {
pw.flush();
- sw.getBuffer().setLength(0);
+ Unsafe.clear(sw);
setNeedWhitespace(false);
nextWhitespace = " ";
}
@@ -821,7 +823,9 @@ public class SqlPrettyWriter implements SqlWriter {
public void keyword(String s) {
maybeWhitespace(s);
pw.print(
- isKeywordsLowerCase() ? s.toLowerCase() : s.toUpperCase());
+ isKeywordsLowerCase()
+ ? s.toLowerCase(Locale.ROOT)
+ : s.toUpperCase(Locale.ROOT));
charCount += s.length();
if (!s.equals("")) {
setNeedWhitespace(needWhitespaceAfter(s));
@@ -1148,7 +1152,7 @@ public class SqlPrettyWriter implements SqlWriter {
}
private String stripPrefix(String name, int offset) {
- return name.substring(offset, offset + 1).toLowerCase()
+ return name.substring(offset, offset + 1).toLowerCase(Locale.ROOT)
+ name.substring(offset + 1);
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java
index f55f9b9..f34ea11 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java
@@ -16,7 +16,6 @@
*/
package org.apache.calcite.sql.type;
-import org.apache.calcite.avatica.util.DateTimeUtils;
import org.apache.calcite.avatica.util.TimeUnit;
import org.apache.calcite.sql.SqlLiteral;
import org.apache.calcite.sql.parser.SqlParserPos;
@@ -591,7 +590,7 @@ public enum SqlTypeName {
return bytes;
case DATE:
- calendar = Calendar.getInstance(DateTimeUtils.GMT_ZONE);
+ calendar = Util.calendar();
switch (limit) {
case ZERO:
@@ -639,7 +638,7 @@ public enum SqlTypeName {
if (beyond) {
return null; // invalid values are impossible to represent
}
- calendar = Calendar.getInstance(DateTimeUtils.GMT_ZONE);
+ calendar = Util.calendar();
switch (limit) {
case ZERO:
@@ -664,7 +663,7 @@ public enum SqlTypeName {
return calendar;
case TIMESTAMP:
- calendar = Calendar.getInstance(DateTimeUtils.GMT_ZONE);
+ calendar = Util.calendar();
switch (limit) {
case ZERO:
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/util/ReflectiveSqlOperatorTable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/util/ReflectiveSqlOperatorTable.java b/core/src/main/java/org/apache/calcite/sql/util/ReflectiveSqlOperatorTable.java
index a9d2ae1..0812b24 100644
--- a/core/src/main/java/org/apache/calcite/sql/util/ReflectiveSqlOperatorTable.java
+++ b/core/src/main/java/org/apache/calcite/sql/util/ReflectiveSqlOperatorTable.java
@@ -32,6 +32,7 @@ import com.google.common.collect.Multimap;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
+import java.util.Locale;
/**
* ReflectiveSqlOperatorTable implements the {@link SqlOperatorTable} interface
@@ -145,7 +146,7 @@ public abstract class ReflectiveSqlOperatorTable implements SqlOperatorTable {
* store case-insensitively, even in a case-sensitive session. */
private static class Key extends Pair<String, SqlSyntax> {
Key(String name, SqlSyntax syntax) {
- super(name.toUpperCase(), normalize(syntax));
+ super(name.toUpperCase(Locale.ROOT), normalize(syntax));
}
private static SqlSyntax normalize(SqlSyntax syntax) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
index d270f57..eb2ea3b 100644
--- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
+++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
@@ -111,6 +111,7 @@ import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
@@ -3073,7 +3074,7 @@ public class SqlValidatorImpl implements SqlValidatorWithHints {
names = Lists.transform(names,
new Function<String, String>() {
public String apply(String s) {
- return s.toUpperCase();
+ return s.toUpperCase(Locale.ROOT);
}
});
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
----------------------------------------------------------------------
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 a0846c8..ddc0c43 100644
--- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
+++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
@@ -87,6 +87,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;
import java.util.Objects;
import java.util.Set;
import java.util.SortedSet;
@@ -431,7 +432,7 @@ public class RelBuilder {
return field(inputCount, inputCount - 1 - inputOrdinal, p.i);
}
fields.add(
- String.format("{aliases=%s,fieldName=%s}", p.e.left,
+ String.format(Locale.ROOT, "{aliases=%s,fieldName=%s}", p.e.left,
p.e.right.getName()));
}
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/ConversionUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/ConversionUtil.java b/core/src/main/java/org/apache/calcite/util/ConversionUtil.java
index 193cc7c..29a2614 100644
--- a/core/src/main/java/org/apache/calcite/util/ConversionUtil.java
+++ b/core/src/main/java/org/apache/calcite/util/ConversionUtil.java
@@ -18,6 +18,7 @@ package org.apache.calcite.util;
import java.nio.ByteOrder;
import java.text.NumberFormat;
+import java.util.Locale;
import static org.apache.calcite.util.Static.RESOURCE;
@@ -68,14 +69,12 @@ public class ConversionUtil {
}
int trick = radix * radix;
- StringBuffer ret = new StringBuffer();
- for (int i = 0; i < value.length; i++) {
- ret.append(
- Integer.toString(trick | (0x0ff & value[i]), radix).substring(
- 1));
+ StringBuilder ret = new StringBuilder();
+ for (byte b : value) {
+ ret.append(Integer.toString(trick | (0x0ff & b), radix).substring(1));
}
- return ret.toString().toUpperCase();
+ return ret.toString().toUpperCase(Locale.ROOT);
}
/**
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/NameMap.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/NameMap.java b/core/src/main/java/org/apache/calcite/util/NameMap.java
index a0c69bc..19a5507 100644
--- a/core/src/main/java/org/apache/calcite/util/NameMap.java
+++ b/core/src/main/java/org/apache/calcite/util/NameMap.java
@@ -18,6 +18,7 @@ package org.apache.calcite.util;
import com.google.common.collect.ImmutableSortedMap;
+import java.util.Locale;
import java.util.Map;
import java.util.NavigableMap;
import java.util.TreeMap;
@@ -62,7 +63,8 @@ public class NameMap<V> {
return ImmutableSortedMap.of();
}
} else {
- return map.subMap(name.toUpperCase(), true, name.toLowerCase(), true);
+ return map.subMap(name.toUpperCase(Locale.ROOT), true,
+ name.toLowerCase(Locale.ROOT), true);
}
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/NameMultimap.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/NameMultimap.java b/core/src/main/java/org/apache/calcite/util/NameMultimap.java
index 1b3734a..4d42a29 100644
--- a/core/src/main/java/org/apache/calcite/util/NameMultimap.java
+++ b/core/src/main/java/org/apache/calcite/util/NameMultimap.java
@@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.NavigableMap;
import java.util.TreeMap;
@@ -75,7 +76,8 @@ public class NameMultimap<V> {
final ImmutableList.Builder<Map.Entry<String, V>> builder =
ImmutableList.builder();
NavigableMap<String, List<V>> m =
- map.subMap(name.toUpperCase(), true, name.toLowerCase(), true);
+ map.subMap(name.toUpperCase(Locale.ROOT), true,
+ name.toLowerCase(Locale.ROOT), true);
for (Map.Entry<String, List<V>> entry : m.entrySet()) {
for (V v : entry.getValue()) {
builder.add(Pair.of(entry.getKey(), v));
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/NameSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/NameSet.java b/core/src/main/java/org/apache/calcite/util/NameSet.java
index ccdd5d5..a51f949 100644
--- a/core/src/main/java/org/apache/calcite/util/NameSet.java
+++ b/core/src/main/java/org/apache/calcite/util/NameSet.java
@@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableSortedSet;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
+import java.util.Locale;
import java.util.NavigableSet;
import java.util.Set;
import java.util.TreeSet;
@@ -77,7 +78,8 @@ public class NameSet {
return ImmutableList.of();
}
} else {
- return names.subSet(name.toUpperCase(), true, name.toLowerCase(), true);
+ return names.subSet(name.toUpperCase(Locale.ROOT), true,
+ name.toLowerCase(Locale.ROOT), true);
}
}
@@ -88,7 +90,7 @@ public class NameSet {
return true;
}
if (!caseSensitive) {
- final String s = names.ceiling(name.toLowerCase());
+ final String s = names.ceiling(name.toLowerCase(Locale.ROOT));
return s != null
&& s.equalsIgnoreCase(name);
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/NlsString.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/NlsString.java b/core/src/main/java/org/apache/calcite/util/NlsString.java
index aa68eec..eee7884 100644
--- a/core/src/main/java/org/apache/calcite/util/NlsString.java
+++ b/core/src/main/java/org/apache/calcite/util/NlsString.java
@@ -27,6 +27,7 @@ import java.nio.charset.CharsetEncoder;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException;
import java.util.List;
+import java.util.Locale;
import java.util.Objects;
import static org.apache.calcite.util.Static.RESOURCE;
@@ -63,7 +64,7 @@ public class NlsString implements Comparable<NlsString> {
SqlCollation collation) {
assert value != null;
if (null != charsetName) {
- charsetName = charsetName.toUpperCase();
+ charsetName = charsetName.toUpperCase(Locale.ROOT);
this.charsetName = charsetName;
String javaCharsetName =
SqlUtil.translateCharacterSetName(charsetName);
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/NumberUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/NumberUtil.java b/core/src/main/java/org/apache/calcite/util/NumberUtil.java
index a33b416..d0e2d84 100644
--- a/core/src/main/java/org/apache/calcite/util/NumberUtil.java
+++ b/core/src/main/java/org/apache/calcite/util/NumberUtil.java
@@ -20,10 +20,12 @@ import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
+import java.util.Locale;
/**
- * Utility functions for working with numbers This class is JDK 1.4 compatible.
+ * Utility functions for working with numbers.
*/
public class NumberUtil {
private NumberUtil() {}
@@ -39,12 +41,10 @@ public class NumberUtil {
static {
// TODO: DecimalFormat uses ROUND_HALF_EVEN, not ROUND_HALF_UP
// Float: precision of 7 (6 digits after .)
- FLOAT_FORMATTER = new DecimalFormat();
- FLOAT_FORMATTER.applyPattern("0.######E0");
+ FLOAT_FORMATTER = decimalFormat("0.######E0");
// Double: precision of 16 (15 digits after .)
- DOUBLE_FORMATTER = new DecimalFormat();
- DOUBLE_FORMATTER.applyPattern("0.###############E0");
+ DOUBLE_FORMATTER = decimalFormat("0.###############E0");
BIG_INT_TEN_POW = new BigInteger[20];
BIG_INT_MIN_UNSCALED = new BigInteger[20];
@@ -64,6 +64,12 @@ public class NumberUtil {
//~ Methods ----------------------------------------------------------------
+ /** Creates a format. Locale-independent. */
+ public static DecimalFormat decimalFormat(String pattern) {
+ return new DecimalFormat(pattern,
+ DecimalFormatSymbols.getInstance(Locale.ROOT));
+ }
+
public static BigInteger powTen(int exponent) {
if ((exponent >= 0) && (exponent < BIG_INT_TEN_POW.length)) {
return BIG_INT_TEN_POW[exponent];
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/Sources.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/Sources.java b/core/src/main/java/org/apache/calcite/util/Sources.java
index 946102f..01a864a 100644
--- a/core/src/main/java/org/apache/calcite/util/Sources.java
+++ b/core/src/main/java/org/apache/calcite/util/Sources.java
@@ -20,13 +20,13 @@ import com.google.common.base.Preconditions;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
+import java.nio.charset.StandardCharsets;
import java.util.zip.GZIPInputStream;
/**
@@ -57,11 +57,6 @@ public abstract class Sources {
}
}
- private static String trim(String s, String suffix) {
- String trimmed = trimOrNull(s, suffix);
- return trimmed != null ? trimmed : s;
- }
-
/** Looks for a suffix on a path and returns
* either the path with the suffix removed
* or null. */
@@ -126,12 +121,9 @@ public abstract class Sources {
final InputStream fis = openStream();
is = new GZIPInputStream(fis);
} else {
- if (file != null) {
- return new FileReader(file);
- }
is = openStream();
}
- return new InputStreamReader(is);
+ return new InputStreamReader(is, StandardCharsets.UTF_8);
}
public InputStream openStream() throws IOException {
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/Template.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/Template.java b/core/src/main/java/org/apache/calcite/util/Template.java
index 1936f8e..88d268a 100644
--- a/core/src/main/java/org/apache/calcite/util/Template.java
+++ b/core/src/main/java/org/apache/calcite/util/Template.java
@@ -86,7 +86,7 @@ public class Template extends MessageFormat {
* @throws IllegalArgumentException if the pattern is invalid
*/
public static Template of(String pattern, Locale locale) {
- final List<String> parameterNames = new ArrayList<String>();
+ final List<String> parameterNames = new ArrayList<>();
final String processedPattern = process(pattern, parameterNames);
return new Template(processedPattern, parameterNames, locale);
}
@@ -110,9 +110,9 @@ public class Template extends MessageFormat {
* @return Pattern with named parameters substituted with ordinals
*/
private static String process(String pattern, List<String> parameterNames) {
- StringBuffer[] segments = new StringBuffer[4];
+ StringBuilder[] segments = new StringBuilder[4];
for (int i = 0; i < segments.length; ++i) {
- segments[i] = new StringBuffer();
+ segments[i] = new StringBuilder();
}
int part = 0;
boolean inQuote = false;
@@ -184,7 +184,7 @@ public class Template extends MessageFormat {
* @param parameterNames List of parameter names seen so far
*/
private static void makeFormat(
- StringBuffer[] segments,
+ StringBuilder[] segments,
List<String> parameterNames) {
final String parameterName = segments[1].toString();
final int parameterOrdinal = parameterNames.size();
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/Unsafe.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/Unsafe.java b/core/src/main/java/org/apache/calcite/util/Unsafe.java
new file mode 100644
index 0000000..61805ab
--- /dev/null
+++ b/core/src/main/java/org/apache/calcite/util/Unsafe.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.calcite.util;
+
+import java.io.StringWriter;
+
+/**
+ * Contains methods that call JDK methods that the
+ * <a href="https://github.com/policeman-tools/forbidden-apis">forbidden
+ * APIs checker</a> does not approve of.
+ *
+ * <p>This class is excluded from the check, so methods called via this class
+ * will not fail the build.
+ */
+public class Unsafe {
+ private Unsafe() {}
+
+ /** Calls {@link System#exit}. */
+ public static void systemExit(int status) {
+ System.exit(status);
+ }
+
+ /** Calls {@link Object#notifyAll()}. */
+ public static void notifyAll(Object o) {
+ o.notifyAll();
+ }
+
+ /** Calls {@link Object#wait()}. */
+ public static void wait(Object o) throws InterruptedException {
+ o.wait();
+ }
+
+ /** Clears the contents of a {@link StringWriter}. */
+ public static void clear(StringWriter sw) {
+ // Included in this class because StringBuffer is banned.
+ sw.getBuffer().setLength(0);
+ }
+}
+
+// End Unsafe.java
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/Util.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/Util.java b/core/src/main/java/org/apache/calcite/util/Util.java
index 8d85ad9..24d9ab5 100644
--- a/core/src/main/java/org/apache/calcite/util/Util.java
+++ b/core/src/main/java/org/apache/calcite/util/Util.java
@@ -16,6 +16,7 @@
*/
package org.apache.calcite.util;
+import org.apache.calcite.avatica.util.DateTimeUtils;
import org.apache.calcite.avatica.util.Spaces;
import org.apache.calcite.linq4j.Ord;
import org.apache.calcite.runtime.CalciteException;
@@ -43,10 +44,16 @@ import org.slf4j.Logger;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
+import java.io.BufferedWriter;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.OutputStream;
+import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.Reader;
@@ -60,6 +67,7 @@ import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
@@ -70,6 +78,7 @@ import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Calendar;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
@@ -619,7 +628,8 @@ public class Util {
*/
@Deprecated // to be removed before 2.0
public static String getFileTimestamp() {
- SimpleDateFormat sdf = new SimpleDateFormat(FILE_TIMESTAMP_FORMAT);
+ SimpleDateFormat sdf =
+ new SimpleDateFormat(FILE_TIMESTAMP_FORMAT, Locale.ROOT);
return sdf.format(new java.util.Date());
}
@@ -1304,13 +1314,13 @@ public class Util {
*/
public static String toPosix(TimeZone tz, boolean verbose) {
StringBuilder buf = new StringBuilder();
- buf.append(tz.getDisplayName(false, TimeZone.SHORT));
+ buf.append(tz.getDisplayName(false, TimeZone.SHORT, Locale.ROOT));
appendPosixTime(buf, tz.getRawOffset());
final int dstSavings = tz.getDSTSavings();
if (dstSavings == 0) {
return buf.toString();
}
- buf.append(tz.getDisplayName(true, TimeZone.SHORT));
+ buf.append(tz.getDisplayName(true, TimeZone.SHORT, Locale.ROOT));
if (verbose || (dstSavings != 3600000)) {
// POSIX allows us to omit DST offset if it is 1:00:00
appendPosixTime(buf, dstSavings);
@@ -2368,6 +2378,48 @@ public class Util {
return builder.build();
}
+ /** Creates a {@link PrintWriter} to a given output stream using UTF-8
+ * character set.
+ *
+ * <p>Does not use the default character set. */
+ public static PrintWriter printWriter(OutputStream out) {
+ return new PrintWriter(
+ new BufferedWriter(
+ new OutputStreamWriter(out, StandardCharsets.UTF_8)));
+ }
+
+ /** Creates a {@link PrintWriter} to a given file using UTF-8
+ * character set.
+ *
+ * <p>Does not use the default character set. */
+ public static PrintWriter printWriter(File file)
+ throws FileNotFoundException {
+ return printWriter(new FileOutputStream(file));
+ }
+
+ /** Creates a {@link BufferedReader} to a given input stream using UTF-8
+ * character set.
+ *
+ * <p>Does not use the default character set. */
+ public static BufferedReader reader(InputStream in) {
+ return new BufferedReader(
+ new InputStreamReader(in, StandardCharsets.UTF_8));
+ }
+
+ /** Creates a {@link BufferedReader} to read a given file using UTF-8
+ * character set.
+ *
+ * <p>Does not use the default character set. */
+ public static BufferedReader reader(File file) throws FileNotFoundException {
+ return reader(new FileInputStream(file));
+ }
+
+ /** Creates a {@link Calendar} in the GMT time zone and root locale.
+ * Does not use the time zone or locale. */
+ public static Calendar calendar() {
+ return Calendar.getInstance(DateTimeUtils.GMT_ZONE, Locale.ROOT);
+ }
+
//~ Inner Classes ----------------------------------------------------------
/**
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/ZonelessDatetime.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/ZonelessDatetime.java b/core/src/main/java/org/apache/calcite/util/ZonelessDatetime.java
index 13e956b..ab311e7 100644
--- a/core/src/main/java/org/apache/calcite/util/ZonelessDatetime.java
+++ b/core/src/main/java/org/apache/calcite/util/ZonelessDatetime.java
@@ -21,6 +21,7 @@ import org.apache.calcite.avatica.util.DateTimeUtils;
import java.io.Serializable;
import java.text.DateFormat;
import java.util.Calendar;
+import java.util.Locale;
import java.util.TimeZone;
/**
@@ -171,7 +172,7 @@ public abstract class ZonelessDatetime implements BasicDatetime, Serializable {
*/
protected Calendar getCalendar(TimeZone zone) {
if (tempCal == null) {
- tempCal = Calendar.getInstance(zone);
+ tempCal = Calendar.getInstance(zone, Locale.ROOT);
} else {
tempCal.setTimeZone(zone);
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/javac/JaninoCompiler.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/javac/JaninoCompiler.java b/core/src/main/java/org/apache/calcite/util/javac/JaninoCompiler.java
index af170d9..1ac6a39 100644
--- a/core/src/main/java/org/apache/calcite/util/javac/JaninoCompiler.java
+++ b/core/src/main/java/org/apache/calcite/util/javac/JaninoCompiler.java
@@ -24,6 +24,7 @@ import org.codehaus.janino.util.resource.ResourceFinder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
@@ -67,7 +68,7 @@ public class JaninoCompiler implements JavaCompiler {
Map<String, byte[]> sourceMap = new HashMap<String, byte[]>();
sourceMap.put(
ClassFile.getSourceResourceName(args.fullClassName),
- args.source.getBytes());
+ args.source.getBytes(StandardCharsets.UTF_8));
MapResourceFinder sourceFinder = new MapResourceFinder(sourceMap);
classLoader =
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java b/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java
index 792ab79..07ada81 100644
--- a/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java
+++ b/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java
@@ -16,6 +16,8 @@
*/
package org.apache.calcite.util.trace;
+import org.apache.calcite.util.NumberUtil;
+
import org.slf4j.Logger;
import java.text.DecimalFormat;
@@ -28,7 +30,7 @@ public class CalciteTimingTracer {
//~ Static fields/initializers ---------------------------------------------
private static final DecimalFormat DECIMAL_FORMAT =
- new DecimalFormat("###,###,###,###,###");
+ NumberUtil.decimalFormat("###,###,###,###,###");
//~ Instance fields --------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java b/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
index 4578822..e08e3c0 100644
--- a/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
+++ b/core/src/test/java/org/apache/calcite/jdbc/CalciteRemoteDriverTest.java
@@ -30,6 +30,7 @@ import org.apache.calcite.prepare.CalcitePrepareImpl;
import org.apache.calcite.test.CalciteAssert;
import org.apache.calcite.test.JdbcFrontLinqBackTest;
import org.apache.calcite.test.JdbcTest;
+import org.apache.calcite.util.Util;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
@@ -42,11 +43,12 @@ import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URL;
+import java.nio.charset.StandardCharsets;
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
@@ -70,6 +72,7 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import static org.hamcrest.CoreMatchers.equalTo;
@@ -85,9 +88,9 @@ import static org.junit.Assert.assertThat;
public class CalciteRemoteDriverTest {
public static final String LJS = Factory2.class.getName();
- private final PrintStream out =
- CalcitePrepareImpl.DEBUG ? System.out
- : new PrintStream(new ByteArrayOutputStream());
+ private final PrintWriter out =
+ CalcitePrepareImpl.DEBUG ? Util.printWriter(System.out)
+ : new PrintWriter(new StringWriter());
private static final CalciteAssert.ConnectionFactory
REMOTE_CONNECTION_FACTORY =
@@ -429,9 +432,10 @@ public class CalciteRemoteDriverTest {
SqlType.NCHAR, SqlType.NVARCHAR, SqlType.LONGNVARCHAR, SqlType.NCLOB,
SqlType.SQLXML
};
- final PrintStream out =
- CalcitePrepareImpl.DEBUG ? System.out
- : new PrintStream(new ByteArrayOutputStream());
+ final PrintWriter out =
+ CalcitePrepareImpl.DEBUG
+ ? Util.printWriter(System.out)
+ : new PrintWriter(new StringWriter());
for (SqlType.Method row : SqlType.Method.values()) {
out.print(pad(row.methodName));
for (SqlType column : columns) {
@@ -632,7 +636,7 @@ public class CalciteRemoteDriverTest {
// string
"", "foo", " foo! Baz ",
// byte[]
- new byte[0], "hello".getBytes());
+ new byte[0], "hello".getBytes(StandardCharsets.UTF_8));
private static List<Object> values(Class clazz) {
final List<Object> list = Lists.newArrayList();
@@ -659,7 +663,7 @@ public class CalciteRemoteDriverTest {
}
if (clazz == byte[].class) {
if (o instanceof String) {
- return ((String) o).getBytes();
+ return ((String) o).getBytes(StandardCharsets.UTF_8);
}
}
if (clazz == Timestamp.class) {
@@ -679,12 +683,15 @@ public class CalciteRemoteDriverTest {
}
if (clazz == java.util.Date.class) {
if (o instanceof String) {
- return DateFormat.getInstance().parse((String) o);
+ final DateFormat dateFormat =
+ DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT,
+ Locale.ROOT);
+ return dateFormat.parse((String) o);
}
}
if (clazz == Calendar.class) {
if (o instanceof String) {
- return Calendar.getInstance(); // TODO:
+ return Util.calendar(); // TODO:
}
}
if (o instanceof Boolean) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/rex/RexExecutorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/rex/RexExecutorTest.java b/core/src/test/java/org/apache/calcite/rex/RexExecutorTest.java
index cd453cd..3a1227f 100644
--- a/core/src/test/java/org/apache/calcite/rex/RexExecutorTest.java
+++ b/core/src/test/java/org/apache/calcite/rex/RexExecutorTest.java
@@ -19,7 +19,6 @@ package org.apache.calcite.rex;
import org.apache.calcite.DataContext;
import org.apache.calcite.adapter.java.JavaTypeFactory;
import org.apache.calcite.avatica.util.ByteString;
-import org.apache.calcite.avatica.util.DateTimeUtils;
import org.apache.calcite.linq4j.QueryProvider;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptSchema;
@@ -38,6 +37,7 @@ import org.apache.calcite.sql.type.ReturnTypes;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.tools.Frameworks;
import org.apache.calcite.util.NlsString;
+import org.apache.calcite.util.Util;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
@@ -159,7 +159,7 @@ public class RexExecutorTest {
checkConstant(true,
new Function<RexBuilder, RexNode>() {
public RexNode apply(RexBuilder rexBuilder) {
- Calendar calendar = Calendar.getInstance(DateTimeUtils.GMT_ZONE);
+ Calendar calendar = Util.calendar();
return rexBuilder.makeCall(SqlStdOperatorTable.LESS_THAN_OR_EQUAL,
rexBuilder.makeDateLiteral(calendar),
rexBuilder.makeDateLiteral(calendar));
@@ -169,7 +169,7 @@ public class RexExecutorTest {
checkConstant(false,
new Function<RexBuilder, RexNode>() {
public RexNode apply(RexBuilder rexBuilder) {
- Calendar calendar = Calendar.getInstance(DateTimeUtils.GMT_ZONE);
+ Calendar calendar = Util.calendar();
return rexBuilder.makeCall(SqlStdOperatorTable.LESS_THAN,
rexBuilder.makeDateLiteral(calendar),
rexBuilder.makeDateLiteral(calendar));
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
index 54fce65..9c47a4f 100644
--- a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
@@ -46,7 +46,6 @@ import org.junit.Test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
-import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
@@ -6595,8 +6594,9 @@ public class SqlParserTest {
for (Map.Entry<String, List<String>> intervalGroup : tsi.entrySet()) {
for (String function : functions) {
for (String interval : intervalGroup.getValue()) {
- checkExp(String.format(function, interval, ""),
- String.format(function, intervalGroup.getKey(), "`").toUpperCase());
+ checkExp(String.format(Locale.ROOT, function, interval, ""),
+ String.format(Locale.ROOT, function, intervalGroup.getKey(), "`")
+ .toUpperCase(Locale.ROOT));
}
}
}
@@ -6819,9 +6819,9 @@ public class SqlParserTest {
final File inFile = new File(base, "site/_docs/reference.md");
final File outFile = new File(base, "core/target/surefire/reference.md");
outFile.getParentFile().mkdirs();
- try (BufferedReader r = new BufferedReader(new FileReader(inFile));
+ try (BufferedReader r = Util.reader(inFile);
FileOutputStream fos = new FileOutputStream(outFile);
- PrintWriter w = new PrintWriter(fos)) {
+ PrintWriter w = Util.printWriter(outFile)) {
String line;
int stage = 0;
while ((line = r.readLine()) != null) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
index 95000f6..1fd1933 100644
--- a/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
@@ -51,6 +51,7 @@ import org.apache.calcite.test.SqlLimitsTest;
import org.apache.calcite.util.Bug;
import org.apache.calcite.util.Holder;
import org.apache.calcite.util.Pair;
+import org.apache.calcite.util.Util;
import com.google.common.base.Function;
import com.google.common.base.Throwables;
@@ -72,6 +73,7 @@ import java.util.Calendar;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.Locale;
import java.util.TimeZone;
import java.util.regex.Pattern;
@@ -1202,7 +1204,7 @@ public abstract class SqlOperatorBaseTest {
// is guaranteed to be good for at least 2 minutes, which should give
// us time to run the rest of the tests.
final String today =
- new SimpleDateFormat("yyyy-MM-dd").format(
+ new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT).format(
getCalendarNotTooNear(Calendar.DAY_OF_MONTH).getTime());
tester.checkScalar(
@@ -1384,7 +1386,7 @@ public abstract class SqlOperatorBaseTest {
* @return calendar
*/
protected static Calendar getCalendarNotTooNear(int timeUnit) {
- final Calendar cal = Calendar.getInstance();
+ final Calendar cal = Util.calendar();
while (true) {
cal.setTimeInMillis(System.currentTimeMillis());
try {
@@ -4517,7 +4519,7 @@ public abstract class SqlOperatorBaseTest {
public void close() {}
};
} else {
- calendar = Calendar.getInstance();
+ calendar = Util.calendar();
calendar.set(Calendar.YEAR, 2014);
calendar.set(Calendar.MONTH, 8);
calendar.set(Calendar.DATE, 7);
@@ -4535,7 +4537,7 @@ public abstract class SqlOperatorBaseTest {
});
}
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:");
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:", Locale.ROOT);
sdf.setTimeZone(tz);
return Pair.of(sdf.format(calendar.getTime()), closeable);
}
@@ -6662,7 +6664,7 @@ public abstract class SqlOperatorBaseTest {
case VARCHAR:
return SqlLiteral.createCharString(value.toString(), SqlParserPos.ZERO);
case TIMESTAMP:
- Calendar calendar = Calendar.getInstance();
+ Calendar calendar = Util.calendar();
calendar.setTimeInMillis((Long) value);
return SqlLiteral.createTimestamp(calendar, type.getPrecision(),
SqlParserPos.ZERO);
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/sql/validate/SqlValidatorUtilTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/sql/validate/SqlValidatorUtilTest.java b/core/src/test/java/org/apache/calcite/sql/validate/SqlValidatorUtilTest.java
index 87de5f5..5fe474f 100644
--- a/core/src/test/java/org/apache/calcite/sql/validate/SqlValidatorUtilTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/validate/SqlValidatorUtilTest.java
@@ -22,6 +22,7 @@ import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
import static org.hamcrest.CoreMatchers.anyOf;
import static org.hamcrest.CoreMatchers.is;
@@ -48,14 +49,15 @@ public class SqlValidatorUtilTest {
// Make sure each name is unique
List<String> copyResultList = new ArrayList<>(resultList.size());
for (String result : resultList) {
- copyResultList.add(result.toLowerCase());
+ copyResultList.add(result.toLowerCase(Locale.ROOT));
}
for (String result : resultList) {
- assertThat(copyResultList.contains(result.toLowerCase()), is(true));
- copyResultList.remove(result.toLowerCase());
+ final String lowerResult = result.toLowerCase(Locale.ROOT);
+ assertThat(copyResultList.contains(lowerResult), is(true));
+ copyResultList.remove(lowerResult);
if (!caseSensitive) {
- assertThat(copyResultList.contains(result.toLowerCase()), is(false));
+ assertThat(copyResultList.contains(lowerResult), is(false));
}
}
assertThat(copyResultList.size(), is(0));
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/CalciteAssert.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/CalciteAssert.java b/core/src/test/java/org/apache/calcite/test/CalciteAssert.java
index fad0812..dd7168c 100644
--- a/core/src/test/java/org/apache/calcite/test/CalciteAssert.java
+++ b/core/src/test/java/org/apache/calcite/test/CalciteAssert.java
@@ -77,6 +77,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
@@ -114,7 +115,7 @@ public class CalciteAssert {
public static final DatabaseInstance DB =
DatabaseInstance.valueOf(
Util.first(System.getProperty("calcite.test.db"), "HSQLDB")
- .toUpperCase());
+ .toUpperCase(Locale.ROOT));
/** Whether to enable slow tests. Default is false. */
public static final boolean ENABLE_SLOW =
@@ -125,11 +126,12 @@ public class CalciteAssert {
private static final DateFormat UTC_TIMESTAMP_FORMAT;
static {
final TimeZone utc = DateTimeUtils.GMT_ZONE;
- UTC_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
+ UTC_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT);
UTC_DATE_FORMAT.setTimeZone(utc);
- UTC_TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
+ UTC_TIME_FORMAT = new SimpleDateFormat("HH:mm:ss", Locale.ROOT);
UTC_TIME_FORMAT.setTimeZone(utc);
- UTC_TIMESTAMP_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+ UTC_TIMESTAMP_FORMAT =
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT);
UTC_TIMESTAMP_FORMAT.setTimeZone(utc);
}
@@ -1418,7 +1420,8 @@ public class CalciteAssert {
boolean save = materializationsEnabled;
try {
materializationsEnabled = false;
- final boolean ordered = sql.toUpperCase().contains("ORDER BY");
+ final boolean ordered =
+ sql.toUpperCase(Locale.ROOT).contains("ORDER BY");
final Function<ResultSet, Void> checker = consistentResult(ordered);
returns(checker);
materializationsEnabled = true;
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/DiffRepository.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/DiffRepository.java b/core/src/test/java/org/apache/calcite/test/DiffRepository.java
index 622c526..ee48d9d 100644
--- a/core/src/test/java/org/apache/calcite/test/DiffRepository.java
+++ b/core/src/test/java/org/apache/calcite/test/DiffRepository.java
@@ -34,7 +34,6 @@ import org.w3c.dom.Text;
import org.xml.sax.SAXException;
import java.io.File;
-import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.net.URL;
@@ -526,7 +525,7 @@ public class DiffRepository {
try {
boolean b = logFile.getParentFile().mkdirs();
Util.discard(b);
- try (FileWriter w = new FileWriter(logFile)) {
+ try (Writer w = Util.printWriter(logFile)) {
write(doc, w, indent);
}
} catch (IOException e) {