Changeset: 511d9879f8ff for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/511d9879f8ff Modified Files: monetdb5/mal/mal_interpreter.c testing/sqllogictest.py Branch: default Log Message:
Merged with Jul2021 diffs (truncated from 1368 to 300 lines): diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c --- a/monetdb5/mal/mal_interpreter.c +++ b/monetdb5/mal/mal_interpreter.c @@ -505,6 +505,7 @@ str runMALsequence(Client cntxt, MalBlkP runtimeProfileBegin(cntxt, mb, stk, getInstrPtr(mb,0), &runtimeProfileFunction); mb->starttime = GDKusec(); if (cntxt->sessiontimeout && mb->starttime - cntxt->session > cntxt->sessiontimeout) { + runtimeProfileFinish(cntxt, mb, stk); if ( backup != backups) GDKfree(backup); if ( garbage != garbages) GDKfree(garbage); throw(MAL, "mal.interpreter", SQLSTATE(HYT00) RUNTIME_SESSION_TIMEOUT); diff --git a/monetdb5/mal/mal_runtime.c b/monetdb5/mal/mal_runtime.c --- a/monetdb5/mal/mal_runtime.c +++ b/monetdb5/mal/mal_runtime.c @@ -161,25 +161,28 @@ clearQRYqueue(size_t idx) static void advanceQRYqueue(void) { - qhead++; - if( qhead == qsize) - qhead = 0; - if( qtail == qhead) - qtail++; - if( qtail == qsize) - qtail = 0; - /* clean out the element */ - str s = QRYqueue[qhead].query; - if( s){ - /* don;t wipe them when they are still running, prepared, or paused */ - /* The upper layer has assured there is at least one slot available */ - if(QRYqueue[qhead].status != 0 && (QRYqueue[qhead].status[0] == 'r' || QRYqueue[qhead].status[0] == 'p')){ - advanceQRYqueue(); - return; + bool found_empty_slot = false; + + while (!found_empty_slot) { + qhead++; + if( qhead == qsize) + qhead = 0; + if( qtail == qhead) + qtail++; + if( qtail == qsize) + qtail = 0; + /* clean out the element */ + str s = QRYqueue[qhead].query; + if (!s || QRYqueue[qhead].status == 0 || (QRYqueue[qhead].status[0] != 'r' && QRYqueue[qhead].status[0] != 'p')) { + /* don't wipe them when they are still running, prepared, or paused */ + /* The upper layer has assured there is at least one slot available */ + if (s) { + GDKfree(s); + GDKfree(QRYqueue[qhead].username); + clearQRYqueue(qhead); + } + found_empty_slot = true; } - GDKfree(s); - GDKfree(QRYqueue[qhead].username); - clearQRYqueue(qhead); } } diff --git a/monetdb5/modules/kernel/batstr.c b/monetdb5/modules/kernel/batstr.c --- a/monetdb5/modules/kernel/batstr.c +++ b/monetdb5/modules/kernel/batstr.c @@ -191,7 +191,7 @@ STRbatAscii(Client cntxt, MalBlkPtr mb, if ((msg = str_wchr_at(&next, x, 0)) != MAL_SUCCEED) goto bailout; - vals[p1] = next; + vals[i] = next; nils |= is_int_nil(next); } } else { @@ -201,7 +201,7 @@ STRbatAscii(Client cntxt, MalBlkPtr mb, if ((msg = str_wchr_at(&next, x, 0)) != MAL_SUCCEED) goto bailout; - vals[p1] = next; + vals[i] = next; nils |= is_int_nil(next); } } 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 @@ -56,9 +56,7 @@ static stmt * stmt_selectnil( backend *be, stmt *col) { sql_subtype *t = tail_type(col); - stmt *n = stmt_atom(be, atom_general(be->mvc->sa, t, NULL)); - stmt *nn = stmt_uselect2(be, col, n, n, 3, NULL, 0, 1); - return nn; + return stmt_uselect(be, col, stmt_atom(be, atom_general(be->mvc->sa, t, NULL)), cmp_equal, NULL, 0, 1); } static stmt * @@ -378,9 +376,7 @@ static stmt * stmt_selectnonil( backend *be, stmt *col, stmt *s ) { sql_subtype *t = tail_type(col); - stmt *n = stmt_atom(be, atom_general(be->mvc->sa, t, NULL)); - stmt *nn = stmt_uselect2(be, col, n, n, 3, s, 1, 1); - return nn; + return stmt_uselect(be, col, stmt_atom(be, atom_general(be->mvc->sa, t, NULL)), cmp_equal, s, 1, 1); } static int @@ -1510,7 +1506,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l if (r2 && r2->nrcols == 0) r2 = stmt_const(be, bin_find_smallest_column(be, swapped?left:right), r2); if (r2) { - s = stmt_join2(be, l, r, r2, (comp_type)e->flag, is_anti(e), swapped); + s = stmt_join2(be, l, r, r2, (comp_type)e->flag, is_anti(e), is_symmetric(e), swapped); } else if (swapped) { s = stmt_join(be, r, l, is_anti(e), swap_compare((comp_type)e->flag), 0, is_semantics(e), false); } else { @@ -1520,7 +1516,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l if (r2) { /* handle all cases in stmt_uselect, reducing, non reducing, scalar etc */ if (l->nrcols == 0 && ((sel && sel->nrcols > 0) || r->nrcols > 0 || r2->nrcols > 0 || reduce)) l = left ? stmt_const(be, bin_find_smallest_column(be, left), l) : column(be, l); - s = stmt_uselect2(be, l, r, r2, (comp_type)e->flag, sel, is_anti(e), reduce); + s = stmt_uselect2(be, l, r, r2, (comp_type)e->flag, sel, is_anti(e), is_symmetric(e), reduce); } else { /* value compare or select */ if ((!reduce || (l->nrcols == 0 && r->nrcols == 0)) && (e->flag == mark_in || e->flag == mark_notin)) { @@ -2414,7 +2410,7 @@ split_join_exps(sql_rel *rel, list *join /* we can handle thetajoins, rangejoins and filter joins (like) */ /* ToDo how about atom expressions? */ if (e->type == e_cmp) { - int flag = e->flag & ~CMP_BETWEEN; + int flag = e->flag; /* check if its a select or join expression, ie use only expressions of one relation left and of the other right (than join) */ if (flag < cmp_filter || flag == mark_in || flag == mark_notin) { /* theta and range joins */ /* join or select ? */ diff --git a/sql/backends/monet5/sql_statement.c b/sql/backends/monet5/sql_statement.c --- a/sql/backends/monet5/sql_statement.c +++ b/sql/backends/monet5/sql_statement.c @@ -1618,8 +1618,7 @@ argumentZero(MalBlkPtr mb, int tpe) */ static InstrPtr -select2_join2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt **Sub, int anti, int swapped, int type, int - reduce) +select2_join2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt **Sub, int anti, int symmetric, int swapped, int type, int reduce) { MalBlkPtr mb = be->mb; InstrPtr p, q; @@ -1630,7 +1629,7 @@ select2_join2(backend *be, stmt *op1, st if (op1->nr < 0 || (sub && sub->nr < 0)) return NULL; l = op1->nr; - if (((cmp & CMP_BETWEEN && cmp & CMP_SYMMETRIC) || op2->nrcols > 0 || op3->nrcols > 0 || !reduce) && (type == st_uselect2)) { + if ((symmetric || op2->nrcols > 0 || op3->nrcols > 0 || !reduce) && (type == st_uselect2)) { int k; int nrcols = (op1->nrcols || op2->nrcols || op3->nrcols); @@ -1666,7 +1665,7 @@ select2_join2(backend *be, stmt *op1, st sub = NULL; } - p = pushBit(mb, p, (cmp & CMP_SYMMETRIC) != 0); /* symmetric */ + p = pushBit(mb, p, (symmetric)?TRUE:FALSE); /* symmetric */ p = pushBit(mb, p, (cmp & 1) != 0); /* lo inclusive */ p = pushBit(mb, p, (cmp & 2) != 0); /* hi inclusive */ p = pushBit(mb, p, FALSE); /* nils_false */ @@ -1767,10 +1766,9 @@ select2_join2(backend *be, stmt *op1, st } q = pushBit(mb, q, anti); if (type == st_uselect2) { - if (cmp & CMP_BETWEEN) - q = pushBit(mb, q, TRUE); /* all nil's are != */ + q = pushBit(mb, q, TRUE); /* all nil's are != */ } else { - q = pushBit(mb, q, (cmp & CMP_SYMMETRIC)?TRUE:FALSE); + q = pushBit(mb, q, (symmetric)?TRUE:FALSE); } if (type == st_join2) q = pushNil(mb, q, TYPE_lng); /* estimate */ @@ -1794,10 +1792,10 @@ select2_join2(backend *be, stmt *op1, st } stmt * -stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt *sub, int anti, int reduce) +stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt *sub, int anti, int symmetric, int reduce) { stmt *sel = sub; - InstrPtr q = select2_join2(be, op1, op2, op3, cmp, &sub, anti, 0, st_uselect2, reduce); + InstrPtr q = select2_join2(be, op1, op2, op3, cmp, &sub, anti, symmetric, 0, st_uselect2, reduce); if (q) { stmt *s = stmt_create(be->mvc->sa, st_uselect2); @@ -2253,9 +2251,9 @@ stmt_left_project(backend *be, stmt *op1 } stmt * -stmt_join2(backend *be, stmt *l, stmt *ra, stmt *rb, int cmp, int anti, int swapped) +stmt_join2(backend *be, stmt *l, stmt *ra, stmt *rb, int cmp, int anti, int symmetric, int swapped) { - InstrPtr q = select2_join2(be, l, ra, rb, cmp, NULL, anti, swapped, st_join2, 1/*reduce semantics*/); + InstrPtr q = select2_join2(be, l, ra, rb, cmp, NULL, anti, symmetric, swapped, st_join2, 1/*reduce semantics*/); if (q) { stmt *s = stmt_create(be->mvc->sa, st_join2); if (s == NULL) { diff --git a/sql/backends/monet5/sql_statement.h b/sql/backends/monet5/sql_statement.h --- a/sql/backends/monet5/sql_statement.h +++ b/sql/backends/monet5/sql_statement.h @@ -187,7 +187,7 @@ extern stmt *stmt_uselect(backend *be, s 2 == l <= x < h 3 == l <= x <= h */ -extern stmt *stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt *sub, int anti, int reduce); +extern stmt *stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt *sub, int anti, int symmetric, int reduce); extern stmt *stmt_genselect(backend *be, stmt *lops, stmt *rops, sql_subfunc *f, stmt *sub, int anti); extern stmt *stmt_tunion(backend *be, stmt *op1, stmt *op2); @@ -196,7 +196,7 @@ extern stmt *stmt_tdiff2(backend *be, st extern stmt *stmt_tinter(backend *be, stmt *op1, stmt *op2, bool single); extern stmt *stmt_join(backend *be, stmt *op1, stmt *op2, int anti, comp_type cmptype, int need_left, int is_semantics, bool single); -extern stmt *stmt_join2(backend *be, stmt *l, stmt *ra, stmt *rb, int cmp, int anti, int swapped); +extern stmt *stmt_join2(backend *be, stmt *l, stmt *ra, stmt *rb, int cmp, int anti, int symmetric, int swapped); /* generic join operator, with a left and right statement list */ extern stmt *stmt_genjoin(backend *be, stmt *l, stmt *r, sql_subfunc *op, int anti, int swapped); extern stmt *stmt_semijoin(backend *be, stmt *l, stmt *r, stmt *lcand, stmt *rcand, int is_semantics, bool single); diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -176,10 +176,6 @@ typedef enum comp_type { cmp_left_project = 15 /* last step of outer join */ } comp_type; -/* for ranges we keep the requirment for symmetric */ -#define CMP_SYMMETRIC 8 -#define CMP_BETWEEN 16 - #define is_theta_exp(e) ((e) == cmp_gt || (e) == cmp_gte || (e) == cmp_lte ||\ (e) == cmp_lt || (e) == cmp_equal || (e) == cmp_notequal) diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h --- a/sql/include/sql_relation.h +++ b/sql/include/sql_relation.h @@ -59,7 +59,8 @@ typedef struct expression { base:1, ref:1, /* used to indicate an other expression may reference this one */ - used:1; /* used for quick dead code removal */ + used:1, /* used for quick dead code removal */ + symmetric:1; /* compare between symmetric */ sql_subtype tpe; void *p; /* properties for the optimizer */ } sql_exp; @@ -232,6 +233,8 @@ typedef enum operator_type { #define set_anti(e) (e)->anti = 1 #define is_semantics(e) ((e)->semantics) #define set_semantics(e) (e)->semantics = 1 +#define is_symmetric(e) ((e)->symmetric) +#define set_symmetric(e) (e)->symmetric = 1 #define is_intern(e) ((e)->intern) #define set_intern(e) (e)->intern = 1 #define is_basecol(e) ((e)->base) diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -267,9 +267,8 @@ exp_print(mvc *sql, stream *fout, sql_ex mnstr_printf(fout, " !"); cmp_print(sql, fout, range2rcompare(e->flag) ); exp_print(sql, fout, e->f, depth+1, refs, 0, 0); - if (e->flag & CMP_BETWEEN) - mnstr_printf(fout, " BETWEEN "); - if (e->flag & CMP_SYMMETRIC) + mnstr_printf(fout, " BETWEEN "); + if (e->symmetric) mnstr_printf(fout, " SYM "); } else { exp_print(sql, fout, e->l, depth+1, refs, 0, 0); @@ -1420,7 +1419,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re return NULL; return exp_in(sql->sa, exp, exps, f); } else { - int sym = 0, between = 0; + int sym = 0; sql_exp *e = exp_read(sql, lrel, rrel, top_exps, r, pos, 0); if (!e) @@ -1428,7 +1427,6 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re if (strncmp(r+*pos, "BETWEEN", strlen("BETWEEN")) == 0) { (*pos)+= (int) strlen("BETWEEN"); skipWS(r,pos); - between = 1; } if (strncmp(r+*pos, "SYM", strlen("SYM")) == 0) { (*pos)+= (int) strlen("SYM"); @@ -1436,20 +1434,12 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re sym = 1; } if (e->type == e_cmp) { - sql_exp *ne = exp_compare2(sql->sa, e->l, exp, e->r, compare2range(swap_compare((comp_type)f), e->flag & ~(CMP_SYMMETRIC|CMP_BETWEEN))); - if (sym) - ne->flag |= CMP_SYMMETRIC; - if (between) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list