/* * Copyright 1999-2012 Alibaba Group. * * Licensed 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. */ /** * (created at 2011-1-21) */ package com.alibaba.cobar.parser.recognizer.mysql; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.alibaba.cobar.parser.ast.expression.Expression; import com.alibaba.cobar.parser.ast.expression.primary.function.FunctionExpression; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Abs; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Acos; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Asin; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Atan; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Atan2; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Ceiling; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Conv; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Cos; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Cot; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Crc32; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Degrees; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Exp; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Floor; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Log; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Log10; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Log2; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Oct; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Pi; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Pow; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Radians; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Rand; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Round; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Sign; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Sin; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Sqrt; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Tan; import com.alibaba.cobar.parser.ast.expression.primary.function.arithmetic.Truncate; import com.alibaba.cobar.parser.ast.expression.primary.function.bit.BitCount; import com.alibaba.cobar.parser.ast.expression.primary.function.comparison.Coalesce; import com.alibaba.cobar.parser.ast.expression.primary.function.comparison.Greatest; import com.alibaba.cobar.parser.ast.expression.primary.function.comparison.Interval; import com.alibaba.cobar.parser.ast.expression.primary.function.comparison.Isnull; import com.alibaba.cobar.parser.ast.expression.primary.function.comparison.Least; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Adddate; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Addtime; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.ConvertTz; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Curdate; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Curtime; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Date; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.DateAdd; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.DateFormat; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.DateSub; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Datediff; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Dayname; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Dayofmonth; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Dayofweek; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Dayofyear; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.FromDays; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.FromUnixtime; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Hour; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.LastDay; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Makedate; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Maketime; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Microsecond; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Minute; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Month; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Monthname; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Now; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.PeriodAdd; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.PeriodDiff; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Quarter; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.SecToTime; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Second; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.StrToDate; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Subdate; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Subtime; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Sysdate; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Time; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.TimeFormat; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.TimeToSec; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Timediff; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Timestamp; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.ToDays; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.ToSeconds; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.UnixTimestamp; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.UtcDate; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.UtcTime; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.UtcTimestamp; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Week; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Weekday; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Weekofyear; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Year; import com.alibaba.cobar.parser.ast.expression.primary.function.datetime.Yearweek; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.AesDecrypt; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.AesEncrypt; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.Compress; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.Decode; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.DesDecrypt; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.DesEncrypt; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.Encode; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.Encrypt; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.Md5; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.OldPassword; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.Password; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.Sha1; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.Sha2; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.Uncompress; import com.alibaba.cobar.parser.ast.expression.primary.function.encryption.UncompressedLength; import com.alibaba.cobar.parser.ast.expression.primary.function.flowctrl.If; import com.alibaba.cobar.parser.ast.expression.primary.function.flowctrl.Ifnull; import com.alibaba.cobar.parser.ast.expression.primary.function.flowctrl.Nullif; import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.BitAnd; import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.BitOr; import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.BitXor; import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.Std; import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.Stddev; import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.StddevPop; import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.StddevSamp; import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.VarPop; import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.VarSamp; import com.alibaba.cobar.parser.ast.expression.primary.function.groupby.Variance; import com.alibaba.cobar.parser.ast.expression.primary.function.info.Benchmark; import com.alibaba.cobar.parser.ast.expression.primary.function.info.Charset; import com.alibaba.cobar.parser.ast.expression.primary.function.info.Coercibility; import com.alibaba.cobar.parser.ast.expression.primary.function.info.Collation; import com.alibaba.cobar.parser.ast.expression.primary.function.info.ConnectionId; import com.alibaba.cobar.parser.ast.expression.primary.function.info.CurrentUser; import com.alibaba.cobar.parser.ast.expression.primary.function.info.Database; import com.alibaba.cobar.parser.ast.expression.primary.function.info.FoundRows; import com.alibaba.cobar.parser.ast.expression.primary.function.info.LastInsertId; import com.alibaba.cobar.parser.ast.expression.primary.function.info.RowCount; import com.alibaba.cobar.parser.ast.expression.primary.function.info.User; import com.alibaba.cobar.parser.ast.expression.primary.function.info.Version; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.Analyse; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.Default; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.GetLock; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.InetAton; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.InetNtoa; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.IsFreeLock; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.IsUsedLock; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.MasterPosWait; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.NameConst; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.ReleaseLock; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.Sleep; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.Uuid; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.UuidShort; import com.alibaba.cobar.parser.ast.expression.primary.function.misc.Values; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Ascii; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Bin; import com.alibaba.cobar.parser.ast.expression.primary.function.string.BitLength; import com.alibaba.cobar.parser.ast.expression.primary.function.string.CharLength; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Concat; import com.alibaba.cobar.parser.ast.expression.primary.function.string.ConcatWs; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Elt; import com.alibaba.cobar.parser.ast.expression.primary.function.string.ExportSet; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Field; import com.alibaba.cobar.parser.ast.expression.primary.function.string.FindInSet; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Format; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Hex; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Insert; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Instr; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Left; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Length; import com.alibaba.cobar.parser.ast.expression.primary.function.string.LoadFile; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Locate; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Lower; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Lpad; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Ltrim; import com.alibaba.cobar.parser.ast.expression.primary.function.string.MakeSet; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Ord; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Quote; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Repeat; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Replace; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Reverse; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Right; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Rpad; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Rtrim; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Soundex; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Space; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Strcmp; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Substring; import com.alibaba.cobar.parser.ast.expression.primary.function.string.SubstringIndex; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Unhex; import com.alibaba.cobar.parser.ast.expression.primary.function.string.Upper; import com.alibaba.cobar.parser.ast.expression.primary.function.xml.Extractvalue; import com.alibaba.cobar.parser.ast.expression.primary.function.xml.Updatexml; /** * @author <a href="mailto:shuo.qius@alibaba-inc.com">QIU Shuo</a> */ public class MySQLFunctionManager { public static enum FunctionParsingStrategy { /** not a function */ _DEFAULT, /** ordinary function */ _ORDINARY, CAST, POSITION, SUBSTRING, TRIM, AVG, COUNT, GROUP_CONCAT, MAX, MIN, SUM, ROW, CHAR, CONVERT, EXTRACT, TIMESTAMPADD, TIMESTAMPDIFF, GET_FORMAT } public static final MySQLFunctionManager INSTANCE_MYSQL_DEFAULT = new MySQLFunctionManager(false); private final boolean allowFuncDefChange; /** non-reserved word named special syntax function */ private final HashMap<String, FunctionParsingStrategy> parsingStrateg = new HashMap<String, FunctionParsingStrategy>(); /** non-reserved word named ordinary syntax function */ private Map<String, FunctionExpression> functionPrototype = new HashMap<String, FunctionExpression>(); public MySQLFunctionManager(boolean allowFuncDefChange) { this.allowFuncDefChange = allowFuncDefChange; parsingStrateg.put("CAST", FunctionParsingStrategy.CAST); parsingStrateg.put("POSITION", FunctionParsingStrategy.POSITION); parsingStrateg.put("SUBSTR", FunctionParsingStrategy.SUBSTRING); parsingStrateg.put("SUBSTRING", FunctionParsingStrategy.SUBSTRING); parsingStrateg.put("TRIM", FunctionParsingStrategy.TRIM); parsingStrateg.put("AVG", FunctionParsingStrategy.AVG); parsingStrateg.put("COUNT", FunctionParsingStrategy.COUNT); parsingStrateg.put("GROUP_CONCAT", FunctionParsingStrategy.GROUP_CONCAT); parsingStrateg.put("MAX", FunctionParsingStrategy.MAX); parsingStrateg.put("MIN", FunctionParsingStrategy.MIN); parsingStrateg.put("SUM", FunctionParsingStrategy.SUM); parsingStrateg.put("ROW", FunctionParsingStrategy.ROW); parsingStrateg.put("CHAR", FunctionParsingStrategy.CHAR); parsingStrateg.put("CONVERT", FunctionParsingStrategy.CONVERT); parsingStrateg.put("EXTRACT", FunctionParsingStrategy.EXTRACT); parsingStrateg.put("TIMESTAMPADD", FunctionParsingStrategy.TIMESTAMPADD); parsingStrateg.put("TIMESTAMPDIFF", FunctionParsingStrategy.TIMESTAMPDIFF); parsingStrateg.put("GET_FORMAT", FunctionParsingStrategy.GET_FORMAT); functionPrototype.put("ABS", new Abs(null)); functionPrototype.put("ACOS", new Acos(null)); functionPrototype.put("ADDDATE", new Adddate(null)); functionPrototype.put("ADDTIME", new Addtime(null)); functionPrototype.put("AES_DECRYPT", new AesDecrypt(null)); functionPrototype.put("AES_ENCRYPT", new AesEncrypt(null)); functionPrototype.put("ANALYSE", new Analyse(null)); functionPrototype.put("ASCII", new Ascii(null)); functionPrototype.put("ASIN", new Asin(null)); functionPrototype.put("ATAN2", new Atan2(null)); functionPrototype.put("ATAN", new Atan(null)); functionPrototype.put("BENCHMARK", new Benchmark(null)); functionPrototype.put("BIN", new Bin(null)); functionPrototype.put("BIT_AND", new BitAnd(null)); functionPrototype.put("BIT_COUNT", new BitCount(null)); functionPrototype.put("BIT_LENGTH", new BitLength(null)); functionPrototype.put("BIT_OR", new BitOr(null)); functionPrototype.put("BIT_XOR", new BitXor(null)); functionPrototype.put("CEIL", new Ceiling(null)); functionPrototype.put("CEILING", new Ceiling(null)); functionPrototype.put("CHAR_LENGTH", new CharLength(null)); functionPrototype.put("CHARACTER_LENGTH", new CharLength(null)); functionPrototype.put("CHARSET", new Charset(null)); functionPrototype.put("COALESCE", new Coalesce(null)); functionPrototype.put("COERCIBILITY", new Coercibility(null)); functionPrototype.put("COLLATION", new Collation(null)); functionPrototype.put("COMPRESS", new Compress(null)); functionPrototype.put("CONCAT_WS", new ConcatWs(null)); functionPrototype.put("CONCAT", new Concat(null)); functionPrototype.put("CONNECTION_ID", new ConnectionId(null)); functionPrototype.put("CONV", new Conv(null)); functionPrototype.put("CONVERT_TZ", new ConvertTz(null)); functionPrototype.put("COS", new Cos(null)); functionPrototype.put("COT", new Cot(null)); functionPrototype.put("CRC32", new Crc32(null)); functionPrototype.put("CURDATE", new Curdate()); functionPrototype.put("CURRENT_DATE", new Curdate()); functionPrototype.put("CURRENT_TIME", new Curtime()); functionPrototype.put("CURTIME", new Curtime()); functionPrototype.put("CURRENT_TIMESTAMP", new Now()); functionPrototype.put("CURRENT_USER", new CurrentUser()); functionPrototype.put("CURTIME", new Curtime()); functionPrototype.put("DATABASE", new Database(null)); functionPrototype.put("DATE_ADD", new DateAdd(null)); functionPrototype.put("DATE_FORMAT", new DateFormat(null)); functionPrototype.put("DATE_SUB", new DateSub(null)); functionPrototype.put("DATE", new Date(null)); functionPrototype.put("DATEDIFF", new Datediff(null)); functionPrototype.put("DAY", new Dayofmonth(null)); functionPrototype.put("DAYOFMONTH", new Dayofmonth(null)); functionPrototype.put("DAYNAME", new Dayname(null)); functionPrototype.put("DAYOFWEEK", new Dayofweek(null)); functionPrototype.put("DAYOFYEAR", new Dayofyear(null)); functionPrototype.put("DECODE", new Decode(null)); functionPrototype.put("DEFAULT", new Default(null)); functionPrototype.put("DEGREES", new Degrees(null)); functionPrototype.put("DES_DECRYPT", new DesDecrypt(null)); functionPrototype.put("DES_ENCRYPT", new DesEncrypt(null)); functionPrototype.put("ELT", new Elt(null)); functionPrototype.put("ENCODE", new Encode(null)); functionPrototype.put("ENCRYPT", new Encrypt(null)); functionPrototype.put("EXP", new Exp(null)); functionPrototype.put("EXPORT_SET", new ExportSet(null)); // functionPrototype.put("EXTRACT", new Extract(null)); functionPrototype.put("EXTRACTVALUE", new Extractvalue(null)); functionPrototype.put("FIELD", new Field(null)); functionPrototype.put("FIND_IN_SET", new FindInSet(null)); functionPrototype.put("FLOOR", new Floor(null)); functionPrototype.put("FORMAT", new Format(null)); functionPrototype.put("FOUND_ROWS", new FoundRows(null)); functionPrototype.put("FROM_DAYS", new FromDays(null)); functionPrototype.put("FROM_UNIXTIME", new FromUnixtime(null)); // functionPrototype.put("GET_FORMAT", new GetFormat(null)); functionPrototype.put("GET_LOCK", new GetLock(null)); functionPrototype.put("GREATEST", new Greatest(null)); functionPrototype.put("HEX", new Hex(null)); functionPrototype.put("HOUR", new Hour(null)); functionPrototype.put("IF", new If(null)); functionPrototype.put("IFNULL", new Ifnull(null)); functionPrototype.put("INET_ATON", new InetAton(null)); functionPrototype.put("INET_NTOA", new InetNtoa(null)); functionPrototype.put("INSERT", new Insert(null)); functionPrototype.put("INSTR", new Instr(null)); functionPrototype.put("INTERVAL", new Interval(null)); functionPrototype.put("IS_FREE_LOCK", new IsFreeLock(null)); functionPrototype.put("IS_USED_LOCK", new IsUsedLock(null)); functionPrototype.put("ISNULL", new Isnull(null)); functionPrototype.put("LAST_DAY", new LastDay(null)); functionPrototype.put("LAST_INSERT_ID", new LastInsertId(null)); functionPrototype.put("LCASE", new Lower(null)); functionPrototype.put("LEAST", new Least(null)); functionPrototype.put("LEFT", new Left(null)); functionPrototype.put("LENGTH", new Length(null)); functionPrototype.put("LN", new Log(null)); // Ln(X) equals Log(X) functionPrototype.put("LOAD_FILE", new LoadFile(null)); functionPrototype.put("LOCALTIME", new Now()); functionPrototype.put("LOCALTIMESTAMP", new Now()); functionPrototype.put("LOCATE", new Locate(null)); functionPrototype.put("LOG10", new Log10(null)); functionPrototype.put("LOG2", new Log2(null)); functionPrototype.put("LOG", new Log(null)); functionPrototype.put("LOWER", new Lower(null)); functionPrototype.put("LPAD", new Lpad(null)); functionPrototype.put("LTRIM", new Ltrim(null)); functionPrototype.put("MAKE_SET", new MakeSet(null)); functionPrototype.put("MAKEDATE", new Makedate(null)); functionPrototype.put("MAKETIME", new Maketime(null)); functionPrototype.put("MASTER_POS_WAIT", new MasterPosWait(null)); functionPrototype.put("MD5", new Md5(null)); functionPrototype.put("MICROSECOND", new Microsecond(null)); functionPrototype.put("MID", new Substring(null)); functionPrototype.put("MINUTE", new Minute(null)); functionPrototype.put("MONTH", new Month(null)); functionPrototype.put("MONTHNAME", new Monthname(null)); functionPrototype.put("NAME_CONST", new NameConst(null)); functionPrototype.put("NOW", new Now()); functionPrototype.put("NULLIF", new Nullif(null)); functionPrototype.put("OCT", new Oct(null)); functionPrototype.put("OCTET_LENGTH", new Length(null)); functionPrototype.put("OLD_PASSWORD", new OldPassword(null)); functionPrototype.put("ORD", new Ord(null)); functionPrototype.put("PASSWORD", new Password(null)); functionPrototype.put("PERIOD_ADD", new PeriodAdd(null)); functionPrototype.put("PERIOD_DIFF", new PeriodDiff(null)); functionPrototype.put("PI", new Pi(null)); functionPrototype.put("POW", new Pow(null)); functionPrototype.put("POWER", new Pow(null)); functionPrototype.put("QUARTER", new Quarter(null)); functionPrototype.put("QUOTE", new Quote(null)); functionPrototype.put("RADIANS", new Radians(null)); functionPrototype.put("RAND", new Rand(null)); functionPrototype.put("RELEASE_LOCK", new ReleaseLock(null)); functionPrototype.put("REPEAT", new Repeat(null)); functionPrototype.put("REPLACE", new Replace(null)); functionPrototype.put("REVERSE", new Reverse(null)); functionPrototype.put("RIGHT", new Right(null)); functionPrototype.put("ROUND", new Round(null)); functionPrototype.put("ROW_COUNT", new RowCount(null)); functionPrototype.put("RPAD", new Rpad(null)); functionPrototype.put("RTRIM", new Rtrim(null)); functionPrototype.put("SCHEMA", new Database(null)); functionPrototype.put("SEC_TO_TIME", new SecToTime(null)); functionPrototype.put("SECOND", new Second(null)); functionPrototype.put("SESSION_USER", new User(null)); functionPrototype.put("SHA1", new Sha1(null)); functionPrototype.put("SHA", new Sha1(null)); functionPrototype.put("SHA2", new Sha2(null)); functionPrototype.put("SIGN", new Sign(null)); functionPrototype.put("SIN", new Sin(null)); functionPrototype.put("SLEEP", new Sleep(null)); functionPrototype.put("SOUNDEX", new Soundex(null)); functionPrototype.put("SPACE", new Space(null)); functionPrototype.put("SQRT", new Sqrt(null)); functionPrototype.put("STD", new Std(null)); functionPrototype.put("STDDEV_POP", new StddevPop(null)); functionPrototype.put("STDDEV_SAMP", new StddevSamp(null)); functionPrototype.put("STDDEV", new Stddev(null)); functionPrototype.put("STR_TO_DATE", new StrToDate(null)); functionPrototype.put("STRCMP", new Strcmp(null)); functionPrototype.put("SUBDATE", new Subdate(null)); functionPrototype.put("SUBSTRING_INDEX", new SubstringIndex(null)); functionPrototype.put("SUBTIME", new Subtime(null)); functionPrototype.put("SYSDATE", new Sysdate(null)); functionPrototype.put("SYSTEM_USER", new User(null)); functionPrototype.put("TAN", new Tan(null)); functionPrototype.put("TIME_FORMAT", new TimeFormat(null)); functionPrototype.put("TIME_TO_SEC", new TimeToSec(null)); functionPrototype.put("TIME", new Time(null)); functionPrototype.put("TIMEDIFF", new Timediff(null)); functionPrototype.put("TIMESTAMP", new Timestamp(null)); // functionPrototype.put("TIMESTAMPADD", new Timestampadd(null)); // functionPrototype.put("TIMESTAMPDIFF", new Timestampdiff(null)); functionPrototype.put("TO_DAYS", new ToDays(null)); functionPrototype.put("TO_SECONDS", new ToSeconds(null)); functionPrototype.put("TRUNCATE", new Truncate(null)); functionPrototype.put("UCASE", new Upper(null)); functionPrototype.put("UNCOMPRESS", new Uncompress(null)); functionPrototype.put("UNCOMPRESSED_LENGTH", new UncompressedLength(null)); functionPrototype.put("UNHEX", new Unhex(null)); functionPrototype.put("UNIX_TIMESTAMP", new UnixTimestamp(null)); functionPrototype.put("UPDATEXML", new Updatexml(null)); functionPrototype.put("UPPER", new Upper(null)); functionPrototype.put("USER", new User(null)); functionPrototype.put("UTC_DATE", new UtcDate(null)); functionPrototype.put("UTC_TIME", new UtcTime(null)); functionPrototype.put("UTC_TIMESTAMP", new UtcTimestamp(null)); functionPrototype.put("UUID_SHORT", new UuidShort(null)); functionPrototype.put("UUID", new Uuid(null)); functionPrototype.put("VALUES", new Values(null)); functionPrototype.put("VAR_POP", new VarPop(null)); functionPrototype.put("VAR_SAMP", new VarSamp(null)); functionPrototype.put("VARIANCE", new Variance(null)); functionPrototype.put("VERSION", new Version(null)); functionPrototype.put("WEEK", new Week(null)); functionPrototype.put("WEEKDAY", new Weekday(null)); functionPrototype.put("WEEKOFYEAR", new Weekofyear(null)); functionPrototype.put("YEAR", new Year(null)); functionPrototype.put("YEARWEEK", new Yearweek(null)); } /** * @param extFuncPrototypeMap funcName -> extFunctionPrototype. funcName * MUST NOT be the same as predefined function of MySQL 5.5 * @throws IllegalArgumentException */ public synchronized void addExtendFunction(Map<String, FunctionExpression> extFuncPrototypeMap) { if (extFuncPrototypeMap == null || extFuncPrototypeMap.isEmpty()) { return; } if (!allowFuncDefChange) { throw new UnsupportedOperationException("function define is not allowed to be changed"); } Map<String, FunctionExpression> toPut = new HashMap<String, FunctionExpression>(); // check extFuncPrototypeMap for (Entry<String, FunctionExpression> en : extFuncPrototypeMap.entrySet()) { String funcName = en.getKey(); if (funcName == null) continue; String funcNameUp = funcName.toUpperCase(); if (functionPrototype.containsKey(funcNameUp)) { throw new IllegalArgumentException("ext-function '" + funcName + "' is MySQL's predefined function!"); } FunctionExpression func = en.getValue(); if (func == null) { throw new IllegalArgumentException("ext-function '" + funcName + "' is null!"); } toPut.put(funcNameUp, func); } functionPrototype.putAll(toPut); } /** * @return null if */ public FunctionExpression createFunctionExpression(String funcNameUpcase, List<Expression> arguments) { FunctionExpression prototype = functionPrototype.get(funcNameUpcase); if (prototype == null) return null; FunctionExpression func = prototype.constructFunction(arguments); func.init(); return func; } public FunctionParsingStrategy getParsingStrategy(String funcNameUpcase) { FunctionParsingStrategy s = parsingStrateg.get(funcNameUpcase); if (s == null) { if (functionPrototype.containsKey(funcNameUpcase)) { return FunctionParsingStrategy._ORDINARY; } return FunctionParsingStrategy._DEFAULT; } return s; } }