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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list