This is an automated email from the ASF dual-hosted git repository.

dlych pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 5416520  [NO ISSUE][COMP] Support SQL++ varargs UDFs
5416520 is described below

commit 54165208bbd5773b32805948399f73bcfa6c3d8a
Author: Dmitry Lychagin <[email protected]>
AuthorDate: Mon Nov 9 14:04:53 2020 -0800

    [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 <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Dmitry Lychagin <[email protected]>
    Reviewed-by: Ian Maxon <[email protected]>
    Reviewed-by: Ali Alsuliman <[email protected]>
---
 .../asterix/app/translator/QueryTranslator.java    |  5 ++
 .../bad-ext-function-ddl-1.1.ddl.sqlpp}            |  9 +--
 .../bad-ext-function-ddl-1.2.lib.sqlpp}            |  8 +--
 .../bad-ext-function-ddl-1.3.ddl.sqlpp}            | 10 +--
 .../bad-function-ddl-1.1.ddl.sqlpp                 |  2 +-
 ....1.ddl.sqlpp => bad-function-ddl-1.2.ddl.sqlpp} | 16 ++---
 .../bad-function-ddl-11.3.ddl.sqlpp}               | 13 ++--
 .../bad-function-ddl-5.1.ddl.sqlpp                 |  2 +-
 ....1.ddl.sqlpp => bad-function-ddl-5.2.ddl.sqlpp} | 10 +--
 .../check-dependencies-1.4.ddl.sqlpp}              | 38 ++++++-----
 .../check-dependencies-1.5.query.sqlpp}            | 15 ++---
 .../check-dependencies-1.6.ddl.sqlpp}              | 10 +--
 .../create-or-replace-function-1.1.ddl.sqlpp       | 42 ++++++++++++-
 .../create-or-replace-function-1.2.query.sqlpp     |  8 ++-
 .../create-or-replace-function-1.3.query.sqlpp     |  4 +-
 ...y.1.ddl.sqlpp => drop-dependency-1.1.ddl.sqlpp} |  0
 ...y.1.ddl.sqlpp => drop-dependency-1.2.ddl.sqlpp} | 12 ++--
 ...y.1.ddl.sqlpp => drop-dependency-1.3.ddl.sqlpp} | 12 ++--
 ...y.1.ddl.sqlpp => drop-dependency-1.4.ddl.sqlpp} | 12 ++--
 ...y.2.ddl.sqlpp => drop-dependency-2.1.ddl.sqlpp} |  4 --
 ...y.2.ddl.sqlpp => drop-dependency-2.2.ddl.sqlpp} | 11 ++--
 ...y.3.ddl.sqlpp => drop-dependency-3.1.ddl.sqlpp} | 15 ++---
 .../drop-dependency-3.2.ddl.sqlpp}                 | 17 +++--
 .../drop-dependency-3.3.ddl.sqlpp}                 | 17 +++--
 .../drop-dependency-3.4.ddl.sqlpp}                 | 17 +++--
 ...y.4.ddl.sqlpp => drop-dependency-4.1.ddl.sqlpp} |  5 +-
 ...y.4.ddl.sqlpp => drop-dependency-4.2.ddl.sqlpp} |  7 +--
 ...y.5.ddl.sqlpp => drop-dependency-5.1.ddl.sqlpp} |  2 +-
 .../drop-dependency-5.2.ddl.sqlpp}                 | 11 ++--
 .../drop-dependency-5.3.ddl.sqlpp}                 | 11 ++--
 .../drop-dependency-5.4.ddl.sqlpp}                 | 15 ++---
 ...y.6.ddl.sqlpp => drop-dependency-6.1.ddl.sqlpp} |  7 +--
 ...y.6.ddl.sqlpp => drop-dependency-6.2.ddl.sqlpp} |  9 +--
 .../drop-function-1/drop-function-1.1.ddl.sqlpp    |  4 ++
 .../drop-function-1/drop-function-1.2.query.sqlpp  |  5 +-
 .../drop-function-1/drop-function-1.3.ddl.sqlpp    |  4 +-
 ...2.query.sqlpp => drop-function-1.5.query.sqlpp} |  7 ++-
 .../udf32_metadata/udf32_metadata.1.ddl.sqlpp      | 22 +++++++
 .../udf32_metadata/udf32_metadata.2.query.sqlpp    |  6 +-
 ...data.1.ddl.sqlpp => udf32_metadata.3.ddl.sqlpp} | 26 ++++----
 .../udf32_metadata.4.query.sqlpp}                  |  9 +--
 .../udf33_overloading.1.ddl.sqlpp                  |  8 +++
 .../udf33_overloading.3.query.sqlpp}               | 13 ++--
 .../udf35_varargs_misc.1.ddl.sqlpp}                | 45 +++++++++----
 .../udf35_varargs_misc.2.update.sqlpp}             | 11 +---
 .../udf35_varargs_misc.3.query.sqlpp}              | 13 ++--
 .../udf35_varargs_misc.4.query.sqlpp}              | 13 ++--
 .../udf35_varargs_misc.5.query.sqlpp}              | 13 ++--
 .../udf35_varargs_misc.6.query.sqlpp}              | 13 ++--
 .../udf35_varargs_misc.7.query.sqlpp}              | 13 ++--
 .../check-dependencies-1.2.adm                     |  5 ++
 .../create-or-replace-function-1.2.adm             |  2 +-
 .../create-or-replace-function-1.3.adm             |  8 ++-
 .../drop-function-1/drop-function-1.2.adm          |  2 +-
 .../udf32_metadata/udf32_metadata.2.adm            |  5 ++
 .../udf32_metadata/udf32_metadata.4.adm            |  1 +
 .../udf33_overloading/udf33_overloading.3.adm      |  1 +
 .../udf35_varargs_misc/udf35_varargs_misc.3.adm    | 10 +++
 .../udf35_varargs_misc/udf35_varargs_misc.4.adm    | 10 +++
 .../udf35_varargs_misc/udf35_varargs_misc.5.adm    | 10 +++
 .../udf35_varargs_misc/udf35_varargs_misc.6.adm    | 10 +++
 .../udf35_varargs_misc/udf35_varargs_misc.7.adm    | 10 +++
 .../resources/runtimets/testsuite_it_sqlpp.xml     |  6 ++
 .../test/resources/runtimets/testsuite_sqlpp.xml   | 21 +++++++
 .../asterix/lang/common/util/FunctionUtil.java     | 30 ++++++---
 .../common/visitor/AbstractInlineUdfsVisitor.java  | 59 +++++++++++++----
 .../asterix-lang-sqlpp/src/main/javacc/SQLPP.jj    | 73 ++++++++++++++++------
 .../FunctionTupleTranslator.java                   |  5 +-
 68 files changed, 553 insertions(+), 316 deletions(-)

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.exceptions.AlgebricksException;
 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 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             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/create-or-replace-function-1/create-or-replace-function-1.2.query.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 91%
