[NO ISSUE][COMP] Support SQL++ varargs UDFs

- user model changes: yes
- storage format changes: no
- interface changes: no

Details:
- Support SQL++ user defined functions with
  variable number of arguments
- Add testcases

Change-Id: Icd4257c77d33d69f0018424922b2e8112b8d7eed
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/8803
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Dmitry Lychagin <dmitry.lychagin@couchbase.com>
Reviewed-by: Ian Maxon <imaxon@uci.edu>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index ec43870..607e23a 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -207,6 +207,7 @@
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.algebricks.common.utils.Triple;
 import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression.FunctionKind;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.data.IAWriterFactory;
 import org.apache.hyracks.algebricks.data.IResultSerializerFactoryProvider;
 import org.apache.hyracks.algebricks.runtime.serializer.ResultSerializerFactoryProvider;
@@ -2040,6 +2041,10 @@
             Map<TypeSignature, Datatype> newInlineTypes;
             Function function;
             if (cfs.isExternal()) {
+                if (functionSignature.getArity() == FunctionIdentifier.VARARGS) {
+                    throw new CompilationException(ErrorCode.COMPILATION_ERROR, cfs.getSourceLocation(),
+                            "Variable number of parameters is not supported for external functions");
+                }
                 List<Pair<VarIdentifier, TypeExpression>> paramList = cfs.getParameters();
                 int paramCount = paramList.size();
                 List<String> paramNames = new ArrayList<>(paramCount);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.1.ddl.sqlpp
similarity index 65%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.1.ddl.sqlpp
index f301fc6..76cc70d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.1.ddl.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -16,23 +16,5 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-/*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
- */
-
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
-
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+DROP DATAVERSE externallibtest if exists;
+CREATE DATAVERSE  externallibtest;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.2.lib.sqlpp
similarity index 65%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.2.lib.sqlpp
index f301fc6..3dc6eb6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.2.lib.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -16,23 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-/*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
- */
-
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
-
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+install externallibtest testlib admin admin target/data/externallib/asterix-external-data-testlib.zip
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.3.ddl.sqlpp
similarity index 66%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.3.ddl.sqlpp
index f301fc6..dd90769 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.3.ddl.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -18,21 +18,8 @@
  */
 
 /*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
+ * Error: External varargs functions are not yet supported
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
-
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+create function externallibtest.f(...)
+  as "org.apache.asterix.external.library.OpenCapitalFinderFactory" at testlib;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-1/bad-function-ddl-1.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-1/bad-function-ddl-1.1.ddl.sqlpp
index 36eed22..bd20a74 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-1/bad-function-ddl-1.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-1/bad-function-ddl-1.1.ddl.sqlpp
@@ -18,7 +18,7 @@
  */
 
 /*
- * Description  : Declare a UDF on a dataset that does not exist
+ * Description  : Declare a non-varargs UDF on a dataset that does not exist
  * Expected Res : Error
  */
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-1/bad-function-ddl-1.2.ddl.sqlpp
similarity index 65%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-1/bad-function-ddl-1.2.ddl.sqlpp
index f301fc6..c4b5967 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-1/bad-function-ddl-1.2.ddl.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -18,21 +18,17 @@
  */
 
 /*
- * Description  : Try to drop a functional dependency
+ * Description  : Declare a varargs UDF on a dataset that does not exist
  * Expected Res : Error
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+drop dataverse experiments2 if exists;
+create dataverse experiments2;
+use experiments2;
 
-create function f1(message, text){
-  contains(message,text)
+create function bad_function2(...) {
+  (select m.message_text
+  from TweetMessages2 m
+  where contains(m.message_text,args[1])
+  and spatial_intersect(m.sender_location, args[0]))
 };
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-11/bad-function-ddl-11.3.ddl.sqlpp
similarity index 68%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-11/bad-function-ddl-11.3.ddl.sqlpp
index f301fc6..6f92b84 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-11/bad-function-ddl-11.3.ddl.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -18,21 +18,14 @@
  */
 
 /*
- * Description  : Try to drop a functional dependency
+ * Description  : Return type definition is prohibited for inline varargs functions
  * Expected Res : Error
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+drop dataverse experiments3 if exists;
+create dataverse experiments3;
+use experiments3;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+create function myfn003(...) returns string {
+  args[0]
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.1.ddl.sqlpp
index f3b0c0f..5418988 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.1.ddl.sqlpp
@@ -18,7 +18,7 @@
  */
 
 /*
- * Description  : Declare a UDF that uses a function that does not exist
+ * Description  : Declare a non-varargs UDF that uses a function that does not exist
  * Expected Res : Error
  */
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.2.ddl.sqlpp
similarity index 68%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.2.ddl.sqlpp
index f301fc6..59ea86c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.2.ddl.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -18,21 +18,15 @@
  */
 
 /*
- * Description  : Try to drop a functional dependency
+ * Description  : Declare a varargs UDF that uses a function that does not exist
  * Expected Res : Error
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+drop dataverse experiments2 if exists;
+create dataverse experiments2;
+use experiments2;
 
-create function f1(message, text){
-  contains(message,text)
-};
 
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+create function bad_function2(...) {
+  function_that_does_not_exist()
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.4.ddl.sqlpp
similarity index 64%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.4.ddl.sqlpp
index f301fc6..0fe609b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.4.ddl.sqlpp
@@ -16,23 +16,36 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
+ * Description  : Verify Function Dependency Metadata for vararg functions
+ * Expected Res : Success
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+drop dataverse X if exists;
+drop dataverse Y if exists;
+create dataverse X;
+create dataverse Y;
 
-create function f1(message, text){
-  contains(message,text)
+use X;
+
+create function fx1(a) {
+  upper(a)
 };
 
-create function f0(message, text){
-  C.f1(message,text)
+create function fx2(...) {
+  string_join(args, ".")
 };
 
-drop function f1(message, text);
\ No newline at end of file
+create function fx3(a, b, c) {
+  fx1(a) || fx2(b, c)
+};
+
+use Y;
+
+create function fy1(a) {
+  lower(a)
+};
+
+create function fy3(a, b, c) {
+  fy1(a) || X.fx2(b, c)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.5.query.sqlpp
similarity index 71%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.5.query.sqlpp
index f301fc6..8f6fac0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.5.query.sqlpp
@@ -16,23 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
+ * Description  : Verify Function Dependency Metadata
+ * Expected Res : Success
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
-
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+select f.DataverseName,f.Name,f.Dependencies from Metadata.`Function` f
+where f.DataverseName in ["X", "Y"]
+order by f.DataverseName, f.Name, f.Arity;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.6.ddl.sqlpp
similarity index 70%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.6.ddl.sqlpp
index f301fc6..c033635 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.6.ddl.sqlpp
@@ -17,22 +17,5 @@
  * under the License.
  */
 
-/*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
- */
-
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
-
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+drop dataverse Y if exists;
+drop dataverse X if exists;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.1.ddl.sqlpp
index c111196..5f380f6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.1.ddl.sqlpp
@@ -30,12 +30,50 @@
   a + b
 };
 
-/* Replace an existing function */
+/* Replaces an existing function */
 create or replace function f1(a, b) {
   a - b
 };
 
-/* Create new function */
+/* Creates new function */
 create or replace function f2(a, b) {
   a * b
 };
