Changeset: 71f4537794c8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=71f4537794c8
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_upgrades.c
sql/server/rel_optimizer.c
sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out
sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out.single
Branch: unlock
Log Message:
merged
diffs (truncated from 1396 to 300 lines):
diff --git a/cmake/monetdb-toolchain.cmake b/cmake/monetdb-toolchain.cmake
--- a/cmake/monetdb-toolchain.cmake
+++ b/cmake/monetdb-toolchain.cmake
@@ -104,7 +104,7 @@ function(monetdb_default_compiler_option
if(${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
add_compile_options("-fsanitize=address")
add_compile_options("-fno-omit-frame-pointer")
- add_compile_definitions(-DNO_ATOMIC_INSTRUCTIONS)
+ add_compile_definitions(NO_ATOMIC_INSTRUCTIONS)
else()
message(FATAL_ERROR "Sanitizer only supported with GCC")
endif()
@@ -176,6 +176,6 @@ function(monetdb_default_compiler_option
endif()
if(NOT ASSERT)
- add_compile_definitions("-DNDEBUG=1")
+ add_compile_definitions("NDEBUG=1")
endif()
endfunction()
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
@@ -531,6 +531,92 @@ exp_count_no_nil_arg( sql_exp *e, stmt *
return as;
}
+static stmt *
+exp_bin_or(backend *be, sql_exp *e, stmt *left, stmt *right, stmt *grp, stmt
*ext, stmt *cnt, stmt *sel, int depth, bool reduce)
+{
+ sql_subtype *bt = sql_bind_localtype("bit");
+ list *l = e->l;
+ node *n;
+ stmt *sel1 = NULL, *sel2 = NULL, *s = NULL;
+ int anti = is_anti(e);
+
+ sel1 = sel;
+ sel2 = sel;
+ for( n = l->h; n; n = n->next ) {
+ sql_exp *c = n->data;
+ stmt *sin = (sel1 && sel1->nrcols)?sel1:NULL;
+
+ /* propagate the anti flag */
+ if (anti)
+ set_anti(c);
+ s = exp_bin(be, c, left, right, grp, ext, cnt, sin, NULL,
depth, reduce);
+ if (!s)
+ return s;
+
+ if (!sin && sel1 && sel1->nrcols == 0 && s->nrcols == 0) {
+ sql_subfunc *f = sql_bind_func(be->mvc->sa,
be->mvc->session->schema, anti?"or":"and", bt, bt, F_FUNC);
+ assert(f);
+ s = stmt_binop(be, sel1, s, f);
+ } else if (sel1 && (sel1->nrcols == 0 || s->nrcols == 0)) {
+ stmt *predicate = bin_first_column(be, left);
+
+ predicate = stmt_const(be, predicate, stmt_bool(be, 1));
+ if (s->nrcols == 0)
+ s = stmt_uselect(be, predicate, s, cmp_equal,
sel1, anti, is_semantics(c));
+ else
+ s = stmt_uselect(be, predicate, sel1,
cmp_equal, s, anti, is_semantics(c));
+ }
+ sel1 = s;
+ }
+ l = e->r;
+ for( n = l->h; n; n = n->next ) {
+ sql_exp *c = n->data;
+ stmt *sin = (sel2 && sel2->nrcols)?sel2:NULL;
+
+ /* propagate the anti flag */
+ if (anti)
+ set_anti(c);
+ s = exp_bin(be, c, left, right, grp, ext, cnt, sin, NULL,
depth, reduce);
+ if (!s)
+ return s;
+
+ if (!sin && sel2 && sel2->nrcols == 0 && s->nrcols == 0) {
+ sql_subfunc *f = sql_bind_func(be->mvc->sa,
be->mvc->session->schema, anti?"or":"and", bt, bt, F_FUNC);
+ assert(f);
+ s = stmt_binop(be, sel2, s, f);
+ } else if (sel2 && (sel2->nrcols == 0 || s->nrcols == 0)) {
+ stmt *predicate = bin_first_column(be, left);
+
+ predicate = stmt_const(be, predicate, stmt_bool(be, 1));
+ if (s->nrcols == 0)
+ s = stmt_uselect(be, predicate, s, cmp_equal,
sel2, anti, 0);
+ else
+ s = stmt_uselect(be, predicate, sel2,
cmp_equal, s, anti, 0);
+ }
+ sel2 = s;
+ }
+ if (sel1->nrcols == 0 && sel2->nrcols == 0) {
+ sql_subfunc *f = sql_bind_func(be->mvc->sa,
be->mvc->session->schema, anti?"and":"or", bt, bt, F_FUNC);
+ assert(f);
+ return stmt_binop(be, sel1, sel2, f);
+ }
+ if (sel1->nrcols == 0) {
+ stmt *predicate = bin_first_column(be, left);
+
+ predicate = stmt_const(be, predicate, stmt_bool(be, 1));
+ sel1 = stmt_uselect(be, predicate, sel1, cmp_equal, NULL,
0/*anti*/, 0);
+ }
+ if (sel2->nrcols == 0) {
+ stmt *predicate = bin_first_column(be, left);
+
+ predicate = stmt_const(be, predicate, stmt_bool(be, 1));
+ sel2 = stmt_uselect(be, predicate, sel2, cmp_equal, NULL,
0/*anti*/, 0);
+ }
+ if (anti)
+ return stmt_project(be, stmt_tinter(be, sel1, sel2, false),
sel1);
+ return stmt_tunion(be, sel1, sel2);
+}
+
stmt *
exp_bin(backend *be, sql_exp *e, stmt *left, stmt *right, stmt *grp, stmt
*ext, stmt *cnt, stmt *sel, stmt *cond, int depth, int reduce)
{
@@ -928,89 +1014,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
if (e->flag == cmp_in || e->flag == cmp_notin) {
return handle_in_exps(be, e->l, e->r, left, right, grp,
ext, cnt, sel, (e->flag == cmp_in), 0, depth, reduce);
}
- if (e->flag == cmp_or && (!right || right->nrcols == 1)) {
- sql_subtype *bt = sql_bind_localtype("bit");
- list *l = e->l;
- node *n;
- stmt *sel1 = NULL, *sel2 = NULL;
- int anti = is_anti(e);
-
- sel1 = sel;
- sel2 = sel;
- for( n = l->h; n; n = n->next ) {
- sql_exp *c = n->data;
- stmt *sin = (sel1 && sel1->nrcols)?sel1:NULL;
-
- /* propagate the anti flag */
- if (anti)
- set_anti(c);
- s = exp_bin(be, c, left, right, grp, ext, cnt,
sin, NULL, depth, reduce);
- if (!s)
- return s;
-
- if (!sin && sel1 && sel1->nrcols == 0 &&
s->nrcols == 0) {
- sql_subfunc *f = sql_bind_func(sql->sa,
sql->session->schema, anti?"or":"and", bt, bt, F_FUNC);
- assert(f);
- s = stmt_binop(be, sel1, s, f);
- } else if (sel1 && (sel1->nrcols == 0 ||
s->nrcols == 0)) {
- stmt *predicate = bin_first_column(be,
left);
-
- predicate = stmt_const(be, predicate,
stmt_bool(be, 1));
- if (s->nrcols == 0)
- s = stmt_uselect(be, predicate,
s, cmp_equal, sel1, anti, is_semantics(c));
- else
- s = stmt_uselect(be, predicate,
sel1, cmp_equal, s, anti, is_semantics(c));
- }
- sel1 = s;
- }
- l = e->r;
- for( n = l->h; n; n = n->next ) {
- sql_exp *c = n->data;
- stmt *sin = (sel2 && sel2->nrcols)?sel2:NULL;
-
- /* propagate the anti flag */
- if (anti)
- set_anti(c);
- s = exp_bin(be, c, left, right, grp, ext, cnt,
sin, NULL, depth, reduce);
- if (!s)
- return s;
-
- if (!sin && sel2 && sel2->nrcols == 0 &&
s->nrcols == 0) {
- sql_subfunc *f = sql_bind_func(sql->sa,
sql->session->schema, anti?"or":"and", bt, bt, F_FUNC);
- assert(f);
- s = stmt_binop(be, sel2, s, f);
- } else if (sel2 && (sel2->nrcols == 0 ||
s->nrcols == 0)) {
- stmt *predicate = bin_first_column(be,
left);
-
- predicate = stmt_const(be, predicate,
stmt_bool(be, 1));
- if (s->nrcols == 0)
- s = stmt_uselect(be, predicate,
s, cmp_equal, sel2, anti, 0);
- else
- s = stmt_uselect(be, predicate,
sel2, cmp_equal, s, anti, 0);
- }
- sel2 = s;
- }
- if (sel1->nrcols == 0 && sel2->nrcols == 0) {
- sql_subfunc *f = sql_bind_func(sql->sa,
sql->session->schema, anti?"and":"or", bt, bt, F_FUNC);
- assert(f);
- return stmt_binop(be, sel1, sel2, f);
- }
- if (sel1->nrcols == 0) {
- stmt *predicate = bin_first_column(be, left);
-
- predicate = stmt_const(be, predicate,
stmt_bool(be, 1));
- sel1 = stmt_uselect(be, predicate, sel1,
cmp_equal, NULL, 0/*anti*/, 0);
- }
- if (sel2->nrcols == 0) {
- stmt *predicate = bin_first_column(be, left);
-
- predicate = stmt_const(be, predicate,
stmt_bool(be, 1));
- sel2 = stmt_uselect(be, predicate, sel2,
cmp_equal, NULL, 0/*anti*/, 0);
- }
- if (anti)
- return stmt_project(be, stmt_tinter(be, sel1,
sel2, false), sel1);
- return stmt_tunion(be, sel1, sel2);
- }
+ if (e->flag == cmp_or && (!right || right->nrcols == 1))
+ return exp_bin_or(be, e, left, right, grp, ext, cnt,
sel, depth, reduce);
if (e->flag == cmp_or && right) { /* join */
assert(0);
}
@@ -1323,86 +1328,12 @@ sql_Nop_(backend *be, const char *fname,
}
static stmt *
-rel_parse_value(backend *be, char *query, char emode)
+parse_value(backend *be, char *query, sql_subtype *tpe, char emode)
{
- mvc *m = be->mvc;
- mvc o = *m;
- stmt *s = NULL;
- buffer *b;
- char *n;
- size_t len = _strlen(query);
- exp_kind ek = {type_value, card_value, FALSE};
- stream *sr;
- bstream *bs;
-
- m->qc = NULL;
-
- m->emode = emode;
- b = (buffer*)GDKmalloc(sizeof(buffer));
- n = GDKmalloc(len + 1 + 1);
- if (b == NULL || n == NULL) {
- GDKfree(b);
- GDKfree(n);
- return sql_error(m, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
- }
- snprintf(n, len + 2, "%s\n", query);
- query = n;
- len++;
- buffer_init(b, query, len);
- sr = buffer_rastream(b, "sqlstatement");
- if (sr == NULL) {
- buffer_destroy(b);
- return sql_error(m, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
- }
- bs = bstream_create(sr, b->len);
- if(bs == NULL) {
- buffer_destroy(b);
- return sql_error(m, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
- }
- scanner_init(&m->scanner, bs, NULL);
- m->scanner.mode = LINE_1;
- bstream_next(m->scanner.rs);
-
- m->params = NULL;
- m->sym = NULL;
- m->errstr[0] = '\0';
-
- (void) sqlparse(m); /* blindly ignore errors */
-
- /* get out the single value as we don't want an enclosing projection! */
- if (m->sym->token == SQL_SELECT) {
- SelectNode *sn = (SelectNode *)m->sym;
- if (sn->selection->h->data.sym->token == SQL_COLUMN ||
sn->selection->h->data.sym->token == SQL_IDENT) {
- sql_rel *rel = NULL;
- sql_query *query = query_create(m);
- sql_exp *e = rel_value_exp2(query, &rel,
sn->selection->h->data.sym->data.lval->h->data.sym, sql_sel | sql_values, ek);
-
- if (!rel)
- s = exp_bin(be, e, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, 0, 0);
- }
- }
- GDKfree(query);
- GDKfree(b);
- bstream_destroy(m->scanner.rs);
-
- m->sym = NULL;
- o.frames = m->frames; /* may have been realloc'ed */
- o.sizeframes = m->sizeframes;
- if (m->session->status || m->errstr[0]) {
- int status = m->session->status;
-
- strcpy(o.errstr, m->errstr);
- *m = o;
- m->session->status = status;
- } else {
- unsigned int label = m->label;
-
- while (m->topframes > o.topframes)
- clear_frame(m, m->frames[--m->topframes]);
- *m = o;
- m->label = label;
- }
- return s;
+ sql_exp *e = rel_parse_val(be->mvc, query, tpe, emode, NULL);
+ if (e)
+ return exp_bin(be, e, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0, 0);
+ return sql_error(be->mvc, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
}
static stmt *
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list