Changeset: 3475699a15e7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3475699a15e7 Modified Files: sql/server/rel_exp.c sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_select.c sql/server/rel_unnest.c sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out sql/test/SQLite_regress/sqllogictest/Tests/All sql/test/Tests/keys.stable.out Branch: Oct2020 Log Message:
Fix has nil flag propagation on some cases and small cleanup diffs (167 lines): 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 @@ -396,7 +396,7 @@ exp_aggr( sql_allocator *sa, list *l, sq set_distinct(e); if (no_nils) set_no_nil(e); - if (!has_nils) + if ((!a->func->semantics && !has_nils) || (!a->func->s && strcmp(a->func->base.name, "count") == 0)) set_has_no_nil(e); return e; } @@ -416,7 +416,6 @@ exp_atom(sql_allocator *sa, atom *a) sql_exp * exp_atom_max(sql_allocator *sa, sql_subtype *tpe) { - if (tpe->type->localtype == TYPE_bte) { return exp_atom_bte(sa, GDK_bte_max); } else if (tpe->type->localtype == TYPE_sht) { 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 @@ -5672,7 +5672,7 @@ sql_class_base_score(mvc *sql, sql_colum case TYPE_dbl: return 75 - 53; default: { - if (equality_based && c && (de = sql_trans_is_duplicate_eliminated(sql->session->tr, c))) + if (equality_based && c && (de = mvc_is_duplicate_eliminated(sql, c))) return 150 - de * 8; /* strings and blobs not duplicate eliminated don't get any points here */ return 0; @@ -8756,7 +8756,7 @@ rel_add_dicts(visitor *v, sql_rel *rel) if (!is_func(e->type) && oname[0] != '%') { sql_column *c = find_sql_column(t, oname); - if ((de = sql_trans_is_duplicate_eliminated(v->sql->session->tr, c)) != 0) { + if ((de = mvc_is_duplicate_eliminated(v->sql, c)) != 0) { int nr = ++v->sql->label; char name[16], *nme; sql_rel *vt = rel_dicttable(v->sql, c, rname, de); diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c --- a/sql/server/rel_rel.c +++ b/sql/server/rel_rel.c @@ -533,7 +533,14 @@ rel_setop_set_exps(mvc *sql, sql_rel *re for (node *n = exps->h, *m = lexps->h, *o = rexps->h ; m && m && o ; n = n->next, m = m->next,o = o->next) { sql_exp *e = n->data, *f = m->data, *g = o->data; - e->card = is_union(rel->op) ? MAX(f->card, g->card) : f->card; + if (is_union(rel->op)) { /* propagate set_has_no_nil only if it's applicable to both sides of the union*/ + if (has_nil(f) || has_nil(g)) + set_has_nil(e); + else + set_has_no_nil(e); + e->card = MAX(f->card, g->card); + } else + e->card = f->card; } rel->nrcols = l->nrcols; rel->exps = exps; 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 @@ -3651,7 +3651,8 @@ static sql_exp * } } if (a && execute_priv(sql,a->func)) { - sql_exp *e = exp_aggr(sql->sa, exps, a, distinct, no_nil, groupby?groupby->card:CARD_ATOM, have_nil(exps)); + bool hasnil = have_nil(exps) || (strcmp(aname, "count") != 0 && (!groupby || list_empty(groupby->r))); /* for global case, the aggregate may return NULL */ + sql_exp *e = exp_aggr(sql->sa, exps, a, distinct, no_nil, groupby?groupby->card:CARD_ATOM, hasnil); if (!groupby) return e; diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -1607,6 +1607,8 @@ rewrite_exp_rel(visitor *v, sql_rel *rel if (!exp_name(ne)) ne = exp_label(v->sql->sa, ne, ++v->sql->label); e = ne; + if (depth) /* a projection from an outer join may have nulls */ + set_has_nil(e); } else { e = exp_rel_update_exp(v->sql, e); } 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 @@ -89,9 +89,9 @@ single project ( | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "o"."open_auction_id" NOT NULL ], | | | | | | table(sys.bidder) [ "bidder"."id" NOT NULL HASHCOL as "b3a"."id", "bidder"."open_auction_id" NOT NULL as "b3a"."open_auction_id", "bidder"."date" NOT NULL as "b3a"."date", "bidder"."time" NOT NULL as "b3a"."time", "bidder"."personref" NOT NULL as "b3a"."personref", "bidder"."increase" NOT NULL as "b3a"."increase", "bidder"."%TID%" NOT NULL as "b3a"."%TID%" ] COUNT | | | | | ) [ "b3a"."open_auction_id" NOT NULL = "o"."open_auction_id" NOT NULL ] -| | | | ) [ "o"."open_auction_id" NOT NULL ] [ sys.min no nil ("b3a"."id" NOT NULL HASHCOL ) NOT NULL as "%1"."%1", "o"."open_auction_id" NOT NULL ] -| | | ) [ "b3"."id" NOT NULL HASHCOL = "%1"."%1" NOT NULL ] -| | ) [ "b3"."id" NOT NULL HASHCOL , "b3"."open_auction_id" NOT NULL, "b3"."date" NOT NULL, "b3"."time" NOT NULL, "b3"."personref" NOT NULL, "b3"."increase" NOT NULL, "b3"."%TID%" NOT NULL, "%1"."%1" NOT NULL, "o"."open_auction_id" NOT NULL as "%5"."%5" ] +| | | | ) [ "o"."open_auction_id" NOT NULL ] [ sys.min no nil ("b3a"."id" NOT NULL HASHCOL ) as "%1"."%1", "o"."open_auction_id" NOT NULL ] +| | | ) [ "b3"."id" NOT NULL HASHCOL = "%1"."%1" ] +| | ) [ "b3"."id" NOT NULL HASHCOL , "b3"."open_auction_id" NOT NULL, "b3"."date" NOT NULL, "b3"."time" NOT NULL, "b3"."personref" NOT NULL, "b3"."increase" NOT NULL, "b3"."%TID%" NOT NULL, "%1"."%1", "o"."open_auction_id" NOT NULL as "%5"."%5" ] | ) [ "o"."open_auction_id" NOT NULL * = "%5"."%5" 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 ( @@ -110,8 +110,8 @@ project ( | | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "o"."open_auction_id" NOT NULL ], | | | | | | | table(sys.bidder) [ "bidder"."id" NOT NULL HASHCOL as "b2a"."id", "bidder"."open_auction_id" NOT NULL as "b2a"."open_auction_id" ] COUNT | | | | | | ) [ "b2a"."open_auction_id" NOT NULL = "o"."open_auction_id" NOT NULL ] -| | | | | ) [ "o"."open_auction_id" NOT NULL ] [ sys.max no nil ("b2a"."id" NOT NULL HASHCOL ) NOT NULL as "%3"."%3", "o"."open_auction_id" NOT NULL ] -| | | | ) [ "b2"."id" NOT NULL HASHCOL = "%3"."%3" NOT NULL ] +| | | | | ) [ "o"."open_auction_id" NOT NULL ] [ sys.max no nil ("b2a"."id" NOT NULL HASHCOL ) as "%3"."%3", "o"."open_auction_id" NOT NULL ] +| | | | ) [ "b2"."id" NOT NULL HASHCOL = "%3"."%3" ] | | | ) [ "b2"."increase" NOT NULL, "o"."open_auction_id" NOT NULL as "%6"."%6" ] | | ) [ "o"."open_auction_id" NOT NULL * = "%6"."%6" NOT NULL ] | ) [ sys.sql_mul("%2"."%2" NOT NULL, double "2") <= "b2"."increase" NOT NULL ] diff --git a/sql/test/SQLite_regress/sqllogictest/Tests/All b/sql/test/SQLite_regress/sqllogictest/Tests/All --- a/sql/test/SQLite_regress/sqllogictest/Tests/All +++ b/sql/test/SQLite_regress/sqllogictest/Tests/All @@ -1,5 +1,5 @@ -select1 -select2 -select3 -select4 -select5 +#select1 +#select2 +#select3 +#select4 +#select5 diff --git a/sql/test/Tests/keys.stable.out b/sql/test/Tests/keys.stable.out --- a/sql/test/Tests/keys.stable.out +++ b/sql/test/Tests/keys.stable.out @@ -132,12 +132,12 @@ project ( % .plan # table_name % rel # name % clob # type -% 66 # length +% 75 # length project ( | group by ( | | table(sys.dummyme) [ "dummyme"."b" ] COUNT -| ) [ ] [ sys.count unique no nil ("dummyme"."b") as "%1"."%1" ] -) [ "%1"."%1" ] +| ) [ ] [ sys.count unique no nil ("dummyme"."b") NOT NULL as "%1"."%1" ] +) [ "%1"."%1" NOT NULL ] #plan select count(distinct a + 1) from dummyme; % .plan # table_name % rel # name @@ -148,8 +148,8 @@ project ( | | project ( | | | table(sys.dummyme) [ "dummyme"."a" NOT NULL HASHCOL ] COUNT | | ) [ bigint["dummyme"."a" NOT NULL HASHCOL ] NOT NULL as "%3"."%3", sys.sql_add("%3"."%3" NOT NULL, bigint "1") as "%2"."%2" ] -| ) [ ] [ sys.count unique no nil ("%2"."%2") as "%1"."%1" ] -) [ "%1"."%1" ] +| ) [ ] [ sys.count unique no nil ("%2"."%2") NOT NULL as "%1"."%1" ] +) [ "%1"."%1" NOT NULL ] #plan select count(distinct a + b) from dummyme; % .plan # table_name % rel # name @@ -160,8 +160,8 @@ project ( | | project ( | | | table(sys.dummyme) [ "dummyme"."a" NOT NULL HASHCOL , "dummyme"."b" ] COUNT | | ) [ bigint["dummyme"."a" NOT NULL HASHCOL ] NOT NULL as "%3"."%3", bigint["dummyme"."b"] as "%4"."%4", sys.sql_add("%3"."%3" NOT NULL, "%4"."%4") as "%2"."%2" ] -| ) [ ] [ sys.count unique no nil ("%2"."%2") as "%1"."%1" ] -) [ "%1"."%1" ] +| ) [ ] [ sys.count unique no nil ("%2"."%2") NOT NULL as "%1"."%1" ] +) [ "%1"."%1" NOT NULL ] #plan select count(distinct abs(a)) from dummyme; % .plan # table_name % rel # name _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list