Changeset: 9a88cff3c9fd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9a88cff3c9fd
Modified Files:
        sql/server/rel_dump.c
Branch: Jun2020
Log Message:

Small missing rel_read cases


diffs (126 lines):

diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -340,9 +340,8 @@ op2string(operator_type op)
        case op_delete:
        case op_truncate:
                return "modify op";
-       default:
-               return "unknown";
        }
+       return "unknown";
 }
 
 static int
@@ -838,7 +837,7 @@ read_exps(mvc *sql, sql_rel *lrel, sql_r
 static sql_exp*
 exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *pexps, char *r, int 
*pos, int grp)
 {
-       int f = -1, not = 1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0;
+       int f = -1, not = 1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0, 
zero_if_empty = 0;
        char *tname = NULL, *cname = NULL, *var_cname = NULL, *e, *b = r + 
*pos, *st;
        sql_exp *exp = NULL;
        list *exps = NULL;
@@ -894,7 +893,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        }
                        if (strncmp(r+*pos, "or",  strlen("or")) == 0) {
                                (*pos)+= (int) strlen("or");
-                       } else if (strncmp(r+*pos, "FILTER",  strlen("FILTER")) 
== 0) {
+                       } else if (strncasecmp(r+*pos, "FILTER",  
strlen("FILTER")) == 0) {
                                (*pos)+= (int) strlen("FILTER");
                                filter = 1;
                        } else {
@@ -998,6 +997,11 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        (*pos)+= (int) strlen("no nil");
                        skipWS(r, pos);
                }
+               if (r[*pos] == 'z') {
+                       zero_if_empty = 1;
+                       (*pos)+= (int) strlen("zero if empty");
+                       skipWS(r, pos);
+               }
        }
        if (r[*pos] == '(') {
                sql_schema *s;
@@ -1016,10 +1020,12 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        if (exps && exps->h)
                                a = sql_bind_func(sql->sa, s, cname, 
exp_subtype(exps->h->data), NULL, F_AGGR);
                        else
-                               a = sql_bind_func(sql->sa, s, cname, 
sql_bind_localtype("void"), NULL, F_AGGR);
+                               a = sql_bind_func(sql->sa, s, cname, 
sql_bind_localtype("void"), NULL, F_AGGR); /* count(*) */
                        if (!a)
                                return sql_error(sql, -1, SQLSTATE(42000) 
"Aggregate %s%s%s not found\n", tname ? tname : "", tname ? "." : "", cname);
                        exp = exp_aggr( sql->sa, exps, a, unique, no_nils, 
CARD_ATOM, 1);
+                       if (zero_if_empty)
+                               set_zero_if_empty(exp);
                } else {
                        list *ops = sa_list(sql->sa);
                        for( n = exps->h; n; n = n->next)
@@ -1040,17 +1046,17 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                }
                        }
                        /* fix scale of div function */
-                        if (f && f->func->fix_scale == SCALE_DIV && 
list_length(exps) == 2) {
-                                sql_arg *ares = f->func->res->h->data;
+                       if (f && f->func->fix_scale == SCALE_DIV && 
list_length(exps) == 2) {
+                               sql_arg *ares = f->func->res->h->data;
 
-                                if (strcmp(f->func->imp, "/") == 0 && 
ares->type.type->scale == SCALE_FIX) {
-                                        sql_subtype *res = f->res->h->data;
-                                        sql_subtype *lt = ops->h->data;
-                                        sql_subtype *rt = ops->h->next->data;
+                               if (strcmp(f->func->imp, "/") == 0 && 
ares->type.type->scale == SCALE_FIX) {
+                                       sql_subtype *res = f->res->h->data;
+                                       sql_subtype *lt = ops->h->data;
+                                       sql_subtype *rt = ops->h->next->data;
 
-                                        res->scale = lt->scale - rt->scale;
-                                }
-                        }
+                                       res->scale = lt->scale - rt->scale;
+                               }
+                       }
 
                        if (f)
                                exp = exp_op( sql->sa, exps, f);
@@ -1235,6 +1241,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        f = cmp_notin;
                }
                break;
+       case 'f':
        case 'F':
                if (strncasecmp(r+*pos, "FILTER",  strlen("FILTER")) == 0) {
                        (*pos)+= (int) strlen("FILTER");
@@ -1293,8 +1300,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        list *exps = read_exps(sql, lrel, rrel, pexps, r, pos, 
'(', 0);
                        if (!exps)
                                return NULL;
-                       if (f == cmp_in || f == cmp_notin)
-                               return exp_in(sql->sa, exp, exps, f);
+                       return exp_in(sql->sa, exp, exps, f);
                } else {
                        int sym = 0, between = 0;
                        sql_exp *e = exp_read(sql, lrel, rrel, pexps, r, pos, 
0);
@@ -1609,9 +1615,6 @@ rel_read(mvc *sql, char *r, int *pos, li
                if (r[*pos] == '[')
                        if (!(rel->r = read_exps(sql, nrel, rel, NULL, r, pos, 
'[', 0)))
                                return NULL;
-               if (distinct)
-                       set_distinct(rel);
-               distinct = 0;
                break;
        case 'g':
                *pos += (int) strlen("group by");
@@ -1827,9 +1830,11 @@ rel_read(mvc *sql, char *r, int *pos, li
        case 'd':
                /* 'ddl' not supported */
        default:
-               return NULL;
+               return sql_error(sql, -1, SQLSTATE(42000) "Could not determine 
the input relation\n");
        }
 
+       if (!rel)
+               return sql_error(sql, -1, SQLSTATE(42000) "Could not determine 
the input relation\n");
        if (distinct)
                set_distinct(rel);
        if (single)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to