diff --git a/antlr/src/main/antlr4/cn/edu/tsinghua/iginx/sql/Sql.g4 b/antlr/src/main/antlr4/cn/edu/tsinghua/iginx/sql/Sql.g4 index 5de41ee2f..a4f0e1949 100644 --- a/antlr/src/main/antlr4/cn/edu/tsinghua/iginx/sql/Sql.g4 +++ b/antlr/src/main/antlr4/cn/edu/tsinghua/iginx/sql/Sql.g4 @@ -813,7 +813,7 @@ NAME_CHAR ; fragment CN_CHAR - : '\u2E80'..'\u9FFF' + : '\u2E85'..'\u9FFF' ; DOUBLE_QUOTE_STRING_LITERAL diff --git a/core/src/main/java/cn/edu/tsinghua/iginx/metadata/entity/TimeSeriesRange.java b/core/src/main/java/cn/edu/tsinghua/iginx/metadata/entity/TimeSeriesRange.java index 2f8be0e73..703cbed01 100644 --- a/core/src/main/java/cn/edu/tsinghua/iginx/metadata/entity/TimeSeriesRange.java +++ b/core/src/main/java/cn/edu/tsinghua/iginx/metadata/entity/TimeSeriesRange.java @@ -22,6 +22,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static cn.edu.tsinghua.iginx.utils.StringUtils.isContainSpecialChar; + @JSONType(seeAlso = {TimeSeriesInterval.class, TimeSeriesPrefixRange.class}, typeKey = "type") public interface TimeSeriesRange extends Comparable { @@ -101,10 +103,21 @@ default public boolean isAfter(String tsName) { public void setClosed(boolean closed); //Strange function: it should not work on the implementation of TimeSeriesPrefixRange - public static TimeSeriesRange fromString(String str) { - String[] parts = str.split("-"); - assert parts.length == 2; - return new TimeSeriesInterval(parts[0].equals("null") ? null : parts[0], parts[1].equals("null") ? null : parts[1]); + public static TimeSeriesRange fromString(String str) throws Exception { + if (str.contains("-") && !isContainSpecialChar(str)) { + String[] parts = str.split("-"); + assert parts.length == 2; + return new TimeSeriesInterval(parts[0].equals("null") ? null : parts[0], parts[1].equals("null") ? null : parts[1]); + } else { + if (str.contains(".*") && str.indexOf(".*") == str.length() - 2) + str = str.substring(0, str.length()-2); + if(!isContainSpecialChar(str)) + return new TimeSeriesPrefixRange(str); + else { + logger.error("Input invalid string format in TimeSeriesRange"); + throw new Exception("Input invalid string format in TimeSeriesRange"); + } + } } public boolean isContain(String tsName); diff --git a/shared/src/main/java/cn/edu/tsinghua/iginx/utils/StringUtils.java b/shared/src/main/java/cn/edu/tsinghua/iginx/utils/StringUtils.java index 9d00e256a..cc81c6ca9 100644 --- a/shared/src/main/java/cn/edu/tsinghua/iginx/utils/StringUtils.java +++ b/shared/src/main/java/cn/edu/tsinghua/iginx/utils/StringUtils.java @@ -20,6 +20,8 @@ import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class StringUtils { @@ -106,4 +108,11 @@ public static String reformatColumnName(String name) { name = name.replaceAll("[)]", "[)]"); return name; } + + public static boolean isContainSpecialChar(String str) { + String regEx = "[~!@#$%&()+=|{}':;',<>?~]|\r|\n|\t|[\u2E80-\u2E84]"; + Pattern p = Pattern.compile(regEx); + Matcher m = p.matcher(str); + return m.find(); + } }