You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2014/01/20 05:30:19 UTC

[1/3] TAJO-409: Add explored and explained annotations to Tajo function system. (SeongHwa Ahn via hyunsik)

Updated Branches:
  refs/heads/master c670c8a98 -> d04f9a567


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
index d871608..2c194fd 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/master/TajoMaster.java
@@ -38,17 +38,13 @@ import org.apache.hadoop.yarn.util.RackResolver;
 import org.apache.hadoop.yarn.util.SystemClock;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.*;
-import org.apache.tajo.catalog.proto.CatalogProtos.FunctionType;
+import org.apache.tajo.catalog.function.Function;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.conf.TajoConf.ConfVars;
-import org.apache.tajo.engine.function.Country;
-import org.apache.tajo.engine.function.InCountry;
-import org.apache.tajo.engine.function.builtin.*;
-import org.apache.tajo.engine.function.datetime.ToCharTimestamp;
-import org.apache.tajo.engine.function.datetime.ToTimestamp;
-import org.apache.tajo.engine.function.math.*;
-import org.apache.tajo.engine.function.string.*;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamOptionTypes;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.master.metrics.CatalogMetricsGaugeSet;
 import org.apache.tajo.master.metrics.WorkerResourceMetricsGaugeSet;
 import org.apache.tajo.master.querymaster.QueryJobManager;
@@ -56,6 +52,7 @@ import org.apache.tajo.master.rm.TajoWorkerResourceManager;
 import org.apache.tajo.master.rm.WorkerResourceManager;
 import org.apache.tajo.storage.AbstractStorageManager;
 import org.apache.tajo.storage.StorageManagerFactory;
+import org.apache.tajo.util.ClassUtil;
 import org.apache.tajo.util.CommonTestingUtil;
 import org.apache.tajo.util.NetUtils;
 import org.apache.tajo.util.metrics.TajoSystemMetrics;
@@ -67,9 +64,11 @@ import java.lang.management.ManagementFactory;
 import java.lang.management.ThreadInfo;
 import java.lang.management.ThreadMXBean;
 import java.lang.reflect.Constructor;
