Changeset: 7d1285b15988 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7d1285b15988
Modified Files:
pathfinder/compiler/algebra/opt/opt_reqval.c
Branch: default
Log Message:
Split up required value rewrites to ensure that we don't get inconsistent
column types.
diffs (97 lines):
diff -r 51719a0961b8 -r 7d1285b15988
pathfinder/compiler/algebra/opt/opt_reqval.c
--- a/pathfinder/compiler/algebra/opt/opt_reqval.c Wed Jul 14 21:33:36
2010 +0200
+++ b/pathfinder/compiler/algebra/opt/opt_reqval.c Thu Jul 22 14:09:05
2010 +0200
@@ -97,23 +97,6 @@
if (p->bit_dag)
return;
- /* Using the required values property as well as the constant
- property we can replace every expression, where at least one
- column has a constant value that differs its required value,
- by an empty table. */
- for (unsigned int i = 0; i < p->schema.count; i++) {
- PFalg_col_t cur_col = p->schema.items[i].name;
-
- if (PFprop_req_bool_val (p->prop, cur_col) &&
- PFprop_const (p->prop, cur_col) &&
- (PFprop_const_val (p->prop, cur_col)).val.bln !=
- PFprop_req_bool_val_val (p->prop, cur_col)) {
- /* create an empty table instead */
- *p = *PFla_empty_tbl_ (p->schema);
- return;
- }
- }
-
/* Replace rowrank operators whose real values
are not needed by rank operators.
Note that we do not need to check for the order
@@ -185,6 +168,41 @@
p->bit_dag = true;
}
+/* worker for PFalgopt_reqval */
+static void
+opt_req_bool_vals (PFla_op_t *p)
+{
+ assert (p);
+
+ /* nothing to do if we already visited that node */
+ if (p->bit_dag)
+ return;
+
+ /* Using the required values property as well as the constant
+ property we can replace every expression, where at least one
+ column has a constant value that differs its required value,
+ by an empty table. */
+ for (unsigned int i = 0; i < p->schema.count; i++) {
+ PFalg_col_t cur_col = p->schema.items[i].name;
+
+ if (PFprop_req_bool_val (p->prop, cur_col) &&
+ PFprop_const (p->prop, cur_col) &&
+ (PFprop_const_val (p->prop, cur_col)).val.bln !=
+ PFprop_req_bool_val_val (p->prop, cur_col)) {
+ /* create an empty table instead */
+ *p = *PFla_empty_tbl_ (p->schema);
+ return;
+ }
+ }
+
+ /* infer properties for children */
+ for (unsigned int i = 0; i < PFLA_OP_MAXCHILD && p->child[i]; i++)
+ opt_req_bool_vals (p->child[i]);
+
+ /* mark node as visited */
+ p->bit_dag = true;
+}
+
/**
* Invoke algebra optimization.
*/
@@ -202,7 +220,10 @@
schema_dirty = false;
- /* Optimize algebra tree */
+ /* Optimize algebra tree.
+ Note: the rewrites modifying the column types have to be performed
+ before empty tables are introduced in opt_req_bool_vals() to avoid
+ inconsistent types. */
opt_reqvals (root);
PFla_dag_reset (root);
@@ -212,6 +233,15 @@
if (schema_dirty)
PFprop_infer_ocol (root);
+ schema_dirty = false;
+
+ /* Get rid of superfluous branches.
+ Make sure to take the rewrites that might have changed column types
+ into account. */
+ opt_req_bool_vals (root);
+ PFla_dag_reset (root);
+ assert (!schema_dirty);
+
return root;
}
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list