MonetDB: oscar - Merged with Jun2020
Changeset: 6f48637e6076 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6f48637e6076 Modified Files: sql/backends/monet5/sql_statistics.c Branch: oscar Log Message: Merged with Jun2020 diffs (158 lines): diff --git a/sql/backends/monet5/sql_statistics.c b/sql/backends/monet5/sql_statistics.c --- a/sql/backends/monet5/sql_statistics.c +++ b/sql/backends/monet5/sql_statistics.c @@ -34,9 +34,7 @@ sql_drop_statistics(mvc *m, sql_table *t tr = m->session->tr; sys = mvc_bind_schema(m, "sys"); if (sys == NULL) - throw(SQL, "sql_drop_statistics", SQLSTATE(3F000) "Internal error"); - if (!mvc_schema_privs(m, sys)) - throw(SQL, "sql.sql_drop_statistics", SQLSTATE(42000) "Access denied for %s to schema '%s'", sqlvar_get_string(find_global_var(m, mvc_bind_schema(m, "sys"), "current_user")), sys->base.name); + throw(SQL, "sql_drop_statistics", SQLSTATE(3F000) "Internal error: No schema sys"); sysstats = mvc_bind_table(m, sys, "statistics"); if (sysstats == NULL) throw(SQL, "sql_drop_statistics", SQLSTATE(3F000) "No table sys.statistics"); @@ -44,6 +42,22 @@ sql_drop_statistics(mvc *m, sql_table *t if (statsid == NULL) throw(SQL, "sql_drop_statistics", SQLSTATE(3F000) "No table sys.statistics"); + /* Do all the validations before any drop */ + if (!isTable(t)) + throw(SQL, "sql_drop_statistics", SQLSTATE(42S02) "DROP STATISTICS: %s '%s' is not persistent", TABLE_TYPE_DESCRIPTION(t->type, t->properties), t->base.name); + if (!table_privs(m, t, PRIV_SELECT)) + throw(SQL, "sql_drop_statistics", SQLSTATE(42000) "DROP STATISTICS: access denied for %s to table '%s.%s'", + sqlvar_get_string(find_global_var(m, mvc_bind_schema(m, "sys"), "current_user")), t->s->base.name, t->base.name); + if (isTable(t) && t->columns.set) { + for (ncol = (t)->columns.set->h; ncol; ncol = ncol->next) { + sql_column *c = (sql_column *) ncol->data; + + if (!column_privs(m, c, PRIV_SELECT)) + throw(SQL, "sql_drop_statistics", SQLSTATE(42000) "DROP STATISTICS: access denied for %s to column '%s' on table '%s.%s'", + sqlvar_get_string(find_global_var(m, mvc_bind_schema(m, "sys"), "current_user")), c->base.name, t->s->base.name, t->base.name); + } + } + if (isTable(t) && t->columns.set) { for (ncol = (t)->columns.set->h; ncol; ncol = ncol->next) { sql_column *c = ncol->data; @@ -51,7 +65,7 @@ sql_drop_statistics(mvc *m, sql_table *t rid = table_funcs.column_find_row(tr, statsid, >base.id, NULL); if (!is_oid_nil(rid) && table_funcs.table_delete(tr, sysstats, rid) != LOG_OK) - throw(SQL, "analyze", "delete failed"); + throw(SQL, "sql_drop_statistics", "delete failed"); } } return MAL_SUCCEED; @@ -87,8 +101,6 @@ sql_analyze(Client cntxt, MalBlkPtr mb, sys = mvc_bind_schema(m, "sys"); if (sys == NULL) throw(SQL, "sql.analyze", SQLSTATE(3F000) "Internal error: No schema sys"); - if (!mvc_schema_privs(m, sys)) - throw(SQL, "sql.analyze", SQLSTATE(42000) "Access denied for %s to schema '%s'", sqlvar_get_string(find_global_var(m, mvc_bind_schema(m, "sys"), "current_user")), sys->base.name); sysstats = mvc_bind_table(m, sys, "statistics"); if (sysstats == NULL) throw(SQL, "sql.analyze", SQLSTATE(3F000) "Internal error: No table sys.statistics"); @@ -109,6 +121,48 @@ sql_analyze(Client cntxt, MalBlkPtr mb, TRC_DEBUG(SQL_PARSER, "analyze %s.%s.%s sample " LLFMT "%s\n", (sch ? sch : ""), (tbl ? tbl : " "), (col ? col : " "), samplesize, (minmax)?"MinMax":""); + /* Do all the validations before doing any analyze */ + for (nsch = tr->schemas.set->h; nsch; nsch = nsch->next) { + sql_schema *s = (sql_schema *) nsch->data; + if (!isalpha((unsigned char) s->base.name[0])) + continue; + + if (sch && strcmp(s->base.name, sch)) + continue; + sfnd = 1; + if (s->tables.set) + for (ntab = (s)->tables.set->h; ntab; ntab = ntab->next) { + sql_table *t = (sql_table *) ntab->data; + + if (tbl && strcmp(t->base.name, tbl)) + continue; + tfnd = 1; + if (tbl && !isTable(t)) + throw(SQL, "analyze", SQLSTATE(42S02) "%s '%s' is
MonetDB: oscar - Merged with Jun2020
Changeset: 9f25e78c28dc for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9f25e78c28dc Modified Files: gdk/gdk_select.c sql/server/rel_select.c sql/test/miscellaneous/Tests/simple_selects.sql sql/test/miscellaneous/Tests/simple_selects.stable.out Branch: oscar Log Message: Merged with Jun2020 diffs (297 lines): diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c --- a/gdk/gdk_select.c +++ b/gdk/gdk_select.c @@ -306,7 +306,7 @@ hashselect(BAT *b, struct canditer *rest buninsfix(bn, dst, cnt, o, \ (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) \ * (dbl) (ci->ncand-p) * 1.1 + 1024), \ - BATcapacity(bn) + ci->ncand - p, BUN_NONE)); \ + maximum, BUN_NONE)); \ } else {\ impsloop(ISDENSE, TEST, quickins(dst, cnt, o, bn)); \ } \ @@ -361,7 +361,7 @@ hashselect(BAT *b, struct canditer *rest buninsfix(bn, dst, cnt, o, \ (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) \ * (dbl) (ci->ncand-p) * 1.1 + 1024), \ - BATcapacity(bn) + ci->ncand - p, BUN_NONE); \ + maximum, BUN_NONE); \ cnt++; \ } \ } \ @@ -526,7 +526,7 @@ fullscan_any(BAT *b, struct canditer *re buninsfix(bn, dst, cnt, o, (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) * (dbl) (ci->ncand-p) * 1.1 + 1024), - BATcapacity(bn) + ci->ncand - p, BUN_NONE); + maximum, BUN_NONE); cnt++; } } @@ -545,7 +545,7 @@ fullscan_any(BAT *b, struct canditer *re buninsfix(bn, dst, cnt, o, (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) * (dbl) (ci->ncand-p) * 1.1 + 1024), - BATcapacity(bn) + ci->ncand - p, BUN_NONE); + maximum, BUN_NONE); cnt++; } } @@ -564,7 +564,7 @@ fullscan_any(BAT *b, struct canditer *re buninsfix(bn, dst, cnt, o, (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) * (dbl) (ci->ncand-p) * 1.1 + 1024), - BATcapacity(bn) + ci->ncand - p, BUN_NONE); + maximum, BUN_NONE); cnt++; } } @@ -603,7 +603,7 @@ fullscan_str(BAT *b, struct canditer *re buninsfix(bn, dst, cnt, o, (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) * (dbl) (ci->ncand-p) * 1.1 + 1024), - BATcapacity(bn) + ci->ncand - p, BUN_NONE); + maximum, BUN_NONE); cnt++; } } @@ -618,7 +618,7 @@ fullscan_str(BAT *b, struct canditer *re buninsfix(bn, dst, cnt, o, (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) * (dbl) (ci->ncand-p) * 1.1 + 1024), - BATcapacity(bn) + ci->ncand - p, BUN_NONE); + maximum, BUN_NONE); cnt++; } } @@ -633,7 +633,7 @@ fullscan_str(BAT *b, struct canditer *re buninsfix(bn, dst, cnt, o, (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) * (dbl) (ci->ncand-p) * 1.1 + 1024), - BATcapacity(bn) + ci->ncand - p, BUN_NONE); + maximum, BUN_NONE); cnt++;
MonetDB: oscar - Merged with Jun2020
Changeset: 792f708ba3df for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=792f708ba3df Modified Files: sql/server/rel_optimizer.c Branch: oscar Log Message: Merged with Jun2020 diffs (97 lines): 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 @@ -7651,6 +7651,8 @@ rel_simplify_predicates(visitor *v, sql_ if (!strcmp(inf->func->base.name, "<>")) flag = !flag; + if (e->flag == cmp_notequal) + flag = !flag; assert(list_length(args) == 2); l = args->h->data; r = args->h->next->data; diff --git a/sql/test/SQLancer/Tests/sqlancer01.sql b/sql/test/SQLancer/Tests/sqlancer01.sql --- a/sql/test/SQLancer/Tests/sqlancer01.sql +++ b/sql/test/SQLancer/Tests/sqlancer01.sql @@ -319,6 +319,23 @@ create view v1(c0) as (select distinct t select max(all abs(+ (- (- (-1620427795) from v0, t0 join v1 on v1.c0)||(t0.c1)))ilike(v1.c0)); ROLLBACK; +START TRANSACTION; +CREATE TABLE "sys"."t1" ("c0" VARCHAR(427),"c1" TIME); +COPY 5 RECORDS INTO "sys"."t1" FROM stdin USING DELIMITERS E'\t',E'\n','"'; +"-"NULL +"0.9494786438610024" NULL +"MA4DƹXb,⻇멫ho\trYmꈋP-aR" NULL +NULL 02:45:58 +NULL 05:45:05 + +SELECT MEDIAN(ALL abs(CASE TIMESTAMP '1970-01-24 09:25:06' WHEN TIMESTAMP '1970-01-19 10:35:50' THEN 2 END)) FROM t1 GROUP BY abs(0.8); +SELECT MEDIAN(ALL abs(CASE TIMESTAMP '1970-01-24 09:25:06' WHEN TIMESTAMP '1970-01-19 10:35:50' THEN 2 END)) FROM t1 GROUP BY abs(0.8) HAVING (NOT (MIN(ALL NOT (NOT ((0.7) IS NULL) = TRUE +UNION ALL +SELECT MEDIAN(ALL abs(CASE TIMESTAMP '1970-01-24 09:25:06' WHEN TIMESTAMP '1970-01-19 10:35:50' THEN 2 END)) FROM t1 GROUP BY abs(0.8) HAVING NOT ((NOT (MIN(ALL NOT (NOT ((0.7) IS NULL) = TRUE) +UNION ALL +SELECT MEDIAN(ALL abs(CASE TIMESTAMP '1970-01-24 09:25:06' WHEN TIMESTAMP '1970-01-19 10:35:50' THEN 2 END)) FROM t1 GROUP BY abs(0.8) HAVING ((NOT (MIN(ALL NOT (NOT ((0.7) IS NULL) = TRUE) IS NULL; +ROLLBACK; + DROP TABLE tbl_ProductSales; DROP TABLE another_T; DROP TABLE integers; diff --git a/sql/test/SQLancer/Tests/sqlancer01.stable.out b/sql/test/SQLancer/Tests/sqlancer01.stable.out --- a/sql/test/SQLancer/Tests/sqlancer01.stable.out +++ b/sql/test/SQLancer/Tests/sqlancer01.stable.out @@ -213,8 +213,8 @@ stdout of test 'sqlancer01` in directory % int # type % 1 # length #select 1 from another_t join integers on (cast(another_t.col4 between 1 and 2 as int)) where false; -% .%15 # table_name -% %15 # name +% .%11 # table_name +% %11 # name % tinyint # type % 1 # length #SELECT another_T.col2 FROM tbl_productsales, integers LEFT OUTER JOIN another_T ON another_T.col1 > 1 WHERE another_T.col2 > 1 GROUP BY another_T.col2 HAVING COUNT((another_T.col2) IN (another_T.col2)) > 0; @@ -272,8 +272,8 @@ stdout of test 'sqlancer01` in directory % 1 # length [ 1] #select 1 from t0 where (3 in (1, 2)) is null; --simplified -% .%5 # table_name -% %5 # name +% .%4 # table_name +% %4 # name % tinyint # type % 1 # length #SELECT 1 FROM t0 WHERE t0.c0 BETWEEN SYMMETRIC (1 IN (2, 1)) AND t0.c0; @@ -625,6 +625,32 @@ stdout of test 'sqlancer01` in directory % 1 # length [ NULL ] #ROLLBACK; +#START TRANSACTION; +#CREATE TABLE "sys"."t1" ("c0" VARCHAR(427),"c1" TIME); +#COPY 5 RECORDS INTO "sys"."t1" FROM stdin USING DELIMITERS E'\t',E'\n','"'; +#"-" NULL +#"0.9494786438610024" NULL +#"MA4DƹXb,⻇멫ho\trYmꈋP-aR" NULL +#NULL 02:45:58 +#NULL 05:45:05 +[ 5] +#SELECT MEDIAN(ALL abs(CASE TIMESTAMP '1970-01-24 09:25:06' WHEN TIMESTAMP '1970-01-19 10:35:50' THEN 2 END)) FROM t1 GROUP BY abs(0.8); +% .%2 # table_name +% %2 # name +% tinyint # type +% 1 # length +[ NULL ] +#SELECT MEDIAN(ALL abs(CASE TIMESTAMP '1970-01-24 09:25:06' WHEN TIMESTAMP '1970-01-19 10:35:50' THEN 2 END)) FROM t1 GROUP BY abs(0.8) HAVING (NOT (MIN(ALL NOT (NOT ((0.7) IS NULL) = TRUE +#UNION ALL +#SELECT MEDIAN(ALL abs(CASE TIMESTAMP '1970-01-24 09:25:06' WHEN TIMESTAMP '1970-01-19 10:35:50' THEN 2 END)) FROM t1 GROUP BY abs(0.8) HAVING NOT ((NOT (MIN(ALL NOT (NOT ((0.7) IS NULL) = TRUE) +#UNION ALL +#SELECT MEDIAN(ALL abs(CASE TIMESTAMP '1970-01-24 09:25:06' WHEN TIMESTAMP '1970-01-19 10:35:50' THEN 2 END)) FROM t1 GROUP BY abs(0.8) HAVING ((NOT (MIN(ALL NOT (NOT ((0.7) IS NULL) = TRUE) IS NULL; +% .%23 # table_name +% %2 # name +% tinyint # type +% 1 # length +[ NULL ] +#ROLLBACK; #DROP TABLE tbl_ProductSales; #DROP TABLE another_T; #DROP TABLE integers; ___ checkin-list mailing list
MonetDB: oscar - Merged with Jun2020
Changeset: 8339385d201d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8339385d201d Modified Files: gdk/gdk_calc.c sql/server/rel_dump.c sql/server/rel_select.c sql/server/rel_unnest.c sql/test/BugTracker-2020/Tests/All sql/test/BugTracker-2020/Tests/tpch-cube.Bug-6938.stable.out sql/test/SQLancer/Tests/All Branch: oscar Log Message: Merged with Jun2020 diffs (truncated from 860 to 300 lines): diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c --- a/gdk/gdk_calc.c +++ b/gdk/gdk_calc.c @@ -319,11 +319,6 @@ BATcalcnot(BAT *b, BAT *s, BAT *r) bn->tnonil = nils == 0; bn->tkey = b->tkey && nils <= 1; - if (nils != 0 && !b->tnil) { - b->tnil = true; - b->batDirtydesc = true; - } - TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n", ALGOBATPAR(b), ALGOOPTBATPAR(s), @@ -449,11 +444,6 @@ BATcalcnegate(BAT *b, BAT *s, BAT *r) bn->tnonil = nils == 0; bn->tkey = b->tkey && nils <= 1; - if (nils != 0 && !b->tnil) { - b->tnil = true; - b->batDirtydesc = true; - } - TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n", ALGOBATPAR(b), ALGOOPTBATPAR(s), @@ -589,11 +579,6 @@ BATcalcabsolute(BAT *b, BAT *s, BAT *r) bn->tnil = nils != 0; bn->tnonil = nils == 0; - if (nils && !b->tnil) { - b->tnil = true; - b->batDirtydesc = true; - } - TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n", ALGOBATPAR(b), ALGOOPTBATPAR(s), @@ -728,11 +713,6 @@ BATcalciszero(BAT *b, BAT *s, BAT *r) bn->tnil = nils != 0; bn->tnonil = nils == 0; - if (nils != 0 && !b->tnil) { - b->tnil = true; - b->batDirtydesc = true; - } - TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n", ALGOBATPAR(b), ALGOOPTBATPAR(s), @@ -871,11 +851,6 @@ BATcalcsign(BAT *b, BAT *s, BAT *r) bn->tnil = nils != 0; bn->tnonil = nils == 0; - if (nils != 0 && !b->tnil) { - b->tnil = true; - b->batDirtydesc = true; - } - TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n", ALGOBATPAR(b), ALGOOPTBATPAR(s), @@ -3809,15 +3784,6 @@ BATcalcincrdecr(BAT *b, BAT *s, BAT *r, bn->tnil = nils != 0; bn->tnonil = nils == 0; - if (nils && !b->tnil) { - b->tnil = true; - b->batDirtydesc = true; - } - if (nils == 0 && !b->tnonil) { - b->tnonil = true; - b->batDirtydesc = true; - } - TRC_DEBUG(ALGO, "%s: b=" ALGOBATFMT ",s=" ALGOOPTBATFMT ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n", func, ALGOBATPAR(b), ALGOOPTBATPAR(s), 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 @@ -929,10 +929,22 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re if (!(rexps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 0))) return NULL; if (filter) { - sql_subfunc *func = sql_find_func(sql->sa, mvc_bind_schema(sql, "sys"), fname, 1+list_length(exps), F_FILT, NULL); - if (!func) + sql_subfunc *func = NULL; + list *tl = sa_list(sql->sa); + + for (node *n = lexps->h; n; n = n->next){ + sql_exp *e = n->data; + + list_append(tl, exp_subtype(e)); + } + for (node *n = rexps->h; n; n = n->next){ + sql_exp *e = n->data; + + list_append(tl, exp_subtype(e)); + } + + if (!(func = sql_bind_func_(sql->sa, mvc_bind_schema(sql, "sys"), fname, tl, F_FILT))) return sql_error(sql, -1, SQLSTATE(42000) "Filter: missing function '%s'\n", fname); - return exp_filter(sql->sa, lexps, rexps, func, anti); } return exp_or(sql->sa, lexps, rexps, anti); @@ -1033,12 +1045,16 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re if
MonetDB: oscar - Merged with Jun2020
Changeset: a5f61329133c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a5f61329133c Modified Files: sql/common/sql_types.c sql/server/rel_select.c sql/test/SQLancer/Tests/sqlancer03.sql sql/test/SQLancer/Tests/sqlancer03.stable.out sql/test/pg_regress/Tests/date.stable.err sql/test/pg_regress/Tests/date.stable.out Branch: oscar Log Message: Merged with Jun2020 diffs (truncated from 714 to 300 lines): diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -107,7 +107,7 @@ static int convert_matrix[EC_MAX][EC_MAX /* EC_FLT */ { 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, /* EC_TIME */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0 }, /* EC_TIME_TZ */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, -/* EC_DATE */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 0, 0 }, +/* EC_DATE */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0, 0 }, /* EC_TSTAMP */{ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 0, 0 }, /* EC_TSTAMP_TZ */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0 }, /* EC_GEOM */ { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -3748,40 +3748,39 @@ rel_case(sql_query *query, sql_rel **rel { mvc *sql = query->sql; sql_subtype *tpe = NULL; - list *conds = new_exp_list(sql->sa); - list *results = new_exp_list(sql->sa); - dnode *dn = when_search_list->h; - sql_subtype *restype = NULL, rtype, bt; - sql_exp *res = NULL, *else_exp = NULL; - node *n, *m; + list *conds = new_exp_list(sql->sa), *results = new_exp_list(sql->sa); + sql_subtype *restype = NULL, *condtype = NULL, ctype, rtype, bt; + sql_exp *res = NULL, *opt_cond_exp = NULL; exp_kind ek = {type_value, card_column, FALSE}; - sql_find_subtype(, "boolean", 0, 0); - for (dn = when_search_list->h; dn; dn = dn->next) { + if (opt_cond) { + if (!(opt_cond_exp = rel_value_exp(query, rel, opt_cond, f, ek))) + return NULL; + condtype = exp_subtype(opt_cond_exp); + } + + for (dnode *dn = when_search_list->h; dn; dn = dn->next) { sql_exp *cond = NULL, *result = NULL; dlist *when = dn->data.sym->data.lval; - if (opt_cond) { - sql_exp *l, *r; - - if (!(l = rel_value_exp(query, rel, opt_cond, f, ek))) - return NULL; - if (!(r = rel_value_exp(query, rel, when->h->data.sym, f, ek))) - return NULL; - if (rel_convert_types(sql, rel ? *rel : NULL, rel ? *rel : NULL, , , 1, type_equal) < 0) - return NULL; - cond = rel_binop_(sql, rel ? *rel : NULL, l, r, NULL, "=", card_value); - } else { + if (opt_cond) + cond = rel_value_exp(query, rel, when->h->data.sym, f, ek); + else cond = rel_logical_value_exp(query, rel, when->h->data.sym, f, ek); - } if (!cond) return NULL; - result = rel_value_exp(query, rel, when->h->next->data.sym, f, ek); - if (!cond || !result) + list_prepend(conds, cond); + tpe = exp_subtype(cond); + if (tpe && condtype) { + supertype(, condtype, tpe); + condtype = + } else if (tpe) { + condtype = tpe; + } + + if (!(result = rel_value_exp(query, rel, when->h->next->data.sym, f, ek))) return NULL; - list_prepend(conds, cond); list_prepend(results, result); - tpe = exp_subtype(result); if (tpe && restype) { supertype(, restype, tpe); @@ -3790,13 +3789,11 @@ rel_case(sql_query *query, sql_rel **rel restype = tpe; } } - if (opt_else || else_exp) { - sql_exp *result = else_exp; - - if (!result && !(result = rel_value_exp(query, rel, opt_else, f, ek))) + if (opt_else) { + if (!(res = rel_value_exp(query, rel, opt_else, f, ek))) return NULL; - tpe = exp_subtype(result); + tpe = exp_subtype(res); if (tpe && restype) { supertype(, restype, tpe); restype = @@ -3809,11 +3806,7 @@
MonetDB: oscar - Merged with Jun2020
Changeset: a1d8df9fc162 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a1d8df9fc162 Modified Files: gdk/gdk_utils.c sql/backends/monet5/sql_upgrades.c sql/server/rel_exp.c sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_select.c sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out sql/test/SQLancer/Tests/sqlancer03.sql sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.ppc64.int128 sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.ppc64.int128 sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128 sql/test/emptydb-upgrade/Tests/upgrade.stable.out sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128 sql/test/miscellaneous/Tests/simple_plans.stable.out sql/test/miscellaneous/Tests/simple_plans.stable.out.single sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade/Tests/upgrade.stable.out sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128 Branch: oscar Log Message: Merged with Jun2020 diffs (truncated from 1173 to 300 lines): diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -1500,11 +1500,7 @@ THRcreate(void (*f) (void *), void *arg, }; len = snprintf(semname, sizeof(semname), "THRcreate%" PRIu64, (uint64_t) ATOMIC_INC()); if (len == -1 || len > (int) sizeof(semname)) { - TRC_DEBUG(IO_, "Semaphore name is too large\n"); - GDKerror("semaphore name is too large\n"); - GDKfree(t); - ATOMIC_SET(>pid, 0); /* deallocate */ - return 0; + TRC_WARNING(IO_, "Semaphore name is too large\n"); } MT_sema_init(>sem, 0, semname); if (MT_create_thread(, THRstarter, t, d, name) != 0) { diff --git a/sql/backends/monet5/sql_upgrades.c b/sql/backends/monet5/sql_upgrades.c --- a/sql/backends/monet5/sql_upgrades.c +++ b/sql/backends/monet5/sql_upgrades.c @@ -2140,6 +2140,31 @@ sql_update_jun2020_sp1_hugeint(Client c, #endif static str +sql_update_jun2020_sp2(Client c, mvc *sql, const char *prev_schema, bool *systabfixed) +{ + /* we need to update the system tables, but only if we haven't done +* so already, and if we are actually upgrading the database */ + if (*systabfixed) + return MAL_SUCCEED; /* already done */ + + char *buf = "select id from sys.functions where name = 'nullif' and schema_id = (select id from sys.schemas where name = 'sys');\n"; + res_table *output; + char *err = SQLstatementIntern(c, , "update", 1, 0, ); + if (err == NULL) { + BAT *b = BATdescriptor(output->cols[0].b); + if (b) { + if (BATcount(b) == 0) { + err = sql_fix_system_tables(c, sql, prev_schema); + *systabfixed = true; + } + BBPunfix(b->batCacheid); + } + res_table_destroy(output); + } + return err; +} + +static str sql_update_oscar_lidar(Client c) { char *query = @@ -2429,6 +2454,7 @@ sql_update_oscar(Client c, mvc *sql, con GDKfree(buf); return err; /* usually MAL_SUCCEED */ } + int SQLupgrades(Client c, mvc *m) { @@ -2645,6 +2671,13 @@ SQLupgrades(Client c, mvc *m) } #endif + if ((err = sql_update_jun2020_sp2(c, m, prev_schema, )) != NULL) { + TRC_CRITICAL(SQL_PARSER, "%s\n", err); + freeException(err); + GDKfree(prev_schema); + return -1; + } + sql_find_subtype(, "varchar", 0, 0); if (sql_bind_func(m->sa, s, "lidarattach", , NULL, F_PROC) && (err = sql_update_oscar_lidar(c)) != NULL) { 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 @@ -1921,20 +1921,6 @@ exps_have_rel_exp( list *exps) return 0; } -int -exps_have_func(list *exps) -{ - if (list_empty(exps)) - return 0; - for(node *n=exps->h; n; n=n->next) { - sql_exp *e = n->data; - - if (exp_has_func(e)) - return 1; - } - return 0; -} - static sql_rel * exps_rel_get_rel(sql_allocator *sa, list *exps ) { @@ -2093,19 +2079,22 @@ exps_are_atoms( list *exps)
MonetDB: oscar - Merged with Jun2020
Changeset: 67ea7498c34f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=67ea7498c34f Modified Files: sql/server/rel_optimizer.c sql/server/sql_atom.c Branch: oscar Log Message: Merged with Jun2020 diffs (43 lines): 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 @@ -5285,7 +5285,7 @@ rel_remove_empty_join(visitor *v, sql_re static bool find_simple_projection_for_join2semi(sql_rel *rel) { - if (is_project(rel->op) && list_length(rel->exps) == 1) { + if (is_project(rel->op) && !is_union(rel->op) && list_length(rel->exps) == 1) { sql_exp *e = rel->exps->h->data; if (rel->card < CARD_AGGR) /* const or groupby without group by exps */ diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c --- a/sql/server/sql_atom.c +++ b/sql/server/sql_atom.c @@ -329,6 +329,7 @@ atom_general(sql_allocator *sa, sql_subt /*_DELETE(val);*/ if (p) GDKfree(p); + GDKclrerr(); return NULL; } VALset(>data, a->data.vtype, p); @@ -1238,8 +1239,10 @@ atom_cast(sql_allocator *sa, atom *a, sq len = sizeof(double); res = ATOMfromstr(TYPE_dbl, , , s, false); GDKfree(s); - if (res < 0) + if (res < 0) { + GDKclrerr(); return 0; + } } if (tp->type->localtype == TYPE_dbl) a->data.val.dval = a->d; @@ -1264,6 +1267,7 @@ atom_cast(sql_allocator *sa, atom *a, sq ATOMcmp(type, p, ATOMnilptr(type)) == 0) { GDKfree(p); a->data.len = strlen(a->data.val.sval); + GDKclrerr(); return 0; } a->tpe = *tp; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: oscar - Merged with Jun2020
Changeset: aed98e315ad4 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=aed98e315ad4 Modified Files: sql/server/rel_optimizer.c tools/merovingian/client/monetdb.c Branch: oscar Log Message: Merged with Jun2020 diffs (118 lines): 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 @@ -4673,43 +4673,6 @@ rel_push_select_down_join(visitor *v, sq return rel; } -static bool -find_simple_projection_for_join2semi(sql_rel *rel) -{ - if (is_project(rel->op) && list_length(rel->exps) == 1) { - sql_exp *e = rel->exps->h->data; - - if (rel->card < CARD_AGGR) /* const or groupby without group by exps */ - return true; - /* a single group by column in the projection list from a group by relation is guaranteed to be unique, but not an aggregate */ - if (e->type == e_column) { - sql_rel *res = NULL; - sql_exp *found = NULL; - bool underjoin = false; - - if (is_groupby(rel->op) || need_distinct(rel) || find_prop(e->p, PROP_HASHCOL)) - return true; - - found = rel_find_exp_and_corresponding_rel(rel->l, e, , ); /* grouping column on inner relation */ - if (found && !underjoin) { - if (find_prop(found->p, PROP_HASHCOL)) /* primary key always unique */ - return true; - if (found->type == e_column && found->card <= CARD_AGGR) { - if (!(is_groupby(res->op) || need_distinct(res)) && list_length(res->exps) != 1) - return false; - for (node *n = res->exps->h ; n ; n = n->next) { /* must be the single column in the group by expression list */ - sql_exp *e = n->data; - if (e != found && e->type == e_column) - return false; - } - return true; - } - } - } - } - return false; -} - /* * Push {semi}joins down, pushes the joins through group by expressions. * When the join is on the group by columns, we can push the joins left @@ -4728,13 +4691,13 @@ rel_push_join_down(visitor *v, sql_rel * { list *exps = NULL; - if (!rel_is_ref(rel) && ((is_join(rel->op) || is_semi(rel->op)) && rel->l && rel->exps)) { + if (!rel_is_ref(rel) && ((is_left(rel->op) || rel->op == op_join || is_semi(rel->op)) && rel->l && rel->exps)) { sql_rel *gb = rel->r, *ogb = gb, *l = NULL, *rell = rel->l; if (gb->op == op_project) gb = gb->l; - if (rel_is_ref(rell) || !find_simple_projection_for_join2semi(rell)) + if (rel_is_ref(rell)) return rel; exps = rel->exps; @@ -5319,6 +5282,43 @@ rel_remove_empty_join(visitor *v, sql_re return rel; } +static bool +find_simple_projection_for_join2semi(sql_rel *rel) +{ + if (is_project(rel->op) && list_length(rel->exps) == 1) { + sql_exp *e = rel->exps->h->data; + + if (rel->card < CARD_AGGR) /* const or groupby without group by exps */ + return true; + /* a single group by column in the projection list from a group by relation is guaranteed to be unique, but not an aggregate */ + if (e->type == e_column) { + sql_rel *res = NULL; + sql_exp *found = NULL; + bool underjoin = false; + + if (is_groupby(rel->op) || need_distinct(rel) || find_prop(e->p, PROP_HASHCOL)) + return true; + + found = rel_find_exp_and_corresponding_rel(rel->l, e, , ); /* grouping column on inner relation */ + if (found && !underjoin) { + if (find_prop(found->p, PROP_HASHCOL)) /* primary key always unique */ + return true; + if (found->type == e_column && found->card <= CARD_AGGR) { + if (!(is_groupby(res->op) || need_distinct(res)) && list_length(res->exps) != 1) + return false; + for (node *n = res->exps->h ; n ; n = n->next) { /* must be the single column in the group by expression list */ +
MonetDB: oscar - Merged with Jun2020
Changeset: b9bbc090f66a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b9bbc090f66a Modified Files: sql/include/sql_catalog.h sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimizer.c sql/server/rel_propagate.c sql/server/sql_atom.c sql/server/sql_atom.h sql/storage/store.c sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.stable.out sql/test/merge-partitions/Tests/All sql/test/mergetables/Tests/forex1.stable.out Branch: oscar Log Message: Merged with Jun2020 ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: oscar - Merged with Jun2020
Changeset: d39245d853c4 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d39245d853c4 Modified Files: gdk/gdk_utils.c sql/include/sql_catalog.h sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimizer.c sql/server/sql_atom.c sql/storage/store.c sql/test/BugTracker-2020/Tests/All Branch: oscar Log Message: Merged with Jun2020 diffs (truncated from 1540 to 300 lines): diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -1357,7 +1357,10 @@ GDKusec(void) return (lng) (f.QuadPart / 10); #elif defined(HAVE_CLOCK_GETTIME) struct timespec ts; - clock_gettime(CLOCK_REALTIME, ); +#ifdef CLOCK_REALTIME_COARSE + if (clock_gettime(CLOCK_REALTIME_COARSE, ) < 0) +#endif + (void) clock_gettime(CLOCK_REALTIME, ); return (lng) (ts.tv_sec * LL_CONSTANT(100) + ts.tv_nsec / 1000); #elif defined(HAVE_GETTIMEOFDAY) struct timeval tv; 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 @@ -309,6 +309,7 @@ typedef enum sql_class { #define EC_TEMP_TZ(e) (e==EC_TIME_TZ||e==EC_TIMESTAMP_TZ) #define EC_TEMP(e) (e==EC_TIME||e==EC_DATE||e==EC_TIMESTAMP||EC_TEMP_TZ(e)) #define EC_TEMP_FRAC(e) (e==EC_TIME||e==EC_TIMESTAMP||EC_TEMP_TZ(e)) +#define EC_TEMP_NOFRAC(e) (e==EC_TIME||e==EC_TIMESTAMP) #define EC_BACKEND_FIXED(e)(EC_NUMBER(e)||e==EC_BIT||EC_TEMP(e)) typedef struct sql_type { 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 @@ -18,8 +18,6 @@ #ifdef HAVE_HGE #include "mal.h" /* for have_hge */ #endif -#include "gdk_time.h" -#include "blob.h" comp_type compare_str2type(const char *compare_op) @@ -2659,97 +2657,6 @@ exp_sum_scales(sql_subfunc *f, sql_exp * } } -sql_exp * -create_table_part_atom_exp(mvc *sql, sql_subtype tpe, ptr value) -{ - str buf = NULL; - size_t len = 0; - sql_exp *res = NULL; - - switch (tpe.type->eclass) { - case EC_BIT: { - bit bval = *((bit*) value); - return exp_atom_bool(sql->sa, bval ? 1 : 0); - } - case EC_POS: - case EC_NUM: - case EC_DEC: - case EC_SEC: - case EC_MONTH: - switch (tpe.type->localtype) { -#ifdef HAVE_HGE - case TYPE_hge: { - hge hval = *((hge*) value); - return exp_atom_hge(sql->sa, hval); - } -#endif - case TYPE_lng: { - lng lval = *((lng*) value); - return exp_atom_lng(sql->sa, lval); - } - case TYPE_int: { - int ival = *((int*) value); - return exp_atom_int(sql->sa, ival); - } - case TYPE_sht: { - sht sval = *((sht*) value); - return exp_atom_sht(sql->sa, sval); - } - case TYPE_bte: { - bte bbval = *((bte *) value); - return exp_atom_bte(sql->sa, bbval); - } - default: - return NULL; - } - case EC_FLT: - switch (tpe.type->localtype) { - case TYPE_flt: { - flt fval = *((flt*) value); - return exp_atom_flt(sql->sa, fval); - } - case TYPE_dbl: { - dbl dval = *((dbl*) value); - return exp_atom_dbl(sql->sa, dval); - } - default: - return NULL; - } - case EC_DATE: { - if(date_tostr(, , (const date *)value, false) < 0) - return NULL; - res = exp_atom(sql->sa, atom_general(sql->sa, , buf)); - break; - } - case EC_TIME: { - if(daytime_tostr(, , (const daytime *)value, false) < 0) - return NULL; - res = exp_atom(sql->sa,
MonetDB: oscar - Merged with Jun2020
Changeset: cf6e79382c27 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cf6e79382c27 Modified Files: sql/backends/monet5/sql_statement.c sql/server/rel_exp.c sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_rewriter.c sql/server/rel_unnest.c sql/server/rel_updates.c sql/test/SQLancer/Tests/sqlancer03.sql sql/test/SQLancer/Tests/sqlancer03.stable.out Branch: oscar Log Message: Merged with Jun2020 diffs (truncated from 529 to 300 lines): 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 @@ -3053,7 +3053,7 @@ stmt_convert(backend *be, stmt *v, sql_s q = pushInt(mb, q, f->scale); */ //q = pushInt(mb, q, ((ValRecord)((atom*)(be->mvc)->args[1])->data).val.ival); } - if (cond && v->nrcols && f->type->eclass != EC_DEC && !EC_TEMP_FRAC(t->type->eclass) && !EC_INTERVAL(t->type->eclass)) + if (cond && v->nrcols && f->type->eclass != EC_DEC && !EC_TEMP(t->type->eclass) && !EC_INTERVAL(t->type->eclass)) q = pushArgument(mb, q, cond->nr); if (q) { stmt *s = stmt_create(be->mvc->sa, st_convert); 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 @@ -861,6 +861,7 @@ exp_setalias(sql_exp *e, const char *rna void exp_prop_alias(sql_allocator *sa, sql_exp *e, sql_exp *oe ) { + e->ref = oe->ref; if (oe->alias.name == NULL && exp_has_rel(oe)) { sql_rel *r = exp_rel_get_rel(sa, oe); if (!is_project(r->op)) 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 @@ -1600,14 +1600,11 @@ rel_push_count_down(visitor *v, sql_rel sql_rel *cp;/* Cross Product */ sql_subfunc *mult; list *args; - const char *rname = NULL, *name = NULL; sql_rel *srel; oce = rel->exps->h->data; if (oce->l) /* we only handle COUNT(*) */ return rel; - rname = exp_relname(oce); - name = exp_name(oce); args = new_exp_list(v->sql->sa); srel = r->l; @@ -1640,7 +1637,8 @@ rel_push_count_down(visitor *v, sql_rel cp = rel_crossproduct(v->sql->sa, gbl, gbr, op_join); nce = exp_op(v->sql->sa, args, mult); - exp_setname(v->sql->sa, nce, rname, name ); + if (exp_name(oce)) + exp_prop_alias(v->sql->sa, nce, oce); rel_destroy(rel); rel = rel_project(v->sql->sa, cp, append(new_exp_list(v->sql->sa), nce)); @@ -2849,7 +2847,8 @@ rel_merge_projects(visitor *v, sql_rel * } */ if (ne) { - exp_setname(v->sql->sa, ne, exp_relname(e), exp_name(e)); + if (exp_name(e)) + exp_prop_alias(v->sql->sa, ne, e); list_append(rel->exps, ne); } else { all = 0; @@ -2865,7 +2864,8 @@ rel_merge_projects(visitor *v, sql_rel * ne = exp_push_down_prj(v->sql, e, prj, prj->l); if (ne) { - exp_setname(v->sql->sa, ne, exp_relname(e), exp_name(e)); + if (exp_name(e)) + exp_prop_alias(v->sql->sa, ne, e); list_append(nr, ne); } else { all = 0; @@ -2934,21 +2934,25 @@ exp_simplify_math( mvc *sql, sql_exp *e, if (exp_is_atom(le) && exp_is_null(sql, le)) { (*changes)++; if (f && f->func && f->func->imp && strstr(f->func->imp, "_no_nil") != NULL) { - exp_setname(sql->sa, re, exp_relname(e), exp_name(e)); + if (exp_name(e)) + exp_prop_alias(sql->sa, re, e); return re; } le = exp_null(sql->sa, et); - exp_setname(sql->sa, le, exp_relname(e), exp_name(e)); + if (exp_name(e)) + exp_prop_alias(sql->sa, le, e);
MonetDB: oscar - Merged with Jun2020
Changeset: 81fd9cd9aaa5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=81fd9cd9aaa5 Modified Files: sql/backends/monet5/sql_statement.c sql/server/rel_optimizer.c sql/server/sql_atom.c sql/server/sql_atom.h sql/server/sql_semantic.c sql/test/SQLancer/Tests/sqlancer03.sql sql/test/SQLancer/Tests/sqlancer03.stable.out sql/test/pg_regress/Tests/timestamp.stable.out sql/test/pg_regress/Tests/timestamptz.stable.out Branch: oscar Log Message: Merged with Jun2020 diffs (truncated from 447 to 300 lines): 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 @@ -1501,6 +1501,8 @@ stmt_uselect(backend *be, stmt *op1, stm q = pushArgument(mb, q, l); if (sub && !op1->cand) q = pushArgument(mb, q, sub->nr); + else + sub = NULL; q = pushArgument(mb, q, r); q = pushArgument(mb, q, r); q = pushBit(mb, q, TRUE); 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 @@ -1740,6 +1740,11 @@ rel_simplify_count_fk_join(mvc *sql, sql if (oce->l) /* we only handle COUNT(*) */ return r; + /* primary side must be a full table */ + if ((fk_left && (!is_left(r->op) && !is_full(r->op)) && !is_basetable(rr->op)) || + (!fk_left && (!is_right(r->op) && !is_full(r->op)) && !is_basetable(rl->op))) + return r; + if (fk_left && is_join(rl->op) && !rel_is_ref(rl)) { rl = rel_simplify_count_fk_join(sql, rl, gexps, changes); r->l = rl; @@ -1748,10 +1753,6 @@ rel_simplify_count_fk_join(mvc *sql, sql rr = rel_simplify_count_fk_join(sql, rr, gexps, changes); r->r = rr; } - /* primary side must be a full table */ - if ((fk_left && (!is_left(r->op) && !is_full(r->op)) && !is_basetable(rr->op)) || - (!fk_left && (!is_right(r->op) && !is_full(r->op)) && !is_basetable(rl->op))) - return r; (*changes)++; /* rewrite, ie remove pkey side */ diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c --- a/sql/server/sql_atom.c +++ b/sql/server/sql_atom.c @@ -429,7 +429,7 @@ atom2string(sql_allocator *sa, atom *a) } char * -atom2sql(atom *a) +atom2sql(atom *a, int timezone) { sql_class ec = a->tpe.type->eclass; char buf[BUFSIZ]; @@ -567,26 +567,101 @@ atom2sql(atom *a) sprintf(buf, "%f", a->data.val.fval); break; case EC_TIME: + case EC_TIME_TZ: case EC_DATE: case EC_TIMESTAMP: - if (a->data.vtype == TYPE_str) { - char *val1 = sql_escape_str(a->tpe.type->sqlname), *val2 = sql_escape_str(a->data.val.sval), *res; + case EC_TIMESTAMP_TZ: { + char val1[64], sbuf[64], *val2 = sbuf, *res; + size_t len = sizeof(sbuf); - if (!val1 || !val2) { - c_delete(val1); - c_delete(val2); - return NULL; + switch (ec) { + case EC_TIME: + case EC_TIME_TZ: + case EC_TIMESTAMP: + case EC_TIMESTAMP_TZ: { + char *n = stpcpy(val1, (ec == EC_TIME || ec == EC_TIME_TZ) ? "TIME" : "TIMESTAMP"); + if (a->tpe.digits) { + char str[16]; + sprintf(str, "%u", a->tpe.digits); + n = stpcpy(stpcpy(stpcpy(n, " ("), str), ")"); } + if (ec == EC_TIME_TZ || ec == EC_TIMESTAMP_TZ) + stpcpy(n, " WITH TIME ZONE"); + } break; + case EC_DATE: + strcpy(val1, "DATE"); + break; + default: + assert(0); + } + + switch (ec) { + case EC_TIME: + case EC_TIME_TZ: { + daytime dt = a->data.val.lval; + int digits = a->tpe.digits ? a->tpe.digits - 1 : 0; + char *s = val2; + ssize_t lens; + + if (ec == EC_TIME_TZ) + dt = daytime_add_usec_modulo(dt, timezone * 1000); + if ((lens = daytime_precision_tostr(, , dt, digits, true)) < 0) + assert(0); + + if (ec == EC_TIME_TZ) { + lng
MonetDB: oscar - Merged with Jun2020
Changeset: 8f10367ee2b6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8f10367ee2b6 Modified Files: sql/storage/store.c sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.stable.out sql/test/miscellaneous/Tests/groupby_error.stable.out Branch: oscar Log Message: Merged with Jun2020 diffs (124 lines): diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -4612,13 +4612,18 @@ validate_tables(sql_schema *s, sql_schem if (cs_size(>tables)) for (n = s->tables.set->h; n; n = n->next) { sql_table *t = n->data; - sql_table *ot; + sql_table *ot = NULL; if (!t->base.wtime && !t->base.rtime) continue; - ot = find_sql_table(os, t->base.name); - if (ot && isKindOfTable(ot) && isKindOfTable(t) && !isDeclaredTable(ot) && !isDeclaredTable(t)) { + o = list_find_base_id(os->tables.set, t->base.id); + if (o) + ot = o->data; + if (!ot && os->tables.dset && list_find_base_id(os->tables.dset, t->base.id) != NULL) { + /* dropped table */ + return 0; + } else if (ot && isKindOfTable(ot) && isKindOfTable(t) && !isDeclaredTable(ot) && !isDeclaredTable(t)) { if ((t->base.wtime && (t->base.wtime < ot->base.rtime || t->base.wtime < ot->base.wtime)) || (t->base.rtime && (t->base.rtime < ot->base.wtime))) return 0; @@ -4877,7 +4882,8 @@ reset_table(sql_trans *tr, sql_table *ft ft->access = pft->access; if (pft->p) { ft->p = find_sql_table(ft->s, pft->p->base.name); - assert(isMergeTable(ft->p) || isReplicaTable(ft->p)); + //the parent (merge or replica table) maybe created later! + //assert(isMergeTable(ft->p) || isReplicaTable(ft->p)); } else ft->p = NULL; @@ -4986,6 +4992,12 @@ reset_trans(sql_trans *tr, sql_trans *pt { int res = reset_changeset(tr, >schemas, >schemas, (sql_base *)tr->parent, (resetf) _schema, (dupfunc) _dup); TRC_DEBUG(SQL_STORE, "Reset transaction: %d\n", tr->wtime); + + for (node *n = tr->schemas.set->h; n; n = n->next) { /* Set table members */ + sql_schema *s = n->data; + + set_members(>tables); + } return res; } diff --git a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out --- a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out +++ b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out @@ -97,7 +97,7 @@ single project ( | ) [ "o"."open_auction_id" NOT NULL * = "%32"."%32" NOT NULL ] ) [ "o"."id" NOT NULL HASHCOL , "o"."open_auction_id" NOT NULL, "o"."initial" NOT NULL, "o"."reserve" NOT NULL, "o"."aktuell" NOT NULL, "o"."privacy" NOT NULL, "o"."itemref" NOT NULL, "o"."seller" NOT NULL, "o"."quantity" NOT NULL, "o"."type" NOT NULL, "o"."start" NOT NULL, "o"."ende" NOT NULL, "o"."%TID%" NOT NULL, "b"."id" NOT NULL HASHCOL , "b"."open_auction_id" NOT NULL, "b"."date" NOT NULL, "b"."time" NOT NULL, "b"."personref" NOT NULL, "b"."increase" NOT NULL, "b"."%TID%" NOT NULL, "b3"."increase" NOT NULL as "%2"."%2" ] project ( -| select ( +| single select ( | | single join ( | | | & REF 2 , | | | project ( diff --git a/sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.stable.out b/sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.stable.out --- a/sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.stable.out +++ b/sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.stable.out @@ -92,29 +92,25 @@ project ( | | | | | project ( | | | | | | project ( | | | | | | | project ( -| | | | | | | | project ( -| | | | | | | | | project ( -| | | | | | | | | | left outer join ( -| | | | | | | | | | | left outer join ( -| | | | | | | | | | | | join ( -| | | | | | | | | | | | | join ( -| | | | | | | | | | | | | | table(sys.functions) [ "functions"."id" as "f"."id", "functions"."schema_id" as "f"."schema_id" ] COUNT , -| | | | | | | | | | | | | | table(sys.comments) [ "comments"."id" NOT NULL HASHCOL as "c"."id" ] COUNT -| | | | | | | | | | | | | ) [ "f"."id" = "c"."id" NOT NULL HASHCOL ], -| | | | | | | | | | | | | table(sys.schemas) [ "schemas"."id" as "s"."id" ] COUNT -| | | | | | | | | | | | ) [
MonetDB: oscar - Merged with Jun2020
Changeset: 772de296974d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=772de296974d Modified Files: sql/common/sql_list.c sql/include/sql_list.h sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_rewriter.c sql/server/rel_rewriter.h sql/server/rel_unnest.c sql/test/miscellaneous/Tests/groupby_error.stable.out sql/test/miscellaneous/Tests/simple_plans.stable.out sql/test/miscellaneous/Tests/simple_plans.stable.out.single testing/Mtest.py.bat testing/Mtest.py.in Branch: oscar Log Message: Merged with Jun2020 diffs (72 lines): 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 @@ -1652,7 +1652,6 @@ rel_push_count_down(visitor *v, sql_rel return rel; } - static sql_rel * rel_simplify_project_fk_join(mvc *sql, sql_rel *r, list *pexps, int *changes) { @@ -3686,7 +3685,6 @@ merge_notequal(mvc *sql, list *exps, int return nexps; } - static sql_rel * rel_select_cse(visitor *v, sql_rel *rel) { diff --git a/testing/Mtest.py.bat b/testing/Mtest.py.bat --- a/testing/Mtest.py.bat +++ b/testing/Mtest.py.bat @@ -4,4 +4,4 @@ @REM @REM Copyright 1997 - July 2008 CWI, August 2008 - 2020 MonetDB B.V. -@python3 "%~dpn0" %* +@python "%~dpn0" %* diff --git a/testing/Mtest.py.in b/testing/Mtest.py.in --- a/testing/Mtest.py.in +++ b/testing/Mtest.py.in @@ -104,22 +104,37 @@ if isatty: left, top, right, bottom, maxx, maxy) = struct.unpack("Hhh", csbi.raw) return wattr reset = get_csbi_attributes(handle) -def prred(str, write = sys.stdout.write, scta = ctypes.windll.kernel32.SetConsoleTextAttribute): +def prred(str, + write=sys.stdout.write, + flush=sys.stdout.flush, + scta=ctypes.windll.kernel32.SetConsoleTextAttribute): try: +flush() scta(handle, 0x4) write(str) +flush() finally: scta(handle, reset) -def prgreen(str, write = sys.stdout.write, scta = ctypes.windll.kernel32.SetConsoleTextAttribute): +def prgreen(str, +write=sys.stdout.write, +flush=sys.stdout.flush, + scta=ctypes.windll.kernel32.SetConsoleTextAttribute): try: +flush() scta(handle, 0x2) write(str) +flush() finally: scta(handle, reset) -def prpurple(str, write = sys.stdout.write, scta = ctypes.windll.kernel32.SetConsoleTextAttribute): +def prpurple(str, + write=sys.stdout.write, + flush=sys.stdout.flush, + scta=ctypes.windll.kernel32.SetConsoleTextAttribute): try: +flush() scta(handle, 0x5) write(str) +flush() finally: scta(handle, reset) ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: oscar - Merged with Jun2020
Changeset: 075a94ddd322 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=075a94ddd322 Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_scenario.c sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_select.c sql/server/rel_unnest.c sql/server/rel_updates.c sql/server/sql_atom.c sql/storage/bat/bat_storage.c sql/storage/store.c sql/test/BugTracker-2016/Tests/storagemodel.stable.out sql/test/SQLancer/Tests/sqlancer03.stable.out sql/test/subquery/Tests/subquery6.stable.out Branch: oscar Log Message: Merged with Jun2020 diffs (truncated from 884 to 300 lines): 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 @@ -3807,13 +3807,13 @@ insert_check_ukey(backend *be, list *ins stmt *sel = NULL; /* remove any nils as in stmt_order NULL = NULL, instead of NULL != NULL */ - if ((k->type == ukey) && stmt_has_null(col)) { - + if (k->type == ukey) { for (m = k->columns->h; m; m = m->next) { sql_kc *c = m->data; stmt *cs = list_fetch(inserts, c->c->colnr); - sel = stmt_selectnonil(be, cs, sel); + if (stmt_has_null(cs)) + sel = stmt_selectnonil(be, cs, sel); } } /* implementation uses sort key check */ diff --git a/sql/backends/monet5/sql_scenario.c b/sql/backends/monet5/sql_scenario.c --- a/sql/backends/monet5/sql_scenario.c +++ b/sql/backends/monet5/sql_scenario.c @@ -1233,10 +1233,12 @@ SQLparser(Client c) msg = SQLoptimizeQuery(c, c->curprg->def); if (msg != MAL_SUCCEED) { + str other = c->curprg->def->errors; c->curprg->def->errors = 0; MSresetInstructions(c->curprg->def, oldstop); freeVariables(c, c->curprg->def, NULL, oldvtop); - sqlcleanup(m, err); + if (other != msg) + freeException(other); goto finalize; } } 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 @@ -1810,7 +1810,7 @@ rel_read(mvc *sql, char *r, int *pos, li if (!(exps = read_exps(sql, NULL, NULL, NULL, r, pos, '[', 0))) return NULL; rel = rel_setop(sql->sa, lrel, rrel, j); - rel->exps = exps; + rel_setop_set_exps(sql, rel, exps); if (rel_set_types(sql, rel) < 0) return sql_error(sql, -1, SQLSTATE(42000) "Setop: number of expressions don't match\n"); set_processed(rel); 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 @@ -687,16 +687,16 @@ exp_alias_or_copy( mvc *sql, const char tname = exp_relname(old); if (!cname && exp_name(old) && has_label(old)) { - ne = exp_column(sql->sa, exp_relname(old), exp_name(old), exp_subtype(old), orel?orel->card:CARD_ATOM, has_nil(old), is_intern(old)); + ne = exp_column(sql->sa, exp_relname(old), exp_name(old), exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM, has_nil(old), is_intern(old)); return exp_propagate(sql->sa, ne, old); } else if (!cname) { exp_label(sql->sa, old, ++sql->label); - ne = exp_column(sql->sa, exp_relname(old), exp_name(old), exp_subtype(old), orel?orel->card:CARD_ATOM, has_nil(old), is_intern(old)); + ne = exp_column(sql->sa, exp_relname(old), exp_name(old), exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM, has_nil(old), is_intern(old)); return exp_propagate(sql->sa, ne, old); } else if (cname && !old->alias.name) { exp_setname(sql->sa, old, tname, cname); } - ne = exp_column(sql->sa, tname, cname, exp_subtype(old), orel?orel->card:CARD_ATOM, has_nil(old), is_intern(old)); + ne = exp_column(sql->sa, tname, cname, exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM,
MonetDB: oscar - Merged with Jun2020
Changeset: 5b8c17917c35 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5b8c17917c35 Added Files: sql/test/BugDay_2005-10-06_2.9.3/Tests/parser_crashes_server.SF-921996.stable.err.Darwin Modified Files: sql/server/rel_optimizer.c sql/server/rel_select.c sql/test/SQLancer/Tests/sqlancer03.sql sql/test/SQLancer/Tests/sqlancer03.stable.out Branch: oscar Log Message: Merged with Jun2020 diffs (188 lines): 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 @@ -1389,8 +1389,11 @@ exp_needs_push_down(sql_exp *e) case e_convert: return exp_needs_push_down(e->l); case e_aggr: - case e_func: + case e_func: { + if (!e->l || exps_are_atoms(e->l)) + return 0; return 1; + } break; case e_column: case e_atom: default: @@ -1458,6 +1461,8 @@ exp_push_single_func_down(visitor *v, sq if (exp_unsafe(e, 0)) return e; + if (!e->l || exps_are_atoms(e->l)) + return e; if ((is_joinop(rel->op) && ((can_push_func(e, l, ) && mustl) || (can_push_func(e, r, ) && mustr))) || (is_select(rel->op) && can_push_func(e, l, ) && must)) { exp_label(v->sql->sa, e, ++v->sql->label); @@ -7672,7 +7677,7 @@ rel_simplify_predicates(visitor *v, sql_ } } else if (is_atom(l->type) && is_atom(r->type) && !is_semantics(e)) { if (exp_is_null(v->sql, l) || exp_is_null(v->sql, r)) { - e = exp_null(v->sql->sa, exp_subtype(l)); + e = exp_null(v->sql->sa, sql_bind_localtype("bit")); v->changes++; } else if (l->l && r->l) { int res = atom_cmp(l->l, r->l); diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -2765,14 +2765,6 @@ rel_op(sql_query *query, sql_rel **rel, return sql_error(sql, 02, SQLSTATE(3F000) "SELECT: no such schema '%s'", sname); sf = find_func(sql, s, fname, 0, F_AGGR, NULL); - if (!sf && *rel && (*rel)->card == CARD_AGGR) { - if (is_sql_having(f) || is_sql_orderby(f)) - return NULL; - /* reset error */ - sql->session->status = 0; - sql->errstr[0] = '\0'; - return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no such aggregate '%s'", fname); - } if (sf) return _rel_aggr(query, rel, 0, s, fname, NULL, f); return rel_op_(sql, s, fname, ek); diff --git a/sql/test/BugDay_2005-10-06_2.9.3/Tests/parser_crashes_server.SF-921996.stable.err.Darwin b/sql/test/BugDay_2005-10-06_2.9.3/Tests/parser_crashes_server.SF-921996.stable.err.Darwin new file mode 100644 --- /dev/null +++ b/sql/test/BugDay_2005-10-06_2.9.3/Tests/parser_crashes_server.SF-921996.stable.err.Darwin @@ -0,0 +1,24 @@ +stderr of test 'parser_crashes_server.SF-921996` in directory 'sql/test/BugDay_2005-10-06_2.9.3` itself: + + +# 14:52:27 > +# 14:52:27 > Mtimeout -timeout 180 Mserver "--config=/home/manegold/Monet/Testing/Current/.GNU.32.32.d.--enable-debug.PREFIX./etc/MonetDB.conf" --debug=10 --set "monet_mod_path=/home/manegold/Monet/Testing/Current/.GNU.32.32.d.--enable-debug.PREFIX./lib/MonetDB:/home/manegold/Monet/Testing/Current/.GNU.32.32.d.--enable-debug.PREFIX./lib/bin" --set "gdk_dbfarm=/home/manegold/Monet/Testing/Current/.GNU.32.32.d.--enable-debug.PREFIX./var/MonetDB/dbfarm" --set "sql_logdir=/home/manegold/Monet/Testing/Current/.GNU.32.32.d.--enable-debug.PREFIX./var/MonetDB/log" --set mapi_port=38897 --set sql_port=49478 --set xquery_port=59231 --set monet_prompt= --trace "--dbname=mTests_src_test_BugDay_2005-10-06_2.9.3" --dbinit="module(sql_server); sql_server_start();" ; echo ; echo Over.. +# 14:52:27 > + + +# 14:52:27 > +# 14:52:27 > Mtimeout -timeout 60 MapiClient -lsql -u monetdb -P monetdb --host=localhost --port=49478 < parser_crashes_server.SF-921996.sql +# 14:52:27 > + +MAPI = (monetdb) /var/tmp/mtest-23209/.s.monetdb.33225 +QUERY = CREATE TABLE bounds_test ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +ERROR = !syntax error: 42000!end of input stream in "create table bounds_test ( +!id int not null auto_increment primary key, +!" +CODE = 42000 + +# 14:52:27 > +# 14:52:27 > Done. +# 14:52:27 > + diff --git a/sql/test/SQLancer/Tests/sqlancer03.sql b/sql/test/SQLancer/Tests/sqlancer03.sql --- a/sql/test/SQLancer/Tests/sqlancer03.sql +++ b/sql/test/SQLancer/Tests/sqlancer03.sql @@ -142,3
MonetDB: oscar - Merged with Jun2020
Changeset: 1a6a69063cab for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1a6a69063cab Modified Files: gdk/gdk_bbp.c sql/server/sql_atom.c testing/mktest.py testing/sqllogictest.py Branch: oscar Log Message: Merged with Jun2020 diffs (truncated from 338 to 300 lines): diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -504,6 +504,12 @@ fixdateheap(BAT *b, const char *anme) bnme = nme; sprintf(filename, "BACKUP%c%s", DIR_SEP, bnme); + /* we don't maintain index structures */ + HASHdestroy(b); + IMPSdestroy(b); + OIDXdestroy(b); + PROPdestroy(b); + /* make backup of heap */ if (GDKmove(b->theap.farmid, srcdir, bnme, "tail", BAKDIR, bnme, "tail") != GDK_SUCCEED) { GDKfree(srcdir); @@ -661,18 +667,11 @@ fixdatebats(void) } fclose(fp); } - /* The date type is not known in GDK when reading the BBP */ - if (b->ttype < 0) { - const char *anme; - - /* as yet unknown tail column type */ - anme = ATOMunknown_name(b->ttype); - /* known string types */ - if ((strcmp(anme, "date") == 0 || -strcmp(anme, "timestamp") == 0 || -strcmp(anme, "daytime") == 0) && - fixdateheap(b, anme) != GDK_SUCCEED) - return GDK_FAIL; + if ((b->ttype == TYPE_date || +b->ttype == TYPE_timestamp || +b->ttype == TYPE_daytime) && + fixdateheap(b, ATOMname(b->ttype)) != GDK_SUCCEED) { + return GDK_FAIL; } } return GDK_SUCCEED; diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c --- a/sql/server/sql_atom.c +++ b/sql/server/sql_atom.c @@ -1337,67 +1337,7 @@ atom_is_zero(atom *a) { if (a->isnull) return 0; - switch (a->tpe.type->localtype) { - case TYPE_bte: - return a->data.val.btval == 0; - case TYPE_sht: - return a->data.val.shval == 0; - case TYPE_int: - return a->data.val.ival == 0; - case TYPE_lng: - return a->data.val.lval == 0; -#ifdef HAVE_HGE - case TYPE_hge: - return a->data.val.hval == 0; -#endif - case TYPE_flt: - return a->data.val.fval == 0; - case TYPE_dbl: - return a->data.val.dval == 0; - default: - break; - } - return 0; -} - -int -atom_is_true(atom *a) -{ - if (a->isnull) - return 0; - switch (a->tpe.type->localtype) { - case TYPE_bit: - return a->data.val.btval != 0; - case TYPE_bte: - return a->data.val.btval != 0; - case TYPE_sht: - return a->data.val.shval != 0; - case TYPE_int: - return a->data.val.ival != 0; - case TYPE_lng: - return a->data.val.lval != 0; -#ifdef HAVE_HGE - case TYPE_hge: - return a->data.val.hval != 0; -#endif - case TYPE_flt: - return a->data.val.fval != 0; - case TYPE_dbl: - return a->data.val.dval != 0; - default: - break; - } - return 0; -} - -int -atom_is_false( atom *a ) -{ - if (a->isnull) - return 0; - switch(a->tpe.type->localtype) { - case TYPE_bit: - return a->data.val.btval == 0; + switch (ATOMstorage(a->tpe.type->localtype)) { case TYPE_bte: return a->data.val.btval == 0; case TYPE_sht: @@ -1415,9 +1355,66 @@ atom_is_false( atom *a ) case TYPE_dbl: return a->data.val.dval == 0; default: - break; + return 0; } - return 0; +} + +int +atom_is_true(atom *a) +{ + if (a->isnull) + return 0; + switch (ATOMstorage(a->tpe.type->localtype)) { + case TYPE_bte: + return a->data.val.btval != 0; + case TYPE_sht: + return a->data.val.shval != 0; + case TYPE_int: + return a->data.val.ival != 0; + case TYPE_lng: + return a->data.val.lval != 0; +#ifdef HAVE_HGE + case TYPE_hge: + return a->data.val.hval != 0; +#endif + case TYPE_flt: + return a->data.val.fval != 0; + case TYPE_dbl: + return a->data.val.dval != 0; + case TYPE_str: + return strcmp(a->data.val.sval, "") != 0; + default: + return 0; + } +} + +int +atom_is_false(atom *a) +{ + if (a->isnull) + return 0; + switch
MonetDB: oscar - Merged with Jun2020
Changeset: ea657c85c07d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ea657c85c07d Modified Files: sql/server/rel_select.c sql/test/SQLancer/Tests/sqlancer03.sql sql/test/SQLancer/Tests/sqlancer03.stable.out Branch: oscar Log Message: Merged with Jun2020 diffs (88 lines): diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -2102,9 +2102,17 @@ negate_symbol_tree(mvc *sql, symbol *sc) case SQL_IS_NOT_NULL: sc->token = SQL_IS_NULL; break; - case SQL_NOT: /* nested NOTs eliminate each other */ - memmove(sc, sc->data.sym, sizeof(symbol)); - break; + case SQL_NOT: { /* nested NOTs eliminate each other */ + if (sc->data.sym->token == SQL_ATOM) { + AtomNode *an = (AtomNode*) sc->data.sym; + memmove(sc, an, sizeof(AtomNode)); + } else if (sc->data.sym->token == SQL_SELECT) { + SelectNode *sn = (SelectNode*) sc->data.sym; + memmove(sc, sn, sizeof(SelectNode)); + } else { + memmove(sc, sc->data.sym, sizeof(symbol)); + } + } break; case SQL_COMPARE: { dnode *cmp_n = sc->data.lval->h; comp_type neg_cmp_type = negate_compare(compare_str2type(cmp_n->next->data.sval)); /* negate the comparator */ @@ -2117,8 +2125,7 @@ negate_symbol_tree(mvc *sql, symbol *sc) negate_symbol_tree(sql, sc->data.lval->h->data.sym); negate_symbol_tree(sql, sc->data.lval->h->next->data.sym); sc->token = sc->token == SQL_AND ? SQL_OR : SQL_AND; - break; - } + } break; default: break; } diff --git a/sql/test/SQLancer/Tests/sqlancer03.sql b/sql/test/SQLancer/Tests/sqlancer03.sql --- a/sql/test/SQLancer/Tests/sqlancer03.sql +++ b/sql/test/SQLancer/Tests/sqlancer03.sql @@ -125,3 +125,20 @@ NULL NULL22 false true23 DROP TABLE t0; + +START TRANSACTION; +CREATE TABLE "sys"."t0" ( + "c0" DECIMAL(18,3) NOT NULL DEFAULT cast(cast("sys"."sql_sub"("sys"."sql_neg"(1933820187),"sys"."charindex"(cast(0.235784 as clob(182)),"sys"."concat"('rt\\b',1174691962),"sys"."locate"('!oLqvKg恺','!G+tZ9\'A\'LZ*滻mW^',1174691962))) as int) as decimal(18,3)), + "c1" DECIMAL(18,3), + "c2" CHARACTER LARGE OBJECT, + CONSTRAINT "t0_c0_pkey" PRIMARY KEY ("c0"), + CONSTRAINT "t0_c0_unique" UNIQUE ("c0"), + CONSTRAINT "t0_c2_unique" UNIQUE ("c2"), + CONSTRAINT "t0_c0_c2_c1_unique" UNIQUE ("c0", "c2", "c1") +); +COMMENT ON COLUMN "sys"."t0"."c2" IS 'vi'; +COPY 1 RECORDS INTO "sys"."t0" FROM stdin USING DELIMITERS E'\t',E'\n','"'; +-1933820187.000NULL"-1554387152" + +select t0.c0 from t0 where not (true) union all select all t0.c0 from t0 where not (not (true)) union all select t0.c0 from t0 where (not (true)) is null; +ROLLBACK; diff --git a/sql/test/SQLancer/Tests/sqlancer03.stable.out b/sql/test/SQLancer/Tests/sqlancer03.stable.out --- a/sql/test/SQLancer/Tests/sqlancer03.stable.out +++ b/sql/test/SQLancer/Tests/sqlancer03.stable.out @@ -211,6 +211,26 @@ stdout of test 'sqlancer03` in directory #false true23 [ 14 ] #DROP TABLE t0; +#START TRANSACTION; +#CREATE TABLE "sys"."t0" ( +# "c0" DECIMAL(18,3) NOT NULL DEFAULT cast(cast("sys"."sql_sub"("sys"."sql_neg"(1933820187),"sys"."charindex"(cast(0.235784 as clob(182)),"sys"."concat"('rt\\b',1174691962),"sys"."locate"('!oLqvKg恺','!G+tZ9\'A\'LZ*滻mW^',1174691962))) as int) as decimal(18,3)), +# "c1" DECIMAL(18,3), +# "c2" CHARACTER LARGE OBJECT, +# CONSTRAINT "t0_c0_pkey" PRIMARY KEY ("c0"), +# CONSTRAINT "t0_c0_unique" UNIQUE ("c0"), +# CONSTRAINT "t0_c2_unique" UNIQUE ("c2"), +# CONSTRAINT "t0_c0_c2_c1_unique" UNIQUE ("c0", "c2", "c1") +#COMMENT ON COLUMN "sys"."t0"."c2" IS 'vi'; +#COPY 1 RECORDS INTO "sys"."t0" FROM stdin USING DELIMITERS E'\t',E'\n','"'; +#-1933820187.000 NULL"-1554387152" +[ 1] +#select t0.c0 from t0 where not (true) union all select all t0.c0 from t0 where not (not (true)) union all select t0.c0 from t0 where (not (true)) is null; +% .%12 # table_name +% c0 # name +% decimal # type +% 20 # length +[ -1933820187.000 ] +#ROLLBACK; # 17:14:16 > # 17:14:16 > "Done." ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: oscar - Merged with Jun2020
Changeset: 67f12d1935be for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=67f12d1935be Modified Files: monetdb5/optimizer/opt_mergetable.c sql/backends/monet5/sql_scenario.c sql/include/sql_catalog.h sql/server/rel_optimizer.c testing/mktest.py testing/sqllogictest.py Branch: oscar Log Message: Merged with Jun2020 diffs (truncated from 409 to 300 lines): diff --git a/monetdb5/optimizer/opt_mergetable.c b/monetdb5/optimizer/opt_mergetable.c --- a/monetdb5/optimizer/opt_mergetable.c +++ b/monetdb5/optimizer/opt_mergetable.c @@ -1985,7 +1985,7 @@ OPTmergetableImplementation(Client cntxt int input = getArg(p, p->retc); /* argument one is first input */ if (group_input[input]) { - TRC_WARNING(MAL_OPTIMIZER, "Mergetable bailout on group input reuse in group statement\n"); + TRC_INFO(MAL_OPTIMIZER, "Mergetable bailout on group input reuse in group statement\n"); bailout = 1; } diff --git a/sql/backends/monet5/sql_scenario.c b/sql/backends/monet5/sql_scenario.c --- a/sql/backends/monet5/sql_scenario.c +++ b/sql/backends/monet5/sql_scenario.c @@ -1233,6 +1233,9 @@ SQLparser(Client c) msg = SQLoptimizeQuery(c, c->curprg->def); if (msg != MAL_SUCCEED) { + c->curprg->def->errors = 0; + MSresetInstructions(c->curprg->def, oldstop); + freeVariables(c, c->curprg->def, NULL, oldvtop); sqlcleanup(m, err); goto finalize; } 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 @@ -305,9 +305,9 @@ typedef enum sql_class { #define EC_COMPUTE(e) (e==EC_NUM||e==EC_FLT) #define EC_BOOLEAN(e) (e==EC_BIT||e==EC_NUM||e==EC_FLT) #define EC_TEMP_TZ(e) (e==EC_TIME_TZ||e==EC_TIMESTAMP_TZ) -#define EC_TEMP(e) (e==EC_TIME||e==EC_DATE||e==EC_TIMESTAMP||EC_TEMP_TZ(e)) +#define EC_TEMP(e) (e==EC_TIME||e==EC_DATE||e==EC_TIMESTAMP||EC_TEMP_TZ(e)) #define EC_TEMP_FRAC(e) (e==EC_TIME||e==EC_TIMESTAMP||EC_TEMP_TZ(e)) -#define EC_FIXED(e) (e==EC_BIT||e==EC_CHAR||e==EC_POS||e==EC_NUM||EC_INTERVAL(e)||e==EC_DEC||EC_TEMP(e)) +#define EC_BACKEND_FIXED(e)(EC_NUMBER(e)||e==EC_BIT||EC_TEMP(e)) typedef struct sql_type { sql_base base; 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 @@ -4648,6 +4648,42 @@ rel_push_select_down_join(visitor *v, sq return rel; } +static bool +find_simple_projection_for_join2semi(sql_rel *rel) +{ + if (is_project(rel->op) && list_length(rel->exps) == 1) { + sql_exp *e = rel->exps->h->data; + + if (rel->card < CARD_AGGR) /* const or groupby without group by exps */ + return true; + /* a single group by column in the projection list from a group by relation is guaranteed to be unique, but not an aggregate */ + if (e->type == e_column) { + sql_rel *res = NULL; + sql_exp *found = NULL; + + if (is_groupby(rel->op) || need_distinct(rel) || find_prop(e->p, PROP_HASHCOL)) + return true; + + found = rel_find_exp_and_corresponding_rel(rel->l, e, ); /* grouping column on inner relation */ + if (found) { + if (find_prop(found->p, PROP_HASHCOL)) /* primary key always unique */ + return true; + if (found->type == e_column && found->card <= CARD_AGGR) { + if (!(is_groupby(res->op) || need_distinct(res)) && list_length(res->exps) != 1) + return false; + for (node *n = res->exps->h ; n ; n = n->next) { /* must be the single column in the group by expression list */ + sql_exp *e = n->data; + if (e != found && e->type == e_column) + return false; + } + return true; + } + } + } + } + return false; +} + /* * Push {semi}joins down, pushes the joins through group by expressions. * When the join is
MonetDB: oscar - Merged with Jun2020
Changeset: 2f417e9487c5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2f417e9487c5 Modified Files: gdk/gdk_analytic_bounds.c sql/backends/monet5/sql_cast.c sql/backends/monet5/sql_optimizer.c sql/backends/monet5/sql_time.c sql/server/rel_optimizer.c sql/server/rel_rewriter.c sql/server/rel_rewriter.h sql/server/rel_unnest.c sql/storage/bat/bat_storage.c sql/storage/bat/bat_storage.h sql/storage/store.c sql/test/BugTracker-2013/Tests/timestamp.Bug-3401.stable.err sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.err sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.err.int128 sql/test/BugTracker/Tests/inserting_invalid_timestamp.SF-1363557.stable.err sql/test/miscellaneous/Tests/select_groupby.stable.err sql/test/pg_regress/Tests/date.stable.err sql/test/pg_regress/Tests/time.stable.err sql/test/pg_regress/Tests/timestamp.stable.err sql/test/pg_regress/Tests/timestamptz.stable.err sql/test/pg_regress/Tests/timetz.stable.err sql/test/sys-schema/Tests/systemfunctions.stable.out sql/test/sys-schema/Tests/systemfunctions.stable.out.int128 sql/test/wlcr/Tests/wlr110.stable.err Branch: oscar Log Message: Merged with Jun2020 diffs (truncated from 1861 to 300 lines): diff --git a/gdk/gdk_analytic_bounds.c b/gdk/gdk_analytic_bounds.c --- a/gdk/gdk_analytic_bounds.c +++ b/gdk/gdk_analytic_bounds.c @@ -548,10 +548,7 @@ #define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_GROUPS(IMP, LIMIT, TPE) \ do {\ - switch (tp1) { \ - case TYPE_bit: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(bit, ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS##IMP, LIMIT, TPE); \ - break; \ + switch (ATOMbasetype(tp1)) {\ case TYPE_bte: \ ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(bte, ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS##IMP, LIMIT, TPE); \ break; \ diff --git a/sql/backends/monet5/sql_optimizer.c b/sql/backends/monet5/sql_optimizer.c --- a/sql/backends/monet5/sql_optimizer.c +++ b/sql/backends/monet5/sql_optimizer.c @@ -30,7 +30,6 @@ SQLgetColumnSize(sql_trans *tr, sql_colu { lng size = 0; BAT *b; - store_lock(); switch(access){ case 0: b= store_funcs.bind_col(tr, c, RDONLY); @@ -58,7 +57,6 @@ SQLgetColumnSize(sql_trans *tr, sql_colu BBPunfix(b->batCacheid); } } - store_unlock(); return size; } diff --git a/sql/backends/monet5/sql_time.c b/sql/backends/monet5/sql_time.c --- a/sql/backends/monet5/sql_time.c +++ b/sql/backends/monet5/sql_time.c @@ -222,13 +222,12 @@ lng shift, lng divider, lng multiplier ) { ssize_t pos = 0; - daytime *conv = NULL; + daytime dt = 0, *conv = pos = fromstr_func(next, &(size_t){sizeof(daytime)}, , false); if (pos < (ssize_t) strlen(next) || /* includes pos < 0 */ ATOMcmp(TYPE_daytime, conv, ATOMnilptr(TYPE_daytime)) == 0) - return createException(SQL, "batcalc.str_2time_daytimetz", SQLSTATE(22007) "Daytime (%s) has incorrect format", next); - else - *ret = daytime_2time_daytime_imp(*conv, shift, divider, multiplier); + return createException(SQL, "batcalc.str_2time_daytimetz", SQLSTATE(22007) "Daytime '%s' has incorrect format", next); + *ret = daytime_2time_daytime_imp(*conv, shift, divider, multiplier); return MAL_SUCCEED; } @@ -608,13 +607,12 @@ lng shift, lng divider, lng multiplier ) { ssize_t pos = 0; - timestamp *conv = NULL; + timestamp tp = 0, *conv = pos = fromstr_func(next, &(size_t){sizeof(timestamp)}, , false); if (!pos || pos < (ssize_t) strlen(next) || ATOMcmp(TYPE_timestamp, conv, ATOMnilptr(TYPE_timestamp)) == 0) - return createException(SQL, "batcalc.str_2time_timestamptz_internal", SQLSTATE(22007) "Timestamp (%s) has incorrect format", next); - else - *ret = timestamp_2time_timestamp_imp(*conv, shift, divider, multiplier); + return createException(SQL, "batcalc.str_2time_timestamptz_internal", SQLSTATE(22007) "Timestamp '%s' has incorrect format", next); + *ret = timestamp_2time_timestamp_imp(*conv, shift, divider, multiplier); return MAL_SUCCEED; } @@ -1257,21 +1255,19 @@ nil_2_date(Client cntxt, MalBlkPtr mb, M } static inline str -str_2_date_internal_imp(date *res, str next, bit ce, bit *hasnil)
MonetDB: oscar - Merged with Jun2020
Changeset: 3230620bae43 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3230620bae43 Modified Files: sql/server/rel_optimizer.c sql/test/SQLancer/Tests/sqlancer03.sql sql/test/SQLancer/Tests/sqlancer03.stable.out sql/test/mergetables/Tests/sqlsmith-exists2.sql sql/test/mergetables/Tests/sqlsmith-exists2.stable.out sql/test/miscellaneous/Tests/simple_plans.stable.out sql/test/miscellaneous/Tests/simple_plans.stable.out.single sql/test/xquery/Tests/q01.stable.out Branch: oscar Log Message: Merged with Jun2020 diffs (truncated from 353 to 300 lines): 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 @@ -1449,6 +1449,9 @@ exp_push_single_func_down(visitor *v, sq } } break; case e_convert: + if ((e->l = exp_push_single_func_down(v, rel, l, r, e->l)) == NULL) + return NULL; + break; case e_aggr: case e_func: { int must = 0, mustl = 0, mustr = 0; @@ -3753,6 +3756,7 @@ rel_project_cse(visitor *v, sql_rel *rel sql_exp *ne = exp_alias(v->sql->sa, exp_relname(e1), exp_name(e1), exp_relname(e2), exp_name(e2), exp_subtype(e2), e2->card, has_nil(e2), is_intern(e1)); ne = exp_propagate(v->sql->sa, ne, e1); + exp_setname(v->sql->sa, ne, exp_relname(e1), exp_name(e1)); e1 = ne; break; } diff --git a/sql/test/SQLancer/Tests/sqlancer03.sql b/sql/test/SQLancer/Tests/sqlancer03.sql --- a/sql/test/SQLancer/Tests/sqlancer03.sql +++ b/sql/test/SQLancer/Tests/sqlancer03.sql @@ -66,20 +66,20 @@ select "insert"('屁{珙', 1, 1, '1'), "insert"('屁{珙', 1, 1, '抔'), "insert"('屁抔珙', 1, 1, 'ಜ'), "insert"('a', 0, 1, 'ಜ'), "insert"('a', 0, 0, 'ಜ'); select "insert"('屁{珙', 1, 1, '1'), "insert"('屁{珙', 1, 1, '抔'), "insert"('屁抔珙', 1, 1, 'ಜ') from t0; ROLLBACK; -CREATE TABLE t0(c0 boolean, c1 boolean, c2 serial, UNIQUE(c0, c1)); -- Bug 6920 -INSERT INTO t0(c1) VALUES((0.5968066098520423) NOT BETWEEN SYMMETRIC (CAST(length(upper(r'z')) AS INT)) AND (1347145665)), (FALSE); +CREATE TABLE t0(c0 boolean, c1 boolean, c2 int, UNIQUE(c0, c1)); -- Bug 6920 +INSERT INTO t0(c1) VALUES((0.5) NOT BETWEEN SYMMETRIC (CAST(length(upper(r'z')) AS INT)) AND (2)), (FALSE); INSERT INTO t0(c0) VALUES(TRUE); INSERT INTO t0(c1) VALUES(FALSE), (TRUE); -INSERT INTO t0(c2, c0, c1) VALUES(1347145665, (ltrim(lower(r'K'), ((upper(r'296348087'))||(- (1582370739) IS NOT NULL, (((lower(r'ö -eg#K,纗HSJw!{cOw⇒l/l!B*H'))||(((CAST(0.12411368110083143 AS INT))+(-1795901173) IN (lower(CAST(TRUE AS STRING, (-1795901173, NULL, (0.9575114678279173) NOT IN (2.96348087E8, 0.501053365665)), (1922411524, TRUE, (0.5020325273627405) NOT IN (-1388966352, 1163825182)); +INSERT INTO t0(c2, c0, c1) VALUES(2, (ltrim(lower(r'K'), ((upper(r'4'))||(- (7) IS NOT NULL, (((lower(r'ö +eg#K,纗HSJw!{cOw⇒l/l!B*H'))||(((CAST(0.1 AS INT))+(-5) IN (lower(CAST(TRUE AS STRING, (-9, NULL, (0.3) NOT IN (2.96348087E8, 0.3)), (4, TRUE, (0.5) NOT IN (-3, 4)); INSERT INTO t0(c1) VALUES(TRUE); INSERT INTO t0(c1, c2) VALUES(FALSE, 623585248); -INSERT INTO t0(c0) VALUES(NOT (NOT -1388966352)*(-984145454))) NOT IN (0.7356286, (FALSE); +INSERT INTO t0(c0) VALUES(NOT (NOT -1)*(-9))) NOT IN (0.7, (FALSE); INSERT INTO t0(c0) VALUES(TRUE); -INSERT INTO t0(c2) VALUES(-1235619315); +INSERT INTO t0(c2) VALUES(-1); DELETE FROM t0 WHERE (t0.c0) = FALSE; -INSERT INTO t0(c1, c0, c2) VALUES(TRUE, ((+ (- (1580722914)))>(charindex(CAST(0.347536126443453330381316845887340605258941650390625 AS STRING), ((CAST(TRUE AS STRING(771)))||(0.2182260714120349831546263885684311389923095703125)), length(r'd', -1819817735); -UPDATE t0 SET c2 = DEFAULT WHERE t0.c1)OR(CAST(t0.c2 AS BOOLEANOR((CAST(0.6873694879073857 AS DECIMAL)) NOT IN (0.10021624439224552371996423971722833812236785888671875))); +INSERT INTO t0(c1, c0, c2) VALUES(TRUE, ((+ (- (1)))>(charindex(CAST(0.3 AS STRING), ((CAST(TRUE AS STRING(771)))||(0.2)), length(r'd', -1); +UPDATE t0 SET c2 = 1 WHERE t0.c1)OR(CAST(t0.c2 AS BOOLEANOR((CAST(0.6 AS DECIMAL)) NOT IN (0.1))); SELECT t0.c0 FROM t0 WHERE ((CAST(t0.c2 AS INT)) NOT BETWEEN ASYMMETRIC (abs(t0.c2)) AND (((t0.c2)/(t0.c2 NOT BETWEEN ASYMMETRIC (t0.c0) AND ((t0.c2) NOT IN (t0.c2)); SELECT t0.c0 FROM t0 WHERE (t0.c2) BETWEEN (t0.c0) AND ((t0.c2) NOT IN (t0.c2)); DROP TABLE t0; diff --git a/sql/test/SQLancer/Tests/sqlancer03.stable.out b/sql/test/SQLancer/Tests/sqlancer03.stable.out --- a/sql/test/SQLancer/Tests/sqlancer03.stable.out +++