Changeset: da73006ed76b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/da73006ed76b
Branch: Jul2021
Log Message:

merged


diffs (228 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -331,6 +331,7 @@ gdk_return GDKtracer_set_adapter(const c
 gdk_return GDKtracer_set_component_level(const char *comp, const char *lvl);
 gdk_return GDKtracer_set_flush_level(const char *lvl);
 gdk_return GDKtracer_set_layer_level(const char *layer, const char *lvl);
+gdk_return GDKtracer_set_tracefile(const char *tracefile);
 gdk_return GDKtracer_stop(void);
 size_t GDKuniqueid(size_t offset);
 gdk_return GDKupgradevarheap(BAT *b, var_t v, BUN cap, bool copyall) 
__attribute__((__warn_unused_result__));
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -162,7 +162,7 @@ gdk_return GDKssort_rev(void *restrict h
 gdk_return GDKssort(void *restrict h, void *restrict t, const void *restrict 
base, size_t n, int hs, int ts, int tpe)
        __attribute__((__warn_unused_result__))
        __attribute__((__visibility__("hidden")));
-void GDKtracer_init(const char *dbname, const char *dbtrace)
+gdk_return GDKtracer_init(const char *dbname, const char *dbtrace)
        __attribute__((__visibility__("hidden")));
 gdk_return GDKunlink(int farmid, const char *dir, const char *nme, const char 
*extension)
        __attribute__((__visibility__("hidden")));
diff --git a/gdk/gdk_tracer.c b/gdk/gdk_tracer.c
--- a/gdk/gdk_tracer.c
+++ b/gdk/gdk_tracer.c
@@ -428,15 +428,24 @@ GDKtracer_reset_adapter(void)
 
 static bool add_ts;            /* add timestamp to error message to stderr */
 
-void
+gdk_return
 GDKtracer_init(const char *dbpath, const char *dbtrace)
 {
+       MT_lock_set(&GDKtracer_lock);
 #ifdef _MSC_VER
        add_ts = GetFileType(GetStdHandle(STD_ERROR_HANDLE)) != FILE_TYPE_PIPE;
 #else
        add_ts = isatty(2) || lseek(2, 0, SEEK_CUR) != (off_t) -1 || errno != 
ESPIPE;
 #endif
-       (void) GDKtracer_init_trace_file(dbpath, dbtrace);
+       gdk_return rc = GDKtracer_init_trace_file(dbpath, dbtrace);
+       MT_lock_unset(&GDKtracer_lock);
+       return rc;
+}
+
+gdk_return
+GDKtracer_set_tracefile(const char *tracefile)
+{
+       return GDKtracer_init(NULL, tracefile);
 }
 
 void
diff --git a/gdk/gdk_tracer.h b/gdk/gdk_tracer.h
--- a/gdk/gdk_tracer.h
+++ b/gdk/gdk_tracer.h
@@ -39,11 +39,11 @@
 
 
 // ADAPTERS
-#define FOREACH_ADPTR(ADPTR)   \
+#define FOREACH_ADPTR(ADPTR)                   \
        ADPTR( BASIC )                          \
        ADPTR( PROFILER )                       \
        ADPTR( MBEDDED )                        \
-                                                               \
+                                               \
        ADPTR( ADAPTERS_COUNT )
 
 typedef enum {
@@ -233,6 +233,8 @@ gdk_export log_level_t lvl_per_component
 // Used for logrotate
 gdk_export void GDKtracer_reinit_basic(int sig);
 
+gdk_export gdk_return GDKtracer_set_tracefile(const char *tracefile);
+
 gdk_export gdk_return GDKtracer_stop(void);
 
 gdk_export gdk_return GDKtracer_set_component_level(const char *comp, const 
char *lvl);
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1305,7 +1305,7 @@ exp_match_exp( sql_exp *e1, sql_exp *e2)
                return 1;
        if (is_ascending(e1) != is_ascending(e2) || nulls_last(e1) != 
nulls_last(e2) || zero_if_empty(e1) != zero_if_empty(e2) ||
                need_no_nil(e1) != need_no_nil(e2) || is_anti(e1) != 
is_anti(e2) || is_semantics(e1) != is_semantics(e2) ||
-               need_distinct(e1) != need_distinct(e2))
+               is_symmetric(e1) != is_symmetric(e2) || need_distinct(e1) != 
need_distinct(e2))
                return 0;
        if (e1->type == e2->type) {
                switch(e1->type) {
@@ -1313,7 +1313,7 @@ exp_match_exp( sql_exp *e1, sql_exp *e2)
                        if (e1->flag == e2->flag && !is_complex_exp(e1->flag) &&
                            exp_match_exp(e1->l, e2->l) &&
                            exp_match_exp(e1->r, e2->r) &&
-                           ((!e1->f && !e2->f) || exp_match_exp(e1->f, e2->f)))
+                           ((!e1->f && !e2->f) || (e1->f && e2->f && 
exp_match_exp(e1->f, e2->f))))
                                return 1;
                        else if (e1->flag == e2->flag && e1->flag == cmp_or &&
                            exp_match_list(e1->l, e2->l) &&
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
@@ -2513,6 +2513,14 @@ rel_remove_redundant_join(visitor *v, sq
                        int left = 0;
                        if (is_basetable(jl->op) && jl->l == b->l)
                                left = 1;
+                       if (!list_empty(p->exps)) {
+                               for (node *n=p->exps->h; n; n = n->next) { /* 
all exps of 'p' must be bound to the opposite side */
+                                       sql_exp *e = n->data;
+
+                                       if (!rel_rebind_exp(v->sql, left ? jr : 
jl, e))
+                                               return rel;
+                               }
+                       }
                        if (exp_match_list(j->exps, rel->exps)) {
                                p->l = (left)?rel_dup(jr):rel_dup(jl);
                                rel_destroy(j);
diff --git a/sql/test/SQLancer/Tests/sqlancer16.test 
b/sql/test/SQLancer/Tests/sqlancer16.test
--- a/sql/test/SQLancer/Tests/sqlancer16.test
+++ b/sql/test/SQLancer/Tests/sqlancer16.test
@@ -1,3 +1,56 @@
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE "t0" ("c0" BIGINT,"c1" DOUBLE PRECISION,"c3" TIME,"c4" INTERVAL 
DAY)
+
+statement ok rowcount 5
+INSERT INTO "t0" VALUES (6, NULL, NULL, NULL), (8, NULL, NULL, NULL), (44, 
0.011253359357251025, NULL, INTERVAL '345600' SECOND), (45, 2099043029, NULL, 
NULL), (-6, NULL, NULL, INTERVAL '86400' SECOND)
+
+statement ok
+CREATE TABLE "t1" ("c0" BIGINT)
+
+statement ok rowcount 7
+INSERT INTO "t1" VALUES (-482276492),(2),(0),(-1048351158),(1849849110),(6),(3)
+
+query I rowsort
+SELECT 1 FROM t0 FULL OUTER JOIN (SELECT DISTINCT NULLIF(t0.c0, 1) FROM t0 
FULL OUTER JOIN (SELECT 1 FROM t1) AS sub0 ON FALSE) AS sub0 ON FALSE
+----
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+
+statement ok
+ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE "t1" ("c0" UUID)
+
+statement ok rowcount 4
+INSERT INTO "t1" VALUES ('f4ecc4d5-5f7c-ce6a-199e-dd98c59f7bbf'), 
('f4ecc4d5-5f7c-ce6a-199e-dd98c59f7bbf'), 
('f4ecc4d5-5f7c-ce6a-199e-dd98c59f7bbf'), 
('f4ecc4d5-5f7c-ce6a-199e-dd98c59f7bbf')
+
+query T rowsort
+SELECT t1.c0 FROM t1 WHERE ((((FALSE)OR(CAST(greatest(5, 1) AS 
BOOLEAN))))OR((((t1.c0) BETWEEN SYMMETRIC (t1.c0) AND 
(t1.c0))OR(((t1.c0)<(t1.c0))))))
+----
+f4ecc4d5-5f7c-ce6a-199e-dd98c59f7bbf
+f4ecc4d5-5f7c-ce6a-199e-dd98c59f7bbf
+f4ecc4d5-5f7c-ce6a-199e-dd98c59f7bbf
+f4ecc4d5-5f7c-ce6a-199e-dd98c59f7bbf
+
+statement ok
+ROLLBACK
+
 statement ok
 START TRANSACTION
 
diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -595,12 +595,11 @@ monetdbe_shutdown_internal(void) // Call
 }
 
 static void
-monetdbe_startup(monetdbe_database_internal *mdbe, char* dbdir, 
monetdbe_options *opts)
+monetdbe_startup(monetdbe_database_internal *mdbe, const char* dbdir, 
monetdbe_options *opts)
 {
        // Only call monetdbe_startup when there is no monetdb internal yet 
initialized.
        assert(!monetdbe_embedded_initialized);
 
-       const char* mbedded = "MBEDDED";
        opt *set = NULL;
        int setlen;
        bool with_mapi_server;
@@ -668,7 +667,19 @@ monetdbe_startup(monetdbe_database_inter
                }
        }
 
-       GDKtracer_set_adapter(mbedded); /* set the output of GDKtracer logs */
+       /* set the output of GDKtracer logs */
+       if (opts->trace_file) {
+               /* if file specified, use it */
+               if (GDKtracer_set_tracefile(opts->trace_file) != GDK_SUCCEED) {
+                       mo_free_options(set, setlen);
+                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", GDK_EXCEPTION);
+                       goto cleanup;
+               }
+               GDKtracer_set_adapter("BASIC");
+       } else {
+               /* otherwise no trace output */
+               GDKtracer_set_adapter("MBEDDED");
+       }
 
        workers = monetdbe_workers_internal(mdbe, opts);
        memory = monetdbe_memory_internal(mdbe, opts);
diff --git a/tools/monetdbe/monetdbe.h b/tools/monetdbe/monetdbe.h
--- a/tools/monetdbe/monetdbe.h
+++ b/tools/monetdbe/monetdbe.h
@@ -107,7 +107,7 @@ typedef struct {
        int nr_threads;  // maximum number of worker treads, limits level of 
parallelism
        monetdbe_remote* remote;
        monetdbe_mapi_server* mapi_server;
-
+       const char *trace_file;         // file to which log output should be 
written
 } monetdbe_options;
 
 #define DEFAULT_STRUCT_DEFINITION(ctype, typename)         \
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to