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