copy from 
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
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 8e6c136..76cc70d 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/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.1.ddl.sqlpp
@@ -16,10 +16,5 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-use test;
-
-{
-  "f1": f1(5, 2),
-  "f2": f2(5, 2)
-}
\ 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/create-or-replace-function-1/create-or-replace-function-1.2.query.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 88%
copy from 
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
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 8e6c136..3dc6eb6 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/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.2.lib.sqlpp
@@ -16,10 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-use test;
-
-{
-  "f1": f1(5, 2),
-  "f2": f2(5, 2)
-}
\ 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/create-or-replace-function-1/create-or-replace-function-1.2.query.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 81%
copy from 
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
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 8e6c136..dd90769 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/external-library/bad-ext-function-ddl-1/bad-ext-function-ddl-1.3.ddl.sqlpp
@@ -17,9 +17,9 @@
  * under the License.
  */
 
-use test;
+/*
+ * Error: External varargs functions are not yet supported
+ */
 
-{
-  "f1": f1(5, 2),
-  "f2": f2(5, 2)
-}
\ 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/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.2.ddl.sqlpp
similarity index 73%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-1/bad-function-ddl-1.1.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 36eed22..c4b5967 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.2.ddl.sqlpp
@@ -18,17 +18,17 @@
  */
 
 /*
- * Description  : Declare a UDF on a dataset that does not exist
+ * Description  : Declare a varargs UDF on a dataset that does not exist
  * Expected Res : Error
  */
 
