Changeset: 3756f04de0fd for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3756f04de0fd Modified Files: gdk/gdk_private.h gdk/gdk_tracer.c gdk/gdk_utils.c sql/backends/monet5/rel_bin.c sql/server/rel_optimizer.c sql/server/rel_schema.c sql/storage/store.c sql/test/SQLancer/Tests/sqlancer04.test sql/test/SQLancer/Tests/sqlancer09.test Branch: default Log Message:
Merged with Oct2020 diffs (truncated from 527 to 300 lines): diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -168,7 +168,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(void) +void 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 @@ -95,24 +95,20 @@ get_timestamp(char *datetime, size_t dts // When BASIC adapter is active, all the log messages are getting printed to a file. // This function prepares a file in order to write the contents of the buffer when necessary. static gdk_return -_GDKtracer_init_basic_adptr(void) +GDKtracer_init_trace_file(const char *dbpath, const char *dbtrace) { - const char *trace_path; - - trace_path = GDKgetenv("gdk_dbtrace"); - if (trace_path == NULL) { - trace_path = GDKgetenv("gdk_dbpath"); - if (trace_path == NULL) { + if (dbtrace == NULL) { + if (dbpath == NULL) { active_tracer = stderr; return GDK_SUCCEED; } if (strconcat_len(file_name, sizeof(file_name), - trace_path, DIR_SEP_STR, FILE_NAME, NULL) + dbpath, DIR_SEP_STR, FILE_NAME, NULL) >= sizeof(file_name)) { goto too_long; } } else { - if (strcpy_len(file_name, trace_path, sizeof(file_name)) + if (strcpy_len(file_name, dbtrace, sizeof(file_name)) >= sizeof(file_name)) { goto too_long; } @@ -137,6 +133,13 @@ static gdk_return return GDK_FAIL; } +static gdk_return +_GDKtracer_init_basic_adptr(void) +{ + return GDKtracer_init_trace_file(GDKgetenv("gdk_dbpath"), + GDKgetenv("gdk_dbtrace")); +} + static void set_level_for_layer(int layer, int lvl) @@ -418,13 +421,14 @@ GDKtracer_reset_adapter(void) static bool add_ts; /* add timestamp to error message to stderr */ void -GDKtracer_init(void) +GDKtracer_init(const char *dbpath, const char *dbtrace) { #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); } void @@ -487,7 +491,7 @@ GDKtracer_log(const char *file, const ch if ((p = strchr(buffer, '\n')) != NULL) *p = '\0'; - if (comp == GDK && (level == M_CRITICAL || level == M_ERROR)) { + if (comp == GDK && level <= M_ERROR) { /* append message to GDKerrbuf (if set) */ char *buf = GDKerrbuf; if (buf) { @@ -500,7 +504,7 @@ GDKtracer_log(const char *file, const ch } } - if (level == M_CRITICAL || level == M_ERROR || level == M_WARNING) { + if (level <= M_WARNING) { fprintf(stderr, "#%s%s%s: %s: %s%s%s%s\n", add_ts ? ts : "", add_ts ? ": " : "", @@ -510,12 +514,8 @@ GDKtracer_log(const char *file, const ch if (active_tracer == NULL || active_tracer == stderr) return; } - MT_lock_set(&GDKtracer_lock); - if (file_name[0] == 0) { - MT_lock_unset(&GDKtracer_lock); + if (active_tracer == NULL) return; - } - MT_lock_unset(&GDKtracer_lock); if (syserr) fprintf(active_tracer, "%s: %s\n", buffer, syserr); else @@ -527,7 +527,7 @@ GDKtracer_log(const char *file, const ch // like mserver5 refusing to start due to allocated port // and the error is never reported to the user because it // is still in the buffer which it never gets flushed. - if (level == cur_flush_level || level == M_CRITICAL || level == M_ERROR) + if (level == cur_flush_level || level <= M_ERROR) fflush(active_tracer); } diff --git a/gdk/gdk_tracer.h b/gdk/gdk_tracer.h --- a/gdk/gdk_tracer.h +++ b/gdk/gdk_tracer.h @@ -140,9 +140,7 @@ gdk_export log_level_t lvl_per_component // ERROR or WARNING it is logged no matter the component. In any other // case the component is taken into account #define GDK_TRACER_TEST(LOG_LEVEL, COMP) \ - (LOG_LEVEL == M_CRITICAL || \ - LOG_LEVEL == M_ERROR || \ - LOG_LEVEL == M_WARNING || \ + (LOG_LEVEL <= M_WARNING || \ lvl_per_component[COMP] >= LOG_LEVEL) diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -743,7 +743,8 @@ gdk_return GDKinit(opt *set, int setlen, bool embedded) { static bool first = true; - char *dbpath = mo_find_option(set, setlen, "gdk_dbpath"); + const char *dbpath = mo_find_option(set, setlen, "gdk_dbpath"); + const char *dbtrace = mo_find_option(set, setlen, "gdk_dbtrace"); const char *p; opt *n; int i, nlen = 0; @@ -807,7 +808,7 @@ GDKinit(opt *set, int setlen, bool embed /* BBP was locked by BBPexit() */ BBPunlock(); } - GDKtracer_init(); + GDKtracer_init(dbpath, dbtrace); errno = 0; if (!GDKinmemory(0) && !GDKenvironment(dbpath)) return GDK_FAIL; 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 @@ -395,9 +395,9 @@ handle_in_exps(backend *be, sql_exp *ce, if(!i) return NULL; - i = stmt_binop(be, c, i, sel, cmp); + i = stmt_binop(be, c, i, NULL, cmp); if (s) - s = stmt_binop(be, s, i, sel, a); + s = stmt_binop(be, s, i, NULL, a); else s = i; 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 @@ -24,6 +24,18 @@ typedef struct global_props { static sql_subfunc *find_func(mvc *sql, char *name, list *exps); +static int +find_member_pos(list *l, sql_table *t) +{ + int i = 0; + for (node *n = l->h; n ; n = n->next, i++) { + sql_part *pt = n->data; + if (pt->member->base.id == t->base.id) + return i; + } + return -1; +} + /* The important task of the relational optimizer is to optimize the join order. @@ -67,7 +79,7 @@ name_find_column( sql_rel *rel, const ch if (strcmp(c->base.name, name) == 0) { *bt = rel; if (pnr < 0 || (mt && - list_position(mt->members, c->t) == pnr)) + find_member_pos(mt->members, c->t) == pnr)) return c; } } @@ -77,7 +89,7 @@ name_find_column( sql_rel *rel, const ch if (strcmp(i->base.name, name+1 /* skip % */) == 0) { *bt = rel; if (pnr < 0 || (mt && - list_position(mt->members, i->t) == pnr)) { + find_member_pos(mt->members, i->t) == pnr)) { sql_kc *c = i->columns->h->data; return c->c; } @@ -3157,7 +3169,7 @@ exp_simplify_math( mvc *sql, sql_exp *e, } } } - if (exp_equal(le,re) == 0) { /* a - a = 0 */ + if (exp_is_not_null(le) && exp_is_not_null(re) && exp_equal(le,re) == 0) { /* a - a = 0 */ atom *a; sql_exp *ne; @@ -4882,7 +4894,7 @@ rel_part_nr( sql_rel *rel, sql_exp *e ) return -1; sql_table *pp = c->t; sql_table *mt = bt->r; - return list_position(mt->members, pp); + return find_member_pos(mt->members, pp); } static int @@ -4905,7 +4917,7 @@ rel_uses_part_nr( sql_rel *rel, sql_exp if (c && bt && bt->r) { sql_table *pp = c->t; sql_table *mt = bt->r; - if (list_position(mt->members, pp) == pnr) + if (find_member_pos(mt->members, pp) == pnr) return 1; } /* for projects we may need to do a rename! */ 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 @@ -1512,9 +1512,6 @@ sql_alter_table(sql_query *query, dlist return rel_drop(sql->sa, ddl_drop_constraint, sname, kname, drop_action, 0); } - if (t->s && !nt->s) - nt->s = t->s; - res = rel_table(sql, ddl_alter_table, sname, nt, 0); if (!isTable(nt)) @@ -1831,8 +1828,6 @@ rel_create_index(mvc *sql, char *iname, if (t->persistence != SQL_DECLARED_TABLE) sname = t->s->base.name; - if (t->s && !nt->s) - nt->s = t->s; /* add index here */ i = mvc_create_idx(sql, nt, iname, itype); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -1765,6 +1765,8 @@ dup_sql_part(sql_allocator *sa, sql_tabl } list_append(mt->members, p); p->t = mt; + p->member = find_sql_table_id(mt->s, op->member->base.id); + assert(p->member); return p; } @@ -1779,6 +1781,7 @@ dup_sql_table(sql_allocator *sa, sql_tab nt->access = t->access; nt->partition = t->partition; nt->query = (t->query) ? sa_strdup(sa, t->query) : NULL; + nt->s = t->s; if (isPartitionedByExpressionTable(nt)) { nt->part.pexp = SA_ZNEW(sa, sql_expression); @@ -3462,7 +3465,7 @@ part_dup(sql_trans *tr, int flags, sql_p sql_allocator *sa = (newFlagSet(flags))?tr->parent->sa:tr->sa; sql_part *p = SA_ZNEW(sa, sql_part); sql_table *mt = find_sql_table_id(s, op->t->base.id); - sql_table *member = find_sql_table_id(s, op->base.id); + sql_table *member = find_sql_table_id(s, op->member->base.id); base_init(sa, &p->base, op->base.id, tr_flag(&op->base, flags), op->base.name); if (isRangePartitionTable(mt) || isListPartitionTable(mt)) diff --git a/sql/test/BugTracker-2017/Tests/sqlitelogictest-cast-decimal.Bug-6445.stable.out b/sql/test/BugTracker-2017/Tests/sqlitelogictest-cast-decimal.Bug-6445.stable.out --- a/sql/test/BugTracker-2017/Tests/sqlitelogictest-cast-decimal.Bug-6445.stable.out +++ b/sql/test/BugTracker-2017/Tests/sqlitelogictest-cast-decimal.Bug-6445.stable.out @@ -25,8 +25,8 @@ stdout of test 'sqlitelogictest-cast-dec #CREATE TABLE tab1(col0 INTEGER, col1 INTEGER, col2 INTEGER); #SELECT col0 + - - CAST ( NULL AS REAL ) - + col0 + + col1 FROM tab1 cor0 WHERE ( NULL ) IS NOT NULL; -% .%2 # table_name -% %2 # name +% sys.%1 # table_name +% %1 # name % real # type % 15 # length #SELECT col0 + - - CAST( NULL AS DECIMAL ) - + col0 + + col1 FROM tab1 cor0 WHERE ( NULL ) IS NOT NULL; diff --git a/sql/test/SQLancer/Tests/sqlancer04.sql b/sql/test/SQLancer/Tests/sqlancer04.sql _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list