From 49628d6a5913eb83493be214ad14422a9ec9a14d Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 19 Jun 2017 19:40:27 +0800 Subject: [PATCH] add method OracleUtils.isBultinFunction --- .../com/alibaba/druid/util/OracleUtils.java | 22 ++ .../java/com/alibaba/druid/util/Utils.java | 38 ++- .../parser/oracle/builtin_aggreagte_functions | 36 +++ .../druid/parser/oracle/builtin_functions | 233 ++++++++++++++++++ .../druid/bvt/utils/OracleUtilsTest.java | 15 ++ 5 files changed, 335 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/META-INF/druid/parser/oracle/builtin_aggreagte_functions create mode 100644 src/main/resources/META-INF/druid/parser/oracle/builtin_functions create mode 100644 src/test/java/com/alibaba/druid/bvt/utils/OracleUtilsTest.java diff --git a/src/main/java/com/alibaba/druid/util/OracleUtils.java b/src/main/java/com/alibaba/druid/util/OracleUtils.java index d6d276a727..1e3f3942dc 100644 --- a/src/main/java/com/alibaba/druid/util/OracleUtils.java +++ b/src/main/java/com/alibaba/druid/util/OracleUtils.java @@ -19,6 +19,8 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.HashSet; +import java.util.Set; import javax.sql.XAConnection; import javax.transaction.xa.XAException; @@ -161,4 +163,24 @@ public class OracleUtils { OracleResultSet oracleResultSet = rs.unwrap(OracleResultSet.class); return oracleResultSet.getROWID(columnIndex); } + + private static Set builtinFunctions; + + public static boolean isBuiltinFunction(String function) { + if (function == null) { + return false; + } + + String function_lower = function.toLowerCase(); + + Set functions = builtinFunctions; + + if (functions == null) { + functions = new HashSet(); + Utils.loadFromFile("META-INF/druid/parser/oracle/builtin_functions", functions); + builtinFunctions = functions; + } + + return functions.contains(function_lower); + } } diff --git a/src/main/java/com/alibaba/druid/util/Utils.java b/src/main/java/com/alibaba/druid/util/Utils.java index 4bbb04f354..b336a419f7 100644 --- a/src/main/java/com/alibaba/druid/util/Utils.java +++ b/src/main/java/com/alibaba/druid/util/Utils.java @@ -15,21 +15,14 @@ */ package com.alibaba.druid.util; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.Reader; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.lang.management.ManagementFactory; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; +import java.util.Set; import javax.servlet.GenericServlet; @@ -447,4 +440,31 @@ public class Utils { return hash; } + + public static void loadFromFile(String path, Set set) { + InputStream is = null; + BufferedReader reader = null; + try { + is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path); + reader = new BufferedReader(new InputStreamReader(is)); + for (; ; ) { + String line = reader.readLine(); + if (line == null) { + break; + } + + line = line.trim().toLowerCase(); + + if (line.length() == 0) { + continue; + } + set.add(line); + } + } catch (Exception ex) { + // skip + } finally { + JdbcUtils.close(is); + JdbcUtils.close(reader); + } + } } diff --git a/src/main/resources/META-INF/druid/parser/oracle/builtin_aggreagte_functions b/src/main/resources/META-INF/druid/parser/oracle/builtin_aggreagte_functions new file mode 100644 index 0000000000..06cc4ca677 --- /dev/null +++ b/src/main/resources/META-INF/druid/parser/oracle/builtin_aggreagte_functions @@ -0,0 +1,36 @@ +AVG +COLLECT +CORR +COUNT +COVAR_POP +COVAR_SAMP +CUME_DIST +DENSE_RANK +FIRST +GROUP_ID +GROUPING +GROUPING_ID +LAST +MAX +MEDIAN +MIN +PERCENTILE_CONT +PERCENTILE_DISC +PERCENT_RANK +RANK +STATS_BINOMIAL_TEST +STATS_CROSSTAB +STATS_F_TEST +STATS_KS_TEST +STATS_MODE +STATS_MW_TEST +STATS_ONE_WAY_ANOVA +STATS_T_TEST_* +STATS_WSR_TEST +STDDEV +STDDEV_POP +STDDEV_SAMP +SUM +VAR_POP +VAR_SAMP +VARIANCE \ No newline at end of file diff --git a/src/main/resources/META-INF/druid/parser/oracle/builtin_functions b/src/main/resources/META-INF/druid/parser/oracle/builtin_functions new file mode 100644 index 0000000000..0c5632cc28 --- /dev/null +++ b/src/main/resources/META-INF/druid/parser/oracle/builtin_functions @@ -0,0 +1,233 @@ +ABS +ACOS +ASIN +ATAN +ATAN2 +BITAND +CEIL +COS +COSH +EXP +FLOOR +LN +LOG +MOD +NANVL +POWER +REMAINDER +ROUND +SIGN +SIN +SINH +SQRT +TAN +TANH +TRUNC +WIDTH_BUCKET + +CHR +NCHR +CHAR +NCHAR +CONCAT +INITCAP +LOWER +LPAD +LTRIM +NLS_INITCAP +NLS_LOWER +NLSSORT +NLS_UPPER +REGEXP_REPLACE +REGEXP_SUBSTR +REPLACE +RPAD +RTRIM +SOUNDEX +SUBSTR +TRANSLATE +TREAT +TRIM +UPPER + +NLS_CHARSET_DECL_LEN +NLS_CHARSET_ID +NLS_CHARSET_NAME + +ASCII +INSTR +LENGTH +LENGTHB +REGEXP_INSTR + +ADD_MONTHS +CURRENT_DATE +CURRENT_TIMESTAMP +DBTIMEZONE +EXTRACT +FROM_TZ +LAST_DAY +LOCALTIMESTAMP +MONTHS_BETWEEN +NEW_TIME +NEXT_DAY +NUMTODSINTERVAL +NUMTOYMINTERVAL +ROUND +SESSIONTIMEZONE +SYS_EXTRACT_UTC +SYSDATE +SYSTIMESTAMP +TO_CHAR +TO_TIMESTAMP +TO_TIMESTAMP_TZ +TO_DSINTERVAL +TO_YMINTERVAL +TRUNC +TZ_OFFSET + +GREATEST +LEAST + +ASCIISTR +BIN_TO_NUM +CAST +CHARTOROWID +COMPOSE +CONVERT +DECOMPOSE +HEXTORAW +NUMTODSINTERVAL +NUMTOYMINTERVAL +RAWTOHEX +RAWTONHEX +ROWIDTOCHAR +ROWIDTONCHAR +SCN_TO_TIMESTAMP +TIMESTAMP_TO_SCN +TO_BINARY_DOUBLE +TO_BINARY_FLOAT +TO_CHAR +TO_CLOB +TO_DATE +TO_DSINTERVAL +TO_LOB +TO_MULTI_BYTE +TO_NCHAR +TO_NCLOB +TO_NUMBER +TO_DSINTERVAL +TO_SINGLE_BYTE +TO_TIMESTAMP +TO_TIMESTAMP_TZ +TO_YMINTERVAL +TO_YMINTERVAL +TRANSLATE +UNISTR + +BFILENAME +EMPTY_BLOB +EMPTY_CLOB + +CARDINALITY +COLLECT +POWERMULTISET +POWERMULTISET_BY_CARDINALITY +SET + +SYS_CONNECT_BY_PATH + +CLUSTER_ID +CLUSTER_PROBABILITY +CLUSTER_SET +FEATURE_ID +FEATURE_SET +FEATURE_VALUE +PREDICTION +PREDICTION_COST +PREDICTION_DETAILS +PREDICTION_PROBABILITY +PREDICTION_SET + +APPENDCHILDXML +DELETEXML +DEPTH +EXTRACT +EXISTSNODE +EXTRACTVALUE +INSERTCHILDXML +INSERTXMLBEFORE +PATH +SYS_DBURIGEN +SYS_XMLAGG +SYS_XMLGEN +UPDATEXML +XMLAGG +XMLCDATA +XMLCOLATTVAL +XMLCOMMENT +XMLCONCAT +XMLFOREST +XMLPARSE +XMLPI +XMLQUERY +XMLROOT +XMLSEQUENCE +XMLSERIALIZE +XMLTABLE +XMLTRANSFORM + +DECODE +DUMP +ORA_HASH +VSIZE + +COALESCE +LNNVL +NULLIF +NVL +NVL2 + +SYS_CONTEXT +SYS_GUID +SYS_TYPEID +UID +USER +USERENV + +AVG +COLLECT +CORR +COUNT +COVAR_POP +COVAR_SAMP +CUME_DIST +DENSE_RANK +FIRST +GROUP_ID +GROUPING +GROUPING_ID +LAST +MAX +MEDIAN +MIN +PERCENTILE_CONT +PERCENTILE_DISC +PERCENT_RANK +RANK +STATS_BINOMIAL_TEST +STATS_CROSSTAB +STATS_F_TEST +STATS_KS_TEST +STATS_MODE +STATS_MW_TEST +STATS_ONE_WAY_ANOVA +STATS_WSR_TEST +STDDEV +STDDEV_POP +STDDEV_SAMP +SUM +VAR_POP +VAR_SAMP +VARIANCE + diff --git a/src/test/java/com/alibaba/druid/bvt/utils/OracleUtilsTest.java b/src/test/java/com/alibaba/druid/bvt/utils/OracleUtilsTest.java new file mode 100644 index 0000000000..637bac5bdd --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/utils/OracleUtilsTest.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.utils; + +import com.alibaba.druid.util.OracleUtils; +import junit.framework.TestCase; + +/** + * Created by wenshao on 19/06/2017. + */ +public class OracleUtilsTest extends TestCase { + public void test_builtin() throws Exception { + assertTrue(OracleUtils.isBuiltinFunction("nvl")); + assertTrue(OracleUtils.isBuiltinFunction("NVL")); + assertFalse(OracleUtils.isBuiltinFunction("xxx_nvl")); + } +}