Changeset: 72f2e92bcc3c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/72f2e92bcc3c
Modified Files:
        sql/common/sql_types.c
        sql/common/sql_types.h
        sql/server/rel_exp.c
        sql/server/rel_select.c
Branch: Jul2021
Log Message:

Only internal functions are known to be commutative


diffs (61 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
@@ -150,9 +150,9 @@ int sql_type_convert (int from, int to)
        return convert_matrix[from][to];
 }
 
-bool is_commutative(const char *fnm)
+bool is_commutative(const char *sname, const char *fnm)
 {
-       return strcmp("sql_add", fnm) == 0 || strcmp("sql_mul", fnm) == 0 || 
strcmp("scale_up", fnm) == 0;
+       return (!sname || strcmp("sys", sname) == 0) && (strcmp("sql_add", fnm) 
== 0 || strcmp("sql_mul", fnm) == 0 || strcmp("scale_up", fnm) == 0);
 }
 
 void
diff --git a/sql/common/sql_types.h b/sql/common/sql_types.h
--- a/sql/common/sql_types.h
+++ b/sql/common/sql_types.h
@@ -26,7 +26,7 @@ extern unsigned int digits2bits(unsigned
 extern unsigned int type_digits_to_char_digits(sql_subtype *t);
 
 extern int sql_type_convert(int form, int to); /* return 1, convert possible 
but it's a down cast, 2 convert possible can be done savely */
-extern bool is_commutative(const char *fnm);   /* return true if commutative */
+extern bool is_commutative(const char *sname, const char *fnm);        /* 
return true if commutative */
 
 extern char *sql_bind_alias(const char *alias);
 
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1348,7 +1348,8 @@ exp_match_exp( sql_exp *e1, sql_exp *e2)
                        break;
                case e_func: {
                        sql_subfunc *e1f = (sql_subfunc*) e1->f;
-                       int (*comp)(list*, list*) = !e1f->func->s && 
is_commutative(e1f->func->base.name) ? exp_match_list : exps_equal;
+                       const char *sname = e1f->func->s ? 
e1f->func->s->base.name : NULL;
+                       int (*comp)(list*, list*) = is_commutative(sname, 
e1f->func->base.name) ? exp_match_list : exps_equal;
 
                        if (!e1f->func->side_effect &&
                                !subfunc_cmp(e1f, e2->f) && /* equal functions 
*/
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
@@ -2924,7 +2924,7 @@ rel_binop_(mvc *sql, sql_rel *rel, sql_e
        if (card == card_loader)
                card = card_none;
 
-       if (is_commutative(fname) && l->card < r->card) { /* move constants to 
the right if possible */
+       if (is_commutative(sname, fname) && l->card < r->card) { /* move 
constants to the right if possible */
                sql_subtype *tmp = t1;
                t1 = t2;
                t2 = tmp;
@@ -2983,7 +2983,7 @@ rel_binop_(mvc *sql, sql_rel *rel, sql_e
                sql->session->status = 0; /* if the function was not found 
clean the error */
                sql->errstr[0] = '\0';
        }
-       if (!f && is_commutative(fname)) {
+       if (!f && is_commutative(sname, fname)) {
                if ((f = bind_func(sql, sname, fname, t2, t1, type, &found))) {
                        sql_subtype *tmp = t1;
                        t1 = t2;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to