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