+import java.lang.reflect.Modifier;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 public class TajoMaster extends CompositeService {
   private static final String METRICS_GROUP_NAME = "tajomaster";
@@ -259,586 +258,73 @@ public class TajoMaster extends CompositeService {
   public static List<FunctionDesc> initBuiltinFunctions() throws ServiceException {
     List<FunctionDesc> sqlFuncs = new ArrayList<FunctionDesc>();
 
-    // Sum
-    sqlFuncs.add(new FunctionDesc("sum", SumInt.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.INT4),
-        CatalogUtil.newSimpleDataTypeArray(Type.INT4)));
-    sqlFuncs.add(new FunctionDesc("sum", SumLong.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.INT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.INT8)));
-    sqlFuncs.add(new FunctionDesc("sum", SumFloat.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.FLOAT4),
-        CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-    sqlFuncs.add(new FunctionDesc("sum", SumDouble.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.FLOAT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    // Max
-    sqlFuncs.add(new FunctionDesc("max", MaxInt.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.INT4),
-        CatalogUtil.newSimpleDataTypeArray(Type.INT4)));
-    sqlFuncs.add(new FunctionDesc("max", MaxLong.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.INT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.INT8)));
-    sqlFuncs.add(new FunctionDesc("max", MaxFloat.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.FLOAT4),
-        CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-    sqlFuncs.add(new FunctionDesc("max", MaxDouble.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.FLOAT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    // Min
-    sqlFuncs.add(new FunctionDesc("min", MinInt.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.INT4),
-        CatalogUtil.newSimpleDataTypeArray(Type.INT4)));
-    sqlFuncs.add(new FunctionDesc("min", MinLong.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.INT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.INT8)));
-    sqlFuncs.add(new FunctionDesc("min", MinFloat.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.FLOAT4),
-        CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-    sqlFuncs.add(new FunctionDesc("min", MinDouble.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.FLOAT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-    sqlFuncs.add(new FunctionDesc("min", MinString.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.TEXT),
-        CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-
-    // AVG
-    sqlFuncs.add(new FunctionDesc("avg", AvgInt.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.FLOAT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.INT4)));
-    sqlFuncs.add(new FunctionDesc("avg", AvgLong.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.FLOAT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.INT8)));
-    sqlFuncs.add(new FunctionDesc("avg", AvgFloat.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.FLOAT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-    sqlFuncs.add(new FunctionDesc("avg", AvgDouble.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.FLOAT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    // Count
-    sqlFuncs.add(new FunctionDesc("count", CountValue.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.INT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.ANY)));
-    sqlFuncs.add(new FunctionDesc("count", CountRows.class, FunctionType.AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.INT8),
-        CatalogUtil.newSimpleDataTypeArray()));
-    sqlFuncs.add(new FunctionDesc("count", CountValueDistinct.class, FunctionType.DISTINCT_AGGREGATION,
-        CatalogUtil.newSimpleDataType(Type.INT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.ANY)));
-
-    // GeoIP
-    sqlFuncs.add(new FunctionDesc("in_country", InCountry.class, FunctionType.GENERAL,
-        CatalogUtil.newSimpleDataType(Type.BOOLEAN),
-        CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT)));
-    sqlFuncs.add(new FunctionDesc("country", Country.class, FunctionType.GENERAL,
-        CatalogUtil.newSimpleDataType(Type.TEXT),
-        CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-
-    // Date
-    sqlFuncs.add(new FunctionDesc("date", Date.class, FunctionType.GENERAL,
-        CatalogUtil.newSimpleDataType(Type.INT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-
-    // Today
-    sqlFuncs.add(new FunctionDesc("today", Date.class, FunctionType.GENERAL,
-        CatalogUtil.newSimpleDataType(Type.INT8),
-        CatalogUtil.newSimpleDataTypeArray()));
-
-    sqlFuncs.add(
-        new FunctionDesc("random", RandomInt.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("reverse", Reverse.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("repeat", Repeat.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.INT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("left", Left.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.INT4)));
-    sqlFuncs.add(
-        new FunctionDesc("right", Right.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.INT4)));
-    sqlFuncs.add(
-        new FunctionDesc("to_hex", ToHex.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4)));
-    sqlFuncs.add(
-        new FunctionDesc("to_hex", ToHex.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8)));
-    sqlFuncs.add(
-        new FunctionDesc("to_bin", ToBin.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8)));
-    sqlFuncs.add(
-        new FunctionDesc("to_bin", ToBin.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("upper", Upper.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("lower", Lower.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("md5", Md5.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("char_length", CharLength.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("character_length", CharLength.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("bit_length", BitLength.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("split_part", SplitPart.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT, Type.INT4)));
-    sqlFuncs.add(
-        new FunctionDesc("trim", BTrim.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("trim", BTrim.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("btrim", BTrim.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("btrim", BTrim.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("ltrim", LTrim.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("ltrim", LTrim.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("rtrim", RTrim.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("rtrim", RTrim.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("regexp_replace", RegexpReplace.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT, Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("ascii", Ascii.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("chr", Chr.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.CHAR),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("length", Length.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("octet_length", OctetLength.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("substr", Substr.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.INT4, Type.INT4)));
-    
-    sqlFuncs.add(
-        new FunctionDesc("locate", Locate.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT)));
-    sqlFuncs.add(
-        new FunctionDesc("locate", Locate.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT, Type.INT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("quote_ident", QuoteIdent.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("round", Round.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-    sqlFuncs.add(
-        new FunctionDesc("round", Round.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("floor", Floor.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-    sqlFuncs.add(
-        new FunctionDesc("floor", Floor.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("ceil", Ceil.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("ceil", Ceil.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("ceiling", Ceil.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("ceiling", Ceil.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("strpos", StrPos.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("strposb", StrPosb.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("sin", Sin.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("sin", Sin.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("cos", Cos.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("cos", Cos.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("tan", Tan.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("tan", Tan.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("asin", Asin.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("asin", Asin.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("acos", Acos.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("acos", Acos.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("atan", Atan.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("atan", Atan.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("atan2", Atan2.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8, Type.FLOAT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("atan2", Atan2.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4, Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("mod", Mod.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8, Type.INT8)));
-    sqlFuncs.add(
-        new FunctionDesc("mod", Mod.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.INT4)));
-    sqlFuncs.add(
-        new FunctionDesc("mod", Mod.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.INT8)));
-    sqlFuncs.add(
-        new FunctionDesc("mod", Mod.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8, Type.INT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("div", Div.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8, Type.INT8)));
-    sqlFuncs.add(
-        new FunctionDesc("div", Div.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.INT4)));
-    sqlFuncs.add(
-        new FunctionDesc("div", Div.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.INT8)));
-    sqlFuncs.add(
-        new FunctionDesc("div", Div.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8, Type.INT4)));
-
-     sqlFuncs.add(
-         new FunctionDesc("degrees", Degrees.class, FunctionType.GENERAL,
-             CatalogUtil.newSimpleDataType(Type.FLOAT8),
-             CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-     sqlFuncs.add(
-         new FunctionDesc("degrees", Degrees.class, FunctionType.GENERAL,
-             CatalogUtil.newSimpleDataType(Type.FLOAT8),
-             CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-     sqlFuncs.add(
-         new FunctionDesc("radians", Radians.class, FunctionType.GENERAL,
-             CatalogUtil.newSimpleDataType(Type.FLOAT8),
-             CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-     sqlFuncs.add(
-         new FunctionDesc("radians", Radians.class, FunctionType.GENERAL,
-             CatalogUtil.newSimpleDataType(Type.FLOAT8),
-             CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-
-    sqlFuncs.add(
-        new FunctionDesc("initcap", InitCap.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("lpad", Lpad.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.INT4, Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("rpad", Rpad.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.INT4, Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("sign", Sign.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("sign", Sign.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("sign", Sign.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("sign", Sign.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("sqrt", Sqrt.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("sqrt", Sqrt.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("exp", Exp.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-
-    sqlFuncs.add(
-        new FunctionDesc("exp", Exp.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    //abs
-    sqlFuncs.add(new FunctionDesc("abs", AbsInt.class, FunctionType.GENERAL,
-        CatalogUtil.newSimpleDataType(Type.INT4),
-        CatalogUtil.newSimpleDataTypeArray(Type.INT4)));
-    sqlFuncs.add(new FunctionDesc("abs", AbsLong.class, FunctionType.GENERAL,
-        CatalogUtil.newSimpleDataType(Type.INT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.INT8)));
-    sqlFuncs.add(new FunctionDesc("abs", AbsFloat.class, FunctionType.GENERAL,
-        CatalogUtil.newSimpleDataType(Type.FLOAT4),
-        CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-    sqlFuncs.add(new FunctionDesc("abs", AbsDouble.class, FunctionType.GENERAL,
-        CatalogUtil.newSimpleDataType(Type.FLOAT8),
-        CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-
-    sqlFuncs.add(
-        new FunctionDesc("cbrt", Cbrt.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4)));
-    sqlFuncs.add(
-        new FunctionDesc("cbrt", Cbrt.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8)));
-
-    // Date Time
-    sqlFuncs.add(
-        new FunctionDesc("to_timestamp", ToTimestamp.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TIMESTAMP),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8)));
-    sqlFuncs.add(
-        new FunctionDesc("to_timestamp", ToTimestamp.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TIMESTAMP),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4)));
-    sqlFuncs.add(
-        new FunctionDesc("to_char", ToCharTimestamp.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TIMESTAMP, Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4, Type.FLOAT4)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4, Type.FLOAT8)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8, Type.FLOAT4)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8, Type.FLOAT8)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.INT4)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.INT8)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8, Type.INT4)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8, Type.INT8)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.FLOAT4)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.FLOAT8)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8, Type.FLOAT4)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.INT8, Type.FLOAT8)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4, Type.INT4)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT4, Type.INT8)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8, Type.INT4)));
-    sqlFuncs.add(
-        new FunctionDesc("pow", Pow.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.FLOAT8, Type.INT8)));
-
-    sqlFuncs.add(
-        new FunctionDesc("pi", Pi.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.FLOAT8),
-            CatalogUtil.newSimpleDataTypeArray(Type.NULL_TYPE)));
-
-    sqlFuncs.add(
-        new FunctionDesc("encode", Encode.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("decode", Decode.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.TEXT),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT)));
-
-    sqlFuncs.add(
-        new FunctionDesc("find_in_set", FindInSet.class, FunctionType.GENERAL,
-            CatalogUtil.newSimpleDataType(Type.INT4),
-            CatalogUtil.newSimpleDataTypeArray(Type.TEXT, Type.TEXT)));
+    Set<Class> functionClasses = ClassUtil.findClasses(org.apache.tajo.catalog.function.Function.class,
+          "org.apache.tajo.engine.function");
+
+    for (Class eachClass : functionClasses) {
+      if(eachClass.isInterface() || Modifier.isAbstract(eachClass.getModifiers())) {
+        continue;
+      }
+      Function function = null;
+      try {
+        function = (Function)eachClass.newInstance();
+      } catch (Exception e) {
+        LOG.warn(eachClass + " cannot instantiate Function class because of " + e.getMessage());
+        continue;
+      }
+      String functionName = function.getClass().getAnnotation(Description.class).functionName();
+      String[] synonyms = function.getClass().getAnnotation(Description.class).synonyms();
+      String description = function.getClass().getAnnotation(Description.class).description();
+      String detail = function.getClass().getAnnotation(Description.class).detail();
+      String example = function.getClass().getAnnotation(Description.class).example();
+      Type returnType = function.getClass().getAnnotation(Description.class).returnType();
+      ParamTypes[] paramArray = function.getClass().getAnnotation(Description.class).paramTypes();
+
+      String[] allFunctionNames = null;
+      if(synonyms != null && synonyms.length > 0) {
+        allFunctionNames = new String[1 + synonyms.length];
+        allFunctionNames[0] = functionName;
+        System.arraycopy(synonyms, 0, allFunctionNames, 1, synonyms.length);
+      } else {
+        allFunctionNames = new String[]{functionName};
+      }
+
+      for(String eachFunctionName: allFunctionNames) {
+        for (ParamTypes params : paramArray) {
+          ParamOptionTypes[] paramOptionArray;
+          if(params.paramOptionTypes() == null ||
+              params.paramOptionTypes().getClass().getAnnotation(ParamTypes.class) == null) {
+            paramOptionArray = new ParamOptionTypes[0];
+          } else {
+            paramOptionArray = params.paramOptionTypes().getClass().getAnnotation(ParamTypes.class).paramOptionTypes();
+          }
+
+          Type[] paramTypes = params.paramTypes();
+          if (paramOptionArray.length > 0)
+            paramTypes = params.paramTypes().clone();
+
+          for (int i=0; i < paramOptionArray.length + 1; i++) {
+            FunctionDesc functionDesc = new FunctionDesc(eachFunctionName,
+                function.getClass(), function.getFunctionType(),
+                CatalogUtil.newSimpleDataType(returnType),
+                paramTypes.length == 0 ? CatalogUtil.newSimpleDataTypeArray() : CatalogUtil.newSimpleDataTypeArray(paramTypes));
+
+            functionDesc.setDescription(description);
+            functionDesc.setExample(example);
+            functionDesc.setDetail(detail);
+            sqlFuncs.add(functionDesc);
+
+            if (i != paramOptionArray.length) {
+              paramTypes = new Type[paramTypes.length +
+                  paramOptionArray[i].paramOptionTypes().length];
+              System.arraycopy(params.paramTypes(), 0, paramTypes, 0, paramTypes.length);
+              System.arraycopy(paramOptionArray[i].paramOptionTypes(), 0, paramTypes, paramTypes.length,
+                  paramOptionArray[i].paramOptionTypes().length);
+            }
+          }
+        }
+      }
+    }
 
     return sqlFuncs;
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/util/ClassUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/util/ClassUtil.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/util/ClassUtil.java
new file mode 100644
index 0000000..160b585
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/util/ClassUtil.java
@@ -0,0 +1,155 @@
+/**
+ * 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.tajo.util;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.File;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+public abstract class ClassUtil {
+  private static final Log LOG = LogFactory.getLog(ClassUtil.class);
+
+  public static Set<Class> findClasses(Class type, String packageFilter) {
+    Set<Class> classSet = new HashSet<Class>();
+
+    String classpath = System.getProperty("java.class.path");
+    String[] paths = classpath.split(System.getProperty("path.separator"));
+
+    for (String path : paths) {
+      File file = new File(path);
+      if (file.exists()) {
+        findClasses(classSet, file, file, true, type, packageFilter);
+      }
+    }
+
+    return classSet;
+  }
+
+  private static void findClasses(Set<Class> matchedClassSet, File root, File file, boolean includeJars, Class type, String packageFilter) {
+    if (file.isDirectory()) {
+      for (File child : file.listFiles()) {
+        findClasses(matchedClassSet, root, child, includeJars, type, packageFilter);
+      }
+    } else {
+      if (file.getName().toLowerCase().endsWith(".jar") && includeJars) {
+        JarFile jar = null;
+        try {
+          jar = new JarFile(file);
+        } catch (Exception ex) {
+          LOG.error(ex.getMessage(), ex);
+          return;
+        }
+        Enumeration<JarEntry> entries = jar.entries();
+        while (entries.hasMoreElements()) {
+          JarEntry entry = entries.nextElement();
+          String name = entry.getName();
+          int extIndex = name.lastIndexOf(".class");
+          if (extIndex > 0) {
+            String qualifiedClassName = name.substring(0, extIndex).replace("/", ".");
+            if (qualifiedClassName.indexOf(packageFilter) >= 0 && !isTestClass(qualifiedClassName)) {
+              try {
+                Class clazz = Class.forName(qualifiedClassName);
+
+                if (!clazz.isInterface() && isMatch(type, clazz)) {
+                  matchedClassSet.add(clazz);
+                }
+              } catch (ClassNotFoundException e) {
+                LOG.error(e.getMessage(), e);
+              }
+            }
+          }
+        }
+      } else if (file.getName().toLowerCase().endsWith(".class")) {
+        String qualifiedClassName = createClassName(root, file);
+        if (qualifiedClassName.indexOf(packageFilter) >= 0 && !isTestClass(qualifiedClassName)) {
+          try {
+            Class clazz = Class.forName(qualifiedClassName);
+            if (!clazz.isInterface() && isMatch(type, clazz)) {
+              matchedClassSet.add(clazz);
+            }
+          } catch (ClassNotFoundException e) {
+            LOG.error(e.getMessage(), e);
+          }
+        }
+      }
+    }
+  }
+
+  private static boolean isTestClass(String qualifiedClassName) {
+    String className = getClassName(qualifiedClassName);
+    if(className == null) {
+      return false;
+    }
+
+    return className.startsWith("Test");
+  }
+
+  private static boolean isMatch(Class targetClass, Class loadedClass) {
+    if (targetClass.equals(loadedClass)) {
+      return true;
+    }
+
+    Class[] classInterfaces = loadedClass.getInterfaces();
+    if (classInterfaces != null) {
+      for (Class eachInterfaceClass : classInterfaces) {
+        if (eachInterfaceClass.equals(targetClass)) {
+          return true;
+        }
+
+        if (isMatch(targetClass, eachInterfaceClass)) {
+          return true;
+        }
+      }
+    }
+
+    Class superClass = loadedClass.getSuperclass();
+    if (superClass != null) {
+      if (isMatch(targetClass, superClass)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private static String getClassName(String qualifiedClassName) {
+    String[] tokens = qualifiedClassName.split("\\.");
+    if (tokens.length == 0) {
+      return qualifiedClassName;
+    }
+    return tokens[tokens.length - 1];
+  }
+
+  private static String createClassName(File root, File file) {
+    StringBuffer sb = new StringBuffer();
+    String fileName = file.getName();
+    sb.append(fileName.substring(0, fileName.lastIndexOf(".class")));
+    file = file.getParentFile();
+    while (file != null && !file.equals(root)) {
+      sb.insert(0, '.').insert(0, file.getName());
+      file = file.getParentFile();
+    }
+    return sb.toString();
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/util/JSPUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/util/JSPUtil.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/util/JSPUtil.java
index 907dba5..89a3b03 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/util/JSPUtil.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/util/JSPUtil.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.util;
 
 import org.apache.hadoop.conf.Configuration;
+import org.apache.tajo.catalog.FunctionDesc;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.master.querymaster.QueryInProgress;
 import org.apache.tajo.master.querymaster.QueryMasterTask;
@@ -173,4 +174,18 @@ public class JSPUtil {
       return 0;
     }
   }
+
+  public static void sortFunctionDesc(List<FunctionDesc> functions) {
+    Collections.sort(functions, new java.util.Comparator<FunctionDesc>() {
+      @Override
+      public int compare(FunctionDesc f1, FunctionDesc f2) {
+        int nameCompared = f1.getSignature().compareTo(f2.getSignature());
+        if(nameCompared != 0) {
+          return nameCompared;
+        } else {
+          return f1.getReturnType().getType().compareTo(f2.getReturnType().getType());
+        }
+      }
+    });
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/catalogview.jsp
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/catalogview.jsp b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/catalogview.jsp
index f36752b..26212f0 100644
--- a/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/catalogview.jsp
+++ b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/catalogview.jsp
@@ -28,6 +28,15 @@
   TajoMaster master = (TajoMaster) StaticHttpServer.getInstance().getAttribute("tajo.info.server.object");
   CatalogService catalog = master.getCatalog();
 
+  String catalogType = request.getParameter("type");
+  if(catalogType != null && "function".equals(catalogType)) {
+%>
+<script type="text/javascript">
+    document.location.href = 'functions.jsp';
+</script>
+    return;
+<%
+  }
   String selectedDatabase = request.getParameter("database");
   if(selectedDatabase == null || selectedDatabase.trim().isEmpty()) {
     selectedDatabase = "default";
@@ -58,6 +67,11 @@
   <h2>Tajo Master: <%=master.getMasterName()%></h2>
   <hr/>
   <h3>Catalog</h3>
+  <div>
+    <div style='float:left; margin-right:10px'><a href='catalogview.jsp'>[Table]</a></div>
+    <div style='float:left; margin-right:10px'><a href='functions.jsp'>[Function]</a></div>
+    <div style='clear:both'></div>
+  </div>
   <p/>
   <table width="100%" border='0'>
     <tr>

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/functions.jsp
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/functions.jsp b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/functions.jsp
new file mode 100644
index 0000000..68e127b
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/resources/webapps/admin/functions.jsp
@@ -0,0 +1,77 @@
+<%
+    /*
+    * 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.
+    */
+%>
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+
+<%@ page import="java.util.*" %>
+<%@ page import="org.apache.tajo.webapp.StaticHttpServer" %>
+<%@ page import="org.apache.tajo.master.*" %>
+<%@ page import="org.apache.tajo.catalog.*" %>
+<%@ page import="org.apache.hadoop.http.HtmlQuoting" %>
+<%@ page import="org.apache.tajo.util.JSPUtil" %>
+<%
+    TajoMaster master = (TajoMaster) StaticHttpServer.getInstance().getAttribute("tajo.info.server.object");
+    CatalogService catalog = master.getCatalog();
+
+    List<FunctionDesc> functions = new ArrayList<FunctionDesc>(catalog.getFunctions());
+    JSPUtil.sortFunctionDesc(functions);
+%>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <link rel="stylesheet" type = "text/css" href = "/static/style.css" />
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <title>Tajo</title>
+</head>
+<body>
+<%@ include file="header.jsp"%>
+<div class='contents'>
+    <h2>Tajo Master: <%=master.getMasterName()%></h2>
+    <hr/>
+    <h3>Catalog</h3>
+    <div>
+        <div style='float:left; margin-right:10px'><a href='catalogview.jsp'>[Table]</a></div>
+        <div style='float:left; margin-right:10px'><a href='functions.jsp'>[Function]</a></div>
+        <div style='clear:both'></div>
+    </div>
+    <p/>
+    <table border="1" class='border_table'>
+        <tr><th width='5%'>Name</th><th width='20%'>Signature</th><th width="5%">Type</th><th width='40%'>Description</th><th>Example</th></tr>
+<%
+    for(FunctionDesc eachFunction: functions) {
+        String fullDecription = eachFunction.getDescription();
+        if(eachFunction.getDetail() != null && !eachFunction.getDetail().isEmpty()) {
+            fullDecription += "\n" + eachFunction.getDetail();
+        }
+%>
+        <tr>
+            <td><%=eachFunction.getSignature()%></td>
+            <td><%=eachFunction.getHelpSignature()%></td>
+            <td><%=eachFunction.getFuncType()%></td>
+            <td><%=HtmlQuoting.quoteHtmlChars(fullDecription).replace("\n", "<br/>")%></td>
+            <td><%=HtmlQuoting.quoteHtmlChars(eachFunction.getExample()).replace("\n", "<br/>")%></td>
+        </tr>
+<%
+    }
+%>
+    </table>
+</div>
+</body>
+</html>


[2/3] TAJO-409: Add explored and explained annotations to Tajo function system. (SeongHwa Ahn via hyunsik)

Posted by hy...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Cbrt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Cbrt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Cbrt.java
index a805351..b85fe58 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Cbrt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Cbrt.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * FLOAT8 cbrt(value FLOAT8)
  */
+@Description(
+  functionName = "cbrt",
+  description = "Cube root",
+  example = "> SELECT cbrt(27.0);\n"
+      + "3",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Cbrt extends GeneralFunction {
   public Cbrt() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.FLOAT8)
+      new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Ceil.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Ceil.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Ceil.java
index 5a593bc..cca7f60 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Ceil.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Ceil.java
@@ -24,17 +24,29 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
  * Function definition
  *
- * INT8 ceil(value FLOAT8)
+ * INT8 ceil(value FLOAT4/FLOAT8)
  */
+@Description(
+  functionName = "ceil",
+  synonyms = {"ceiling"},
+  description = "Smallest integer not less than argument.",
+  example = "> SELECT ceil(-42.8);\n"
+          + "-42",
+  returnType = TajoDataTypes.Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Ceil extends GeneralFunction {
   public Ceil() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.FLOAT8)
+      new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 
@@ -47,4 +59,5 @@ public class Ceil extends GeneralFunction {
 
     return DatumFactory.createInt8((long)Math.ceil(valueDatum.asFloat8()));
   }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Cos.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Cos.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Cos.java
index 44194b2..997784a 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Cos.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Cos.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,18 @@ import org.apache.tajo.storage.Tuple;
  *
  * Float8 cos(value FLOAT8)
  */
+@Description(
+  functionName = "cos",
+  description = "Cosine.",
+  example = "> SELECT cos(x);",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Cos extends GeneralFunction {
   public Cos() {
     super(new Column[] {
-        new Column("value", TajoDataTypes.Type.FLOAT8)
+        new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Degrees.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Degrees.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Degrees.java
index e9e4932..cd5fd2f 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Degrees.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Degrees.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * FLOAT8 degrees(value FLOAT8)
  */
+@Description(
+  functionName = "degrees",
+  description = "Radians to degrees",
+  example = "> SELECT degrees(0.5);\n"
+      + "28.6478897565412",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Degrees extends GeneralFunction {
   public Degrees() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.FLOAT8)
+      new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Div.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Div.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Div.java
index 7bf2d20..d904a2c 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Div.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Div.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,11 +33,23 @@ import org.apache.tajo.storage.Tuple;
  *
  * INT8 div(value INT8, value INT8)
  */
+@Description(
+  functionName = "div",
+  description = "Division(integer division truncates results)",
+  example = "> SELECT div(4, 2);\n"
+    + "2",
+  returnType = TajoDataTypes.Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.INT8, TajoDataTypes.Type.INT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT8, TajoDataTypes.Type.INT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT4, TajoDataTypes.Type.INT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT4, TajoDataTypes.Type.INT4})
+  }
+)
 public class Div extends GeneralFunction {
   public Div() {
     super(new Column[] {
-      new Column("value1", TajoDataTypes.Type.INT8),
-      new Column("value2", TajoDataTypes.Type.INT8)
+      new Column("x", TajoDataTypes.Type.INT8),
+      new Column("y", TajoDataTypes.Type.INT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Exp.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Exp.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Exp.java
index 5614809..3c3b07c 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Exp.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Exp.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * FLOAT8 exp(value FLOAT8)
  */
+@Description(
+  functionName = "exp",
+  description = "Exponential",
+  example = "> SELECT exp(1.0);\n"
+      + "2.71828182845905",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Exp extends GeneralFunction {
   public Exp() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.FLOAT8)
+      new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Floor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Floor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Floor.java
index e48a733..7e4cee0 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Floor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Floor.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * INT8 floor(value FLOAT8)
  */
+@Description(
+  functionName = "floor",
+  description = " Largest integer not greater than argument.",
+  example = "> SELECT floor(-42.8);\n" +
+      "-43",
+  returnType = TajoDataTypes.Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Floor extends GeneralFunction {
   public Floor() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.FLOAT8)
+      new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Mod.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Mod.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Mod.java
index 0878464..c748a2d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Mod.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Mod.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,11 +33,23 @@ import org.apache.tajo.storage.Tuple;
  *
  * INT8 mod(value INT8, value INT8)
  */
+@Description(
+  functionName = "mod",
+  description = "Remainder of y/x",
+  example = "> SELECT mod(9, 4);\n" +
+            "1",
+  returnType = TajoDataTypes.Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.INT8, TajoDataTypes.Type.INT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT8, TajoDataTypes.Type.INT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT4, TajoDataTypes.Type.INT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT4, TajoDataTypes.Type.INT4})
+  }
+)
 public class Mod extends GeneralFunction {
   public Mod() {
     super(new Column[] {
-      new Column("value1", TajoDataTypes.Type.INT8),
-      new Column("value2", TajoDataTypes.Type.INT8)
+      new Column("y", TajoDataTypes.Type.INT8),
+      new Column("x", TajoDataTypes.Type.INT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Pi.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Pi.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Pi.java
index 5074439..abc06b5 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Pi.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Pi.java
@@ -18,12 +18,12 @@
 
 package org.apache.tajo.engine.function.math;
 
-import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,11 +31,17 @@ import org.apache.tajo.storage.Tuple;
  *
  * INT8 ceil(value FLOAT8)
  */
+@Description(
+  functionName = "pi",
+  description = "\"π\" constant",
+  example = "> SELECT pi();\n"
+          + "3.14159265358979",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {})}
+)
 public class Pi extends GeneralFunction {
   public Pi() {
-    super(new Column[] {
-      new Column("value", TajoDataTypes.Type.NULL_TYPE)
-    });
+    super(NoArgs);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Pow.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Pow.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Pow.java
index a999ab2..101e508 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Pow.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Pow.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,11 +33,35 @@ import org.apache.tajo.storage.Tuple;
  *
  * Float8 pow(value FLOAT8, value FLOAT8)
  */
+@Description(
+  functionName = "pow",
+  description = "x raised to the power of y",
+  example = "> SELECT pow(9.0, 3.0)\n"
+           + "729",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4, TajoDataTypes.Type.FLOAT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4, TajoDataTypes.Type.FLOAT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8, TajoDataTypes.Type.FLOAT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8, TajoDataTypes.Type.FLOAT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT4, TajoDataTypes.Type.INT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT4, TajoDataTypes.Type.INT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT8, TajoDataTypes.Type.INT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT8, TajoDataTypes.Type.INT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT4, TajoDataTypes.Type.FLOAT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT4, TajoDataTypes.Type.FLOAT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT8, TajoDataTypes.Type.FLOAT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT8, TajoDataTypes.Type.FLOAT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4, TajoDataTypes.Type.INT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4, TajoDataTypes.Type.INT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8, TajoDataTypes.Type.INT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8, TajoDataTypes.Type.INT8})
+  }
+)
 public class Pow extends GeneralFunction {
   public Pow() {
     super(new Column[] {
-        new Column("value", TajoDataTypes.Type.FLOAT8),
-        new Column("value", TajoDataTypes.Type.FLOAT8)
+        new Column("x", TajoDataTypes.Type.FLOAT8),
+        new Column("y", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Radians.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Radians.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Radians.java
index 97ac9c4..a8bf363 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Radians.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Radians.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,20 @@ import org.apache.tajo.storage.Tuple;
  *
  * FLOAT8 radians(value FLOAT8)
  */
+@Description(
+  functionName = "radians",
+  description = "Degrees to radians",
+  example = "> SELECT radians(45.0)\n"
+      + "0.785398163397448",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4})
+  }
+)
 public class Radians extends GeneralFunction {
   public Radians() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.FLOAT8)
+      new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Round.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Round.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Round.java
index e033df0..9740888 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Round.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Round.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * INT8 round(value FLOAT8)
  */
+@Description(
+  functionName = "round",
+  description = "Round to nearest integer.",
+  example = "> SELECT round(42.4)\n"
+          + "42",
+  returnType = TajoDataTypes.Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Round extends GeneralFunction {
   public Round() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.FLOAT8)
+      new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sign.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sign.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sign.java
index 0f9d466..f9c49bf 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sign.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sign.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,22 @@ import org.apache.tajo.storage.Tuple;
  *
  * FLOAT8 sign(value FLOAT8)
  */
+@Description(
+  functionName = "sign",
+  description = "sign of the argument (-1, 0, +1)",
+  example = "> SELECT sign(-8.4);\n"
+          + "-1",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT4})
+  }
+)
 public class Sign extends GeneralFunction {
   public Sign() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.FLOAT8)
+      new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sin.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sin.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sin.java
index 928625c..31d56b4 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sin.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sin.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,18 @@ import org.apache.tajo.storage.Tuple;
  *
  * Float8 sin(value FLOAT8)
  */
+@Description(
+  functionName = "sin",
+  description = "Sine.",
+  example = "> SELECT sin(x);",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Sin extends GeneralFunction {
   public Sin() {
     super(new Column[] {
-        new Column("value", TajoDataTypes.Type.FLOAT8)
+        new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sqrt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sqrt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sqrt.java
index 35fa04c..aba33f4 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sqrt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Sqrt.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,20 @@ import org.apache.tajo.storage.Tuple;
  *
  * FLOAT8 sqrt(value FLOAT8)
  */
+@Description(
+  functionName = "sqrt",
+  description = "Square root",
+  example = "> SELECT sqrt(2.0);\n"
+          + "1.4142135623731",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4})
+  }
+)
 public class Sqrt extends GeneralFunction {
   public Sqrt() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.FLOAT8)
+      new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Tan.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Tan.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Tan.java
index d06461b..d551d8b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Tan.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Tan.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,11 +33,18 @@ import org.apache.tajo.storage.Tuple;
  *
  * Float8 tan(value FLOAT8)
  */
-
+@Description(
+  functionName = "tan",
+  description = "Tangent.",
+  example = "> SELECT tan(x);",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Tan extends GeneralFunction {
   public Tan() {
     super(new Column[] {
-        new Column("value", TajoDataTypes.Type.FLOAT8)
+        new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Ascii.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Ascii.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Ascii.java
index 12070f9..ecb32a4 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Ascii.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Ascii.java
@@ -18,13 +18,14 @@
 
 package org.apache.tajo.engine.function.string;
 
-import org.apache.commons.lang.StringUtils;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -32,13 +33,22 @@ import org.apache.tajo.storage.Tuple;
  *
  * int4 ascii(string text)
  */
-
+@Description(
+  functionName = "ascii",
+  description = "ASCII code of the first character of the argument.",
+  detail = "For UTF8 returns the Unicode code point of the character.\n"
+        + "For other multibyte encodings, the argument must be an ASCII character.",
+  example = "> SELECT ascii('x');\n"
+          + "120",
+  returnType = TajoDataTypes.Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class Ascii extends GeneralFunction {
 
 
   public Ascii() {
     super(new Column[]{
-            new Column("text", TajoDataTypes.Type.TEXT)
+            new Column("char", TajoDataTypes.Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BTrim.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BTrim.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BTrim.java
index 7206a81..b7c5611 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BTrim.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BTrim.java
@@ -27,6 +27,8 @@ import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.FunctionEval;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -34,12 +36,24 @@ import org.apache.tajo.storage.Tuple;
  *
  * text btrim(string text [, characters text])
  */
+@Description(
+  functionName = "trim",
+  synonyms = {"btrim"},
+  description = " Remove the longest string consisting only of "
+          + " characters in characters (a space by default) "
+          + "from the start and end of string.",
+  example = "> SELECT trim('xyxtrimyyx', 'xy');\n"
+          + "trim",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT,TajoDataTypes.Type.TEXT})}
+)
 public class BTrim extends GeneralFunction {
   @Expose private boolean hasTrimCharacters;
 
   public BTrim() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT),
+        new Column("string", TajoDataTypes.Type.TEXT),
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BitLength.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BitLength.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BitLength.java
index 3a84f5b..3a5c216 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BitLength.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/BitLength.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,18 @@ import org.apache.tajo.storage.Tuple;
  *
  * INT4 bit_length(string text)
  */
+@Description(
+  functionName = "bit_length",
+  description = "Number of bits in string",
+  example = "> SELECT bit_length('jose');\n"
+          + "32",
+  returnType = TajoDataTypes.Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class BitLength extends GeneralFunction {
   public BitLength() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT)
+        new Column("string", TajoDataTypes.Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/CharLength.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/CharLength.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/CharLength.java
index ffe461a..76d3b55 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/CharLength.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/CharLength.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * INT4 char_length(string text) or INT4 character_length(string text)
  */
+@Description(
+  functionName = "char_length",
+  synonyms = {"character_length"},
+  description = "Number of characters in string",
+  example = "> SELECT char_length('jose');\n"
+          + "4",
+  returnType = TajoDataTypes.Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class CharLength extends GeneralFunction {
   public CharLength() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT)
+        new Column("string", TajoDataTypes.Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Chr.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Chr.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Chr.java
index 05a7a86..fac4b27 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Chr.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Chr.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,11 +33,20 @@ import org.apache.tajo.storage.Tuple;
  *
  * char chr(value int4)
  */
-
+@Description(
+  functionName = "chr",
+  description = "Character with the given code.",
+  detail = "For UTF8 the argument is treated as a Unicode code point. "
+    + "For other multibyte encodings the argument must designate an ASCII character.",
+  example = "> SELECT chr(65);\n"
+          + "A",
+  returnType = TajoDataTypes.Type.CHAR,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.INT4})}
+)
 public class Chr extends GeneralFunction {
   public Chr() {
     super(new Column[]{
-            new Column("text", TajoDataTypes.Type.INT4)
+            new Column("n", TajoDataTypes.Type.INT4)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Decode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Decode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Decode.java
index 33e8030..13f0749 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Decode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Decode.java
@@ -26,6 +26,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 
@@ -34,10 +36,20 @@ import org.apache.tajo.storage.Tuple;
  *
  * bytearray decode(string text, format text)
  */
+@Description(
+  functionName = "decode",
+  description = "Decode binary data from textual representation in string. "
+          + "Options for format are same as in encode.",
+  detail = "format is one of 'base64', 'hex'",
+  example = "> SELECT decode('MTIzAAE=', 'base64');\n"
+          + "\\x3132330001",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT})}
+)
 public class Decode extends GeneralFunction {
   public Decode() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT),
+        new Column("string", TajoDataTypes.Type.TEXT),
         new Column("format", TajoDataTypes.Type.TEXT)
     });
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Encode.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Encode.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Encode.java
index 938d6c0..0023ae6 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Encode.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Encode.java
@@ -26,6 +26,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 
@@ -34,10 +36,20 @@ import org.apache.tajo.storage.Tuple;
  *
  * bytearray encode(data bytea, format text)
  */
+@Description(
+  functionName = "encode",
+  description = "Encode binary data into a textual representation.",
+  detail = "Supported formats are: base64, hex, escape. escape converts zero bytes and "
+        + "high-bit-set bytes to octal sequences (\\nnn) and doubles backslashes.",
+  example = "> SELECT encode(E'123\\\\000\\\\001', 'base64');\n"
+          + "MTIzAAE=",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT})}
+)
 public class Encode extends GeneralFunction {
   public Encode() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT),
+        new Column("string", TajoDataTypes.Type.TEXT),
         new Column("format", TajoDataTypes.Type.TEXT)
     });
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java
index 17df825..0c3e221 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/FindInSet.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -37,10 +39,20 @@ import org.apache.tajo.storage.Tuple;
  * SELECT find_in_set('cr','crt,c,cr,c,def') FROM src LIMIT 1;\n"
  * -> result: 3
  */
+@Description(
+  functionName = "find_in_set",
+  description = "Returns the first occurrence of str in str_array where str_array is a comma-delimited string",
+  detail = "Returns null if either argument is null.\n"
+      + "Returns 0 if the first argument has any commas.",
+  example = "> SELECT find_in_set('cr','crt,c,cr,c,def');\n"
+          + "3",
+  returnType = TajoDataTypes.Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT})}
+)
 public class FindInSet extends GeneralFunction {
   public FindInSet() {
     super(new Column[]{
-        new Column("text", TajoDataTypes.Type.TEXT),
+        new Column("string", TajoDataTypes.Type.TEXT),
         new Column("str_array", TajoDataTypes.Type.TEXT)
     });
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/InitCap.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/InitCap.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/InitCap.java
index e2158fb..4347dbb 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/InitCap.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/InitCap.java
@@ -25,6 +25,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -32,10 +34,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * text initcap(string text)
  */
+@Description(
+  functionName = "initcap",
+  description = "Convert the first letter of each word to upper case "
+          + " and the rest to lower case..",
+  example = "> SELECT initcap('hi THOMAS');\n"
+          + "Hi Thomas",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class InitCap extends GeneralFunction {
   public InitCap() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT)
+        new Column("string", TajoDataTypes.Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/LTrim.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/LTrim.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/LTrim.java
index ece01f3..db6b714 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/LTrim.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/LTrim.java
@@ -27,6 +27,8 @@ import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.FunctionEval;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -34,6 +36,17 @@ import org.apache.tajo.storage.Tuple;
  *
  * text ltrim(string text [, characters text])
  */
+@Description(
+  functionName = "ltrim",
+  description = "Remove the longest string containing only "
+          + "characters from characters (a space by default) "
+          + "from the start of string.",
+  example = "> SELECT ltrim('zzzytrim', 'xyz');\n"
+          + "trim",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT,TajoDataTypes.Type.TEXT})}
+)
 public class LTrim extends GeneralFunction {
   @Expose private boolean hasTrimCharacters;
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Left.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Left.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Left.java
index 3d25cd8..31469f5 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Left.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Left.java
@@ -25,6 +25,8 @@ import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.datum.TextDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -32,10 +34,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * text left(string text, int size)
  */
+@Description(
+  functionName = "left",
+  description = "First n characters in the string.",
+  example = "> SELECT left('ABC', 2);\n"
+          + "AB",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT,
+          TajoDataTypes.Type.INT4})}
+)
 public class Left extends GeneralFunction {
   public Left() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT),
+        new Column("string", TajoDataTypes.Type.TEXT),
         new Column("size", TajoDataTypes.Type.INT4)
     });
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Length.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Length.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Length.java
index 5c8b689..389f358 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Length.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Length.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,11 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * INT4 length(string text)
  */
+@Description(
+  functionName = "length",
+  description = "Number of characters in string.",
+  example = "> SELECT length('Tajo');\n"
+          + "4",
+  returnType = TajoDataTypes.Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class Length  extends GeneralFunction {
 
   public Length() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT)
+        new Column("string", TajoDataTypes.Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Locate.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Locate.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Locate.java
index 704d944..67ee389 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Locate.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Locate.java
@@ -25,6 +25,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -32,6 +34,16 @@ import org.apache.tajo.storage.Tuple;
  * 
  * INT4 locate(string TEXT, substr TEXT, [, pos INT4])
  */
+@Description(
+  functionName = "locate",
+  description = "Location of specified substring",
+  example = "> SELECT locate('high', 'ig')\n"
+          + "2",
+  returnType = TajoDataTypes.Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT, TajoDataTypes.Type.INT4})
+  }
+)
 public class Locate extends GeneralFunction {
   public Locate() {
     super(new Column[] {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Lower.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Lower.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Lower.java
index 551afcd..80c8192 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Lower.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Lower.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,6 +33,14 @@ import org.apache.tajo.storage.Tuple;
  *
  * text lower(string text)
  */
+@Description(
+  functionName = "lower",
+  description = "Convert string to lower case",
+  example = "> SELECT lower('ToM');\n"
+          + "tom",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class Lower extends GeneralFunction {
   public Lower() {
     super(new Column[] {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Lpad.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Lpad.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Lpad.java
index 4d5a8f8..8b5b96b 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Lpad.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Lpad.java
@@ -27,21 +27,32 @@ import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.FunctionEval;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
-
 /**
  * Function definition
  *
  * text lpad(string text, length int [, fill text])
  */
+@Description(
+  functionName = "lpad",
+  description = "Fill up the string to length length by prepending the characters fill (a space by default)",
+  detail = "If the string is already longer than length then it is truncated (on the right)",
+  example = "> SELECT lpad('hi', 5, 'xy');\n"
+      + "xyxhi",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.INT4, TajoDataTypes.Type.TEXT})}
+)
 public class Lpad extends GeneralFunction {
   @Expose private boolean hasFillCharacters;
 
   public Lpad() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT),
-        new Column("length", TajoDataTypes.Type.INT4)
+        new Column("string", TajoDataTypes.Type.TEXT),
+        new Column("length", TajoDataTypes.Type.INT4),
+        new Column("fill_text", TajoDataTypes.Type.TEXT)
     });
   }
 
@@ -56,23 +67,23 @@ public class Lpad extends GeneralFunction {
     Datum datum = params.get(0);
     Datum lengthDatum = params.get(1);
 
-    if(datum instanceof NullDatum) return NullDatum.get();
-    if(lengthDatum instanceof NullDatum) return NullDatum.get();
+    if (datum instanceof NullDatum) return NullDatum.get();
+    if (lengthDatum instanceof NullDatum) return NullDatum.get();
 
-    Datum fillText=NullDatum.get();
+    Datum fillText = NullDatum.get();
 
-    if(hasFillCharacters) {
-      fillText=params.get(2);
-    }
-    else {
-      fillText=DatumFactory.createText(" ");
+    if (hasFillCharacters) {
+      fillText = params.get(2);
+    } else {
+      fillText = DatumFactory.createText(" ");
     }
 
     int templen = lengthDatum.asInt4() - datum.asChars().length();
 
-    if(templen<=0)
+    if (templen <= 0) {
       return DatumFactory.createText(datum.asChars().substring(0,lengthDatum.asInt4()));
-
-    return DatumFactory.createText(StringUtils.leftPad(datum.asChars(), lengthDatum.asInt4(), fillText.asChars()));
+    } else {
+      return DatumFactory.createText(StringUtils.leftPad(datum.asChars(), lengthDatum.asInt4(), fillText.asChars()));
+    }
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Md5.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Md5.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Md5.java
index fc1db8d..fb5f73c 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Md5.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Md5.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 import java.security.*;
 import org.apache.commons.codec.binary.Hex;
@@ -33,10 +35,18 @@ import org.apache.commons.codec.binary.Hex;
  *
  * text md5(string text)
  */
+@Description(
+  functionName = "md5",
+  description = "Calculates the MD5 hash of string",
+  example = "> SELECT md5('abc');\n"
+          + "900150983cd24fb0 d6963f7d28e17f72",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class Md5 extends GeneralFunction {
   public Md5() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT)
+        new Column("string", TajoDataTypes.Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java
index 345244d..dc71907 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/OctetLength.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,11 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * INT4 octet_length(string text)
  */
+@Description(
+  functionName = "octet_length",
+  description = "Number of bytes in string. ",
+  example = "> SELECT octet_length('jose');\n"
+        + "4",
+  returnType = TajoDataTypes.Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class OctetLength  extends GeneralFunction {
 
   public OctetLength() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT)
+        new Column("string", TajoDataTypes.Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java
index 91d3259..d5237d7 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/QuoteIdent.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -34,10 +36,21 @@ import org.apache.tajo.storage.Tuple;
  * Description:
  * Return a quoted string.
  */
+@Description(
+  functionName = "quote_ident",
+  description = "Return the given string suitably quoted to be used as an identifier in an SQL statement string",
+  detail = "Quotes are added only if necessary "
+        + "(i.e., if the string contains non-identifier characters or would be case-folded).\n"
+        + "Embedded quotes are properly doubled.",
+  example = "> SELECT quote_ident('Foo bar');\n"
+      + "\"Foo bar\"",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class QuoteIdent extends GeneralFunction {
   public QuoteIdent() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT)
+        new Column("string", TajoDataTypes.Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/RTrim.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/RTrim.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/RTrim.java
index b8bdd4e..9e3ff8d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/RTrim.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/RTrim.java
@@ -27,6 +27,8 @@ import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.FunctionEval;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -34,6 +36,17 @@ import org.apache.tajo.storage.Tuple;
  *
  * text rtrim(string text [, characters text])
  */
+@Description(
+  functionName = "rtrim",
+  description = "Remove the longest string containing only "
+          + " characters from characters (a space by default) "
+          + " from the end of string.",
+  example = "> SELECT rtrim('trimxxxx', 'x');\n"
+          + "trim",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT,TajoDataTypes.Type.TEXT})}
+)
 public class RTrim extends GeneralFunction {
   @Expose private boolean hasTrimCharacters;
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java
index 1877ba4..2b59d34 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/RegexpReplace.java
@@ -23,6 +23,8 @@ import org.apache.tajo.catalog.Column;
 import org.apache.tajo.engine.function.GeneralFunction;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.*;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 import java.util.regex.Matcher;
@@ -38,6 +40,15 @@ import static org.apache.tajo.engine.eval.FunctionEval.ParamType;
  *
  * flags is not supported yet.
  */
+@Description(
+  functionName = "regexp_replace",
+  description = " Replace substring(s) matching a POSIX regular expression.",
+  example = "> SELECT regexp_replace('Thomas', '.[mN]a.', 'M');\n"
+          + "ThM",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT,
+          TajoDataTypes.Type.TEXT,TajoDataTypes.Type.TEXT})}
+)
 public class RegexpReplace extends GeneralFunction {
   @Expose protected boolean isPatternConstant;
 
@@ -49,7 +60,7 @@ public class RegexpReplace extends GeneralFunction {
 
   public RegexpReplace() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT),
+        new Column("string", TajoDataTypes.Type.TEXT),
         new Column("pattern", TajoDataTypes.Type.TEXT),
         new Column("replacement", TajoDataTypes.Type.INT4),
         new Column("flags", TajoDataTypes.Type.INT4), // it is not supported yet.

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Repeat.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Repeat.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Repeat.java
index c170e5d..4c52a6e 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Repeat.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Repeat.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * text reverse(string text)
  */
+@Description(
+  functionName = "repeat",
+  description = "Repeat string the specified number of times.",
+  example = "> SELECT repeat('Pg', 4);\n"
+          + "PgPgPgPg",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT,
+          TajoDataTypes.Type.INT4})}
+)
 public class Repeat extends GeneralFunction {
   public Repeat() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT),
+        new Column("string", TajoDataTypes.Type.TEXT),
         new Column("count", TajoDataTypes.Type.INT4)
     });
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Reverse.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Reverse.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Reverse.java
index a08c2d3..a77ba69 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Reverse.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Reverse.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,18 @@ import org.apache.tajo.storage.Tuple;
  *
  * text reverse(string text)
  */
+@Description(
+  functionName = "reverse",
+  description = "Reverse str",
+  example = "> SELECT reverse('TAJO');\n"
+          + "OJAT",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class Reverse extends GeneralFunction {
   public Reverse() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT)
+        new Column("string", TajoDataTypes.Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Right.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Right.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Right.java
index 43421fd..aa0dad0 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Right.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Right.java
@@ -25,6 +25,8 @@ import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.datum.TextDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -32,10 +34,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * text right(string text, int size)
  */
+@Description(
+  functionName = "right",
+  description = "Last n characters in the string",
+  example = "> SELECT right('ABC', 2);\n"
+          + "BC",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT,
+          TajoDataTypes.Type.INT4})}
+)
 public class Right extends GeneralFunction {
   public Right() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT),
+        new Column("string", TajoDataTypes.Type.TEXT),
         new Column("size", TajoDataTypes.Type.INT4)
     });
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Rpad.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Rpad.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Rpad.java
index fb17562..35c1afa 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Rpad.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Rpad.java
@@ -27,6 +27,8 @@ import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.FunctionEval;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 
@@ -35,13 +37,23 @@ import org.apache.tajo.storage.Tuple;
  *
  * text rpad(string text, length int [, fill text])
  */
+@Description(
+  functionName = "rpad",
+  description = "Fill up the string to length length by appending the characters fill (a space by default)",
+  detail = "If the string is already longer than length then it is truncated.",
+  example = "> SELECT rpad('hi', 5, 'xy');\n"
+      + "hixyx",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.INT4, TajoDataTypes.Type.TEXT})}
+)
 public class Rpad extends GeneralFunction {
   @Expose private boolean hasFillCharacters;
 
   public Rpad() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT),
-        new Column("length", TajoDataTypes.Type.INT4)
+        new Column("string", TajoDataTypes.Type.TEXT),
+        new Column("length", TajoDataTypes.Type.INT4),
+        new Column("fill_text", TajoDataTypes.Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java
index 6de485f..fd1de55 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/SplitPart.java
@@ -25,19 +25,30 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
  * Function definition
  *
- * text split_part(string text, delimiter text, part int)
+ * text split_part(string text, delimiter text, field int)
  */
+@Description(
+  functionName = "split_part",
+  description = "Split string on delimiter and return the given field",
+  example = "> SELECT split_part('abc~@~def~@~ghi', '~@~', 2);\n"
+          + "def",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT,
+          TajoDataTypes.Type.TEXT,TajoDataTypes.Type.INT4})}
+)
 public class SplitPart extends GeneralFunction {
   public SplitPart() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT),
+        new Column("string", TajoDataTypes.Type.TEXT),
         new Column("delimiter", TajoDataTypes.Type.TEXT),
-        new Column("part", TajoDataTypes.Type.INT4),
+        new Column("field", TajoDataTypes.Type.INT4),
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/StrPos.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/StrPos.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/StrPos.java
index 46fdded..d6f88de 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/StrPos.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/StrPos.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * int strpos(string text, substring text))
  */
+@Description(
+  functionName = "strpos",
+  description = "Location of specified substring.",
+  example = "> SELECT strpos('tajo', 'aj');\n"
+          + "2",
+  returnType = TajoDataTypes.Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT,
+          TajoDataTypes.Type.TEXT})}
+)
 public class StrPos extends GeneralFunction {
   public StrPos() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT),
+        new Column("string", TajoDataTypes.Type.TEXT),
         new Column("substring", TajoDataTypes.Type.TEXT)
     });
   }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java
index 511d092..56fb3a1 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/StrPosb.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 import java.nio.ByteBuffer;
@@ -33,6 +35,15 @@ import java.nio.ByteBuffer;
  *
  * int strposb(string text, substring text))
  */
+@Description(
+  functionName = "strposb",
+  description = "Binary location of specified substring.",
+  example = "> SELECT strpos('tajo', 'aj');\n"
+      + "2",
+  returnType = TajoDataTypes.Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT,
+          TajoDataTypes.Type.TEXT})}
+)
 public class StrPosb extends GeneralFunction {
   public StrPosb() {
     super(new Column[] {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Substr.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Substr.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Substr.java
index 9652cdc..8f6cf21 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Substr.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Substr.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,12 +33,21 @@ import org.apache.tajo.storage.Tuple;
  *
  * text substr(string text, from int4 [, length int4])
  */
+@Description(
+  functionName = "substr",
+  description = "Extract substring.",
+  example = "> SELECT substr('alphabet', 3, 2);\n"
+          + "ph",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT,
+          TajoDataTypes.Type.INT4,TajoDataTypes.Type.INT4})}
+)
 public class Substr extends GeneralFunction {
   public Substr() {
     super(new Column[] {
         new Column("text", TajoDataTypes.Type.TEXT),
         new Column("from", TajoDataTypes.Type.INT4),
-        new Column("count", TajoDataTypes.Type.INT4)    //optional
+        new Column("length", TajoDataTypes.Type.INT4)    //optional
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/ToBin.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/ToBin.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/ToBin.java
index eab1529..3048aa8 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/ToBin.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/ToBin.java
@@ -23,6 +23,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 
@@ -33,11 +35,20 @@ import org.apache.tajo.storage.Tuple;
  *   SELECT Tobin(22) FROM src LIMIT 1;
  *   -> result: '10110'
  */
+@Description(
+  functionName = "to_bin",
+  description = "Returns n in binary.",
+  example = "> SELECT to_bin(22);\n"
+      + "10110",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.INT8}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT4})}
+)
 public class ToBin extends GeneralFunction {
 
   public ToBin() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT)
+        new Column("n", TajoDataTypes.Type.INT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/ToHex.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/ToHex.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/ToHex.java
index c5bebda..a8624ab 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/ToHex.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/ToHex.java
@@ -18,17 +18,16 @@
 
 package org.apache.tajo.engine.function.string;
 
+import org.apache.commons.codec.binary.Hex;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.datum.Float4Datum;
-import org.apache.tajo.datum.Float8Datum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
-import org.apache.commons.codec.binary.Hex;
-import java.nio.ByteBuffer;
 
 /**
  * Function definition
@@ -36,11 +35,20 @@ import java.nio.ByteBuffer;
  * text to_hex(text)
  * text to_hex(int)
  */
+@Description(
+  functionName = "to_hex",
+  description = "Convert the argument to hexadecimal",
+  example = "SELECT to_hex(15);\n"
+          + "F",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.INT4}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.INT8})}
+)
 public class ToHex extends GeneralFunction {
 
   public ToHex() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT)
+        new Column("n", TajoDataTypes.Type.INT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Upper.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Upper.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Upper.java
index eb3e19a..47d38ba 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Upper.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/string/Upper.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,18 @@ import org.apache.tajo.storage.Tuple;
  *
  * text upper(string text)
  */
+@Description(
+  functionName = "upper",
+  description = "Convert string to upper case.",
+  example = "> SELECT upper('tajo');\n"
+          + "TAJO",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class Upper extends GeneralFunction {
   public Upper() {
     super(new Column[] {
-        new Column("text", TajoDataTypes.Type.TEXT)
+        new Column("string", TajoDataTypes.Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/ExprAnnotator.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/ExprAnnotator.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/ExprAnnotator.java
index cd49c73..545caa2 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/ExprAnnotator.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/ExprAnnotator.java
@@ -376,8 +376,7 @@ public class ExprAnnotator extends BaseAlgebraVisitor<ExprAnnotator.Context, Eva
     // Given parameters
     Expr[] params = expr.getParams();
     if (params == null) {
-      params = new Expr[1];
-      params[0] = new NullLiteral();
+      params = new Expr[0];
     }
 
     EvalNode[] givenArgs = new EvalNode[params.length];
@@ -395,7 +394,9 @@ public class ExprAnnotator extends BaseAlgebraVisitor<ExprAnnotator.Context, Eva
     }
 
     FunctionDesc funcDesc = catalog.getFunction(expr.getSignature(), paramTypes);
-
+    if (funcDesc == null) {
+      throw new UndefinedFunctionException(CatalogUtil.getCanonicalName(expr.getSignature(), paramTypes));
+    }
     try {
     CatalogProtos.FunctionType functionType = funcDesc.getFuncType();
     if (functionType == CatalogProtos.FunctionType.GENERAL
@@ -427,6 +428,10 @@ public class ExprAnnotator extends BaseAlgebraVisitor<ExprAnnotator.Context, Eva
       throws PlanningException {
     FunctionDesc countRows = catalog.getFunction("count", CatalogProtos.FunctionType.AGGREGATION,
         new TajoDataTypes.DataType[] {});
+    if (countRows == null) {
+      throw new UndefinedFunctionException(CatalogUtil.
+          getCanonicalName(countRows.getSignature(), new TajoDataTypes.DataType[]{}));
+    }
 
     try {
       ctx.currentBlock.setAggregationRequire();


[3/3] git commit: TAJO-409: Add explored and explained annotations to Tajo function system. (SeongHwa Ahn via hyunsik)

Posted by hy...@apache.org.
TAJO-409: Add explored and explained annotations to Tajo function system. (SeongHwa Ahn via hyunsik)


Project: http://git-wip-us.apache.org/repos/asf/incubator-tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tajo/commit/d04f9a56
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/d04f9a56
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/d04f9a56

Branch: refs/heads/master
Commit: d04f9a567f3eac01fb796487e6dcb0af68f1d34b
Parents: c670c8a
Author: Hyunsik Choi <hy...@apache.org>
Authored: Mon Jan 20 13:29:56 2014 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Mon Jan 20 13:29:57 2014 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |   5 +-
 .../tajo/catalog/AbstractCatalogClient.java     |   8 +-
 .../org/apache/tajo/catalog/FunctionDesc.java   |  66 +-
 .../apache/tajo/catalog/function/Function.java  |   3 +
 .../src/main/proto/CatalogProtos.proto          |   3 +
 .../apache/tajo/catalog/TestFunctionDesc.java   |  13 +
 .../org/apache/tajo/catalog/TestCatalog.java    |   7 +
 .../tajo/engine/function/AggFunction.java       |   6 +
 .../apache/tajo/engine/function/Country.java    |  12 +-
 .../tajo/engine/function/GeneralFunction.java   |   6 +
 .../apache/tajo/engine/function/InCountry.java  |  11 +-
 .../engine/function/annotation/Description.java |  50 ++
 .../function/annotation/ParamOptionTypes.java   |  29 +
 .../engine/function/annotation/ParamTypes.java  |  30 +
 .../tajo/engine/function/builtin/AvgDouble.java |  11 +-
 .../tajo/engine/function/builtin/AvgFloat.java  |  11 +
 .../tajo/engine/function/builtin/AvgInt.java    |  11 +
 .../tajo/engine/function/builtin/AvgLong.java   |  11 +-
 .../tajo/engine/function/builtin/CountRows.java |  13 +-
 .../engine/function/builtin/CountValue.java     |  15 +-
 .../function/builtin/CountValueDistinct.java    |  20 +-
 .../tajo/engine/function/builtin/Date.java      |  14 +-
 .../tajo/engine/function/builtin/MaxDouble.java |  15 +-
 .../tajo/engine/function/builtin/MaxFloat.java  |  15 +-
 .../tajo/engine/function/builtin/MaxInt.java    |  15 +-
 .../tajo/engine/function/builtin/MaxLong.java   |  15 +-
 .../tajo/engine/function/builtin/MinDouble.java |  15 +-
 .../tajo/engine/function/builtin/MinFloat.java  |  15 +-
 .../tajo/engine/function/builtin/MinInt.java    |  15 +-
 .../tajo/engine/function/builtin/MinLong.java   |  15 +-
 .../tajo/engine/function/builtin/MinString.java |  15 +-
 .../tajo/engine/function/builtin/RandomInt.java |  16 +-
 .../tajo/engine/function/builtin/SumDouble.java |  20 +-
 .../tajo/engine/function/builtin/SumFloat.java  |  20 +-
 .../tajo/engine/function/builtin/SumInt.java    |  20 +-
 .../tajo/engine/function/builtin/SumLong.java   |  20 +-
 .../tajo/engine/function/builtin/Today.java     |  13 +-
 .../function/datetime/ToCharTimestamp.java      |  11 +
 .../engine/function/datetime/ToTimestamp.java   |  13 +-
 .../tajo/engine/function/math/AbsDouble.java    |  13 +-
 .../tajo/engine/function/math/AbsFloat.java     |  13 +-
 .../tajo/engine/function/math/AbsInt.java       |  13 +-
 .../tajo/engine/function/math/AbsLong.java      |  12 +-
 .../apache/tajo/engine/function/math/Acos.java  |  13 +-
 .../apache/tajo/engine/function/math/Asin.java  |  12 +-
 .../apache/tajo/engine/function/math/Atan.java  |  12 +-
 .../apache/tajo/engine/function/math/Atan2.java |  13 +-
 .../apache/tajo/engine/function/math/Cbrt.java  |  13 +-
 .../apache/tajo/engine/function/math/Ceil.java  |  17 +-
 .../apache/tajo/engine/function/math/Cos.java   |  12 +-
 .../tajo/engine/function/math/Degrees.java      |  13 +-
 .../apache/tajo/engine/function/math/Div.java   |  18 +-
 .../apache/tajo/engine/function/math/Exp.java   |  13 +-
 .../apache/tajo/engine/function/math/Floor.java |  13 +-
 .../apache/tajo/engine/function/math/Mod.java   |  18 +-
 .../apache/tajo/engine/function/math/Pi.java    |  16 +-
 .../apache/tajo/engine/function/math/Pow.java   |  30 +-
 .../tajo/engine/function/math/Radians.java      |  14 +-
 .../apache/tajo/engine/function/math/Round.java |  13 +-
 .../apache/tajo/engine/function/math/Sign.java  |  16 +-
 .../apache/tajo/engine/function/math/Sin.java   |  12 +-
 .../apache/tajo/engine/function/math/Sqrt.java  |  14 +-
 .../apache/tajo/engine/function/math/Tan.java   |  13 +-
 .../tajo/engine/function/string/Ascii.java      |  16 +-
 .../tajo/engine/function/string/BTrim.java      |  16 +-
 .../tajo/engine/function/string/BitLength.java  |  12 +-
 .../tajo/engine/function/string/CharLength.java |  13 +-
 .../apache/tajo/engine/function/string/Chr.java |  15 +-
 .../tajo/engine/function/string/Decode.java     |  14 +-
 .../tajo/engine/function/string/Encode.java     |  14 +-
 .../tajo/engine/function/string/FindInSet.java  |  14 +-
 .../tajo/engine/function/string/InitCap.java    |  13 +-
 .../tajo/engine/function/string/LTrim.java      |  13 +
 .../tajo/engine/function/string/Left.java       |  13 +-
 .../tajo/engine/function/string/Length.java     |  12 +-
 .../tajo/engine/function/string/Locate.java     |  12 +
 .../tajo/engine/function/string/Lower.java      |  10 +
 .../tajo/engine/function/string/Lpad.java       |  39 +-
 .../apache/tajo/engine/function/string/Md5.java |  12 +-
 .../engine/function/string/OctetLength.java     |  12 +-
 .../tajo/engine/function/string/QuoteIdent.java |  15 +-
 .../tajo/engine/function/string/RTrim.java      |  13 +
 .../engine/function/string/RegexpReplace.java   |  13 +-
 .../tajo/engine/function/string/Repeat.java     |  13 +-
 .../tajo/engine/function/string/Reverse.java    |  12 +-
 .../tajo/engine/function/string/Right.java      |  13 +-
 .../tajo/engine/function/string/Rpad.java       |  16 +-
 .../tajo/engine/function/string/SplitPart.java  |  17 +-
 .../tajo/engine/function/string/StrPos.java     |  13 +-
 .../tajo/engine/function/string/StrPosb.java    |  11 +
 .../tajo/engine/function/string/Substr.java     |  13 +-
 .../tajo/engine/function/string/ToBin.java      |  13 +-
 .../tajo/engine/function/string/ToHex.java      |  18 +-
 .../tajo/engine/function/string/Upper.java      |  12 +-
 .../tajo/engine/planner/ExprAnnotator.java      |  11 +-
 .../java/org/apache/tajo/master/TajoMaster.java | 662 +++----------------
 .../java/org/apache/tajo/util/ClassUtil.java    | 155 +++++
 .../main/java/org/apache/tajo/util/JSPUtil.java |  15 +
 .../resources/webapps/admin/catalogview.jsp     |  14 +
 .../main/resources/webapps/admin/functions.jsp  |  77 +++
 100 files changed, 1607 insertions(+), 738 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index e75c1e8..19a445a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -117,7 +117,10 @@ Release 0.8.0 - unreleased
 
   IMPROVEMENTS
 
-    TAJO-499: Shorten the length of classpath in shell command. 
+    TAJO-409: Add explored and explained annotations to Tajo function system.
+    (SeongHwa Ahn via hyunsik)
+
+    TAJO-499: Shorten the length of classpath in shell command.
     (hyoungjunkim via hyunsik)
 
     TAJO-483: Add getParentCount(), getParents(), getParent() functions to DirectedGraph. 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/AbstractCatalogClient.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/AbstractCatalogClient.java b/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/AbstractCatalogClient.java
index 44ac8f4..9241806 100644
--- a/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/AbstractCatalogClient.java
+++ b/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/AbstractCatalogClient.java
@@ -25,7 +25,9 @@ import org.apache.tajo.catalog.CatalogProtocol.CatalogProtocolService;
 import org.apache.tajo.catalog.proto.CatalogProtos.*;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.conf.TajoConf;
-import org.apache.tajo.rpc.*;
+import org.apache.tajo.rpc.NettyClientBase;
+import org.apache.tajo.rpc.RpcConnectionPool;
+import org.apache.tajo.rpc.ServerCallable;
 import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.NullProto;
 import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.StringProto;
 
@@ -326,6 +328,10 @@ public abstract class AbstractCatalogClient implements CatalogService {
       LOG.error(e.getMessage(), e);
       return null;
     }
+    if(descProto == null) {
+      LOG.error("No matched function:" + signature + "," + funcType + "," + paramTypes);
+      return null;
+    }
     try {
       return new FunctionDesc(descProto);
     } catch (ClassNotFoundException e) {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FunctionDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FunctionDesc.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FunctionDesc.java
index c64ac45..b0bc68d 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FunctionDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FunctionDesc.java
@@ -40,34 +40,47 @@ public class FunctionDesc implements ProtoObject<FunctionDescProto>, Cloneable,
   @Expose private FunctionType funcType;
   @Expose private DataType returnType;
   @Expose private DataType [] params;
+  @Expose private String description;
+  @Expose private String detail;
+  @Expose private String example;
 
   public FunctionDesc() {
   }
 
   public FunctionDesc(String signature, Class<? extends Function> clazz,
-      FunctionType funcType, DataType retType, DataType [] params) {
+      FunctionType funcType, DataType retType,
+      DataType [] params) {
     this.signature = signature.toLowerCase();
     this.funcClass = clazz;
     this.funcType = funcType;
     this.returnType = retType;
     this.params = params;
   }
-  
+
   public FunctionDesc(FunctionDescProto proto) throws ClassNotFoundException {
     this(proto.getSignature(), proto.getClassName(), proto.getType(),
         proto.getReturnType(),
         proto.getParameterTypesList().toArray(new DataType[proto.getParameterTypesCount()]));
+    if (proto.hasDescription()) {
+      this.description = proto.getDescription();
+    }
+    if (proto.hasDetail()) {
+      this.detail = proto.getDetail();
+    }
+    if (proto.hasExample()) {
+      this.example = proto.getExample();
+    }
   }
 
   public FunctionDesc(String signature, String className, FunctionType type,
-                      DataType retType, DataType... argTypes) throws ClassNotFoundException {
-    this(signature, (Class<? extends Function>) Class.forName(className), type,
-        retType, argTypes);
+                      DataType retType,
+                      DataType... argTypes) throws ClassNotFoundException {
+    this(signature, (Class<? extends Function>) Class.forName(className), type, retType, argTypes);
   }
 
   /**
    * 
-   * @return 함수 인스턴스
+   * @return Function Instance
    * @throws org.apache.tajo.exception.InternalException
    */
   public Function newInstance() throws InternalException {
@@ -100,6 +113,30 @@ public class FunctionDesc implements ProtoObject<FunctionDescProto>, Cloneable,
     return this.returnType;
   }
 
+  public String getDescription() {
+    return description;
+  }
+
+  public String getDetail() {
+    return detail;
+  }
+
+  public String getExample() {
+    return example;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public void setDetail(String detail) {
+    this.detail = detail;
+  }
+
+  public void setExample(String example) {
+    this.example = example;
+  }
+
   @Override
   public int hashCode() {
     return Objects.hashCode(signature, params);
@@ -121,6 +158,9 @@ public class FunctionDesc implements ProtoObject<FunctionDescProto>, Cloneable,
     
     desc.signature = this.signature;
     desc.params = params.clone();
+    desc.description = this.description;
+    desc.example = this.example;
+    desc.detail = this.detail;
     desc.returnType = this.returnType;
     desc.funcClass = this.funcClass;
     
@@ -138,7 +178,15 @@ public class FunctionDesc implements ProtoObject<FunctionDescProto>, Cloneable,
     builder.setClassName(this.funcClass.getName());
     builder.setType(this.funcType);
     builder.setReturnType(this.returnType);
-
+    if(this.description != null) {
+      builder.setDescription(this.description);
+    }
+    if (this.detail != null) {
+      builder.setDetail(this.detail);
+    }
+    if (this.example != null) {
+      builder.setExample(this.example);
+    }
     if (this.params != null) { // repeated field
       builder.addAllParameterTypes(Arrays.asList(params));
     }
@@ -153,4 +201,8 @@ public class FunctionDesc implements ProtoObject<FunctionDescProto>, Cloneable,
   public String toJson() {
     return CatalogGsonHelper.toJson(this, FunctionDesc.class);
   }
+
+  public String getHelpSignature() {
+    return returnType.getType() + " " + CatalogUtil.getCanonicalName(signature, getParamTypes());
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/Function.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/Function.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/Function.java
index 6d3feff..562f064 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/Function.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/function/Function.java
@@ -20,6 +20,7 @@ package org.apache.tajo.catalog.function;
 
 import com.google.common.base.Objects;
 import com.google.gson.annotations.Expose;
+import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.json.CatalogGsonHelper;
@@ -59,4 +60,6 @@ public abstract class Function<T extends Datum> implements Cloneable, GsonObject
   public String toJson() {
     return CatalogGsonHelper.toJson(this, Function.class);
   }
+
+  public abstract CatalogProtos.FunctionType getFunctionType();
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto b/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
index 8180812..beff4c7 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
+++ b/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
@@ -131,6 +131,9 @@ message FunctionDescProto {
 	required FunctionType type = 3;
 	repeated DataType parameterTypes = 4;
 	required DataType returnType = 5;
+  optional string description = 6;
+  optional string example = 7;
+  optional string detail = 8;
 }
 
 message IndexDescProto {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestFunctionDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestFunctionDesc.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestFunctionDesc.java
index b30cbba..53a6796 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestFunctionDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestFunctionDesc.java
@@ -20,6 +20,7 @@ package org.apache.tajo.catalog;
 
 import org.apache.tajo.catalog.function.Function;
 import org.apache.tajo.catalog.json.CatalogGsonHelper;
+import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.catalog.proto.CatalogProtos.FunctionDescProto;
 import org.apache.tajo.catalog.proto.CatalogProtos.FunctionType;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -32,6 +33,7 @@ import java.io.File;
 import java.io.IOException;
 
 import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
 
 public class TestFunctionDesc {
   private static final String TEST_PATH = "target/test-data/TestFunctionDesc";
@@ -48,6 +50,11 @@ public class TestFunctionDesc {
     public String toJSON() {
       return CatalogGsonHelper.toJson(this, Function.class);
     }
+
+    @Override
+    public CatalogProtos.FunctionType getFunctionType() {
+      return FunctionType.GENERAL;
+    }
   }
 
 
@@ -56,6 +63,10 @@ public class TestFunctionDesc {
     FunctionDesc desc = new FunctionDesc("sum", TestSum.class, FunctionType.GENERAL,
         CatalogUtil.newSimpleDataType(Type.INT4),
         CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.INT8));
+    desc.setDescription("desc");
+    desc.setExample("example");
+    desc.setDetail("detail");
+
     assertEquals("sum", desc.getSignature());
     assertEquals(TestSum.class, desc.getFuncClass());
     assertEquals(FunctionType.GENERAL, desc.getFuncType());
@@ -71,10 +82,12 @@ public class TestFunctionDesc {
     proto = (FunctionDescProto) FileUtil.loadProto(save, proto);
 
     FunctionDesc newDesc = new FunctionDesc(proto);
+
     assertEquals("sum", newDesc.getSignature());
     assertEquals(TestSum.class, newDesc.getFuncClass());
     assertEquals(FunctionType.GENERAL, newDesc.getFuncType());
     assertEquals(Type.INT4, newDesc.getReturnType().getType());
+
     assertArrayEquals(CatalogUtil.newSimpleDataTypeArray(Type.INT4, Type.INT8),
         newDesc.getParamTypes());
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
index 3abbb81..00417f8 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
@@ -153,6 +153,10 @@ public class TestCatalog {
 					}
 			);
 		}
+
+    public CatalogProtos.FunctionType getFunctionType() {
+      return FunctionType.GENERAL;
+    }
 	}
 
   public static class TestFunc2 extends Function {
@@ -164,6 +168,9 @@ public class TestCatalog {
           }
       );
     }
+    public CatalogProtos.FunctionType getFunctionType() {
+      return FunctionType.GENERAL;
+    }
   }
 
 	@Test

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/AggFunction.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/AggFunction.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/AggFunction.java
index ebbf6e6..a5a2583 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/AggFunction.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/AggFunction.java
@@ -21,6 +21,7 @@ package org.apache.tajo.engine.function;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.function.Function;
 import org.apache.tajo.catalog.json.CatalogGsonHelper;
+import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.storage.Tuple;
@@ -49,4 +50,9 @@ public abstract class AggFunction<T extends Datum> extends Function<T> {
   public String toJson() {
     return CatalogGsonHelper.toJson(this, AggFunction.class);
   }
+
+  @Override
+  public CatalogProtos.FunctionType getFunctionType() {
+    return CatalogProtos.FunctionType.AGGREGATION;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/Country.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/Country.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/Country.java
index 672a358..9e28b55 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/Country.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/Country.java
@@ -19,16 +19,26 @@
 package org.apache.tajo.engine.function;
 
 import org.apache.tajo.catalog.Column;
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.TextDatum;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.GeoUtil;
 
 import static org.apache.tajo.common.TajoDataTypes.Type.TEXT;
 
+@Description(
+  functionName = "country",
+  description = "Returns country code.",
+  example = "",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class Country extends GeneralFunction {
 
   public Country() {
-    super(new Column[] {new Column("addr", TEXT)});
+    super(new Column[] {new Column("string", TEXT)});
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/GeneralFunction.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/GeneralFunction.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/GeneralFunction.java
index aa43b12..f7c31a1 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/GeneralFunction.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/GeneralFunction.java
@@ -21,6 +21,7 @@ package org.apache.tajo.engine.function;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.function.Function;
 import org.apache.tajo.catalog.json.CatalogGsonHelper;
+import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.engine.eval.FunctionEval;
 import org.apache.tajo.json.GsonObject;
@@ -47,4 +48,9 @@ public abstract class GeneralFunction extends Function implements GsonObject {
   public String toJson() {
     return CatalogGsonHelper.toJson(this, GeneralFunction.class);
   }
+
+  @Override
+  public CatalogProtos.FunctionType getFunctionType() {
+    return CatalogProtos.FunctionType.GENERAL;
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/InCountry.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/InCountry.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/InCountry.java
index 3cc9efa..1cac624 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/InCountry.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/InCountry.java
@@ -22,13 +22,22 @@ import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.BooleanDatum;
 import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.GeoUtil;
 
+@Description(
+  functionName = "in_country",
+  description = "",
+  example = "",
+  returnType = TajoDataTypes.Type.BOOLEAN,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT})}
+)
 public class InCountry extends GeneralFunction {
 
   public InCountry() {
-    super(new Column[] {new Column("addr", TajoDataTypes.Type.TEXT),
+    super(new Column[] {new Column("string", TajoDataTypes.Type.TEXT),
         new Column("code", TajoDataTypes.Type.TEXT)});
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/Description.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/Description.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/Description.java
new file mode 100644
index 0000000..bc6c7a2
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/Description.java
@@ -0,0 +1,50 @@
+/**
+ * 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.tajo.engine.function.annotation;
+
+import org.apache.tajo.common.TajoDataTypes.Type;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Description.
+ *
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface Description {
+
+  String description();
+
+  String detail() default "";
+
+  String example();
+
+  String functionName();
+
+  String[] synonyms() default {};
+
+  Type returnType();
+
+  ParamTypes[] paramTypes() default @ParamTypes;
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/ParamOptionTypes.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/ParamOptionTypes.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/ParamOptionTypes.java
new file mode 100644
index 0000000..0ef7f4c
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/ParamOptionTypes.java
@@ -0,0 +1,29 @@
+/**
+ * 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.tajo.engine.function.annotation;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ParamOptionTypes {
+  TajoDataTypes.Type[] paramOptionTypes() default {};
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/ParamTypes.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/ParamTypes.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/ParamTypes.java
new file mode 100644
index 0000000..ed2545c
--- /dev/null
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/annotation/ParamTypes.java
@@ -0,0 +1,30 @@
+/**
+ * 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.tajo.engine.function.annotation;
+
+import org.apache.tajo.common.TajoDataTypes.Type;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ParamTypes {
+  Type[] paramTypes() default { Type.NULL_TYPE };
+  ParamOptionTypes[] paramOptionTypes() default {};
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
index 5bae257..df5cc80 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
@@ -27,14 +27,23 @@ import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.ProtobufDatum;
 import org.apache.tajo.engine.function.AggFunction;
 import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 import static org.apache.tajo.InternalTypes.AvgDoubleProto;
 
+@Description(
+  functionName = "avg",
+  description = "The mean of a set of numbers.",
+  example = "> SELECT avg(expr);",
+  returnType = Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {Type.FLOAT8})}
+)
 public class AvgDouble extends AggFunction {
   public AvgDouble() {
     super(new Column[] {
-        new Column("val", Type.FLOAT8)
+        new Column("expr", Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
index 9fc5ed9..4a30036 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
@@ -18,9 +18,19 @@
 
 package org.apache.tajo.engine.function.builtin;
 
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "avg",
+  description = "The mean of a set of numbers.",
+  example = "> SELECT avg(expr);",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4})}
+)
 public class AvgFloat extends AvgDouble {
 
   public AvgFloat() {
@@ -32,4 +42,5 @@ public class AvgFloat extends AvgDouble {
     avgCtx.sum += params.get(0).asFloat4();
     avgCtx.count++;
   }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
index 338903a..3c59f13 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
@@ -18,9 +18,19 @@
 
 package org.apache.tajo.engine.function.builtin;
 
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "avg",
+  description = "the mean of a set of numbers.",
+  example = "> SELECT avg(expr);",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.INT4})}
+)
 public class AvgInt extends AvgLong {
 
   public AvgInt() {
@@ -33,4 +43,5 @@ public class AvgInt extends AvgLong {
     avgCtx.sum += params.get(0).asInt4();
     avgCtx.count++;
   }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
index 86fc709..5bb5ff9 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
@@ -28,15 +28,24 @@ import org.apache.tajo.datum.Float8Datum;
 import org.apache.tajo.datum.ProtobufDatum;
 import org.apache.tajo.engine.function.AggFunction;
 import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 import static org.apache.tajo.InternalTypes.AvgLongProto;
 
+@Description(
+  functionName = "avg",
+  description = "the mean of a set of numbers",
+  example = "> SELECT avg(expr);",
+  returnType = Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {Type.INT8})}
+)
 public class AvgLong extends AggFunction<Float8Datum> {
 
   public AvgLong() {
     super(new Column[] {
-        new Column("val", Type.FLOAT8)
+        new Column("expr", Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
index 722d8b7..aa1d941 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
@@ -20,15 +20,24 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Int8Datum;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "count",
+  description = "the total number of retrieved rows",
+  example = "> SELECT count(*);",
+  returnType = Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {})}
+)
 public class CountRows extends AggFunction<Datum> {
 
   public CountRows() {

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
index 5959197..12d8892 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
@@ -19,19 +19,29 @@
 package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.NullDatum;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
  * Count(column) function
  */
+@Description(
+  functionName = "count",
+  description = "The number of retrieved rows for "
+          + "which the supplied expressions are non-NULL",
+  example = "> SELECT count(expr);",
+  returnType = Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {Type.ANY})}
+)
 public final class CountValue extends CountRows {
 
   public CountValue() {
     super(new Column[] {
-        new Column("col", Type.ANY)
+        new Column("expr", Type.ANY)
     });
   }
 
@@ -41,4 +51,5 @@ public final class CountValue extends CountRows {
       ((CountRowContext) ctx).count++;
     }
   }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
index 4c4900b..c0f5ec3 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
@@ -19,22 +19,33 @@
 package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Int8Datum;
 import org.apache.tajo.datum.NullDatum;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
  * Count(distinct column) function
  */
+@Description(
+  functionName = "count",
+  description = " The number of rows for "
+          + "which the supplied expressions are unique and non-NULL.",
+  example = "> SELECT count(expr);",
+  returnType = Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {Type.ANY})}
+)
 public final class CountValueDistinct extends CountRows {
 
   public CountValueDistinct() {
     super(new Column[] {
-        new Column("col", Type.ANY)
+        new Column("expr", Type.ANY)
     });
   }
 
@@ -71,4 +82,9 @@ public final class CountValueDistinct extends CountRows {
     long count = 0;
     Datum latest = null;
   }
+
+  @Override
+  public CatalogProtos.FunctionType getFunctionType() {
+    return CatalogProtos.FunctionType.DISTINCT_AGGREGATION;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Date.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
index cbc789c..7666e89 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
@@ -21,9 +21,12 @@ package org.apache.tajo.engine.function.builtin;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Int8Datum;
+import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 import java.text.ParseException;
@@ -31,12 +34,19 @@ import java.text.SimpleDateFormat;
 
 import static org.apache.tajo.common.TajoDataTypes.Type.TEXT;
 
+@Description(
+  functionName = "date",
+  description = "Extracts the date part of the date or datetime expression expr.",
+  example = "> SELECT date(expr);",
+  returnType = TajoDataTypes.Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.INT4})}
+)
 public class Date extends GeneralFunction {
   private final Log LOG = LogFactory.getLog(Date.class);
   private final static String dateFormat = "dd/MM/yyyy HH:mm:ss";
 
   public Date() {
-    super(new Column[] {new Column("val", TEXT)});
+    super(new Column[] {new Column("expr", TEXT)});
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxDouble.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxDouble.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxDouble.java
index 38fb14d..5c9ceb1 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxDouble.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxDouble.java
@@ -20,20 +20,29 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Float8Datum;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "max",
+  description = "the maximum value of expr",
+  example = "> SELECT max(expr);",
+  returnType = Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {Type.FLOAT8})}
+)
 public class MaxDouble extends AggFunction<Float8Datum> {
 
   public MaxDouble() {
     super(new Column[] {
-        new Column("val", Type.FLOAT8)
+        new Column("expr", Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxFloat.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxFloat.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxFloat.java
index c3c29f7..067026d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxFloat.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxFloat.java
@@ -20,18 +20,27 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "max",
+  description = "the maximum value of expr",
+  example = "> SELECT max(expr);",
+  returnType = Type.FLOAT4,
+  paramTypes = {@ParamTypes(paramTypes = {Type.FLOAT4})}
+)
 public class MaxFloat extends AggFunction<Datum> {
   public MaxFloat() {
     super(new Column[] {
-        new Column("val", Type.FLOAT8)
+        new Column("expr", Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxInt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxInt.java
index be18858..a329390 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxInt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxInt.java
@@ -20,19 +20,28 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "max",
+  description = "the maximum value of expr",
+  example = "> SELECT max(expr);",
+  returnType = Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {Type.INT4})}
+)
 public class MaxInt extends AggFunction<Datum> {
 
   public MaxInt() {
     super(new Column[] {
-        new Column("val", Type.INT8)
+        new Column("expr", Type.INT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxLong.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxLong.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxLong.java
index 7f82f06..71bab1a 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxLong.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MaxLong.java
@@ -20,19 +20,28 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Int8Datum;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "max",
+  description = "the maximum value of expr",
+  example = "> SELECT max(expr);",
+  returnType = Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {Type.INT8})}
+)
 public class MaxLong extends AggFunction<Int8Datum> {
   public MaxLong() {
     super(new Column[] {
-        new Column("val", Type.INT8)
+        new Column("expr", Type.INT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinDouble.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinDouble.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinDouble.java
index fa54c8b..7b9e0ab 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinDouble.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinDouble.java
@@ -20,19 +20,28 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "min",
+  description = "the minimum value of expr",
+  example = "> SELECT min(expr);",
+  returnType = Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {Type.FLOAT8})}
+)
 public class MinDouble extends AggFunction<Datum> {
 
   public MinDouble() {
     super(new Column[] {
-        new Column("val", Type.FLOAT8)
+        new Column("expr", Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinFloat.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinFloat.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinFloat.java
index 1e9def1..95a97be 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinFloat.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinFloat.java
@@ -20,20 +20,29 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Float4Datum;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "min",
+  description = "the minimum value of expr",
+  example = "> SELECT min(expr);",
+  returnType = Type.FLOAT4,
+  paramTypes = {@ParamTypes(paramTypes = {Type.FLOAT4})}
+)
 public class MinFloat extends AggFunction<Float4Datum> {
 
   public MinFloat() {
     super(new Column[] {
-        new Column("val", Type.FLOAT4)
+        new Column("expr", Type.FLOAT4)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinInt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinInt.java
index e4184e0..24b379a 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinInt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinInt.java
@@ -20,19 +20,28 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "min",
+  description = "the minimum value of expr",
+  example = "> SELECT min(expr);",
+  returnType = Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {Type.INT4})}
+)
 public class MinInt extends AggFunction<Datum> {
 
   public MinInt() {
     super(new Column[] {
-        new Column("val", Type.INT8)
+        new Column("expr", Type.INT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinLong.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinLong.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinLong.java
index 6cc854f..ad9ebfa 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinLong.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinLong.java
@@ -20,20 +20,29 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Int8Datum;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "min",
+  description = "the minimum value of expr",
+  example = "> SELECT min(expr);",
+  returnType = Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {Type.INT8})}
+)
 public class MinLong extends AggFunction<Datum> {
 
   public MinLong() {
     super(new Column[] {
-        new Column("val", Type.INT8)
+        new Column("expr", Type.INT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinString.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinString.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinString.java
index 5364540..cbf214e 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinString.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/MinString.java
@@ -20,20 +20,29 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.TextDatum;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "min",
+  description = "the minimum value of expr",
+  example = "> SELECT min(expr);",
+  returnType = Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {Type.TEXT})}
+)
 public class MinString extends AggFunction<Datum> {
 
   public MinString() {
     super(new Column[] {
-        new Column("val", Type.TEXT)
+        new Column("expr", Type.TEXT)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java
index 304bd44..bdcf485 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/RandomInt.java
@@ -19,21 +19,32 @@
 package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 import java.util.Random;
 
 import static org.apache.tajo.common.TajoDataTypes.Type.INT4;
 
+@Description(
+  functionName = "random",
+  description = "A pseudorandom number",
+  example = "> SELECT random(10);\n"
+          + "4",
+  returnType = TajoDataTypes.Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.INT4})}
+)
 public class RandomInt extends GeneralFunction {
   private Random random;
 
   public RandomInt() {
     super(new Column[] {
-        new Column("val", INT4)
+        new Column("n", INT4)
     });
     random = new Random(System.nanoTime());
   }
@@ -42,4 +53,5 @@ public class RandomInt extends GeneralFunction {
   public Datum eval(Tuple params) {
     return DatumFactory.createInt4(random.nextInt(params.get(0).asInt4()));
   }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java
index 09b1ab2..ece7487 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumDouble.java
@@ -20,20 +20,34 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Float8Datum;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+/**
+ * Function definition
+ *
+ * FLOAT8 sum(value FLOAT8)
+ */
+@Description(
+  functionName = "sum",
+  description = "the sum of a set of numbers",
+  example = "> SELECT sum(expr);",
+  returnType = Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {Type.FLOAT8})}
+)
 public class SumDouble extends AggFunction<Datum> {
 
   public SumDouble() {
     super(new Column[] {
-        new Column("val", Type.FLOAT8)
+        new Column("expr", Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java
index 96b45ba..10fd720 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumFloat.java
@@ -20,18 +20,32 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+/**
+ * Function definition
+ *
+ * FLOAT4 sum(value FLOAT4)
+ */
+@Description(
+  functionName = "sum",
+  description = "the sum of a set of numbers",
+  example = "> SELECT sum(expr);",
+  returnType = Type.FLOAT4,
+  paramTypes = {@ParamTypes(paramTypes = {Type.FLOAT4})}
+)
 public class SumFloat extends AggFunction<Datum> {
   public SumFloat() {
     super(new Column[] {
-        new Column("val", Type.FLOAT4)
+        new Column("expr", Type.FLOAT4)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumInt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumInt.java
index 5797d6d..fff3a23 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumInt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumInt.java
@@ -20,19 +20,33 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+/**
+ * Function definition
+ *
+ * INT4 sum(value INT4)
+ */
+@Description(
+  functionName = "sum",
+  description = "the sum of a set of numbers",
+  example = "> SELECT sum(expr);",
+  returnType = Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {Type.INT4})}
+)
 public class SumInt extends AggFunction<Datum> {
 
   public SumInt() {
     super(new Column[] {
-        new Column("val", Type.INT4)
+        new Column("expr", Type.INT4)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java
index fe33b62..894348d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/SumLong.java
@@ -20,20 +20,34 @@ package org.apache.tajo.engine.function.builtin;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
-import org.apache.tajo.engine.function.AggFunction;
-import org.apache.tajo.engine.function.FunctionContext;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.Int8Datum;
+import org.apache.tajo.engine.function.AggFunction;
+import org.apache.tajo.engine.function.FunctionContext;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+/**
+ * Function definition
+ *
+ * INT8 sum(value INT8)
+ */
+@Description(
+  functionName = "sum",
+  description = "the sum of a set of numbers",
+  example = "> SELECT sum(expr);",
+  returnType = Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {Type.INT8})}
+)
 public class SumLong extends AggFunction<Datum> {
 
   public SumLong() {
     super(new Column[] {
-        new Column("val", Type.INT8)
+        new Column("expr", Type.INT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Today.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Today.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Today.java
index e283c2f..157e545 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Today.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/builtin/Today.java
@@ -18,16 +18,25 @@
 
 package org.apache.tajo.engine.function.builtin;
 
-import org.apache.tajo.catalog.Column;
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
+@Description(
+  functionName = "today",
+  description = "get current time millis",
+  example = "> SELECT today();",
+  returnType = TajoDataTypes.Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {})}
+)
 public class Today extends GeneralFunction {
 
   public Today() {
-    super(new Column[] {});
+    super(NoArgs);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java
index a3fd1f3..2a74ff5 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java
@@ -19,12 +19,15 @@
 package org.apache.tajo.engine.function.datetime;
 
 import org.apache.tajo.catalog.Column;
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.engine.eval.FunctionEval;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
@@ -32,6 +35,14 @@ import org.joda.time.format.DateTimeFormatter;
 import static org.apache.tajo.common.TajoDataTypes.Type.INT8;
 import static org.apache.tajo.common.TajoDataTypes.Type.TEXT;
 
+@Description(
+  functionName = "to_char",
+  description = "Convert time stamp to string",
+  example = "> SELECT to_char(1389071652, 'yyyy-MM');\n"
+          + "2014-01",
+  returnType = TajoDataTypes.Type.TEXT,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TIMESTAMP, TajoDataTypes.Type.TEXT})}
+)
 public class ToCharTimestamp extends GeneralFunction {
   private boolean constantFormat;
   private DateTimeFormatter formatter;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestamp.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestamp.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestamp.java
index 6779b85..1cf6870 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestamp.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestamp.java
@@ -19,20 +19,31 @@
 package org.apache.tajo.engine.function.datetime;
 
 import org.apache.tajo.catalog.Column;
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 import static org.apache.tajo.common.TajoDataTypes.Type.INT4;
 
+@Description(
+  functionName = "to_timestamp",
+  description = "Convert UNIX epoch to time stamp",
+  example = "> SELECT to_timestamp(1389071574);\n"
+        + "2014-01-07 14:12:54",
+  returnType = TajoDataTypes.Type.TIMESTAMP,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.INT4}),
+      @ParamTypes(paramTypes = {TajoDataTypes.Type.INT8})}
+)
 public class ToTimestamp extends GeneralFunction {
   public ToTimestamp() {
     super(new Column[] {new Column("timestamp", INT4)});
   }
 
-
   @Override
   public Datum eval(Tuple params) {
     Datum value = params.get(0);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsDouble.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsDouble.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsDouble.java
index cde4be7..1ff2f29 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsDouble.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsDouble.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * FLOAT8 abs(value FLOAT8)
  */
+@Description(
+  functionName = "abs",
+  description = "Absolute value",
+  detail = "",
+  example = "> SELECT abs(-10);\n"
+          + "10",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class AbsDouble extends GeneralFunction {
   public AbsDouble() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.FLOAT8)
+      new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsFloat.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsFloat.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsFloat.java
index 08ea90a..4e3f54c 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsFloat.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsFloat.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * FLOAT4 abs(value FLOAT4)
  */
+@Description(
+  functionName = "abs",
+  description = "Absolute value",
+  detail = "",
+  example = "> SELECT abs(-10);\n"
+      + "10",
+  returnType = TajoDataTypes.Type.FLOAT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4})}
+)
 public class AbsFloat extends GeneralFunction {
   public AbsFloat() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.FLOAT4)
+      new Column("x", TajoDataTypes.Type.FLOAT4)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsInt.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsInt.java
index 4f76162..b1fb79e 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsInt.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsInt.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * INT4 abs(value INT4)
  */
+@Description(
+  functionName = "abs",
+  description = "Absolute value",
+  detail = "",
+  example = "> SELECT abs(-10);\n"
+      + "10",
+  returnType = TajoDataTypes.Type.INT4,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.INT4})}
+)
 public class AbsInt extends GeneralFunction {
   public AbsInt() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.INT4)
+      new Column("x", TajoDataTypes.Type.INT4)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsLong.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsLong.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsLong.java
index 9b42417..cdb5a29 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsLong.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/AbsLong.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,18 @@ import org.apache.tajo.storage.Tuple;
  *
  * INT8 abs(value INT8)
  */
+@Description(
+  functionName = "abs",
+  description = "Absolute value",
+  example = "> SELECT abs(-10);\n"
+      + "10",
+  returnType = TajoDataTypes.Type.INT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.INT8})}
+)
 public class AbsLong extends GeneralFunction {
   public AbsLong() {
     super(new Column[] {
-      new Column("value", TajoDataTypes.Type.INT8)
+      new Column("x", TajoDataTypes.Type.INT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Acos.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Acos.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Acos.java
index 3c12bfb..f1f2804 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Acos.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Acos.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * Float8 acos(value FLOAT8)
  */
+@Description(
+  functionName = "acos",
+  description = "Inverse cosine.",
+  detail = "",
+  example = "> SELECT acos(x);",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Acos extends GeneralFunction {
   public Acos() {
     super(new Column[] {
-        new Column("value", TajoDataTypes.Type.FLOAT8)
+        new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Asin.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Asin.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Asin.java
index 9357a1a..6f6c905 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Asin.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Asin.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,18 @@ import org.apache.tajo.storage.Tuple;
  *
  * Float8 asin(value FLOAT8)
  */
+@Description(
+  functionName = "asin",
+  description = "Inverse sine.",
+  example = "> SELECT asin(x);",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Asin extends GeneralFunction {
   public Asin() {
     super(new Column[] {
-        new Column("value", TajoDataTypes.Type.FLOAT8)
+        new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Atan.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Atan.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Atan.java
index c628a26..9e70ae3 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Atan.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Atan.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,18 @@ import org.apache.tajo.storage.Tuple;
  *
  * Float8 atan(value FLOAT8)
  */
+@Description(
+  functionName = "atan",
+  description = "Inverse tangent.",
+  example = "> SELECT atan(x);",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8})}
+)
 public class Atan extends GeneralFunction {
   public Atan() {
     super(new Column[] {
-        new Column("value", TajoDataTypes.Type.FLOAT8)
+        new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/d04f9a56/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Atan2.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Atan2.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Atan2.java
index 99908e7..bc2764c 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Atan2.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/function/math/Atan2.java
@@ -24,6 +24,8 @@ import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.GeneralFunction;
+import org.apache.tajo.engine.function.annotation.Description;
+import org.apache.tajo.engine.function.annotation.ParamTypes;
 import org.apache.tajo.storage.Tuple;
 
 /**
@@ -31,10 +33,19 @@ import org.apache.tajo.storage.Tuple;
  *
  * Float8 atan2(value FLOAT8, value FLOAT8)
  */
+@Description(
+  functionName = "atan2",
+  description = "Inverse tangent of y/x.",
+  example = "> SELECT atan(y,x);",
+  returnType = TajoDataTypes.Type.FLOAT8,
+  paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT4, TajoDataTypes.Type.FLOAT4}),
+          @ParamTypes(paramTypes = {TajoDataTypes.Type.FLOAT8, TajoDataTypes.Type.FLOAT8})}
+)
 public class Atan2 extends GeneralFunction {
   public Atan2() {
     super(new Column[] {
-        new Column("value", TajoDataTypes.Type.FLOAT8)
+        new Column("y", TajoDataTypes.Type.FLOAT8),
+        new Column("x", TajoDataTypes.Type.FLOAT8)
     });
   }