Changeset: faaa0cabeced for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/faaa0cabeced Modified Files: sql/server/rel_optimizer.c Branch: pushcands Log Message:
Merged with default diffs (truncated from 24870 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 @@ -4099,10 +4099,11 @@ rel_push_aggr_down(visitor *v, sql_rel * { if (rel->op == op_groupby && rel->l) { sql_rel *u = rel->l, *ou = u; + sql_rel *g = rel; sql_rel *ul = u->l; sql_rel *ur = u->r; node *n, *m; - list *lgbe = NULL, *rgbe = NULL, *gbe = NULL, *exps = NULL, *others = NULL; + list *lgbe = NULL, *rgbe = NULL, *gbe = NULL, *exps = NULL; if (u->op == op_project) u = u->l; @@ -4118,7 +4119,7 @@ rel_push_aggr_down(visitor *v, sql_rel * return rel; /* distinct should be done over the full result */ - for (n = rel->exps->h; n; n = n->next) { + for (n = g->exps->h; n; n = n->next) { sql_exp *e = n->data; sql_subfunc *af = e->f; @@ -4136,9 +4137,11 @@ rel_push_aggr_down(visitor *v, sql_rel * ul = rel_dup(ul); ur = rel_dup(ur); if (!is_project(ul->op)) - ul = rel_project(v->sql->sa, ul, rel_projections(v->sql, ul, NULL, 1, 1)); + ul = rel_project(v->sql->sa, ul, + rel_projections(v->sql, ul, NULL, 1, 1)); if (!is_project(ur->op)) - ur = rel_project(v->sql->sa, ur, rel_projections(v->sql, ur, NULL, 1, 1)); + ur = rel_project(v->sql->sa, ur, + rel_projections(v->sql, ur, NULL, 1, 1)); rel_rename_exps(v->sql, u->exps, ul->exps); rel_rename_exps(v->sql, u->exps, ur->exps); if (u != ou) { @@ -4150,49 +4153,29 @@ rel_push_aggr_down(visitor *v, sql_rel * rel_rename_exps(v->sql, ou->exps, ur->exps); } - if (!list_empty(rel->r)) { - list *ogbe = rel->r; - - lgbe = exps_copy(v->sql, ogbe); - rgbe = exps_copy(v->sql, ogbe); - gbe = new_exp_list(v->sql->sa); - others = new_exp_list(v->sql->sa); - for (n = ogbe->h; n; n = n->next) { - sql_exp *e = n->data, *ne; - - /* all grouping columns are required to the sum, otherwise the grouping column will different, thus giving a different result */ - ne = exps_uses_exp(rel->exps, e); - if (!ne) { - ne = exp_ref(v->sql, e); - list_append(others, ne); - } else { - ne = list_find_exp(rel->exps, ne); - assert(ne); - ne = exp_ref(v->sql, ne); - } - append(gbe, ne); - } - } - + if (g->r && list_length(g->r) > 0) { + list *gbe = g->r; + + lgbe = exps_copy(v->sql, gbe); + rgbe = exps_copy(v->sql, gbe); + } ul = rel_groupby(v->sql, ul, NULL); ul->r = lgbe; - ul->nrcols = rel->nrcols; - ul->card = rel->card; - ul->exps = list_empty(others) ? exps_copy(v->sql, rel->exps) : list_merge(exps_copy(v->sql, others), exps_copy(v->sql, rel->exps), (fdup) NULL); + ul->nrcols = g->nrcols; + ul->card = g->card; + ul->exps = exps_copy(v->sql, g->exps); ul->nrcols = list_length(ul->exps); ur = rel_groupby(v->sql, ur, NULL); ur->r = rgbe; - ur->nrcols = rel->nrcols; - ur->card = rel->card; - ur->exps = list_empty(others) ? exps_copy(v->sql, rel->exps) : list_merge(exps_copy(v->sql, others), exps_copy(v->sql, rel->exps), (fdup) NULL); + ur->nrcols = g->nrcols; + ur->card = g->card; + ur->exps = exps_copy(v->sql, g->exps); ur->nrcols = list_length(ur->exps); - rel->exps = list_empty(others) ? rel->exps : list_merge(others, rel->exps, (fdup) NULL); - /* group by on primary keys which define the partioning scheme * don't need a finalizing group by */ - /* how to check if a partition is based on some primary key ? + /* how to check if a partion is based on some primary key ? * */ if (rel->r && list_length(rel->r)) { node *n; @@ -4208,7 +4191,8 @@ rel_push_aggr_down(visitor *v, sql_rel * sql_table *mt = (bt)?rel_base_get_mergetable(bt):NULL; if (c && mt && list_find(c->t->pkey->k.columns, c, cmp) != NULL) { v->changes++; - return rel_inplace_setop(v->sql, rel, ul, ur, op_union, rel_projections(v->sql, rel, NULL, 1, 1)); + return rel_inplace_setop(v->sql, rel, ul, ur, op_union, + rel_projections(v->sql, rel, NULL, 1, 1)); } } } @@ -4218,6 +4202,22 @@ rel_push_aggr_down(visitor *v, sql_rel * rel_setop_set_exps(v->sql, u, rel_projections(v->sql, ul, NULL, 1, 1)); set_processed(u); + if (rel->r) { + list *ogbe = rel->r; + + gbe = new_exp_list(v->sql->sa); + for (n = ogbe->h; n; n = n->next) { + sql_exp *e = n->data, *ne; + + ne = exps_uses_exp( rel->exps, e); + if (!ne) + continue; + ne = list_find_exp( u->exps, ne); + assert(ne); + ne = exp_ref(v->sql, ne); + append(gbe, ne); + } + } exps = new_exp_list(v->sql->sa); for (n = u->exps->h, m = rel->exps->h; n && m; n = n->next, m = m->next) { sql_exp *ne, *e = n->data, *oa = m->data; 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 @@ -480,6 +480,7 @@ rel_inplace_groupby(sql_rel *rel, sql_re rel->nrcols = l->nrcols; rel->op = op_groupby; rel->flag = 0; + set_processed(rel); return rel; } 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 @@ -1278,12 +1278,7 @@ atom_cast(sql_allocator *sa, atom *a, sq int tpe = tp->type->localtype; size_t len = (tpe == TYPE_dbl) ? sizeof(dbl) : sizeof(flt); ssize_t res; - ptr p; - - if (tpe == TYPE_dbl) - p = &(a->data.val.dval); - else - p = &(a->data.val.fval); + ptr p = &(a->data.val); if ((res = ATOMfromstr(tpe, &p, &len, s, false)) < 0) { GDKclrerr(); return 0; diff --git a/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 b/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 --- a/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 +++ b/sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128 @@ -3520,689 +3520,617 @@ insert into sys.functions values (944, ' insert into sys.args values (43965, 944, 'res_0', 'boolean', 1, 0, 0, 0); insert into sys.args values (43966, 944, 'arg_1', 'clob', 0, 0, 1, 1); insert into sys.args values (43967, 944, 'arg_2', 'clob', 0, 0, 1, 2); -insert into sys.functions values (945, 'like', 'like', 'algebra', 0, 4, false, false, false, 2000, true, false); -insert into sys.args values (43968, 945, 'res_0', 'boolean', 1, 0, 0, 0); -insert into sys.args values (43969, 945, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (43970, 945, 'arg_2', 'clob', 0, 0, 1, 2); -insert into sys.args values (43971, 945, 'arg_3', 'clob', 0, 0, 1, 3); -insert into sys.functions values (946, 'ilike', 'ilike', 'algebra', 0, 4, false, false, false, 2000, true, false); -insert into sys.args values (43972, 946, 'res_0', 'boolean', 1, 0, 0, 0); -insert into sys.args values (43973, 946, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (43974, 946, 'arg_2', 'clob', 0, 0, 1, 2); -insert into sys.functions values (947, 'ilike', 'ilike', 'algebra', 0, 4, false, false, false, 2000, true, false); -insert into sys.args values (43975, 947, 'res_0', 'boolean', 1, 0, 0, 0); -insert into sys.args values (43976, 947, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (43977, 947, 'arg_2', 'clob', 0, 0, 1, 2); -insert into sys.args values (43978, 947, 'arg_3', 'clob', 0, 0, 1, 3); -insert into sys.functions values (948, 'not_like', 'not_like', 'algebra', 0, 4, false, false, false, 2000, true, false); -insert into sys.args values (43979, 948, 'res_0', 'boolean', 1, 0, 0, 0); -insert into sys.args values (43980, 948, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (43981, 948, 'arg_2', 'clob', 0, 0, 1, 2); -insert into sys.functions values (949, 'not_like', 'not_like', 'algebra', 0, 4, false, false, false, 2000, true, false); -insert into sys.args values (43982, 949, 'res_0', 'boolean', 1, 0, 0, 0); -insert into sys.args values (43983, 949, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (43984, 949, 'arg_2', 'clob', 0, 0, 1, 2); -insert into sys.args values (43985, 949, 'arg_3', 'clob', 0, 0, 1, 3); -insert into sys.functions values (950, 'not_ilike', 'not_ilike', 'algebra', 0, 4, false, false, false, 2000, true, false); -insert into sys.args values (43986, 950, 'res_0', 'boolean', 1, 0, 0, 0); -insert into sys.args values (43987, 950, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (43988, 950, 'arg_2', 'clob', 0, 0, 1, 2); -insert into sys.functions values (951, 'not_ilike', 'not_ilike', 'algebra', 0, 4, false, false, false, 2000, true, false); -insert into sys.args values (43989, 951, 'res_0', 'boolean', 1, 0, 0, 0); -insert into sys.args values (43990, 951, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (43991, 951, 'arg_2', 'clob', 0, 0, 1, 2); -insert into sys.args values (43992, 951, 'arg_3', 'clob', 0, 0, 1, 3); -insert into sys.functions values (952, 'patindex', 'patindex', 'pcre', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (43993, 952, 'res_0', 'int', 32, 0, 0, 0); -insert into sys.args values (43994, 952, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (43995, 952, 'arg_2', 'clob', 0, 0, 1, 2); -insert into sys.functions values (953, 'truncate', 'stringleft', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (43996, 953, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (43997, 953, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (43998, 953, 'arg_2', 'int', 32, 0, 1, 2); -insert into sys.functions values (954, 'concat', '+', 'calc', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (43999, 954, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (44000, 954, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (44001, 954, 'arg_2', 'clob', 0, 0, 1, 2); -insert into sys.functions values (955, 'ascii', 'ascii', 'str', 0, 1, false, false, false, 2000, true, true); -insert into sys.args values (44002, 955, 'res_0', 'int', 32, 0, 0, 0); -insert into sys.args values (44003, 955, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.functions values (956, 'code', 'unicode', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (44004, 956, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (44005, 956, 'arg_1', 'int', 32, 0, 1, 1); -insert into sys.functions values (957, 'length', 'length', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (44006, 957, 'res_0', 'int', 32, 0, 0, 0); -insert into sys.args values (44007, 957, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.functions values (958, 'right', 'stringright', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (44008, 958, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (44009, 958, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (44010, 958, 'arg_2', 'int', 32, 0, 1, 2); -insert into sys.functions values (959, 'left', 'stringleft', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (44011, 959, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (44012, 959, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (44013, 959, 'arg_2', 'int', 32, 0, 1, 2); -insert into sys.functions values (960, 'upper', 'toUpper', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (44014, 960, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (44015, 960, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.functions values (961, 'ucase', 'toUpper', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (44016, 961, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (44017, 961, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.functions values (962, 'lower', 'toLower', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (44018, 962, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (44019, 962, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.functions values (963, 'lcase', 'toLower', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (44020, 963, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (44021, 963, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.functions values (964, 'trim', 'trim', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (44022, 964, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (44023, 964, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.functions values (965, 'trim', 'trim2', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (44024, 965, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (44025, 965, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.args values (44026, 965, 'arg_2', 'clob', 0, 0, 1, 2); -insert into sys.functions values (966, 'ltrim', 'ltrim', 'str', 0, 1, false, false, false, 2000, true, false); -insert into sys.args values (44027, 966, 'res_0', 'clob', 0, 0, 0, 0); -insert into sys.args values (44028, 966, 'arg_1', 'clob', 0, 0, 1, 1); -insert into sys.functions values (967, 'ltrim', 'ltrim2', 'str', 0, 1, false, false, false, 2000, true, false); +insert into sys.args values (43968, 944, 'arg_3', 'clob', 0, 0, 1, 3); +insert into sys.args values (43969, 944, 'arg_4', 'boolean', 1, 0, 1, 4); +insert into sys.functions values (945, 'not_like', 'not_like', 'algebra', 0, 4, false, false, false, 2000, true, false); +insert into sys.args values (43970, 945, 'res_0', 'boolean', 1, 0, 0, 0); +insert into sys.args values (43971, 945, 'arg_1', 'clob', 0, 0, 1, 1); +insert into sys.args values (43972, 945, 'arg_2', 'clob', 0, 0, 1, 2); +insert into sys.args values (43973, 945, 'arg_3', 'clob', 0, 0, 1, 3); +insert into sys.args values (43974, 945, 'arg_4', 'boolean', 1, 0, 1, 4); +insert into sys.functions values (946, 'patindex', 'patindex', 'pcre', 0, 1, false, false, false, 2000, true, false); +insert into sys.args values (43975, 946, 'res_0', 'int', 32, 0, 0, 0); +insert into sys.args values (43976, 946, 'arg_1', 'clob', 0, 0, 1, 1); +insert into sys.args values (43977, 946, 'arg_2', 'clob', 0, 0, 1, 2); +insert into sys.functions values (947, 'truncate', 'stringleft', 'str', 0, 1, false, false, false, 2000, true, false); +insert into sys.args values (43978, 947, 'res_0', 'clob', 0, 0, 0, 0); +insert into sys.args values (43979, 947, 'arg_1', 'clob', 0, 0, 1, 1); +insert into sys.args values (43980, 947, 'arg_2', 'int', 32, 0, 1, 2); +insert into sys.functions values (948, 'concat', '+', 'calc', 0, 1, false, false, false, 2000, true, false); +insert into sys.args values (43981, 948, 'res_0', 'clob', 0, 0, 0, 0); +insert into sys.args values (43982, 948, 'arg_1', 'clob', 0, 0, 1, 1); +insert into sys.args values (43983, 948, 'arg_2', 'clob', 0, 0, 1, 2); +insert into sys.functions values (949, 'ascii', 'ascii', 'str', 0, 1, false, false, false, 2000, true, true); +insert into sys.args values (43984, 949, 'res_0', 'int', 32, 0, 0, 0); +insert into sys.args values (43985, 949, 'arg_1', 'clob', 0, 0, 1, 1); +insert into sys.functions values (950, 'code', 'unicode', 'str', 0, 1, false, false, false, 2000, true, false); +insert into sys.args values (43986, 950, 'res_0', 'clob', 0, 0, 0, 0); +insert into sys.args values (43987, 950, 'arg_1', 'int', 32, 0, 1, 1); +insert into sys.functions values (951, 'length', 'length', 'str', 0, 1, false, false, false, 2000, true, false); +insert into sys.args values (43988, 951, 'res_0', 'int', 32, 0, 0, 0); +insert into sys.args values (43989, 951, 'arg_1', 'clob', 0, 0, 1, 1); +insert into sys.functions values (952, 'right', 'stringright', 'str', 0, 1, false, false, false, 2000, true, false); +insert into sys.args values (43990, 952, 'res_0', 'clob', 0, 0, 0, 0); +insert into sys.args values (43991, 952, 'arg_1', 'clob', 0, 0, 1, 1); +insert into sys.args values (43992, 952, 'arg_2', 'int', 32, 0, 1, 2); +insert into sys.functions values (953, 'left', 'stringleft', 'str', 0, 1, false, false, false, 2000, true, false); +insert into sys.args values (43993, 953, 'res_0', 'clob', 0, 0, 0, 0); +insert into sys.args values (43994, 953, 'arg_1', 'clob', 0, 0, 1, 1); +insert into sys.args values (43995, 953, 'arg_2', 'int', 32, 0, 1, 2); +insert into sys.functions values (954, 'upper', 'toUpper', 'str', 0, 1, false, false, false, 2000, true, false); +insert into sys.args values (43996, 954, 'res_0', 'clob', 0, 0, 0, 0); +insert into sys.args values (43997, 954, 'arg_1', 'clob', 0, 0, 1, 1); +insert into sys.functions values (955, 'ucase', 'toUpper', 'str', 0, 1, false, false, false, 2000, true, false); +insert into sys.args values (43998, 955, 'res_0', 'clob', 0, 0, 0, 0); +insert into sys.args values (43999, 955, 'arg_1', 'clob', 0, 0, 1, 1); +insert into sys.functions values (956, 'lower', 'toLower', 'str', 0, 1, false, false, false, 2000, true, false); +insert into sys.args values (44000, 956, 'res_0', 'clob', 0, 0, 0, 0); +insert into sys.args values (44001, 956, 'arg_1', 'clob', 0, 0, 1, 1); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list