Changeset: 129d7afa9aac for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/129d7afa9aac
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/include/sql_catalog.h
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        tools/monetdbe/monetdbe.c
Branch: antipush
Log Message:

Merged with default


diffs (truncated from 977 to 300 lines):

diff --git a/ctest/tools/monetdbe/example1.c b/ctest/tools/monetdbe/example1.c
--- a/ctest/tools/monetdbe/example1.c
+++ b/ctest/tools/monetdbe/example1.c
@@ -36,7 +36,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example2.c b/ctest/tools/monetdbe/example2.c
--- a/ctest/tools/monetdbe/example2.c
+++ b/ctest/tools/monetdbe/example2.c
@@ -43,7 +43,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_bool: {
                                        monetdbe_column_bool * col = 
(monetdbe_column_bool *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_append.c 
b/ctest/tools/monetdbe/example_append.c
--- a/ctest/tools/monetdbe/example_append.c
+++ b/ctest/tools/monetdbe/example_append.c
@@ -44,7 +44,7 @@ main(void)
                for (size_t c = 0; c < result->ncols; c++) {
                        if ((err = monetdbe_result_fetch(result, rcol+c, c)) != 
NULL)
                                error(err)
-                       switch (rcol[c]->type) {
+                       switch (rcol[c]->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol[c];
                                        if (col->data[r] == col->null_value) {
@@ -129,7 +129,7 @@ main(void)
                for (size_t c = 0; c < result->ncols; c++) {
                        if ((err = monetdbe_result_fetch(result, rcol+c, c)) != 
NULL)
                                error(err)
-                       switch (rcol[c]->type) {
+                       switch (rcol[c]->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol[c];
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_append_raw.c 
b/ctest/tools/monetdbe/example_append_raw.c
--- a/ctest/tools/monetdbe/example_append_raw.c
+++ b/ctest/tools/monetdbe/example_append_raw.c
@@ -38,11 +38,11 @@ main(void)
        int32_t i1 = 42;
        int32_t i2 = *(int32_t*)monetdbe_null(mdbe, monetdbe_int32_t);
        int32_t ints[2] = { i1, i2 };
-       monetdbe_column col0 = { .type = monetdbe_int32_t, .data = &ints, 
.count = 2 };
+       monetdbe_column col0 = { .type.type = monetdbe_int32_t, .data = &ints, 
.count = 2 };
 
        // str
        char* dstr[2] = { "Hello", "World" };
-       monetdbe_column col1 = { .type = monetdbe_str, .data = &dstr, .count = 
2 };
+       monetdbe_column col1 = { .type.type = monetdbe_str, .data = &dstr, 
.count = 2 };
 
        // timestamp
        monetdbe_data_date dt = { .day = 2, .month = 3, .year = 2020 };
@@ -50,25 +50,25 @@ main(void)
        monetdbe_data_timestamp t1 = { .date = dt, .time = tm };
        monetdbe_data_timestamp t2 = 
*(monetdbe_data_timestamp*)monetdbe_null(mdbe, monetdbe_timestamp);
        monetdbe_data_timestamp tss[2] = { t1, t2 };
-       monetdbe_column col2 = { .type = monetdbe_timestamp, .data = &tss, 
.count = 2 };
+       monetdbe_column col2 = { .type.type = monetdbe_timestamp, .data = &tss, 
.count = 2 };
 
        // date
        monetdbe_data_date d1 = dt;
        monetdbe_data_date d2 = *(monetdbe_data_date*)monetdbe_null(mdbe, 
monetdbe_date);
        monetdbe_data_date dts[2] = { d1, d2 };
-       monetdbe_column col3 = { .type = monetdbe_date, .data = &dts, .count = 
2 };
+       monetdbe_column col3 = { .type.type = monetdbe_date, .data = &dts, 
.count = 2 };
 
        // time
        monetdbe_data_time tm1 = tm;
        monetdbe_data_time tm2 = *(monetdbe_data_time*)monetdbe_null(mdbe, 
monetdbe_time);
        monetdbe_data_time tms[2] = { tm1, tm2 };
-       monetdbe_column col4 = { .type = monetdbe_time, .data = &tms, .count = 
2 };
+       monetdbe_column col4 = { .type.type = monetdbe_time, .data = &tms, 
.count = 2 };
 
        // blob
        monetdbe_data_blob b1 = { .size = 1, .data = "33" };
        monetdbe_data_blob b2 = *(monetdbe_data_blob*)monetdbe_null(mdbe, 
monetdbe_blob);
        monetdbe_data_blob bs[2] = { b1, b2 };
-       monetdbe_column col5 = { .type = monetdbe_blob, .data = &bs, .count = 2 
};
+       monetdbe_column col5 = { .type.type = monetdbe_blob, .data = &bs, 
.count = 2 };
 
        monetdbe_column* dcol[6] = { &col0, &col1, &col2, &col3, &col4, &col5 };
        if ((err = monetdbe_append(mdbe, "sys", "test", (monetdbe_column**) 
&dcol, 6)) != NULL)
@@ -76,7 +76,7 @@ main(void)
 
        // str with wrong utf8
        char* dstr2[2] = { "\xc3\x28", "\xe2\x28\xa1" };
-       monetdbe_column col12 = { .type = monetdbe_str, .data = &dstr2, .count 
= 2 };
+       monetdbe_column col12 = { .type.type = monetdbe_str, .data = &dstr2, 
.count = 2 };
        monetdbe_column* dcol2[6] = { &col0, &col12, &col2, &col3, &col4, &col5 
};
        if ((err = monetdbe_append(mdbe, "sys", "test", (monetdbe_column**) 
&dcol2, 6)) == NULL)
                error("Invalid UTF-8 string expected")
@@ -89,7 +89,7 @@ main(void)
                for (size_t c = 0; c < result->ncols; c++) {
                        if ((err = monetdbe_result_fetch(result, rcol+c, c)) != 
NULL)
                                error(err)
-                       switch (rcol[c]->type) {
+                       switch (rcol[c]->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol[c];
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_blob.c 
b/ctest/tools/monetdbe/example_blob.c
--- a/ctest/tools/monetdbe/example_blob.c
+++ b/ctest/tools/monetdbe/example_blob.c
@@ -38,7 +38,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_blob: {
                                        monetdbe_column_blob * col = 
(monetdbe_column_blob *) rcol;
                                        if (!col->data[r].data) {
diff --git a/ctest/tools/monetdbe/example_connections.c 
b/ctest/tools/monetdbe/example_connections.c
--- a/ctest/tools/monetdbe/example_connections.c
+++ b/ctest/tools/monetdbe/example_connections.c
@@ -38,7 +38,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_decimals.c 
b/ctest/tools/monetdbe/example_decimals.c
--- a/ctest/tools/monetdbe/example_decimals.c
+++ b/ctest/tools/monetdbe/example_decimals.c
@@ -36,7 +36,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_bool: {
                                        monetdbe_column_bool * col = 
(monetdbe_column_bool *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_proxy.c 
b/ctest/tools/monetdbe/example_proxy.c
--- a/ctest/tools/monetdbe/example_proxy.c
+++ b/ctest/tools/monetdbe/example_proxy.c
@@ -38,7 +38,7 @@ main(int argc, char** argv)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_temporal.c 
b/ctest/tools/monetdbe/example_temporal.c
--- a/ctest/tools/monetdbe/example_temporal.c
+++ b/ctest/tools/monetdbe/example_temporal.c
@@ -39,7 +39,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/test_helper_template.h 
b/ctest/tools/monetdbe/test_helper_template.h
--- a/ctest/tools/monetdbe/test_helper_template.h
+++ b/ctest/tools/monetdbe/test_helper_template.h
@@ -29,7 +29,7 @@ bool CHECK_COLUMN_FUNC (
 
     const monetdbe_types expected_type = TPE_ENUM;
 
-    if (rcol->type != expected_type) {
+    if (rcol->type.type != expected_type) {
         printf("Actual column and expected column differ in type.\n");
         return false;
     }
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
@@ -1294,13 +1294,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                list_append(l, es);
                        }
                }
-               if (f->func->rel) {
-                       if (!(s = stmt_func(be, stmt_list(be, l), 
sa_strdup(sql->sa, f->func->base.name), f->func->rel, (f->func->type == 
F_UNION))))
-                               return NULL;
-                       f->func->rel = s->op4.rel; /* f->func->rel may get 
rewritten */
-               } else if (!(s = stmt_Nop(be, stmt_list(be, l), sel, f))) {
+               if (!(s = stmt_Nop(be, stmt_list(be, l), sel, f)))
                        return NULL;
-               }
        }       break;
        case e_aggr: {
                list *attr = e->l;
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -819,7 +819,7 @@ mvc_export_warning(stream *s, str w)
 static int
 mvc_export_binary_bat(stream *s, BAT* bn)
 {
-       bool sendtheap = bn->ttype != TYPE_void && bn->tvarsized;
+       bool sendtheap = bn->ttype != TYPE_void, sendtvheap = sendtheap && 
bn->tvarsized;
 
        if (mnstr_printf(s, /*JSON*/"{"
                "\"version\":1,"
@@ -842,17 +842,17 @@ mvc_export_binary_bat(stream *s, BAT* bn
                bn->tnonil,
                BATtdense(bn),
                bn->batCount,
-               (size_t)bn->batCount << bn->tshift,
-               sendtheap && bn->batCount > 0 ? bn->tvheap->free : 0) < 0)
+               sendtheap ? (size_t)bn->batCount << bn->tshift : 0,
+               sendtvheap && bn->batCount > 0 ? bn->tvheap->free : 0) < 0)
                return -4;
 
-       if (bn->batCount > 0) {
+       if (sendtheap && bn->batCount > 0) {
                BATiter bni = bat_iterator(bn);
                if (mnstr_write(s, /* tail */ bni.base, bni.count * bni.width, 
1) < 1) {
                        bat_iterator_end(&bni);
                        return -4;
                }
-               if (sendtheap && mnstr_write(s, /* theap */ bni.vh->base, 
bni.vh->free, 1) < 1) {
+               if (sendtvheap && mnstr_write(s, /* tvheap */ bni.vh->base, 
bni.vh->free, 1) < 1) {
                        bat_iterator_end(&bni);
                        return -4;
                }
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -510,7 +510,6 @@ typedef struct sql_func {
                        */
        sql_schema *s;
        sql_allocator *sa;
-       void *rel;      /* implementation */
 } sql_func;
 
 typedef struct sql_subfunc {
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -3713,18 +3713,24 @@ try_rewrite_equal_or_is_null(mvc *sql, s
                if (is_compare(cmp->type) && !is_anti(cmp) && !cmp->f && 
cmp->flag == cmp_equal) {
                        int fupcast = is_numeric_upcast(first), supcast = 
is_numeric_upcast(second);
                        for(node *n = l2->h ; n && valid; n = n->next) {
-                               sql_exp *e = n->data, *l = e->l;
+                               sql_exp *e = n->data, *l = e->l, *r = e->r;
 
                                if (is_compare(e->type) && e->flag == cmp_equal 
&& !e->f &&
-                                       !is_anti(e) && is_semantics(e) && 
exp_is_null(e->r)) {
+                                       !is_anti(e) && is_semantics(e)) {
                                        int lupcast = is_numeric_upcast(l);
-
-                                       if 
(exp_match_exp(fupcast?first->l:first, lupcast?l->l:l))
-                                               first_is_null_found = true;
-                                       else if 
(exp_match_exp(supcast?second->l:second, lupcast?l->l:l))
-                                               second_is_null_found = true;
-                                       else
+                                       int rupcast = is_numeric_upcast(r);
+                                       sql_exp *rr = rupcast ? r->l : r;
+
+                                       if (rr->type == e_atom && rr->l && 
atom_null(rr->l)) {
+                                               if 
(exp_match_exp(fupcast?first->l:first, lupcast?l->l:l))
+                                                       first_is_null_found = 
true;
+                                               else if 
(exp_match_exp(supcast?second->l:second, lupcast?l->l:l))
+                                                       second_is_null_found = 
true;
+                                               else
+                                                       valid = false;
+                                       } else {
                                                valid = false;
+                                       }
                                } else {
                                        valid = false;
                                }
diff --git a/sql/server/rel_rewriter.c b/sql/server/rel_rewriter.c
--- a/sql/server/rel_rewriter.c
+++ b/sql/server/rel_rewriter.c
@@ -178,29 +178,29 @@ rewrite_simplify(visitor *v, sql_rel *re
                return rel;
 
        if ((is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) && 
!list_empty(rel->exps)) {
+               int changes = v->changes, level = *(int*)v->data;
                rel->exps = exps_simplify_exp(v, rel->exps);
                /* At a select or inner join relation if the single expression 
is false, eliminate the inner relations with a dummy projection */
-               if (v->value_based_opt && list_length(rel->exps) == 1 && 
(exp_is_false(rel->exps->h->data) || exp_is_null(rel->exps->h->data))) {
-                       if ((is_select(rel->op) || (is_innerjoin(rel->op) && 
!rel_is_ref(rel->r))) && rel->card > CARD_ATOM && !rel_is_ref(rel->l)) {
-                               list *nexps = sa_list(v->sql->sa), *toconvert = 
rel_projections(v->sql, rel->l, NULL, 1, 1);
-                               if (is_innerjoin(rel->op))
-                                       toconvert = list_merge(toconvert, 
rel_projections(v->sql, rel->r, NULL, 1, 1), NULL);
+               if (v->value_based_opt && (v->changes > changes || level == 0) 
&& list_length(rel->exps) == 1 &&
+                       (is_select(rel->op) || is_innerjoin(rel->op)) && 
(exp_is_false(rel->exps->h->data) || exp_is_null(rel->exps->h->data))) {
+                       list *nexps = sa_list(v->sql->sa), *toconvert = 
rel_projections(v->sql, rel->l, NULL, 1, 1);
+                       if (is_innerjoin(rel->op))
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to