Changeset: 0d96de6e8253 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0d96de6e8253 Added Files: sql/test/BugTracker-2018/Tests/singleton-stddev.Bug-6627.sql sql/test/BugTracker-2018/Tests/singleton-stddev.Bug-6627.stable.err sql/test/BugTracker-2018/Tests/singleton-stddev.Bug-6627.stable.out Modified Files: configure.ag gdk/gdk.h gdk/gdk_aggr.c gdk/gdk_join.c gdk/gdk_private.h sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/common/sql_types.c sql/common/sql_types.h sql/server/rel_schema.c sql/server/rel_updates.c sql/test/BugTracker-2018/Tests/All sql/test/pg_regress/Tests/All sql/test/pg_regress/Tests/update.stable.err sql/test/pg_regress/Tests/update.stable.out testing/Mfilter.py Branch: merge-partitions Log Message:
Merge with default. diffs (truncated from 563 to 300 lines): diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1277,7 +1277,7 @@ bat_iterator(BAT *b) * the association dimension are not permitted. * * The persistency indicator tells the retention period of BATs. The - * system support three modes: PERSISTENT and TRANSIENT. + * system support two modes: PERSISTENT and TRANSIENT. * The PERSISTENT BATs are automatically saved upon session boundary * or transaction commit. TRANSIENT BATs are removed upon transaction * boundary. All BATs are initially TRANSIENT unless their mode is diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c --- a/gdk/gdk_aggr.c +++ b/gdk/gdk_aggr.c @@ -3108,7 +3108,8 @@ dogroupstdev(BAT **avgb, BAT *b, BAT *g, if ((e == NULL || (BATcount(e) == BATcount(b) && e->hseqbase == b->hseqbase)) && - (BATtdense(g) || (g->tkey && g->tnonil))) { + (BATtdense(g) || (g->tkey && g->tnonil)) && + (issample || b->tnonil)) { /* trivial: singleton groups, so all results are equal * to zero (population) or nil (sample) */ dbl v = issample ? dbl_nil : 0; @@ -3193,7 +3194,8 @@ dogroupstdev(BAT **avgb, BAT *b, BAT *g, } else { GDKfree(mean); } - nils += nils2; + if (issample) + nils += nils2; GDKfree(delta); GDKfree(m2); GDKfree(cnts); diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c --- a/gdk/gdk_join.c +++ b/gdk/gdk_join.c @@ -3874,6 +3874,23 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA rsize = (BUN) (BATcount(r) * (Tsize(r)) + (r->tvheap ? r->tvheap->size : 0) + 2 * sizeof(BUN)); mem_size = GDK_mem_maxsize / (GDKnr_threads ? GDKnr_threads : 1); + if (lcount == 1 || (BATordered(l) && BATordered_rev(l))) { + /* single value to join, use select */ + return selectjoin(r1, r2, l, r, sl, sr, nil_matches, t0, false); + } else if (rcount == 1 || (BATordered(r) && BATordered_rev(r))) { + /* single value to join, use select */ + return selectjoin(r2, r1, r, l, sr, sl, nil_matches, t0, true); + } else if (BATtdense(r) && (sr == NULL || BATtdense(sr))) { + /* use special implementation for dense right-hand side */ + return mergejoin_void(r1, r2, l, r, sl, sr, false, false, t0, false); + } else if (BATtdense(l) && (sl == NULL || BATtdense(sl))) { + /* use special implementation for dense right-hand side */ + return mergejoin_void(r2, r1, r, l, sr, sl, false, false, t0, true); + } else if ((BATordered(l) || BATordered_rev(l)) && + (BATordered(r) || BATordered_rev(r))) { + /* both sorted */ + return mergejoin(r1, r2, l, r, sl, sr, nil_matches, false, false, false, maxsize, t0, false); + } if (sl == NULL) { lhash = BATcheckhash(l); if (!lhash && (parent = VIEWtparent(l)) != 0) { @@ -3906,23 +3923,7 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA } else if (BATtdense(sr) && BATcheckhash(r)) { rhash = BATcount(r) / ((size_t *) r->thash->heap.base)[5] * lcount < lcount + rcount; } - if (lcount == 1 || (BATordered(l) && BATordered_rev(l))) { - /* single value to join, use select */ - return selectjoin(r1, r2, l, r, sl, sr, nil_matches, t0, false); - } else if (rcount == 1 || (BATordered(r) && BATordered_rev(r))) { - /* single value to join, use select */ - return selectjoin(r2, r1, r, l, sr, sl, nil_matches, t0, true); - } else if (BATtdense(r) && (sr == NULL || BATtdense(sr))) { - /* use special implementation for dense right-hand side */ - return mergejoin_void(r1, r2, l, r, sl, sr, false, false, t0, false); - } else if (BATtdense(l) && (sl == NULL || BATtdense(sl))) { - /* use special implementation for dense right-hand side */ - return mergejoin_void(r2, r1, r, l, sr, sl, false, false, t0, true); - } else if ((BATordered(l) || BATordered_rev(l)) && - (BATordered(r) || BATordered_rev(r))) { - /* both sorted */ - return mergejoin(r1, r2, l, r, sl, sr, nil_matches, false, false, false, maxsize, t0, false); - } else if (lhash && rhash) { + if (lhash && rhash) { /* both have hash, smallest on right */ swap = lcount < rcount; reason = "both have hash"; diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -229,10 +229,11 @@ void BBPdump(void); /* never called: fo __attribute__((__visibility__("hidden"))); /* some macros to help print info about BATs when using ALGODEBUG */ -#define ALGOBATFMT "%s#" BUNFMT "[%s]%s%s%s%s%s%s%s%s" +#define ALGOBATFMT "%s#" BUNFMT "[%s]%s%s%s%s%s%s%s%s%s" #define ALGOBATPAR(b) BATgetId(b), \ BATcount(b), \ ATOMname(b->ttype), \ + b->batPersistence == PERSISTENT ? "P" : isVIEW(b) ? "V" : "T", \ BATtdense(b) ? "D" : "", \ b->tsorted ? "S" : "", \ b->trevsorted ? "R" : "", \ @@ -242,7 +243,7 @@ void BBPdump(void); /* never called: fo b->torderidx ? "O" : "", \ b->timprints ? "I" : "" /* use ALGOOPTBAT* when BAT is optional (can be NULL) */ -#define ALGOOPTBATFMT "%s%s" BUNFMT "%s%s%s%s%s%s%s%s%s%s%s" +#define ALGOOPTBATFMT "%s%s" BUNFMT "%s%s%s%s%s%s%s%s%s%s%s%s" #define ALGOOPTBATPAR(b) \ b ? BATgetId(b) : "", \ b ? "#" : "", \ @@ -250,6 +251,7 @@ void BBPdump(void); /* never called: fo b ? "[" : "", \ b ? ATOMname(b->ttype) : "", \ b ? "]" : "", \ + b ? b->batPersistence == PERSISTENT ? "P" : isVIEW(b) ? "V" : "T" : "", \ b && BATtdense(b) ? "D" : "", \ b && b->tsorted ? "S" : "", \ b && b->trevsorted ? "R" : "", \ diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -3926,7 +3926,11 @@ sql_delete_set_Fkeys(backend *be, sql_ke if (action == ACT_SET_DEFAULT) { if (fc->c->def) { stmt *sq; - char *msg = sa_message(sql->sa, "select %s;", fc->c->def); + char *msg, *typestr = subtype2string2(&fc->c->type); + if(!typestr) + return sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL); + msg = sa_message(sql->sa, "select cast(%s as %s);", fc->c->def, typestr); + _DELETE(typestr); sq = rel_parse_value(be, msg, sql->emode); if (!sq) return NULL; @@ -3985,7 +3989,11 @@ sql_update_cascade_Fkeys(backend *be, sq } else if (action == ACT_SET_DEFAULT) { if (fc->c->def) { stmt *sq; - char *msg = sa_message(sql->sa, "select %s;", fc->c->def); + char *msg, *typestr = subtype2string2(&fc->c->type); + if(!typestr) + return sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL); + msg = sa_message(sql->sa, "select cast(%s as %s);", fc->c->def, typestr); + _DELETE(typestr); sq = rel_parse_value(be, msg, sql->emode); if (!sq) return NULL; diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -312,7 +312,7 @@ create_table_or_view(mvc *sql, char *sna sql_column *c = n->data; if (c->def) { - char *buf; + char *buf, *typestr; sql_rel *r = NULL; list *id_l; @@ -327,7 +327,14 @@ create_table_or_view(mvc *sql, char *sna sql->sa = osa; throw(SQL, "sql.catalog",SQLSTATE(HY001) MAL_MALLOC_FAIL); } - snprintf(buf, BUFSIZ, "select %s;", c->def); + typestr = subtype2string2(&c->type); + if(!typestr) { + sa_destroy(sql->sa); + sql->sa = osa; + throw(SQL, "sql.catalog",SQLSTATE(HY001) MAL_MALLOC_FAIL); + } + snprintf(buf, BUFSIZ, "select cast(%s as %s);", c->def, typestr); + _DELETE(typestr); r = rel_parse(sql, s, buf, m_deps); if (!r || !is_project(r->op) || !r->exps || list_length(r->exps) != 1 || rel_check_type(sql, &c->type, r->exps->h->data, type_equal) == NULL) { if(r) 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 @@ -418,6 +418,28 @@ subtype2string(sql_subtype *t) return _STRDUP(buf); } +char * +subtype2string2(sql_subtype *tpe) //distinguish char(n), decimal(n,m) from other SQL types +{ + char buf[BUFSIZ]; + + switch (tpe->type->eclass) { + case EC_SEC: + snprintf(buf, BUFSIZ, "BIGINT"); + break; + case EC_MONTH: + snprintf(buf, BUFSIZ, "INT"); + break; + case EC_CHAR: + case EC_STRING: + case EC_DEC: + return subtype2string(tpe); + default: + snprintf(buf, BUFSIZ, "%s", tpe->type->sqlname); + } + return _STRDUP(buf); +} + int subaggr_cmp( sql_subaggr *a1, sql_subaggr *a2) { 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 @@ -82,6 +82,7 @@ extern int subtype_cmp(sql_subtype *t1, extern int arg_subtype_cmp(sql_arg *a, sql_subtype *t); extern int is_subtype(sql_subtype *t1, sql_subtype *t2); extern char *subtype2string(sql_subtype *t); +extern char *subtype2string2(sql_subtype *tpe); extern void type_destroy(sql_type *t); diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -1562,7 +1562,11 @@ sql_alter_table(mvc *sql, dlist *qname, for (n = nt->columns.nelm; n; n = n->next) { sql_column *c = n->data; if (c->def) { - char *d = sql_message("select %s;", c->def); + char *d, *typestr = subtype2string2(&c->type); + if(!typestr) + return sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL); + d = sql_message("select cast(%s as %s);", c->def, typestr); + _DELETE(typestr); e = rel_parse_val(sql, d, sql->emode, NULL); _DELETE(d); } else { diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -25,7 +25,12 @@ insert_value(mvc *sql, sql_column *c, sq return exp_atom(sql->sa, atom_general(sql->sa, &c->type, NULL)); } else if (s->token == SQL_DEFAULT) { if (c->def) { - sql_exp *e = rel_parse_val(sql, sa_message(sql->sa, "select CAST(%s AS %s);", c->def, c->type.type->sqlname), sql->emode, NULL); + sql_exp *e; + char *typestr = subtype2string2(&c->type); + if(!typestr) + return sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL); + e = rel_parse_val(sql, sa_message(sql->sa, "select cast(%s as %s);", c->def, typestr), sql->emode, NULL); + _DELETE(typestr); if (!e || (e = rel_check_type(sql, &c->type, e, type_equal)) == NULL) return NULL; return e; @@ -351,7 +356,11 @@ rel_inserts(mvc *sql, sql_table *t, sql_ sql_exp *e = NULL; if (c->def) { - char *q = sa_message(sql->sa, "select %s;", c->def); + char *q, *typestr = subtype2string2(&c->type); + if(!typestr) + return sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL); + q = sa_message(sql->sa, "select cast(%s as %s);", c->def, typestr); + _DELETE(typestr); e = rel_parse_val(sql, q, sql->emode, NULL); if (!e || (e = rel_check_type(sql, &c->type, e, type_equal)) == NULL) return NULL; @@ -1028,7 +1037,11 @@ update_table(mvc *sql, dlist *qname, dli char *colname = assignment->h->next->data.sval; sql_column *col = mvc_bind_column(sql, t, colname); if (col->def) { - v = rel_parse_val(sql, sa_message(sql->sa, "select CAST(%s AS %s);", col->def, col->type.type->sqlname), sql->emode, NULL); + char *typestr = subtype2string2(&col->type); + if(!typestr) + return sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL); + v = rel_parse_val(sql, sa_message(sql->sa, "select cast(%s as %s);", col->def, typestr), sql->emode, NULL); + _DELETE(typestr); } else { return sql_error(sql, 02, SQLSTATE(42000) "UPDATE: column '%s' has no valid default value", col->base.name); } diff --git a/sql/test/BugTracker-2018/Tests/All b/sql/test/BugTracker-2018/Tests/All --- a/sql/test/BugTracker-2018/Tests/All +++ b/sql/test/BugTracker-2018/Tests/All @@ -74,4 +74,5 @@ remote-table-where-not-equal.Bug-6621 groupby_having_orderby_count.Bug-6624 or_in_subselect.Bug-6625 strptime.Bug-6626 +singleton-stddev.Bug-6627 create_table_if_not_exists_returns_42000.Bug-6629 diff --git a/sql/test/BugTracker-2018/Tests/singleton-stddev.Bug-6627.sql b/sql/test/BugTracker-2018/Tests/singleton-stddev.Bug-6627.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2018/Tests/singleton-stddev.Bug-6627.sql @@ -0,0 +1,23 @@ +START TRANSACTION; + +CREATE TABLE "sys"."unitTestDontDelete" ( + "A" VARCHAR(255), + "B" BIGINT, + "C" DOUBLE, + "D" TIMESTAMP _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list