-drop dataverse experiments if exists;
-create dataverse experiments;
-use experiments;
+drop dataverse experiments2 if exists;
+create dataverse experiments2;
+use experiments2;
 
-create function bad_function(place, text) {
+create function bad_function2(...) {
   (select m.message_text
-  from TweetMessages m
-  where contains(m.message_text,text)
-  and spatial_intersect(m.sender_location, place))
+  from TweetMessages2 m
+  where contains(m.message_text,args[1])
+  and spatial_intersect(m.sender_location, args[0]))
 };
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-11/bad-function-ddl-11.3.ddl.sqlpp
similarity index 77%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.1.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 f3b0c0f..6f92b84 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-11/bad-function-ddl-11.3.ddl.sqlpp
@@ -18,15 +18,14 @@
  */
 
 /*
- * Description  : Declare a UDF that uses a function that does not exist
+ * Description  : Return type definition is prohibited for inline varargs 
functions
  * Expected Res : Error
  */
 
-drop dataverse experiments if exists;
-create dataverse experiments;
-use experiments;
+drop dataverse experiments3 if exists;
+create dataverse experiments3;
+use experiments3;
 
-
-create function bad_function(place, text) {
-  function_that_does_not_exist()
+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/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.2.ddl.sqlpp
similarity index 80%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.1.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 f3b0c0f..59ea86c 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.2.ddl.sqlpp
@@ -18,15 +18,15 @@
  */
 
 /*
- * Description  : Declare a UDF that uses a function that does not exist
+ * Description  : Declare a varargs UDF that uses a function that does not 
exist
  * Expected Res : Error
  */
 
-drop dataverse experiments if exists;
-create dataverse experiments;
-use experiments;
+drop dataverse experiments2 if exists;
+create dataverse experiments2;
+use experiments2;
 
 
-create function bad_function(place, text) {
+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-1/drop-dependency.1.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-1/drop-dependency.1.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 08ad454..0fe609b 100644
--- 
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/check-dependencies-1/check-dependencies-1.4.ddl.sqlpp
@@ -16,26 +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 B;
-create dataverse C;
-use C;
+drop dataverse X if exists;
+drop dataverse Y if exists;
+create dataverse X;
+create dataverse Y;
+
+use X;
 
-create function f1(message, text){
-  contains(message,text)
+create function fx1(a) {
+  upper(a)
 };
 
-use B;
+create function fx2(...) {
+  string_join(args, ".")
+};
 
-create function f0(message, text){
-  C.f1(message,text)
+create function fx3(a, b, c) {
+  fx1(a) || fx2(b, c)
 };
 
-drop dataverse C;
\ No newline at end of file
+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-function-1/drop-function-1.1.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 74%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.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 be5e07d..8f6fac0 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/check-dependencies-1/check-dependencies-1.5.query.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under one
+ * Licensed to the Apache Software Foundation (ASF) under A
  * 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,16 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Test drop function
+ * Description  : Verify Function Dependency Metadata
  * Expected Res : Success
  */
 
-drop dataverse experiments if exists;
-create dataverse experiments;
-use experiments;
-
-create function my_sum(a, b) {
-  a + b
-};
+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/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/check-dependencies-1/check-dependencies-1.6.ddl.sqlpp
similarity index 86%
copy from 
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
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.6.ddl.sqlpp
index 8e6c136..c033635 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/check-dependencies-1/check-dependencies-1.6.ddl.sqlpp
@@ -1,5 +1,5 @@
 /*
- * Licensed to the Apache Software Foundation (ASF) under one
+ * Licensed to the Apache Software Foundation (ASF) under A
  * 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,9 +17,5 @@
  * under the License.
  */
 
-use test;
-
-{
-  "f1": f1(5, 2),
-  "f2": f2(5, 2)
-}
\ 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 @@ create function f1(a, b) {
   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 @@ use test;
 
 {
   "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%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency.1.ddl.sqlpp
copy 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-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.2.ddl.sqlpp
similarity index 79%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency.1.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 08ad454..dd9b50b 100644
--- 
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.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,16 +27,17 @@ drop dataverse B if exists;
 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)
 };
 
 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-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.3.ddl.sqlpp
similarity index 79%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency.1.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 08ad454..e99450e 100644
--- 
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.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,16 +27,17 @@ drop dataverse B if exists;
 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])
 };
 
 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-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.4.ddl.sqlpp
similarity index 80%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency.1.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 08ad454..5c333c4 100644
--- 
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.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,16 +27,17 @@ drop dataverse B if exists;
 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])
 };
 
 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 94%
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.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 type TweetMessageType as closed {
 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 88%
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.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 type TweetMessageType as closed {
 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;
+
+drop dataverse C if exists;
 create dataverse C;
-use C;
 
-create function f1(message, text){
+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-1/drop-dependency.1.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 83%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency.1.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 08ad454..ca7c74d 100644
--- 
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-3/drop-dependency-3.2.ddl.sqlpp
@@ -19,23 +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)
 };
 
-drop dataverse C;
\ 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-1/drop-dependency.1.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-1/drop-dependency.1.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 08ad454..1017f65 100644
--- 
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-3/drop-dependency-3.3.ddl.sqlpp
@@ -19,23 +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])
 };
 
-drop dataverse C;
\ 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-1/drop-dependency.1.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-1/drop-dependency.1.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 08ad454..a98cc89 100644
--- 
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-3/drop-dependency-3.4.ddl.sqlpp
@@ -19,23 +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])
 };
 
-drop dataverse C;
\ 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 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.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 type TweetMessageType as closed {
 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 91%
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.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 type TweetMessageType as closed {
 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 90%
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-1/drop-dependency.1.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 86%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency.1.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 08ad454..ab80b88 100644
--- 
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-5/drop-dependency-5.2.ddl.sqlpp
@@ -19,12 +19,11 @@
 
 /*
  * 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 B;
 create dataverse C;
 use C;
 
@@ -32,10 +31,8 @@ create function f1(message, text){
   contains(message,text)
 };
 
-use B;
-
-create function f0(message, text){
-  C.f1(message,text)
+create function f0(...){
+  C.f1(args[0],args[1])
 };
 
-drop dataverse C;
\ No newline at end of file
+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-1/drop-dependency.1.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-1/drop-dependency.1.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 08ad454..e88cbe9 100644
--- 
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-5/drop-dependency-5.3.ddl.sqlpp
@@ -19,23 +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 B;
 create dataverse C;
 use C;
 
-create function f1(message, text){
-  contains(message,text)
+create function f1(...){
+  contains(args[0],args[1])
 };
 
-use B;
-
 create function f0(message, text){
   C.f1(message,text)
 };
 
-drop dataverse C;
\ 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-1/drop-dependency.1.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%
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-5/drop-dependency-5.4.ddl.sqlpp
index 08ad454..1ed188e 100644
--- 
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-5/drop-dependency-5.4.ddl.sqlpp
@@ -19,23 +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 B;
 create dataverse C;
 use C;
 
-create function f1(message, text){
-  contains(message,text)
+create function f1(...){
+  contains(args[0],args[1])
 };
 
-use B;
-
-create function f0(message, text){
-  C.f1(message,text)
+create function f0(...){
+  C.f1(args[0], args[1])
 };
 
-drop dataverse C;
\ 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 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.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 type TweetMessageType as closed {
 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 88%
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.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 type TweetMessageType as closed {
 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 @@ use experiments;
 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-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.5.query.sqlpp
similarity index 88%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.2.query.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 0f0de1a..21cac79 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.5.query.sqlpp
@@ -17,6 +17,11 @@
  * under the License.
  */
 
+/*
+ * Description  : Error. Unknown function with varargs
+ * Expected Res : Failure
+ */
+
 use experiments;
 
-my_sum(2, 3);
\ 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 8392e6c..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 myfn002(a) {
 
 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/udf32_metadata/udf32_metadata.1.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.3.ddl.sqlpp
similarity index 77%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.1.ddl.sqlpp
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.3.ddl.sqlpp
index 8392e6c..7a422ff 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.3.ddl.sqlpp
@@ -16,19 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-drop dataverse test if exists;
-create dataverse test;
 
 use test;
 
-create function myfn001() {
-  42
-};
+drop function myfn001();
 
-create function myfn002(a) {
-  a
-};
+drop function myfn002(a);
 
-create function myfn003(a, b) {
-  a + b
-};
\ No newline at end of file
+drop function myfn003(a, b);
+
+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/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/udf32_metadata/udf32_metadata.4.query.sqlpp
similarity index 91%
copy from 
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
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf32_metadata/udf32_metadata.4.query.sqlpp
index 8e6c136..f932300 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/udf32_metadata/udf32_metadata.4.query.sqlpp
@@ -17,9 +17,6 @@
  * under the License.
  */
 
-use test;
-
-{
-  "f1": f1(5, 2),
-  "f2": f2(5, 2)
-}
\ 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) {
 
 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-function-1/drop-function-1.1.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf33_overloading/udf33_overloading.3.query.sqlpp
similarity index 77%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.ddl.sqlpp
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf33_overloading/udf33_overloading.3.query.sqlpp
index be5e07d..2bf7a91 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/udf33_overloading/udf33_overloading.3.query.sqlpp
@@ -18,14 +18,15 @@
  */
 
 /*
- * Description  : Test drop function
+ * Description  : Function overloading is allowed.
+ *                Non-varags function takes precedence over varargs function
  * Expected Res : Success
  */
 
-drop dataverse experiments if exists;
-create dataverse experiments;
 use experiments;
 
-create function my_sum(a, b) {
-  a + b
-};
+{
+  "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/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/udf35_varargs_misc/udf35_varargs_misc.1.ddl.sqlpp
similarity index 54%
copy from 
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
copy to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf35_varargs_misc/udf35_varargs_misc.1.ddl.sqlpp
index c111196..0398430 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/udf35_varargs_misc/udf35_varargs_misc.1.ddl.sqlpp
@@ -16,26 +16,49 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Test CREATE OR REPLACE FUNCTION
+ * Description  : Miscellaneous tests for varargs functions
  * Expected Res : Success
  */
 
-drop dataverse test if exists;
+drop  dataverse test if exists;
 create dataverse test;
+
 use test;
 
-create function f1(a, b) {
-  a + b
+create type FacebookUserType as open {
+  id : bigint
+};
+
+create  dataset FacebookUsers(FacebookUserType) primary key id;
+
+-----
+
+create function f1(...) {
+  "const"
 };
 
-/* Replace an existing function */
-create or replace function f1(a, b) {
-  a - b
+create function f2(...) {
+  string_join(args, "|")
 };
 
-/* Create new function */
-create or replace function f2(a, b) {
-  a * b
+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-function-1/drop-function-1.1.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 82%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.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 be5e07d..a69c0ef 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/udf35_varargs_misc/udf35_varargs_misc.2.update.sqlpp
@@ -16,16 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Test drop function
+ * Description  : Miscellaneous tests for varargs functions
  * Expected Res : Success
  */
 
-drop dataverse experiments if exists;
-create dataverse experiments;
-use experiments;
+use test;
 
-create function my_sum(a, b) {
-  a + b
-};
+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-function-1/drop-function-1.1.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 83%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.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 be5e07d..a96ecdf 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/udf35_varargs_misc/udf35_varargs_misc.3.query.sqlpp
@@ -16,16 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Test drop function
+ * Description  : Miscellaneous tests for varargs functions
  * Expected Res : Success
  */
 
-drop dataverse experiments if exists;
-create dataverse experiments;
-use experiments;
+use test;
 
-create function my_sum(a, b) {
-  a + b
-};
+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-function-1/drop-function-1.1.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 83%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.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 be5e07d..3229ee4 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/udf35_varargs_misc/udf35_varargs_misc.4.query.sqlpp
@@ -16,16 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Test drop function
+ * Description  : Miscellaneous tests for varargs functions
  * Expected Res : Success
  */
 
-drop dataverse experiments if exists;
-create dataverse experiments;
-use experiments;
+use test;
 
-create function my_sum(a, b) {
-  a + b
-};
+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-function-1/drop-function-1.1.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 83%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.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 be5e07d..3f728da 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/udf35_varargs_misc/udf35_varargs_misc.5.query.sqlpp
@@ -16,16 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Test drop function
+ * Description  : Miscellaneous tests for varargs functions
  * Expected Res : Success
  */
 
-drop dataverse experiments if exists;
-create dataverse experiments;
-use experiments;
+use test;
 
-create function my_sum(a, b) {
-  a + b
-};
+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-function-1/drop-function-1.1.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 82%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.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 be5e07d..94e0007 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/udf35_varargs_misc/udf35_varargs_misc.6.query.sqlpp
@@ -16,16 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Test drop function
+ * Description  : Miscellaneous tests for varargs functions
  * Expected Res : Success
  */
 
-drop dataverse experiments if exists;
-create dataverse experiments;
-use experiments;
+use test;
 
-create function my_sum(a, b) {
-  a + b
-};
+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-function-1/drop-function-1.1.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 83%
copy from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-function-1/drop-function-1.1.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 be5e07d..d2443b3 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/udf35_varargs_misc/udf35_varargs_misc.7.query.sqlpp
@@ -16,16 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 /*
- * Description  : Test drop function
+ * Description  : Miscellaneous tests for varargs functions
  * Expected Res : Success
  */
 
-drop dataverse experiments if exists;
-create dataverse experiments;
-use experiments;
+use test;
 
-create function my_sum(a, b) {
-  a + b
-};
+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 @@ public class FunctionUtil {
             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 @@ public class FunctionUtil {
             Expression expression, List<FunctionSignature> declaredFunctions, 
List<FunctionDecl> inputFunctionDecls,
             IFunctionCollector functionCollector, FunctionParser 
functionParser, DataverseName defaultDataverse)
             throws CompilationException {
-        List<FunctionDecl> functionDecls =
-                inputFunctionDecls == null ? new ArrayList<>() : new 
ArrayList<>(inputFunctionDecls);
         if (expression == null) {
-            return functionDecls;
+            return Collections.emptyList();
         }
+        List<FunctionDecl> functionDecls =
+                inputFunctionDecls == null ? new ArrayList<>() : new 
ArrayList<>(inputFunctionDecls);
         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 @@ package org.apache.asterix.lang.common.visitor;
 
 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.struct.VarIdentifier;
 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 @@ public abstract class AbstractInlineUdfsVisitor extends 
AbstractQueryExpressionV
             // 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 @@ class SQLPPParser extends ScopeChecker implements IParser {
     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 @@ CreateFunctionStatement FunctionSpecification(Token 
startStmtToken, boolean orRe
 {
   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 @@ CreateFunctionStatement FunctionSpecification(Token 
startStmtToken, boolean orRe
      defaultDataverse = fctName.dataverse;
   }
   ifNotExists = IfNotExists()
-  params = FunctionParameters()
+  paramsWithArity = FunctionParameters()
+  {
+    arity = paramsWithArity.first;
+    params = paramsWithArity.second;
+  }
   returnType = FunctionReturnType()
   (
     (
@@ -1210,7 +1217,7 @@ CreateFunctionStatement FunctionSpecification(Token 
startStmtToken, boolean orRe
         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 @@ CreateFunctionStatement FunctionSpecification(Token 
startStmtToken, boolean orRe
       <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 @@ CreateFunctionStatement FunctionSpecification(Token 
startStmtToken, boolean orRe
   )
 }
 
-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 @@ String GetPolicy() throws ParseException:
 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 @@ FunctionDecl FunctionDeclaration() throws 
ParseException:
 {
   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 @@ public class FunctionTupleTranslator extends 
AbstractDatatypeTupleTranslator<Fun
                 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 @@ public class FunctionTupleTranslator extends 
AbstractDatatypeTupleTranslator<Fun
                     paramType = getTypeSignature(paramTypeName, 
paramTypeDataverseNameCanonical, functionDataverseName);
                     break;
                 default:
-                    throw new IllegalStateException(); //TODO:FIXME
+                    throw new AsterixException(ErrorCode.METADATA_ERROR, 
paramTypeObject.getType().getTypeName());
             }
             paramTypes.add(paramType);
         }

Reply via email to