Changeset: d6ae000343b1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d6ae000343b1
Modified Files:
        sql/common/sql_types.c
        sql/server/rel_select.c
        sql/test/group-concat/Tests/groupconcat05.sql
        sql/test/group-concat/Tests/groupconcat05.stable.out
Branch: statistics-analytics
Log Message:

Added listagg aggregate, which is the SQL standard name of group_concat


diffs (88 lines):

diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1412,6 +1412,9 @@ sqltypeinit( sql_allocator *sa)
        sql_create_aggr(sa, "count_no_nil", "aggr", "count_no_nil", LNG, 0);
        sql_create_aggr(sa, "count", "aggr", "count", LNG, 1, ANY);
 
+       sql_create_aggr(sa, "listagg", "aggr", "str_group_concat", STR, 1, STR);
+       sql_create_aggr(sa, "listagg", "aggr", "str_group_concat", STR, 2, STR, 
STR);
+
        /* order based operators */
        sql_create_analytic(sa, "diff", "sql", "diff", SCALE_NONE, BIT, 1, ANY);
        sql_create_analytic(sa, "diff", "sql", "diff", SCALE_NONE, BIT, 2, BIT, 
ANY);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -3409,7 +3409,7 @@ static sql_exp *
        if (!a && list_length(exps) > 1) {
                sql_subtype *t1 = exp_subtype(exps->h->data);
                a = sql_bind_member(sql->sa, s, aname, 
exp_subtype(exps->h->data), F_AGGR, list_length(exps), NULL);
-               bool is_group_concat = (!a && strcmp(s->base.name, "sys") == 0 
&& strcmp(aname, "group_concat") == 0);
+               bool is_group_concat = (!a && ((s && !strcmp(s->base.name, 
"sys") && !strcmp(aname, "group_concat")) || !strcmp(aname, "listagg")));
 
                if (list_length(exps) != 2 || (!EC_NUMBER(t1->type->eclass) || 
!a || is_group_concat || subtype_cmp(
                                                
&((sql_arg*)a->func->ops->h->data)->type,
diff --git a/sql/test/group-concat/Tests/groupconcat05.sql 
b/sql/test/group-concat/Tests/groupconcat05.sql
--- a/sql/test/group-concat/Tests/groupconcat05.sql
+++ b/sql/test/group-concat/Tests/groupconcat05.sql
@@ -28,4 +28,13 @@ select group_concat(a, 8) from testmore;
 select group_concat(a, b) from testmore;
 select group_concat(b, a) from testmore;
 
+/* listagg is the SQL standard name of group_concat */
+select listagg(a) from testmore;
+select listagg(b) from testmore;
+
+select listagg(a, a) from testmore;
+select listagg(b, b) from testmore;
+select listagg(a, b) from testmore;
+select listagg(b, a) from testmore;
+
 rollback;
diff --git a/sql/test/group-concat/Tests/groupconcat05.stable.out 
b/sql/test/group-concat/Tests/groupconcat05.stable.out
--- a/sql/test/group-concat/Tests/groupconcat05.stable.out
+++ b/sql/test/group-concat/Tests/groupconcat05.stable.out
@@ -141,6 +141,42 @@ stdout of test 'groupconcat05` in direct
 % clob # type
 % 53 # length
 [ "another1testing1todo2lets3get2harder3even2more13even1"      ]
+#select listagg(a) from testmore;
+% sys.%1 # table_name
+% %1 # name
+% varchar # type
+% 23 # length
+[ "1,1,1,2,3,2,3,2,1,3,2,1"    ]
+#select listagg(b) from testmore;
+% sys.%1 # table_name
+% %1 # name
+% varchar # type
+% 53 # length
+[ "another,testing,todo,lets,get,harder,even,more,,even,"      ]
+#select listagg(a, a) from testmore;
+% sys.%1 # table_name
+% %1 # name
+% varchar # type
+% 23 # length
+[ "11111223322332211332211"    ]
+#select listagg(b, b) from testmore;
+% sys.%1 # table_name
+% %1 # name
+% varchar # type
+% 79 # length
+[ 
"anothertestingtestingtodotodoletsletsgetgetharderharderevenevenmoremoreeveneven"
    ]
+#select listagg(a, b) from testmore;
+% sys.%1 # table_name
+% %1 # name
+% varchar # type
+% 47 # length
+[ "1testing1todo1lets2get3harder2even3more21even31"    ]
+#select listagg(b, a) from testmore;
+% sys.%1 # table_name
+% %1 # name
+% varchar # type
+% 53 # length
+[ "another1testing1todo2lets3get2harder3even2more13even1"      ]
 #rollback;
 
 # 12:57:06 >  
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to