Changeset: cf8e063d3e77 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cf8e063d3e77 Modified Files: sql/server/rel_statistics_functions.c Branch: properties Log Message:
Statistics for sign and abs diffs (91 lines): diff --git a/sql/server/rel_statistics_functions.c b/sql/server/rel_statistics_functions.c --- a/sql/server/rel_statistics_functions.c +++ b/sql/server/rel_statistics_functions.c @@ -217,12 +217,86 @@ sql_neg_propagate_statistics(mvc *sql, s } } -static struct function_properties functions_list[11] = { +static void +sql_sign_propagate_statistics(mvc *sql, sql_exp *e) +{ + list *l = e->l; + sql_exp *first = l->h->data; + ValPtr omin, omax, res1 = (ValPtr) sa_zalloc(sql->sa, sizeof(ValRecord)), res2 = (ValPtr) sa_zalloc(sql->sa, sizeof(ValRecord)); + ValRecord minus1 = (ValRecord) {.vtype = TYPE_bte, .val.btval = -1}, plus1 = (ValRecord) {.vtype = TYPE_bte, .val.btval = 1}; + bool properties_set = false; + + if ((omin = find_prop_and_get(first->p, PROP_MIN)) && (omax = find_prop_and_get(first->p, PROP_MAX))) { + ValRecord zero1 = (ValRecord) {.vtype = omin->vtype,}, zero2 = (ValRecord) {.vtype = omax->vtype,}, verify1, verify2, verify3, verify4; + + VARcalcgt(&verify1, omin, &zero1); + VARcalcgt(&verify2, omax, &zero2); + VARcalclt(&verify3, omin, &zero1); + VARcalclt(&verify4, omax, &zero2); + + if (verify1.val.btval == 1 && verify2.val.btval == 1) { + VALcopy(res1, &plus1); + VALcopy(res2, &plus1); + set_property(sql, e, PROP_MAX, res1); + set_property(sql, e, PROP_MIN, res2); + properties_set = true; + } else if (verify3.val.btval == 1 && verify4.val.btval == 1) { + VALcopy(res1, &minus1); + VALcopy(res2, &minus1); + set_property(sql, e, PROP_MAX, res1); + set_property(sql, e, PROP_MIN, res2); + properties_set = true; + } + } + if (!properties_set) { + VALcopy(res1, &plus1); + VALcopy(res2, &minus1); + set_property(sql, e, PROP_MAX, res1); + set_property(sql, e, PROP_MIN, res2); + } +} + +static void +sql_abs_propagate_statistics(mvc *sql, sql_exp *e) +{ + list *l = e->l; + sql_exp *first = l->h->data; + ValPtr omin, omax, res1 = (ValPtr) sa_zalloc(sql->sa, sizeof(ValRecord)), res2 = (ValPtr) sa_zalloc(sql->sa, sizeof(ValRecord)); + + if ((omin = find_prop_and_get(first->p, PROP_MIN)) && (omax = find_prop_and_get(first->p, PROP_MAX))) { + ValRecord zero1 = (ValRecord) {.vtype = omin->vtype,}, zero2 = (ValRecord) {.vtype = omax->vtype,}, verify1, verify2, verify3, verify4; + + VARcalcge(&verify1, omin, &zero1); + VARcalcge(&verify2, omax, &zero2); + VARcalcle(&verify3, omin, &zero1); + VARcalcle(&verify4, omax, &zero2); + + if (verify1.val.btval == 1 && verify2.val.btval == 1) { + gdk_return code1 = VARcalcabsolute(res1, omax); + gdk_return code2 = VARcalcabsolute(res2, omin); + + assert(code1 && code2); + set_property(sql, e, PROP_MAX, res1); + set_property(sql, e, PROP_MIN, res2); + } else if (verify3.val.btval == 1 && verify4.val.btval == 1) { + gdk_return code1 = VARcalcabsolute(res1, omax); + gdk_return code2 = VARcalcabsolute(res2, omin); + + assert(code1 && code2); + set_property(sql, e, PROP_MAX, res2); + set_property(sql, e, PROP_MIN, res1); + } + } +} + +static struct function_properties functions_list[13] = { {"sql_add", &sql_add_propagate_statistics}, {"sql_sub", &sql_sub_propagate_statistics}, {"sql_mul", &sql_mul_propagate_statistics}, {"sql_div", &sql_div_propagate_statistics}, {"sql_neg", &sql_neg_propagate_statistics}, + {"sign", &sql_sign_propagate_statistics}, + {"abs", &sql_abs_propagate_statistics}, {"sql_min", &sql_least_greatest_propagate_statistics}, {"sql_max", &sql_least_greatest_propagate_statistics}, {"least", &sql_least_greatest_propagate_statistics}, _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list