Update of /cvsroot/monetdb/pathfinder/compiler/algebra/prop
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv14603/algebra/prop
Modified Files:
prop_reqval.c
Log Message:
-- Extended the required value property to also infer
whether columns are only used in predicates.
-- Added rewrite that turns fn:number into the relaxed variant
that ignores NaN values---values that cannot be cast---based
on the observation if fn:number is applied on predicates only.
U prop_reqval.c
Index: prop_reqval.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/algebra/prop/prop_reqval.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- prop_reqval.c 3 Apr 2008 11:03:37 -0000 1.41
+++ prop_reqval.c 7 Apr 2008 11:06:50 -0000 1.42
@@ -106,6 +106,16 @@
}
/**
+ * Test if @a attr is in the list of filter columns
+ * in container @a prop
+ */
+bool
+PFprop_req_filter_col (const PFprop_t *prop, PFalg_att_t attr)
+{
+ return in (prop->req_filter_cols, attr);
+}
+
+/**
* Test if @a attr is in the list of value columns
* in container @a prop
*/
@@ -162,7 +172,7 @@
(req_bool_val_t) { .name = empty_list, \
.val = empty_list }, \
empty_list, empty_list, empty_list, \
- empty_list, empty_list)
+ empty_list, empty_list, empty_list)
/**
* worker for PFprop_infer_req_bool_val
@@ -176,12 +186,14 @@
PFalg_att_t order_cols,
PFalg_att_t bijective_cols,
PFalg_att_t multi_col_cols,
+ PFalg_att_t filter_cols,
PFalg_att_t value_cols)
{
req_bool_val_t rv; /* list of required boolean values */
PFalg_att_t oc, /* list of order columns */
bc, /* list of bijective columns */
mc, /* list of multi column columns */
+ fc, /* list of filter columns */
vc; /* list of value columns */
assert (n);
@@ -228,12 +240,14 @@
oc = intersect (cols, order_cols);
bc = intersect (cols, bijective_cols);
mc = intersect (cols, multi_col_cols);
+ fc = intersect (cols, filter_cols);
vc = intersect (cols, value_cols);
SEEN(n) = true;
} else {
oc = n->prop->req_order_cols;
bc = n->prop->req_bijective_cols;
mc = n->prop->req_multi_col_cols;
+ fc = n->prop->req_filter_cols;
vc = n->prop->req_value_cols;
/* collect all columns whose order is necessary */
@@ -245,7 +259,13 @@
columns that are not referenced (not in cols).
(comparison is done on common columns only) */
mc = union_ (intersect (intersect (mc, cols), multi_col_cols),
- diff (mc, cols));
+ diff (mc, cols));
+ /* Keep only non-conflicting columns by matching the columns
+ from the new input and the exisiting ones thus keeping the
+ columns that are not referenced (not in cols).
+ (comparison is done on common columns only) */
+ fc = union_ (intersect (intersect (fc, cols), filter_cols),
+ diff (fc, cols));
/* collect all columns whose real value is necessary */
vc = union_ (vc, intersect (cols, value_cols));
}
@@ -253,6 +273,7 @@
n->prop->req_order_cols = oc;
n->prop->req_bijective_cols = bc;
n->prop->req_multi_col_cols = mc;
+ n->prop->req_filter_cols = fc;
n->prop->req_value_cols = vc;
/* nothing to do if we haven't collected
@@ -303,16 +324,18 @@
oc = union_ (empty_list, n->sem.ser_seq.pos);
bc = empty_list;
mc = diff (diff (cols, n->sem.ser_seq.pos), n->sem.ser_seq.item);
+ fc = empty_list;
vc = union_ (vc, n->sem.ser_seq.item);
prop_infer_reqvals_empty (L(n)); /* fragments */
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
case la_serialize_rel:
oc = union_ (empty_list, n->sem.ser_rel.pos);
bc = empty_list;
mc = diff (diff (cols, n->sem.ser_rel.iter), n->sem.ser_rel.pos);
+ fc = empty_list;
vc = union_ (vc, n->sem.ser_rel.iter);
for (unsigned int i = 0; i < n->sem.ser_rel.items.count; i++) {
@@ -338,8 +361,10 @@
break;
case la_cross:
- prop_infer_reqvals (L(n), rv, schema2collist(L(n)), oc, bc, mc,
vc);
- prop_infer_reqvals (R(n), rv, schema2collist(R(n)), oc, bc, mc,
vc);
+ prop_infer_reqvals (L(n), rv, schema2collist(L(n)),
+ oc, bc, mc, fc, vc);
+ prop_infer_reqvals (R(n), rv, schema2collist(R(n)),
+ oc, bc, mc, fc, vc);
return; /* only infer once */
case la_eqjoin:
@@ -375,16 +400,19 @@
n->sem.eqjoin.att2);
}
- prop_infer_reqvals (L(n), rv, schema2collist(L(n)), oc, bc, mc,
vc);
- prop_infer_reqvals (R(n), rv, schema2collist(R(n)), oc, bc, mc,
vc);
+ prop_infer_reqvals (L(n), rv, schema2collist(L(n)),
+ oc, bc, mc, fc, vc);
+ prop_infer_reqvals (R(n), rv, schema2collist(R(n)),
+ oc, bc, mc, fc, vc);
return; /* only infer once */
case la_semijoin:
{
PFalg_att_t oc_right = empty_list,
bc_right = empty_list,
- vc_right = empty_list,
- mc_right = empty_list;
+ mc_right = empty_list,
+ fc_right = empty_list,
+ vc_right = empty_list;
/* Check whether the join columns can be marked as bijective value
columns or if they have to produce the exact values. */
@@ -413,14 +441,14 @@
/* remove columns as we cannot split up the join column */
mc = diff (mc, n->sem.eqjoin.att1);
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
cols = union_ (empty_list, n->sem.eqjoin.att2);
rv.name = empty_list;
rv.val = empty_list;
prop_infer_reqvals (R(n), rv, cols, oc_right,
- bc_right, mc_right, vc_right);
+ bc_right, mc_right, fc_right, vc_right);
} return; /* only infer once */
case la_thetajoin:
@@ -453,12 +481,16 @@
by a one with two condititions (using a theta-join). */
mc = union_ (union_ (mc, left), right);
} else {
+ if (n->sem.thetajoin.pred[i].comp == alg_comp_eq)
+ fc = union_ (union_ (fc, left), right);
vc = union_ (union_ (vc, left), right);
}
}
- prop_infer_reqvals (L(n), rv, schema2collist(L(n)), oc, bc, mc,
vc);
- prop_infer_reqvals (R(n), rv, schema2collist(R(n)), oc, bc, mc,
vc);
+ prop_infer_reqvals (L(n), rv, schema2collist(L(n)),
+ oc, bc, mc, fc, vc);
+ prop_infer_reqvals (R(n), rv, schema2collist(R(n)),
+ oc, bc, mc, fc, vc);
return; /* only infer once */
case la_project:
@@ -468,6 +500,7 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = empty_list;
cols = empty_list;
/* and fill them again based on the original stored values */
@@ -488,6 +521,8 @@
bc = union_ (bc, n->sem.proj.items[i].old);
if (in (n->prop->req_multi_col_cols, n->sem.proj.items[i].new))
mc = union_ (mc, n->sem.proj.items[i].old);
+ if (in (n->prop->req_filter_cols, n->sem.proj.items[i].new))
+ fc = union_ (fc, n->sem.proj.items[i].old);
if (in (n->prop->req_value_cols, n->sem.proj.items[i].new))
vc = union_ (vc, n->sem.proj.items[i].old);
cols = union_ (cols, n->sem.proj.items[i].old);
@@ -593,11 +628,11 @@
vc = union_ (vc, cur);
}
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
rv.name = empty_list;
rv.val = empty_list;
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
case la_distinct:
@@ -620,6 +655,9 @@
break;
case la_num_eq:
+ if (in (rv.name, n->sem.binary.res))
+ fc = union_ (union_ (fc, n->sem.binary.att1),
+ n->sem.binary.att2);
case la_num_gt:
case la_to:
rv.name = diff (rv.name, n->sem.binary.res);
@@ -802,10 +840,11 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
prop_infer_reqvals_empty (L(n)); /* fragments */
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
case la_step_join:
@@ -820,7 +859,7 @@
cols = diff (cols, n->sem.step.item_res);
prop_infer_reqvals_empty (L(n)); /* fragments */
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
case la_doc_index_join:
@@ -835,7 +874,7 @@
cols = diff (cols, n->sem.doc_join.item_res);
prop_infer_reqvals_empty (L(n)); /* fragments */
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
case la_doc_tbl:
@@ -860,7 +899,7 @@
cols = diff (cols, n->sem.doc_access.res);
prop_infer_reqvals_empty (L(n)); /* fragments */
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
case la_twig:
@@ -881,9 +920,10 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
prop_infer_reqvals_empty (R(n)); /* constructor */
return; /* only infer once */
@@ -898,9 +938,10 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
prop_infer_reqvals_empty (R(n)); /* constructor */
return; /* only infer once */
@@ -916,6 +957,7 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
break;
@@ -933,6 +975,7 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
break;
@@ -949,10 +992,11 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
prop_infer_reqvals_empty (L(n)); /* fragments */
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
case la_merge_adjacent:
@@ -968,10 +1012,11 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
prop_infer_reqvals_empty (L(n)); /* fragments */
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
case la_roots:
@@ -993,7 +1038,7 @@
return; /* only infer once */
case la_cond_err:
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
rv.name = empty_list;
rv.val = empty_list;
@@ -1004,9 +1049,10 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
case la_trace:
@@ -1022,9 +1068,10 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
prop_infer_reqvals_empty (R(n)); /* trace */
return; /* only infer once */
@@ -1039,9 +1086,10 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
prop_infer_reqvals_empty (R(n)); /* trace */
return; /* only infer once */
@@ -1056,9 +1104,10 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
prop_infer_reqvals_empty (R(n)); /* trace */
return; /* only infer once */
@@ -1070,10 +1119,11 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
prop_infer_reqvals_empty (L(n)); /* recursion param */
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
case la_rec_param:
@@ -1089,10 +1139,11 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
case la_rec_base:
@@ -1108,10 +1159,11 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
cols = union_ (empty_list, n->sem.fun_call.iter);
vc = cols;
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
prop_infer_reqvals_empty (R(n)); /* function param */
return; /* only infer once */
@@ -1123,9 +1175,10 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
prop_infer_reqvals_empty (R(n)); /* function param */
return; /* only infer once */
@@ -1157,9 +1210,10 @@
oc = empty_list;
bc = empty_list;
mc = empty_list;
+ fc = empty_list;
vc = cols;
- prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
/* to make up for the schema change
we add the input columns by hand */
@@ -1167,12 +1221,12 @@
n->sem.string_join.item_sep);
vc = cols;
- prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
return; /* only infer once */
}
- if (L(n)) prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, vc);
- if (R(n)) prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, vc);
+ if (L(n)) prop_infer_reqvals (L(n), rv, cols, oc, bc, mc, fc, vc);
+ if (R(n)) prop_infer_reqvals (R(n), rv, cols, oc, bc, mc, fc, vc);
}
/* worker for PFprop_infer_reqval */
@@ -1225,7 +1279,8 @@
/* second run infers required values properties */
prop_infer_reqvals (root, init, schema2collist(root),
- empty_list, empty_list, empty_list, empty_list);
+ empty_list, empty_list, empty_list,
+ empty_list, empty_list);
PFla_dag_reset (root);
}
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Register now and save $200. Hurry, offer ends at 11:59 p.m.,
Monday, April 7! Use priority code J8TLD2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins