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

Reply via email to