+
+/* Test varargs functions */
+
+create function f3(...) {
+  string_join(args, ".")
+};
+
+/* Replaces an existing function */
+create or replace function f3(...) {
+  string_join(args, ",")
+};
+
+/* Creates new function */
+create or replace function f4(...) {
+  string_join(args, "/")
+};
+
+/* Overloading. cannot replace varargs function with non-varargs and vice-versa */
+
+/* Creates new non-varargs function */
+create or replace function f5(a) {
+  upper(a)
+};
+
+/* Creates new varargs function (overloading) */
+create or replace function f5(...) {
+  string_join(args, ".")
+};
+
+/* Creates new varargs function */
+create or replace function f6(...) {
+  string_join(args, ",")
+};
+
+/* Creates new non-varargs function */
+create or replace function f6(a) {
+  lower(a)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.2.query.sqlpp
index 8e6c136..5cd97bf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.2.query.sqlpp
@@ -21,5 +21,11 @@
 
 {
   "f1": f1(5, 2),
-  "f2": f2(5, 2)
+  "f2": f2(5, 2),
+  "f3": f3("a", "b"),
+  "f4": f4("c", "d"),
+  "f5_1": f5("e"),
+  "f5_va": f5("f", "g"),
+  "f6_1": f6("H"),
+  "f6_va": f6("i", "j")
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.3.query.sqlpp
index 7a19fc3..66bd77c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.3.query.sqlpp
@@ -17,8 +17,6 @@
  * under the License.
  */
 
-use test;
-
 select f.Name, f.`Definition`
 from Metadata.`Function` f
-order by f.Name;
\ No newline at end of file
+order by f.Name, f.Arity;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency-1.1.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency.1.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency-1.1.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency-1.2.ddl.sqlpp
similarity index 79%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency-1.2.ddl.sqlpp
index 8e09034..dd9b50b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency-1.2.ddl.sqlpp
@@ -18,7 +18,8 @@
  */
 
 /*
- * Description  : Try to drop a functional dependency
+ * Description  : Try to drop a function dependency.
+ *                Non-varargs function uses varargs function.
  * Expected Res : Error
  */
 
@@ -26,17 +27,17 @@
 drop dataverse C if exists;
 create dataverse B;
 create dataverse C;
+
 use C;
 
-create function f1(message, text){
-  contains(message,text)
+create function f2(...) {
+  contains(args[0], args[1])
 };
 
 use B;
 
-create function f0(message, text){
-  C.f1(message,text)
+create function f3(message, text) {
+  C.f2(message, text)
 };
 
-use C;
-drop function f1(message, text);
\ No newline at end of file
+drop dataverse C;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency-1.3.ddl.sqlpp
similarity index 79%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency-1.3.ddl.sqlpp
index 8e09034..e99450e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency-1.3.ddl.sqlpp
@@ -18,7 +18,8 @@
  */
 
 /*
- * Description  : Try to drop a functional dependency
+ * Description  : Try to drop a function dependency.
+ *                Varargs function uses non-varargs function.
  * Expected Res : Error
  */
 
@@ -26,17 +27,17 @@
 drop dataverse C if exists;
 create dataverse B;
 create dataverse C;
+
 use C;
 
-create function f1(message, text){
-  contains(message,text)
+create function f4(message, text) {
+  contains(message, text)
 };
 
 use B;
 
-create function f0(message, text){
-  C.f1(message,text)
+create function f5(...) {
+  C.f4(args[0], args[1])
 };
 
-use C;
-drop function f1(message, text);
\ No newline at end of file
+drop dataverse C;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency-1.4.ddl.sqlpp
similarity index 79%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency-1.4.ddl.sqlpp
index 8e09034..5c333c4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency-1.4.ddl.sqlpp
@@ -18,7 +18,8 @@
  */
 
 /*
- * Description  : Try to drop a functional dependency
+ * Description  : Try to drop a function dependency.
+ *                Varargs function uses varargs function
  * Expected Res : Error
  */
 
@@ -26,17 +27,17 @@
 drop dataverse C if exists;
 create dataverse B;
 create dataverse C;
+
 use C;
 
-create function f1(message, text){
-  contains(message,text)
+create function f6(...) {
+  contains(args[0], args[1])
 };
 
 use B;
 
-create function f0(message, text){
-  C.f1(message,text)
+create function f7(...) {
+  C.f6(args[0], args[1])
 };
 
-use C;
-drop function f1(message, text);
\ No newline at end of file
+drop dataverse C;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency.2.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency-2.1.ddl.sqlpp
similarity index 95%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency.2.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency-2.1.ddl.sqlpp
index 53debdf..a5d42bc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency.2.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency-2.1.ddl.sqlpp
@@ -41,10 +41,6 @@
 create dataset TweetMessages(TweetMessageType)
 primary key tweetid autogenerated;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
 use B;
 
 create function f2(place, text){
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency.2.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency-2.2.ddl.sqlpp
similarity index 89%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency.2.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency-2.2.ddl.sqlpp
index 53debdf..762bb2d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency.2.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency-2.2.ddl.sqlpp
@@ -41,15 +41,12 @@
 create dataset TweetMessages(TweetMessageType)
 primary key tweetid autogenerated;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
 use B;
 
-create function f2(place, text){
- (select m.message_text
-  from C.TweetMessages m)
+create function f3(...) {
+ select message_text
+ from C.TweetMessages m
+ where contains(message_text, args[0])
 };
 
 drop dataverse C;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.1.ddl.sqlpp
similarity index 87%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.1.ddl.sqlpp
index 8e09034..7ab3a2b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.1.ddl.sqlpp
@@ -23,20 +23,17 @@
  */
 
 drop dataverse B if exists;
-drop dataverse C if exists;
 create dataverse B;
-create dataverse C;
-use C;
 
-create function f1(message, text){
+drop dataverse C if exists;
+create dataverse C;
+
+create function C.f1(message, text) {
   contains(message,text)
 };
 
-use B;
-
-create function f0(message, text){
-  C.f1(message,text)
+create function B.f0(message, text) {
+  C.f1(message, text)
 };
 
-use C;
-drop function f1(message, text);
\ No newline at end of file
+drop function C.f1(message, text);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.2.ddl.sqlpp
similarity index 82%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.2.ddl.sqlpp
index 8e09034..ca7c74d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.2.ddl.sqlpp
@@ -19,24 +19,22 @@
 
 /*
  * Description  : Try to drop a functional dependency
+ *              : Non-varargs function uses varargs function.
  * Expected Res : Error
  */
 
 drop dataverse B if exists;
-drop dataverse C if exists;
 create dataverse B;
+
+drop dataverse C if exists;
 create dataverse C;
-use C;
 
-create function f1(message, text){
-  contains(message,text)
+create function C.f3(...) {
+  contains(args[0], args[1])
 };
 
-use B;
-
-create function f0(message, text){
-  C.f1(message,text)
+create function B.f2(message, text) {
+  C.f3(message, text)
 };
 
-use C;
-drop function f1(message, text);
\ No newline at end of file
+drop function C.f3(...);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.3.ddl.sqlpp
similarity index 82%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.3.ddl.sqlpp
index 8e09034..1017f65 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.3.ddl.sqlpp
@@ -19,24 +19,22 @@
 
 /*
  * Description  : Try to drop a functional dependency
+ *              : Varargs function uses non-varargs function.
  * Expected Res : Error
  */
 
 drop dataverse B if exists;
-drop dataverse C if exists;
 create dataverse B;
+
+drop dataverse C if exists;
 create dataverse C;
-use C;
 
-create function f1(message, text){
-  contains(message,text)
+create function C.f5(message, text) {
+  contains(message, text)
 };
 
-use B;
-
-create function f0(message, text){
-  C.f1(message,text)
+create function B.f4(...) {
+  C.f5(args[0], args[1])
 };
 
-use C;
-drop function f1(message, text);
\ No newline at end of file
+drop function C.f5(message, text);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.4.ddl.sqlpp
similarity index 83%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.4.ddl.sqlpp
index 8e09034..a98cc89 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency-3.4.ddl.sqlpp
@@ -19,24 +19,22 @@
 
 /*
  * Description  : Try to drop a functional dependency
+ *              : Varargs function uses varargs function.
  * Expected Res : Error
  */
 
 drop dataverse B if exists;
-drop dataverse C if exists;
 create dataverse B;
+
+drop dataverse C if exists;
 create dataverse C;
-use C;
 
-create function f1(message, text){
-  contains(message,text)
+create function C.f7(...) {
+  contains(args[0], args[1])
 };
 
-use B;
-
-create function f0(message, text){
-  C.f1(message,text)
+create function B.f6(...) {
+  C.f7(args[0], args[1])
 };
 
-use C;
-drop function f1(message, text);
\ No newline at end of file
+drop function C.f7(...);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency-4.1.ddl.sqlpp
similarity index 94%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency.4.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency-4.1.ddl.sqlpp
index c972efc..b2fbfe4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency-4.1.ddl.sqlpp
@@ -19,6 +19,7 @@
 
 /*
  * Description  : Try to drop a functional dependency
+ *                Drop a dataset that is used by a non-varargs function
  * Expected Res : Error
  */
 
@@ -41,10 +42,6 @@
 create dataset TweetMessages(TweetMessageType)
 primary key tweetid autogenerated;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
 use B;
 
 create function f2(place, text){
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency-4.2.ddl.sqlpp
similarity index 93%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency.4.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency-4.2.ddl.sqlpp
index c972efc..bbe10a6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency-4.2.ddl.sqlpp
@@ -19,6 +19,7 @@
 
 /*
  * Description  : Try to drop a functional dependency
+ *                Drop a dataset that is used by a varargs function
  * Expected Res : Error
  */
 
@@ -41,13 +42,9 @@
 create dataset TweetMessages(TweetMessageType)
 primary key tweetid autogenerated;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
 use B;
 
-create function f2(place, text){
+create function f2(...){
  (select m.message_text
   from C.TweetMessages m)
 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.1.ddl.sqlpp
similarity index 92%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.1.ddl.sqlpp
index f301fc6..2a059dd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.1.ddl.sqlpp
@@ -19,10 +19,10 @@
 
 /*
  * Description  : Try to drop a functional dependency
+ *                Drop a non-varargs function that is used by a non-varargs function
  * Expected Res : Error
  */
 
-drop dataverse B if exists;
 drop dataverse C if exists;
 create dataverse C;
 use C;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.2.ddl.sqlpp
similarity index 88%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.2.ddl.sqlpp
index f301fc6..ab80b88 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.2.ddl.sqlpp
@@ -19,10 +19,10 @@
 
 /*
  * Description  : Try to drop a functional dependency
+ *                Drop a non-varargs function that is used by a varargs function
  * Expected Res : Error
  */
 
-drop dataverse B if exists;
 drop dataverse C if exists;
 create dataverse C;
 use C;
@@ -31,8 +31,8 @@
   contains(message,text)
 };
 
-create function f0(message, text){
-  C.f1(message,text)
+create function f0(...){
+  C.f1(args[0],args[1])
 };
 
 drop function f1(message, text);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.3.ddl.sqlpp
similarity index 86%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.3.ddl.sqlpp
index f301fc6..e88cbe9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.3.ddl.sqlpp
@@ -19,20 +19,20 @@
 
 /*
  * Description  : Try to drop a functional dependency
+ *                Drop a varargs function that is used by a non-varargs function
  * Expected Res : Error
  */
 
-drop dataverse B if exists;
 drop dataverse C if exists;
 create dataverse C;
 use C;
 
-create function f1(message, text){
-  contains(message,text)
+create function f1(...){
+  contains(args[0],args[1])
 };
 
 create function f0(message, text){
   C.f1(message,text)
 };
 
-drop function f1(message, text);
\ No newline at end of file
+drop function f1(...);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.4.ddl.sqlpp
similarity index 82%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.4.ddl.sqlpp
index f301fc6..1ed188e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency-5.4.ddl.sqlpp
@@ -19,20 +19,20 @@
 
 /*
  * Description  : Try to drop a functional dependency
+ *                Drop a varargs function that is used by a varargs function
  * Expected Res : Error
  */
 
-drop dataverse B if exists;
 drop dataverse C if exists;
 create dataverse C;
 use C;
 
-create function f1(message, text){
-  contains(message,text)
+create function f1(...){
+  contains(args[0],args[1])
 };
 
-create function f0(message, text){
-  C.f1(message,text)
+create function f0(...){
+  C.f1(args[0], args[1])
 };
 
-drop function f1(message, text);
\ No newline at end of file
+drop function f1(...);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency.6.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency-6.1.ddl.sqlpp
similarity index 91%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency.6.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency-6.1.ddl.sqlpp
index 3ab7b6f..9892317 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency.6.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency-6.1.ddl.sqlpp
@@ -19,10 +19,11 @@
 
 /*
  * Description  : Try to drop a functional dependency
+ *                Drop a dataset that is used by a non-varargs function
+ *                from the same dataverse
  * Expected Res : Error
  */
 
-drop dataverse B if exists;
 drop dataverse C if exists;
 create dataverse C;
 use C;
@@ -40,10 +41,6 @@
 create dataset TweetMessages(TweetMessageType)
 primary key tweetid autogenerated;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
 create function f2(place, text){
  (select m.message_text
   from C.TweetMessages m)
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency.6.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency-6.2.ddl.sqlpp
similarity index 90%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency.6.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency-6.2.ddl.sqlpp
index 3ab7b6f..17904ee 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency.6.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency-6.2.ddl.sqlpp
@@ -19,10 +19,11 @@
 
 /*
  * Description  : Try to drop a functional dependency
+ *                Drop a dataset that is used by a varargs function
+ *                from the same dataverse
  * Expected Res : Error
  */
 
-drop dataverse B if exists;
 drop dataverse C if exists;
 create dataverse C;
 use C;
@@ -40,11 +41,7 @@
 create dataset TweetMessages(TweetMessageType)
 primary key tweetid autogenerated;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f2(place, text){
+create function f2(...){
  (select m.message_text
   from C.TweetMessages m)
 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.ddl.sqlpp
index be5e07d..4080786 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.ddl.sqlpp
@@ -29,3 +29,7 @@
 create function my_sum(a, b) {
   a + b
 };
+
+create function my_sum_va(...) {
+  array_sum(args)
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.2.query.sqlpp
index 0f0de1a..abe6a60 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.2.query.sqlpp
@@ -19,4 +19,7 @@
 
 use experiments;
 
-my_sum(2, 3);
\ No newline at end of file
+{
+  "t1": my_sum(2, 3),
+  "t2": my_sum_va(4, 5)
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.3.ddl.sqlpp
index 7023e16..d17f290 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.3.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.3.ddl.sqlpp
@@ -17,4 +17,6 @@
  * under the License.
  */
 
-drop function experiments.my_sum(a, b);
\ No newline at end of file
+drop function experiments.my_sum(a, b);
+
+drop function experiments.my_sum_va(...);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.5.query.sqlpp
similarity index 66%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.5.query.sqlpp
index f301fc6..21cac79 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.5.query.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -18,21 +18,10 @@
  */
 
 /*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
+ * Description  : Error. Unknown function with varargs
+ * Expected Res : Failure
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+use experiments;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+my_sum_va(2, 3);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.1.ddl.sqlpp
index 8392e6c3..58d4001 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.1.ddl.sqlpp
@@ -31,4 +31,26 @@
 
 create function myfn003(a, b) {
   a + b
+};
+
+create function myfn004(...) {
+  args
+};
+
+/* Test function overloading */
+
+create function myfn005(a) {
+  a
+};
+
+create function myfn005(a, b) {
+  a + b
+};
+
+create function myfn006(a) {
+  a
+};
+
+create function myfn006(...) {
+  args
 };
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.2.query.sqlpp
index bef3e8e..010ea82 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.2.query.sqlpp
@@ -20,8 +20,4 @@
 SELECT object_remove(fn, "Timestamp") as fn
 FROM Metadata.`Function` fn
 WHERE fn.DataverseName = "test"
-UNION ALL
-SELECT object_remove(dt, "Timestamp") as dt
-FROM Metadata.`Datatype` dt
-WHERE dt.DataverseName = "test"
-ORDER BY dt.DatatypeName, fn.Name;
\ No newline at end of file
+ORDER BY fn.Name, fn.Arity;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.3.ddl.sqlpp
similarity index 66%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.3.ddl.sqlpp
index f301fc6..7a422ff 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.3.ddl.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -17,22 +17,22 @@
  * under the License.
  */
 
-/*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
- */
+use test;
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+drop function myfn001();
 
-create function f1(message, text){
-  contains(message,text)
-};
+drop function myfn002(a);
 
-create function f0(message, text){
-  C.f1(message,text)
-};
+drop function myfn003(a, b);
 
-drop function f1(message, text);
\ No newline at end of file
+drop function myfn004(...);
+
+--- overloading
+
+drop function myfn005(a);
+
+drop function myfn005(a, b);
+
+drop function myfn006(a);
+
+drop function myfn006(...);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.4.query.sqlpp
similarity index 65%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.4.query.sqlpp
index f301fc6..f932300 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.4.query.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -17,22 +17,6 @@
  * under the License.
  */
 
-/*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
- */
-
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
-
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+SELECT VALUE COUNT(*)
+FROM Metadata.`Function`
+WHERE fn.DataverseName = "test"
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf33_overloading/udf33_overloading.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf33_overloading/udf33_overloading.1.ddl.sqlpp
index 670922d..6464fa1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf33_overloading/udf33_overloading.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf33_overloading/udf33_overloading.1.ddl.sqlpp
@@ -32,4 +32,12 @@
 
 create function myfn(a, b) {
   a + b
+};
+
+create function myfn2(a) {
+  -a
+};
+
+create function myfn2(...) {
+  array_length(args)
 };
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf33_overloading/udf33_overloading.3.query.sqlpp
similarity index 66%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf33_overloading/udf33_overloading.3.query.sqlpp
index f301fc6..2bf7a91 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf33_overloading/udf33_overloading.3.query.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -18,21 +18,15 @@
  */
 
 /*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
+ * Description  : Function overloading is allowed.
+ *                Non-varags function takes precedence over varargs function
+ * Expected Res : Success
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+use experiments;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+{
+  "myfn2_0": myfn2(),   --- varargs fn
+  "myfn2_1": myfn2(1),  --- non-varags fn
+  "myfn2_2": myfn2(1,2) --- varargs fun
+}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.1.ddl.sqlpp
new file mode 100644
index 0000000..0398430
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.1.ddl.sqlpp
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+/*
+ * Description  : Miscellaneous tests for varargs functions
+ * Expected Res : Success
+ */
+
+drop  dataverse test if exists;
+create dataverse test;
+
+use test;
+
+create type FacebookUserType as open {
+  id : bigint
+};
+
+create  dataset FacebookUsers(FacebookUserType) primary key id;
+
+-----
+
+create function f1(...) {
+  "const"
+};
+
+create function f2(...) {
+  string_join(args, "|")
+};
+
+create function f3(...) {
+  string_join(args, "|") || "||" || string_join(args, "|||")
+};
+
+create function f4(...) {
+  f3(args[0], args[1]) || "," || f3(args[2], args[3])
+};
+
+create function f5(...) {
+  select
+    case
+      when is_string(v) then "string"
+      when is_number(v) then "number"
+      when is_object(v) then "object"
+      when (is_array(v) or is_multiset(v)) then "list"
+    end as t
+  from args as v
+  order by v
+};
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.2.update.sqlpp
similarity index 66%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.2.update.sqlpp
index f301fc6..a69c0ef 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.2.update.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -16,23 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
+ * Description  : Miscellaneous tests for varargs functions
+ * Expected Res : Success
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+use test;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+load  dataset FacebookUsers using localfs ((`path`=`asterix_nc1://data/tinysocial/fbu.adm`),(`format`=`adm`));
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.3.query.sqlpp
similarity index 66%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.3.query.sqlpp
index f301fc6..a96ecdf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.3.query.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -16,23 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
+ * Description  : Miscellaneous tests for varargs functions
+ * Expected Res : Success
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+use test;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+select id, f1() f1_0, f1(name) f1_1, f1(name, alias) f1_2
+from FacebookUsers fbu
+order by id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.4.query.sqlpp
similarity index 66%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.4.query.sqlpp
index f301fc6..3229ee4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.4.query.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -16,23 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
+ * Description  : Miscellaneous tests for varargs functions
+ * Expected Res : Success
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+use test;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+select id, f2() f2_0, f2(name) f2_1, f2(name, alias) f2_2
+from FacebookUsers fbu
+order by id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.5.query.sqlpp
similarity index 66%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.5.query.sqlpp
index f301fc6..3f728da 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.5.query.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -16,23 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
+ * Description  : Miscellaneous tests for varargs functions
+ * Expected Res : Success
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+use test;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+select id, f3() f3_0, f3(name) f3_1, f3(name, alias) f3_2
+from FacebookUsers fbu
+order by id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.6.query.sqlpp
similarity index 66%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.6.query.sqlpp
index f301fc6..94e0007 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.6.query.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -16,23 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
+ * Description  : Miscellaneous tests for varargs functions
+ * Expected Res : Success
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+use test;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+select id, f4(lower(name), lower(alias), upper(name), upper(alias)) f4_4
+from FacebookUsers fbu
+order by id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.7.query.sqlpp
similarity index 66%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.7.query.sqlpp
index f301fc6..d2443b3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.7.query.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under A
+ * 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
@@ -16,23 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Try to drop a functional dependency
- * Expected Res : Error
+ * Description  : Miscellaneous tests for varargs functions
+ * Expected Res : Success
  */
 
-drop dataverse B if exists;
-drop dataverse C if exists;
-create dataverse C;
-use C;
+use test;
 
-create function f1(message, text){
-  contains(message,text)
-};
-
-create function f0(message, text){
-  C.f1(message,text)
-};
-
-drop function f1(message, text);
\ No newline at end of file
+select id, f5(id, name, `friend-ids`, employment[0]) as f5
+from FacebookUsers fbu
+order by id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/check-dependencies-1/check-dependencies-1.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/check-dependencies-1/check-dependencies-1.2.adm
new file mode 100644
index 0000000..04b90ce
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/check-dependencies-1/check-dependencies-1.2.adm
@@ -0,0 +1,5 @@
+{ "DataverseName": "X", "Name": "fx1", "Dependencies": [ [  ], [  ], [  ] ] }
+{ "DataverseName": "X", "Name": "fx2", "Dependencies": [ [  ], [  ], [  ] ] }
+{ "DataverseName": "X", "Name": "fx3", "Dependencies": [ [  ], [ [ "X", "fx1", "1" ], [ "X", "fx2", "-1" ] ], [  ] ] }
+{ "DataverseName": "Y", "Name": "fy1", "Dependencies": [ [  ], [  ], [  ] ] }
+{ "DataverseName": "Y", "Name": "fy3", "Dependencies": [ [  ], [ [ "Y", "fy1", "1" ], [ "X", "fx2", "-1" ] ], [  ] ] }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.2.adm
index e57f576..e7d6441 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.2.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.2.adm
@@ -1 +1 @@
-{ "f1": 3, "f2": 10 }
\ No newline at end of file
+{ "f1": 3, "f2": 10, "f3": "a,b", "f4": "c/d", "f5_1": "E", "f5_va": "f.g", "f6_1": "h", "f6_va": "i,j" }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.3.adm
index 63617d3..d56fa26 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.3.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/create-or-replace-function-1/create-or-replace-function-1.3.adm
@@ -1,2 +1,8 @@
 { "Name": "f1", "Definition": "a - b" }
-{ "Name": "f2", "Definition": "a * b" }
\ No newline at end of file
+{ "Name": "f2", "Definition": "a * b" }
+{ "Name": "f3", "Definition": "string_join(args, \",\")" }
+{ "Name": "f4", "Definition": "string_join(args, \"/\")" }
+{ "Name": "f5", "Definition": "string_join(args, \".\")" }
+{ "Name": "f5", "Definition": "upper(a)" }
+{ "Name": "f6", "Definition": "string_join(args, \",\")" }
+{ "Name": "f6", "Definition": "lower(a)" }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/drop-function-1/drop-function-1.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/drop-function-1/drop-function-1.2.adm
index 7813681..800cdb5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/drop-function-1/drop-function-1.2.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/drop-function-1/drop-function-1.2.adm
@@ -1 +1 @@
-5
\ No newline at end of file
+{ "t1": 5, "t2": 9 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf32_metadata/udf32_metadata.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf32_metadata/udf32_metadata.2.adm
index 7cf89ce..925f873 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf32_metadata/udf32_metadata.2.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf32_metadata/udf32_metadata.2.adm
@@ -1,3 +1,8 @@
 { "fn": { "DataverseName": "test", "Name": "myfn001", "Arity": "0", "Params": [  ], "ReturnType": "", "Definition": "42", "Language": "SQLPP", "Kind": "SCALAR", "Dependencies": [ [  ], [  ], [  ] ] } }
 { "fn": { "DataverseName": "test", "Name": "myfn002", "Arity": "1", "Params": [ "a" ], "ReturnType": "", "Definition": "a", "Language": "SQLPP", "Kind": "SCALAR", "Dependencies": [ [  ], [  ], [  ] ] } }
 { "fn": { "DataverseName": "test", "Name": "myfn003", "Arity": "2", "Params": [ "a", "b" ], "ReturnType": "", "Definition": "a + b", "Language": "SQLPP", "Kind": "SCALAR", "Dependencies": [ [  ], [  ], [  ] ] } }
+{ "fn": { "DataverseName": "test", "Name": "myfn004", "Arity": "-1", "Params": [ "args" ], "ReturnType": "", "Definition": "args", "Language": "SQLPP", "Kind": "SCALAR", "Dependencies": [ [  ], [  ], [  ] ] } }
+{ "fn": { "DataverseName": "test", "Name": "myfn005", "Arity": "1", "Params": [ "a" ], "ReturnType": "", "Definition": "a", "Language": "SQLPP", "Kind": "SCALAR", "Dependencies": [ [  ], [  ], [  ] ] } }
+{ "fn": { "DataverseName": "test", "Name": "myfn005", "Arity": "2", "Params": [ "a", "b" ], "ReturnType": "", "Definition": "a + b", "Language": "SQLPP", "Kind": "SCALAR", "Dependencies": [ [  ], [  ], [  ] ] } }
+{ "fn": { "DataverseName": "test", "Name": "myfn006", "Arity": "-1", "Params": [ "args" ], "ReturnType": "", "Definition": "args", "Language": "SQLPP", "Kind": "SCALAR", "Dependencies": [ [  ], [  ], [  ] ] } }
+{ "fn": { "DataverseName": "test", "Name": "myfn006", "Arity": "1", "Params": [ "a" ], "ReturnType": "", "Definition": "a", "Language": "SQLPP", "Kind": "SCALAR", "Dependencies": [ [  ], [  ], [  ] ] } }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf32_metadata/udf32_metadata.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf32_metadata/udf32_metadata.4.adm
new file mode 100644
index 0000000..c227083
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf32_metadata/udf32_metadata.4.adm
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf33_overloading/udf33_overloading.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf33_overloading/udf33_overloading.3.adm
new file mode 100644
index 0000000..0b1f01e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf33_overloading/udf33_overloading.3.adm
@@ -0,0 +1 @@
+{ "myfn2_0": 0, "myfn2_1": -1, "myfn2_2": 2 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.3.adm
new file mode 100644
index 0000000..029c4cc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.3.adm
@@ -0,0 +1,10 @@
+{ "id": 1, "f1_0": "const", "f1_1": "const", "f1_2": "const" }
+{ "id": 2, "f1_0": "const", "f1_1": "const", "f1_2": "const" }
+{ "id": 3, "f1_0": "const", "f1_1": "const", "f1_2": "const" }
+{ "id": 4, "f1_0": "const", "f1_1": "const", "f1_2": "const" }
+{ "id": 5, "f1_0": "const", "f1_1": "const", "f1_2": "const" }
+{ "id": 6, "f1_0": "const", "f1_1": "const", "f1_2": "const" }
+{ "id": 7, "f1_0": "const", "f1_1": "const", "f1_2": "const" }
+{ "id": 8, "f1_0": "const", "f1_1": "const", "f1_2": "const" }
+{ "id": 9, "f1_0": "const", "f1_1": "const", "f1_2": "const" }
+{ "id": 10, "f1_0": "const", "f1_1": "const", "f1_2": "const" }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.4.adm
new file mode 100644
index 0000000..7740b20
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.4.adm
@@ -0,0 +1,10 @@
+{ "id": 1, "f2_0": "", "f2_1": "MargaritaStoddard", "f2_2": "MargaritaStoddard|Margarita" }
+{ "id": 2, "f2_0": "", "f2_1": "IsbelDull", "f2_2": "IsbelDull|Isbel" }
+{ "id": 3, "f2_0": "", "f2_1": "EmoryUnk", "f2_2": "EmoryUnk|Emory" }
+{ "id": 4, "f2_0": "", "f2_1": "NicholasStroh", "f2_2": "NicholasStroh|Nicholas" }
+{ "id": 5, "f2_0": "", "f2_1": "VonKemble", "f2_2": "VonKemble|Von" }
+{ "id": 6, "f2_0": "", "f2_1": "WillisWynne", "f2_2": "WillisWynne|Willis" }
+{ "id": 7, "f2_0": "", "f2_1": "SuzannaTillson", "f2_2": "SuzannaTillson|Suzanna" }
+{ "id": 8, "f2_0": "", "f2_1": "NilaMilliron", "f2_2": "NilaMilliron|Nila" }
+{ "id": 9, "f2_0": "", "f2_1": "WoodrowNehling", "f2_2": "WoodrowNehling|Woodrow" }
+{ "id": 10, "f2_0": "", "f2_1": "BramHatch", "f2_2": "BramHatch|Bram" }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.5.adm
new file mode 100644
index 0000000..b816059
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.5.adm
@@ -0,0 +1,10 @@
+{ "id": 1, "f3_0": "||", "f3_1": "MargaritaStoddard||MargaritaStoddard", "f3_2": "MargaritaStoddard|Margarita||MargaritaStoddard|||Margarita" }
+{ "id": 2, "f3_0": "||", "f3_1": "IsbelDull||IsbelDull", "f3_2": "IsbelDull|Isbel||IsbelDull|||Isbel" }
+{ "id": 3, "f3_0": "||", "f3_1": "EmoryUnk||EmoryUnk", "f3_2": "EmoryUnk|Emory||EmoryUnk|||Emory" }
+{ "id": 4, "f3_0": "||", "f3_1": "NicholasStroh||NicholasStroh", "f3_2": "NicholasStroh|Nicholas||NicholasStroh|||Nicholas" }
+{ "id": 5, "f3_0": "||", "f3_1": "VonKemble||VonKemble", "f3_2": "VonKemble|Von||VonKemble|||Von" }
+{ "id": 6, "f3_0": "||", "f3_1": "WillisWynne||WillisWynne", "f3_2": "WillisWynne|Willis||WillisWynne|||Willis" }
+{ "id": 7, "f3_0": "||", "f3_1": "SuzannaTillson||SuzannaTillson", "f3_2": "SuzannaTillson|Suzanna||SuzannaTillson|||Suzanna" }
+{ "id": 8, "f3_0": "||", "f3_1": "NilaMilliron||NilaMilliron", "f3_2": "NilaMilliron|Nila||NilaMilliron|||Nila" }
+{ "id": 9, "f3_0": "||", "f3_1": "WoodrowNehling||WoodrowNehling", "f3_2": "WoodrowNehling|Woodrow||WoodrowNehling|||Woodrow" }
+{ "id": 10, "f3_0": "||", "f3_1": "BramHatch||BramHatch", "f3_2": "BramHatch|Bram||BramHatch|||Bram" }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.6.adm
new file mode 100644
index 0000000..192af1e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.6.adm
@@ -0,0 +1,10 @@
+{ "id": 1, "f4_4": "margaritastoddard|margarita||margaritastoddard|||margarita,MARGARITASTODDARD|MARGARITA||MARGARITASTODDARD|||MARGARITA" }
+{ "id": 2, "f4_4": "isbeldull|isbel||isbeldull|||isbel,ISBELDULL|ISBEL||ISBELDULL|||ISBEL" }
+{ "id": 3, "f4_4": "emoryunk|emory||emoryunk|||emory,EMORYUNK|EMORY||EMORYUNK|||EMORY" }
+{ "id": 4, "f4_4": "nicholasstroh|nicholas||nicholasstroh|||nicholas,NICHOLASSTROH|NICHOLAS||NICHOLASSTROH|||NICHOLAS" }
+{ "id": 5, "f4_4": "vonkemble|von||vonkemble|||von,VONKEMBLE|VON||VONKEMBLE|||VON" }
+{ "id": 6, "f4_4": "williswynne|willis||williswynne|||willis,WILLISWYNNE|WILLIS||WILLISWYNNE|||WILLIS" }
+{ "id": 7, "f4_4": "suzannatillson|suzanna||suzannatillson|||suzanna,SUZANNATILLSON|SUZANNA||SUZANNATILLSON|||SUZANNA" }
+{ "id": 8, "f4_4": "nilamilliron|nila||nilamilliron|||nila,NILAMILLIRON|NILA||NILAMILLIRON|||NILA" }
+{ "id": 9, "f4_4": "woodrownehling|woodrow||woodrownehling|||woodrow,WOODROWNEHLING|WOODROW||WOODROWNEHLING|||WOODROW" }
+{ "id": 10, "f4_4": "bramhatch|bram||bramhatch|||bram,BRAMHATCH|BRAM||BRAMHATCH|||BRAM" }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.7.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.7.adm
new file mode 100644
index 0000000..b16d544
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.7.adm
@@ -0,0 +1,10 @@
+{ "id": 1, "f5": [ { "t": "number" }, { "t": "string" }, { "t": "list" }, { "t": "object" } ] }
+{ "id": 2, "f5": [ { "t": "number" }, { "t": "string" }, { "t": "list" }, { "t": "object" } ] }
+{ "id": 3, "f5": [ { "t": "number" }, { "t": "string" }, { "t": "list" }, { "t": "object" } ] }
+{ "id": 4, "f5": [ { "t": "number" }, { "t": "string" }, { "t": "list" }, { "t": "object" } ] }
+{ "id": 5, "f5": [ { "t": "number" }, { "t": "string" }, { "t": "list" }, { "t": "object" } ] }
+{ "id": 6, "f5": [ { "t": "number" }, { "t": "string" }, { "t": "list" }, { "t": "object" } ] }
+{ "id": 7, "f5": [ { "t": "number" }, { "t": "string" }, { "t": "list" }, { "t": "object" } ] }
+{ "id": 8, "f5": [ { "t": "number" }, { "t": "string" }, { "t": "list" }, { "t": "object" } ] }
+{ "id": 9, "f5": [ { "t": "number" }, { "t": "string" }, { "t": "list" }, { "t": "object" } ] }
+{ "id": 10, "f5": [ { "t": "number" }, { "t": "string" }, { "t": "list" }, { "t": "object" } ] }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_it_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_it_sqlpp.xml
index ea5d279..cf5b1a7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_it_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_it_sqlpp.xml
@@ -24,6 +24,12 @@
 
   <test-group name="external-library">
     <test-case FilePath="external-library">
+      <compilation-unit name="bad-ext-function-ddl-1">
+        <output-dir compare="Text">none</output-dir>
+        <expected-error>ASX1079: Compilation error: Variable number of parameters is not supported for external functions</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="external-library">
       <compilation-unit name="create-or-replace-function-1">
         <output-dir compare="Text">create-or-replace-function-1</output-dir>
       </compilation-unit>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index adbdf69..be549f9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -11841,6 +11841,7 @@
       <compilation-unit name="bad-function-ddl-1">
         <output-dir compare="Text">bad-function-ddl-1</output-dir>
         <expected-error>Cannot find dataset TweetMessages in dataverse experiments nor an alias with name TweetMessages!</expected-error>
+        <expected-error>Cannot find dataset TweetMessages2 in dataverse experiments2 nor an alias with name TweetMessages2!</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
@@ -11865,6 +11866,7 @@
       <compilation-unit name="bad-function-ddl-5">
         <output-dir compare="Text">bad-function-ddl-5</output-dir>
         <expected-error>ASX1081: Cannot find function with name experiments.function_that_does_not_exist</expected-error>
+        <expected-error>ASX1081: Cannot find function with name experiments2.function_that_does_not_exist </expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
@@ -11902,6 +11904,7 @@
         <output-dir compare="Text">bad-function-ddl-11</output-dir>
         <expected-error>ASX1001: Syntax error: Unexpected type declaration for parameter a in function myfn001</expected-error>
         <expected-error>ASX1001: Syntax error: Unexpected return type declaration for function myfn002</expected-error>
+        <expected-error>ASX1001: Syntax error: Unexpected return type declaration for function myfn003</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
@@ -11918,6 +11921,9 @@
       <compilation-unit name="drop-dependency-1">
         <output-dir compare="Text">drop-dependency-1</output-dir>
         <expected-error>Cannot drop dataverse. Function B.f0(2) depends on function C.f1(2)</expected-error>
+        <expected-error>Cannot drop dataverse. Function B.f3(2) depends on function C.f2(...)</expected-error>
+        <expected-error>Cannot drop dataverse. Function B.f5(...) depends on function C.f4(2)</expected-error>
+        <expected-error>Cannot drop dataverse. Function B.f7(...) depends on function C.f6(...)</expected-error>
         <source-location>false</source-location>
       </compilation-unit>
     </test-case>
@@ -11925,6 +11931,7 @@
       <compilation-unit name="drop-dependency-2">
         <output-dir compare="Text">drop-dependency-2</output-dir>
         <expected-error>Cannot drop dataverse. Function B.f2(2) depends on dataset C.TweetMessages</expected-error>
+        <expected-error>Cannot drop dataverse. Function B.f3(...) depends on dataset C.TweetMessages</expected-error>
         <source-location>false</source-location>
       </compilation-unit>
     </test-case>
@@ -11932,6 +11939,9 @@
       <compilation-unit name="drop-dependency-3">
         <output-dir compare="Text">drop-dependency-3</output-dir>
         <expected-error>Cannot drop function C.f1(2) being used by function B.f0(2)</expected-error>
+        <expected-error>Cannot drop function C.f3(...) being used by function B.f2(2)</expected-error>
+        <expected-error>Cannot drop function C.f5(2) being used by function B.f4(...)</expected-error>
+        <expected-error>Cannot drop function C.f7(...) being used by function B.f6(...)</expected-error>
         <source-location>false</source-location>
       </compilation-unit>
     </test-case>
@@ -11939,6 +11949,7 @@
       <compilation-unit name="drop-dependency-4">
         <output-dir compare="Text">drop-dependency-4</output-dir>
         <expected-error>Cannot drop dataset C.TweetMessages being used by function B.f2(2)</expected-error>
+        <expected-error>Cannot drop dataset C.TweetMessages being used by function B.f2(...)</expected-error>
         <source-location>false</source-location>
       </compilation-unit>
     </test-case>
@@ -11946,6 +11957,9 @@
       <compilation-unit name="drop-dependency-5">
         <output-dir compare="Text">drop-dependency-5</output-dir>
         <expected-error>Cannot drop function C.f1(2) being used by function C.f0(2)</expected-error>
+        <expected-error>Cannot drop function C.f1(2) being used by function C.f0(...)</expected-error>
+        <expected-error>Cannot drop function C.f1(...) being used by function C.f0(2)</expected-error>
+        <expected-error>Cannot drop function C.f1(...) being used by function C.f0(...)</expected-error>
         <source-location>false</source-location>
       </compilation-unit>
     </test-case>
@@ -11953,6 +11967,7 @@
       <compilation-unit name="drop-dependency-6">
         <output-dir compare="Text">drop-dependency-6</output-dir>
         <expected-error>Cannot drop dataset C.TweetMessages being used by function C.f2(2)</expected-error>
+        <expected-error>Cannot drop dataset C.TweetMessages being used by function C.f2(...)</expected-error>
         <source-location>false</source-location>
       </compilation-unit>
     </test-case>
@@ -11960,6 +11975,7 @@
       <compilation-unit name="drop-function-1">
         <output-dir compare="Text">drop-function-1</output-dir>
         <expected-error>ASX1081: Cannot find function with name experiments.my_sum</expected-error>
+        <expected-error>ASX1081: Cannot find function with name experiments.my_sum_va</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
@@ -12182,6 +12198,11 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="user-defined-functions">
+      <compilation-unit name="udf35_varargs_misc">
+        <output-dir compare="Text">udf35_varargs_misc</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
       <compilation-unit name="f01">
         <output-dir compare="Text">f01</output-dir>
         <expected-error>ASX1081: Cannot find function with name test.tinyint</expected-error>
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
index 71cd759..81ff92d 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
@@ -124,11 +124,20 @@
             if (declaredFunctions.contains(fsWithDv)) {
                 return fsWithDv;
             }
+            FunctionSignature fsWithDvVarargs =
+                    new FunctionSignature(fsWithDv.getDataverseName(), fsWithDv.getName(), FunctionIdentifier.VARARGS);
+            if (declaredFunctions.contains(fsWithDvVarargs)) {
+                return fsWithDvVarargs;
+            }
             try {
                 Function function = metadataProvider.lookupUserDefinedFunction(fsWithDv);
                 if (function != null) {
                     return fsWithDv;
                 }
+                function = metadataProvider.lookupUserDefinedFunction(fsWithDvVarargs);
+                if (function != null) {
+                    return fsWithDvVarargs;
+                }
             } catch (AlgebricksException e) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, e, sourceLoc, e.getMessage());
             }
@@ -203,22 +212,29 @@
             Expression expression, List<FunctionSignature> declaredFunctions, List<FunctionDecl> inputFunctionDecls,
             IFunctionCollector functionCollector, FunctionParser functionParser, DataverseName defaultDataverse)
             throws CompilationException {
+        if (expression == null) {
+            return Collections.emptyList();
+        }
         List<FunctionDecl> functionDecls =
                 inputFunctionDecls == null ? new ArrayList<>() : new ArrayList<>(inputFunctionDecls);
-        if (expression == null) {
-            return functionDecls;
-        }
         Set<CallExpr> functionCalls = functionCollector.getFunctionCalls(expression);
+        Set<FunctionSignature> functionSignatures = new HashSet<>();
         for (CallExpr functionCall : functionCalls) {
             FunctionSignature fs = functionCall.getFunctionSignature();
-            FunctionSignature fsWithDv = fs.getDataverseName() != null ? fs
-                    : new FunctionSignature(defaultDataverse, fs.getName(), fs.getArity());
-            if (declaredFunctions != null && declaredFunctions.contains(fsWithDv)) {
+            if (fs.getDataverseName() == null) {
+                throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, functionCall.getSourceLocation(),
+                        fs);
+            }
+            if (!functionSignatures.add(fs)) {
+                // already seen this signature
+                continue;
+            }
+            if (declaredFunctions != null && declaredFunctions.contains(fs)) {
                 continue;
             }
             Function function;
             try {
-                function = metadataProvider.lookupUserDefinedFunction(fsWithDv);
+                function = metadataProvider.lookupUserDefinedFunction(fs);
             } catch (AlgebricksException e) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, e, functionCall.getSourceLocation(),
                         e.toString());
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
index eb2fba6..c866eff 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
@@ -20,7 +20,6 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -62,8 +61,10 @@
 import org.apache.asterix.lang.common.visitor.base.AbstractQueryExpressionVisitor;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataverse;
+import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.api.exceptions.SourceLocation;
 
 public abstract class AbstractInlineUdfsVisitor extends AbstractQueryExpressionVisitor<Boolean, List<FunctionDecl>> {
@@ -303,33 +304,67 @@
             // TODO(buyingyi): throw an exception for recursive function definition or limit the stack depth.
             implem.setFuncBody(rewriteFunctionBody(implem));
             // it's one of the functions we want to inline
-            List<LetClause> clauses = new ArrayList<>();
-            Iterator<VarIdentifier> paramIter = implem.getParamList().iterator();
-            VariableSubstitutionEnvironment subts = new VariableSubstitutionEnvironment();
+            List<Expression> argList = f.getExprList();
+            int argCount = argList.size();
+            List<LetClause> clauses = new ArrayList<>(argCount + 1);
+            List<Expression> argVars = new ArrayList<>(argCount);
             for (Expression e : f.getExprList()) {
-                VarIdentifier param = paramIter.next();
                 // Obs: we could do smth about passing also literals, or let
                 // variable inlining to take care of this.
+                VarIdentifier argVar;
                 if (e.getKind() == Kind.VARIABLE_EXPRESSION) {
-                    subts.addSubstituion(new VariableExpr(param), e);
+                    argVar = ((VariableExpr) e).getVar();
                 } else {
                     SourceLocation sourceLoc = e.getSourceLocation();
-                    VarIdentifier newV = context.newVariable();
+                    argVar = context.newVariable();
                     Pair<ILangExpression, VariableSubstitutionEnvironment> p1 =
                             e.accept(cloneVisitor, new VariableSubstitutionEnvironment());
-                    VariableExpr newVRef1 = new VariableExpr(newV);
+                    VariableExpr newVRef1 = new VariableExpr(argVar);
                     newVRef1.setSourceLocation(sourceLoc);
                     LetClause c = new LetClause(newVRef1, (Expression) p1.first);
                     c.setSourceLocation(sourceLoc);
                     clauses.add(c);
-                    VariableExpr newVRef2 = new VariableExpr(newV);
-                    newVRef2.setSourceLocation(sourceLoc);
-                    subts.addSubstituion(new VariableExpr(param), newVRef2);
+                }
+
+                VariableExpr argVarExpr = new VariableExpr(argVar);
+                argVarExpr.setSourceLocation(e.getSourceLocation());
+                argVars.add(argVarExpr);
+            }
+
+            VariableSubstitutionEnvironment subst = new VariableSubstitutionEnvironment();
+            List<VarIdentifier> paramList = implem.getParamList();
+            if (implem.getSignature().getArity() == FunctionIdentifier.VARARGS) {
+                if (paramList.size() != 1) {
+                    throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, expr.getSourceLocation(),
+                            paramList.size());
+                }
+                VarIdentifier paramVarargs = paramList.get(0);
+                CallExpr argsListExpr =
+                        new CallExpr(new FunctionSignature(BuiltinFunctions.ORDERED_LIST_CONSTRUCTOR), argVars);
+                argsListExpr.setSourceLocation(expr.getSourceLocation());
+
+                VarIdentifier argsVar = context.newVariable();
+                VariableExpr argsVarRef1 = new VariableExpr(argsVar);
+                argsVarRef1.setSourceLocation(expr.getSourceLocation());
+                LetClause c = new LetClause(argsVarRef1, argsListExpr);
+                c.setSourceLocation(expr.getSourceLocation());
+                clauses.add(c);
+
+                VariableExpr argsVarRef2 = new VariableExpr(argsVar);
+                argsVarRef2.setSourceLocation(expr.getSourceLocation());
+                subst.addSubstituion(new VariableExpr(paramVarargs), argsVarRef2);
+            } else {
+                if (paramList.size() != argCount) {
+                    throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, expr.getSourceLocation(),
+                            paramList.size());
+                }
+                for (int i = 0; i < argCount; i++) {
+                    subst.addSubstituion(new VariableExpr(paramList.get(i)), argVars.get(i));
                 }
             }
 
             Pair<ILangExpression, VariableSubstitutionEnvironment> p2 =
-                    implem.getFuncBody().accept(cloneVisitor, subts);
+                    implem.getFuncBody().accept(cloneVisitor, subst);
             Expression resExpr;
             if (clauses.isEmpty()) {
                 resExpr = (Expression) p2.first;
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
index 9f81216..5ecc35f 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -239,6 +239,7 @@
     private static final String RETURNS = "RETURNS";
 
     private static final String INT_TYPE_NAME = "int";
+    private static final String UDF_VARARGS_PARAM_NAME = "args"; // Note: this value is stored in the function metadata
 
     // error configuration
     protected static final boolean REPORT_EXPECTED_TOKENS = false;
@@ -1178,7 +1179,9 @@
 {
   FunctionSignature signature = null;
   FunctionName fctName = null;
+  Pair<Integer, List<Pair<VarIdentifier,TypeExpression>>> paramsWithArity = null;
   List<Pair<VarIdentifier,TypeExpression>> params = null;
+  int arity = 0;
   TypeExpression returnType = null;
   Token beginPos = null, endPos = null;
   Expression functionBodyExpr = null;
@@ -1195,7 +1198,11 @@
      defaultDataverse = fctName.dataverse;
   }
   ifNotExists = IfNotExists()
-  params = FunctionParameters()
+  paramsWithArity = FunctionParameters()
+  {
+    arity = paramsWithArity.first;
+    params = paramsWithArity.second;
+  }
   returnType = FunctionReturnType()
   (
     (
@@ -1210,7 +1217,7 @@
         endPos = token;
         String functionBody = extractFragment(beginPos.beginLine, beginPos.beginColumn, endPos.beginLine,
           endPos.beginColumn);
-        signature = new FunctionSignature(fctName.dataverse, fctName.function, params.size());
+        signature = new FunctionSignature(fctName.dataverse, fctName.function, arity);
         getCurrentScope().addFunctionDescriptor(signature, false);
         removeCurrentScope();
         defaultDataverse = currentDataverse;
@@ -1225,7 +1232,7 @@
       <AT> libraryName = QualifiedName()
       (<WITH> withOptions = RecordConstructor())?
       {
-        signature = new FunctionSignature(fctName.dataverse, fctName.function, params.size());
+        signature = new FunctionSignature(fctName.dataverse, fctName.function, arity);
         defaultDataverse = currentDataverse;
         try {
           stmt = new CreateFunctionStatement(signature, params, returnType, libraryName.first,
@@ -1239,27 +1246,55 @@
   )
 }
 
-List<Pair<VarIdentifier,TypeExpression>> FunctionParameters() :
+Pair<Integer, List<Pair<VarIdentifier, TypeExpression>>> FunctionParameters() :
 {
-  List<Pair<VarIdentifier,TypeExpression>> paramList = Collections.<Pair<VarIdentifier,TypeExpression>>emptyList();
+  Pair<Integer, List<Pair<VarIdentifier, TypeExpression>>> params = null;
 }
 {
-  <LEFTPAREN> (paramList = FunctionParameterList())? <RIGHTPAREN>
+  <LEFTPAREN> (params = FunctionParameterList())? <RIGHTPAREN>
   {
-    return paramList;
+    if (params == null) {
+      params = new Pair<Integer, List<Pair<VarIdentifier, TypeExpression>>>(
+        0, Collections.<Pair<VarIdentifier, TypeExpression>>emptyList()
+      );
+    }
+    return params;
   }
 }
 
-List<Pair<VarIdentifier,TypeExpression>> FunctionParameterList() :
+Pair<Integer, List<Pair<VarIdentifier, TypeExpression>>> FunctionParameterList() :
 {
-  List<Pair<VarIdentifier,TypeExpression>> paramList = new ArrayList<Pair<VarIdentifier,TypeExpression>>();
-  Pair<VarIdentifier,TypeExpression> param = null;
+  List<Pair<VarIdentifier, TypeExpression>> paramList = null;
+  Pair<VarIdentifier, TypeExpression> param = null;
+  int arity = 0;
 }
 {
-  param = FunctionParameter() { paramList.add(param); }
-  ( <COMMA> param = FunctionParameter() { paramList.add(param); } )*
+  (
+    (
+      <DOT> <DOT> <DOT>
+      {
+        param = new Pair<VarIdentifier, TypeExpression>(
+          SqlppVariableUtil.toInternalVariableIdentifier(UDF_VARARGS_PARAM_NAME), null
+        );
+        paramList = Collections.<Pair<VarIdentifier, TypeExpression>>singletonList(param);
+        arity = FunctionIdentifier.VARARGS;
+      }
+    )
+    |
+    (
+      param = FunctionParameter()
+      {
+        paramList = new ArrayList<Pair<VarIdentifier, TypeExpression>>();
+        paramList.add(param);
+      }
+      ( <COMMA> param = FunctionParameter() { paramList.add(param); } )*
+      {
+        arity = paramList.size();
+      }
+    )
+  )
   {
-    return paramList;
+    return new Pair<Integer, List<Pair<VarIdentifier, TypeExpression>>>(arity, paramList);
   }
 }
 
@@ -1459,13 +1494,13 @@
 FunctionSignature FunctionSignature() throws ParseException:
 {
   FunctionName fctName = null;
-  List<Pair<VarIdentifier,TypeExpression>> params = null;
+  Pair<Integer, List<Pair<VarIdentifier,TypeExpression>>> params = null;
   int arity = 0;
 }
 {
   fctName = FunctionName()
   (
-    LOOKAHEAD(2) params = FunctionParameters() { arity = params.size(); }
+    LOOKAHEAD(2) params = FunctionParameters() { arity = params.first; }
   | ( <LEFTPAREN> arity = FunctionArity() <RIGHTPAREN> )
   | ( <ATT> arity = FunctionArity() ) // back-compat
   )
@@ -2564,19 +2599,21 @@
 {
   Token startToken = null;
   String functionName;
-  List<Pair<VarIdentifier,TypeExpression>> paramList;
+  Pair<Integer, List<Pair<VarIdentifier,TypeExpression>>> paramsWithArity = null;
   Expression funcBody;
   createNewScope();
 }
 {
   <DECLARE> { startToken = token; } <FUNCTION>
     functionName = Identifier()
-    paramList = FunctionParameters()
+    paramsWithArity = FunctionParameters()
   <LEFTBRACE>
     funcBody = FunctionBody()
   <RIGHTBRACE>
   {
-    FunctionSignature signature = new FunctionSignature(defaultDataverse, functionName, paramList.size());
+    int arity = paramsWithArity.first;
+    List<Pair<VarIdentifier,TypeExpression>> paramList = paramsWithArity.second;
+    FunctionSignature signature = new FunctionSignature(defaultDataverse, functionName, arity);
     getCurrentScope().addFunctionDescriptor(signature, false);
     ensureNoTypeDeclsInFunction(functionName, paramList, null, startToken);
     List<VarIdentifier> params = new ArrayList<VarIdentifier>(paramList.size());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
index dddd28e..0672906 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
@@ -197,7 +197,8 @@
                 dependencies);
     }
 
-    private List<TypeSignature> getParamTypes(ARecord functionRecord, DataverseName functionDataverseName) {
+    private List<TypeSignature> getParamTypes(ARecord functionRecord, DataverseName functionDataverseName)
+            throws AsterixException {
         ARecordType functionRecordType = functionRecord.getType();
         int paramTypesFieldIdx = functionRecordType.getFieldIndex(FUNCTION_ARECORD_FUNCTION_PARAMTYPES_FIELD_NAME);
         if (paramTypesFieldIdx < 0) {
@@ -221,7 +222,7 @@
                     paramType = getTypeSignature(paramTypeName, paramTypeDataverseNameCanonical, functionDataverseName);
                     break;
                 default:
-                    throw new IllegalStateException(); //TODO:FIXME
+                    throw new AsterixException(ErrorCode.METADATA_ERROR, paramTypeObject.getType().getTypeName());
             }
             paramTypes.add(paramType);
         }