Changeset: e3536473d5fc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e3536473d5fc
Modified Files:
        monetdb5/mal/mal_profiler.c
        sql/backends/monet5/wlr.c
Branch: default
Log Message:

Merged with Jul2021


diffs (258 lines):

diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -371,7 +371,7 @@ project_any(BAT *restrict bn, BAT *restr
 }
 
 static BAT *
-project_str(BAT *restrict l, struct canditer *restrict ci,
+project_str(BAT *restrict l, struct canditer *restrict ci, int tpe,
            BAT *restrict r1, BAT *restrict r2,
            BATiter *restrict r1i, BATiter *restrict r2i,
            lng t0)
@@ -386,7 +386,7 @@ project_str(BAT *restrict l, struct cand
        var_t v;
        BATiter *ri;
 
-       if ((bn = COLnew(l->hseqbase, TYPE_str, ci ? ci->ncand : BATcount(l),
+       if ((bn = COLnew(l->hseqbase, tpe, ci ? ci->ncand : BATcount(l),
                         TRANSIENT)) == NULL)
                return NULL;
 
@@ -591,7 +591,7 @@ BATproject2(BAT *restrict l, BAT *restri
        BAT *or1 = r1, *or2 = r2, *ol = l;
        oid lo, hi;
        gdk_return res;
-       int tpe = ATOMtype(r1->ttype);
+       int tpe = ATOMtype(r1->ttype), otpe = tpe;
        bool stringtrick = false;
        BUN lcount = BATcount(l);
        struct canditer ci, *lci = NULL;
@@ -690,7 +690,7 @@ BATproject2(BAT *restrict l, BAT *restri
                         * vheap; this also means that for this case we
                         * don't care about duplicate elimination: it
                         * will remain the same */
-                       bn = project_str(l, lci, r1, r2, &r1i, &r2i, t0);
+                       bn = project_str(l, lci, tpe, r1, r2, &r1i, &r2i, t0);
                        bat_iterator_end(&r1i);
                        bat_iterator_end(&r2i);
                        return bn;
@@ -787,7 +787,7 @@ BATproject2(BAT *restrict l, BAT *restri
                } else {
                        /* make copy of string heap */
                        bn->tvheap->parentid = bn->batCacheid;
-                       bn->tvheap->farmid = BBPselectfarm(bn->batRole, 
TYPE_str, varheap);
+                       bn->tvheap->farmid = BBPselectfarm(bn->batRole, otpe, 
varheap);
                        strconcat_len(bn->tvheap->filename,
                                      sizeof(bn->tvheap->filename),
                                      BBP_physical(bn->batCacheid), ".theap",
@@ -965,14 +965,14 @@ BATprojectchain(BAT **bats)
        bi = bat_iterator(b);
        if (nonil && ATOMstorage(tpe) == TYPE_str && b->batRestricted == 
BAT_READ) {
                stringtrick = true;
-               tpe = bi.width == 1 ? TYPE_bte : (bi.width == 2 ? TYPE_sht : 
(bi.width == 4 ? TYPE_int : TYPE_lng));
-               bn = COLnew_intern(ba[0].hlo, TYPE_str, ba[0].cnt, TRANSIENT, 
bi.width);
+               bn = COLnew_intern(ba[0].hlo, tpe, ba[0].cnt, TRANSIENT, 
bi.width);
                if (bn && bn->tvheap) {
                        /* no need to remove any files since they were
                         * never created for this bat */
                        HEAPdecref(bn->tvheap, false);
                        bn->tvheap = NULL;
                }
+               tpe = bi.width == 1 ? TYPE_bte : (bi.width == 2 ? TYPE_sht : 
(bi.width == 4 ? TYPE_int : TYPE_lng));
        } else {
                bn = COLnew(ba[0].hlo, tpe, ba[0].cnt, TRANSIENT);
        }
diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c
--- a/monetdb5/mal/mal_profiler.c
+++ b/monetdb5/mal/mal_profiler.c
@@ -884,6 +884,7 @@ sqlProfilerEvent(Client cntxt, MalBlkPtr
        MT_lock_set(&mal_profileLock);
        if (cntxt->profticks == NULL) {
                MT_lock_unset(&mal_profileLock);
+               GDKfree(stmt);
                return;
        }
        errors += BUNappend(cntxt->profticks, &pci->ticks, false) != 
GDK_SUCCEED;
diff --git a/sql/backends/monet5/sql_time.c b/sql/backends/monet5/sql_time.c
--- a/sql/backends/monet5/sql_time.c
+++ b/sql/backends/monet5/sql_time.c
@@ -1153,7 +1153,10 @@ bailout:
                        } \
                } else { \
                        TPE_IN next = *(TPE_IN*)getArgReference(stk, pci, 1); \
-                       FUNC(*ret, TPE_IN, FUNC_NAME, MAX_VALUE, 
CAST_VALIDATION, MUL_VALIDATION); \
+                       if (is_##TPE_IN##_nil(next)) \
+                               *ret = TPE_OUT##_nil;   \
+                       else    \
+                               FUNC(*ret, TPE_IN, FUNC_NAME, MAX_VALUE, 
CAST_VALIDATION, MUL_VALIDATION); \
                } \
        } while(0)
 
diff --git a/sql/backends/monet5/wlr.c b/sql/backends/monet5/wlr.c
--- a/sql/backends/monet5/wlr.c
+++ b/sql/backends/monet5/wlr.c
@@ -319,7 +319,9 @@ WLRprocessBatch(Client cntxt)
                        }
                        q= getInstrPtr(mb, mb->stop - 1);
                        if( getModuleId(q) != wlrRef){
-                               msg =createException(MAL,"wlr.process", "batch 
%d:improper wlr instruction: %s\n", i, instruction2str(mb,0, q, LIST_MAL_CALL));
+                               char *s = instruction2str(mb,0, q, 
LIST_MAL_CALL);
+                               msg = createException(MAL,"wlr.process", "batch 
%d:improper wlr instruction: %s\n", i, s);
+                               GDKfree(s);
                                cleanup();
                                break;
                        }
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
@@ -1558,19 +1558,23 @@ rel_filter(mvc *sql, sql_rel *rel, list 
        if (exps_one_is_rel(l) || exps_one_is_rel(r)) /* uncorrelated subquery 
case */
                return rel_select(sql->sa, rel, e);
        /* atom or row => select */
-       if (exps_card(l) > rel->card) {
-               sql_exp *ls = l->h->data;
-               if (exp_name(ls))
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", exp_name(ls));
-               else
+       for (node *n=l->h; n; n = n->next) {
+               sql_exp *ls = n->data;
+
+               if (ls->card > rel->card) {
+                       if (exp_name(ls))
+                               return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results 
without an aggregate function", exp_name(ls));
                        return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column in query results without an aggregate 
function");
-       }
-       if (exps_card(r) > rel->card) {
-               sql_exp *rs = l->h->data;
-               if (exp_name(rs))
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", exp_name(rs));
-               else
+               }
+       }
+       for (node *n=r->h; n; n = n->next) {
+               sql_exp *rs = n->data;
+
+               if (rs->card > rel->card) {
+                       if (exp_name(rs))
+                               return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results 
without an aggregate function", exp_name(rs));
                        return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column in query results without an aggregate 
function");
+               }
        }
        if (!is_join(rel->op) && !is_select(rel->op))
                return rel_select(sql->sa, rel, e);
@@ -1665,17 +1669,11 @@ rel_compare_exp_(sql_query *query, sql_r
                return rel_select(sql->sa, rel_project_exp(sql->sa, 
exp_atom_bool(sql->sa, 1)), e);
 
        /* atom or row => select */
-       if (ls->card > rel->card) {
-               if (exp_name(ls))
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", exp_name(ls));
-               else
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column in query results without an aggregate 
function");
-       }
-       if (rs->card > rel->card || (rs2 && rs2->card > rel->card)) {
-               if (exp_name(rs))
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", exp_name(rs));
-               else
-                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column in query results without an aggregate 
function");
+       if (ls->card > rel->card || rs->card > rel->card || (rs2 && rs2->card > 
rel->card)) {
+               sql_exp *e = ls->card > rel->card ? ls : rs->card > rel->card ? 
rs : rs2;
+               if (exp_name(e))
+                       return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", exp_name(e));
+               return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) "SELECT: 
cannot use non GROUP BY column in query results without an aggregate function");
        }
        return rel_select_push_exp_down(sql, rel, e, ls, rs, rs2, f);
 }
@@ -3571,8 +3569,7 @@ static sql_exp *
                                sql_exp *lu = query_outer_last_used(query, 
all_freevar-1);
                                if (lu->type == e_column)
                                        return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: subquery uses ungrouped column \"%s.%s\" from outer 
query", (char*)lu->l, (char*)lu->r);
-                               else
-                                       return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: subquery uses ungrouped column \"%s.%s\" from outer 
query", exp_relname(lu), exp_name(lu));
+                               return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: subquery uses ungrouped column \"%s.%s\" from outer 
query", exp_relname(lu), exp_name(lu));
                        }
                        if (is_outer(groupby))
                                return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: subquery uses ungrouped column from outer query");
@@ -4433,8 +4430,7 @@ rel_order_by_column_exp(sql_query *query
                                if (ee->card > r->card) {
                                        if (exp_name(ee))
                                                return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in 
query results without an aggregate function", exp_name(ee));
-                                       else
-                                               return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query 
results without an aggregate function");
+                                       return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results 
without an aggregate function");
                                }
                        }
                }
@@ -4518,8 +4514,7 @@ rel_order_by(sql_query *query, sql_rel *
                                } else if (e && exp_card(e) > rel->card) {
                                        if (exp_name(e))
                                                return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in 
query results without an aggregate function", exp_name(e));
-                                       else
-                                               return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query 
results without an aggregate function");
+                                       return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results 
without an aggregate function");
                                }
                                if (e && !exp_name(e))
                                        exp_label(sql->sa, e, ++sql->label);
@@ -5407,8 +5402,7 @@ rel_table_exp(sql_query *query, sql_rel 
                                        if (e->card > groupby->card) {
                                                if (exp_name(e))
                                                        return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in 
query results without an aggregate function", exp_name(e));
-                                               else
-                                                       return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query 
results without an aggregate function");
+                                               return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query 
results without an aggregate function");
                                        }
                                }
                        }
@@ -5686,11 +5680,9 @@ rel_select_exp(sql_query *query, sql_rel
                for (node *n=pexps->h; n; n = n->next) {
                        sql_exp *ce = n->data;
                        if (rel->card < ce->card) {
-                               if (exp_name(ce) && !has_label(ce)) {
+                               if (exp_name(ce) && !has_label(ce))
                                        return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results 
without an aggregate function", exp_name(ce));
-                               } else {
-                                       return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results 
without an aggregate function");
-                               }
+                               return sql_error(sql, ERR_GROUPBY, 
SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results 
without an aggregate function");
                        }
                }
                set_processed(rel);
diff --git a/sql/test/SQLancer/Tests/sqlancer18.test 
b/sql/test/SQLancer/Tests/sqlancer18.test
--- a/sql/test/SQLancer/Tests/sqlancer18.test
+++ b/sql/test/SQLancer/Tests/sqlancer18.test
@@ -262,3 +262,24 @@ 135 values hashing to 39898748a4604c294a
 statement ok
 ROLLBACK
 
+statement ok
+CREATE TABLE t1(c1 BLOB)
+
+statement ok
+ALTER TABLE t1 ADD CONSTRAINT con2 PRIMARY KEY(c1)
+
+statement ok rowcount 4
+INSERT INTO t1(c1) VALUES(BLOB 'D8d4F0'), (BLOB 'B135'), (BLOB 'C0'), (BLOB '')
+
+statement ok rowcount 4
+UPDATE t1 SET c1 = t1.c1
+
+statement ok
+ALTER TABLE t1 DROP CONSTRAINT con2
+
+statement ok rowcount 4
+UPDATE t1 SET c1 = t1.c1
+
+statement ok
+DROP TABLE t1
+
diff --git a/sql/test/miscellaneous/Tests/simple_selects.test 
b/sql/test/miscellaneous/Tests/simple_selects.test
--- a/sql/test/miscellaneous/Tests/simple_selects.test
+++ b/sql/test/miscellaneous/Tests/simple_selects.test
@@ -871,3 +871,6 @@ BEGIN
                RETURN 1;
        END WHILE;
 END
+
+statement error 42000!Null step size not allowed
+select * from generate_series(timestamp '2010-01-01', timestamp '2010-01-01', 
null)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to