Changeset: 36bf09df0b9c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=36bf09df0b9c
Modified Files:
Branch: default
Log Message:
Merge git master into default
diffs (truncated from 359 to 300 lines):
diff -r dbec6606e6ec -r 36bf09df0b9c pathfinder/compiler/algebra/algebra.c
--- a/pathfinder/compiler/algebra/algebra.c Thu Jul 29 08:53:57 2010 +0200
+++ b/pathfinder/compiler/algebra/algebra.c Thu Jul 29 13:26:07 2010 +0200
@@ -1196,6 +1196,7 @@
case alg_fun_fn_lower_case: return "fn:lower-case";
case alg_fun_fn_translate: return "fn:translate";
case alg_fun_fn_contains: return "fn:contains";
+ case alg_fun_fn_like: return "fn:like";
case alg_fun_fn_starts_with: return "fn:starts-with";
case alg_fun_fn_ends_with: return "fn:ends-with";
case alg_fun_fn_substring_before: return "fn:substring-before";
@@ -1211,6 +1212,7 @@
case alg_fun_fn_number_lax: return "fn:number";
case alg_fun_fn_qname: return "fn:QName";
case alg_fun_fn_doc_available: return "fn:doc-available";
+ case alg_fun_fn_similar_to: return "fn:similar_to";
case alg_fun_pf_fragment: return "#pf:fragment";
case alg_fun_pf_supernode: return "#pf:supernode";
case alg_fun_pf_add_doc_str: return "pf:add-doc";
diff -r dbec6606e6ec -r 36bf09df0b9c pathfinder/compiler/algebra/logical.c
--- a/pathfinder/compiler/algebra/logical.c Thu Jul 29 08:53:57 2010 +0200
+++ b/pathfinder/compiler/algebra/logical.c Thu Jul 29 13:26:07 2010 +0200
@@ -1473,9 +1473,11 @@
break;
case alg_fun_fn_contains:
+ case alg_fun_fn_like:
case alg_fun_fn_starts_with:
case alg_fun_fn_ends_with:
case alg_fun_fn_matches:
+ case alg_fun_fn_similar_to:
assert (clsize (refs) == 2);
/* make sure both columns are of type string */
assert (n->schema.items[ix[0]].type == aat_str &&
diff -r dbec6606e6ec -r 36bf09df0b9c
pathfinder/compiler/algebra/opt/opt_reqval.c
--- a/pathfinder/compiler/algebra/opt/opt_reqval.c Thu Jul 29 08:53:57
2010 +0200
+++ b/pathfinder/compiler/algebra/opt/opt_reqval.c Thu Jul 29 13:26:07
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;
}
diff -r dbec6606e6ec -r 36bf09df0b9c pathfinder/compiler/algebra/physical.c
--- a/pathfinder/compiler/algebra/physical.c Thu Jul 29 08:53:57 2010 +0200
+++ b/pathfinder/compiler/algebra/physical.c Thu Jul 29 13:26:07 2010 +0200
@@ -1680,9 +1680,11 @@
break;
case alg_fun_fn_contains:
+ case alg_fun_fn_like:
case alg_fun_fn_starts_with:
case alg_fun_fn_ends_with:
case alg_fun_fn_matches:
+ case alg_fun_fn_similar_to:
assert (clsize (refs) == 2);
/* make sure both columns are of type string */
assert (n->schema.items[ix[0]].type == aat_str &&
diff -r dbec6606e6ec -r 36bf09df0b9c
pathfinder/compiler/algebra/prop/prop_ocol.c
--- a/pathfinder/compiler/algebra/prop/prop_ocol.c Thu Jul 29 08:53:57
2010 +0200
+++ b/pathfinder/compiler/algebra/prop/prop_ocol.c Thu Jul 29 13:26:07
2010 +0200
@@ -391,9 +391,11 @@
break;
case alg_fun_fn_contains:
+ case alg_fun_fn_like:
case alg_fun_fn_starts_with:
case alg_fun_fn_ends_with:
case alg_fun_fn_matches:
+ case alg_fun_fn_similar_to:
assert (clsize (n->sem.fun_1to1.refs) == 2);
/* make sure both columns are of type string */
assert (ocol_at (L(n), ix[0]).type == aat_str &&
diff -r dbec6606e6ec -r 36bf09df0b9c pathfinder/compiler/include/algebra.h
--- a/pathfinder/compiler/include/algebra.h Thu Jul 29 08:53:57 2010 +0200
+++ b/pathfinder/compiler/include/algebra.h Thu Jul 29 13:26:07 2010 +0200
@@ -391,6 +391,7 @@
, alg_fun_fn_lower_case /**< fn:lower-case */
, alg_fun_fn_translate /**< fn:translate */
, alg_fun_fn_contains /**< fn:contains */
+ , alg_fun_fn_like /**< fn:like */
, alg_fun_fn_starts_with /**< fn:starts-with */
, alg_fun_fn_ends_with /**< fn:ends-with */
, alg_fun_fn_substring_before /**< fn:substring-before */
@@ -406,6 +407,7 @@
, alg_fun_fn_number_lax /**< fn:number (ignoring NaN) */
, alg_fun_fn_qname /**< fn:QName */
, alg_fun_fn_doc_available /**< fn:doc-available */
+ , alg_fun_fn_similar_to /**< fn:similar_to */
, alg_fun_pf_fragment /**< #pf:fragment */
, alg_fun_pf_supernode /**< #pf:supernode */
, alg_fun_pf_add_doc_str /**< pf:add-doc */
diff -r dbec6606e6ec -r 36bf09df0b9c pathfinder/compiler/include/sql.h
--- a/pathfinder/compiler/include/sql.h Thu Jul 29 08:53:57 2010 +0200
+++ b/pathfinder/compiler/include/sql.h Thu Jul 29 13:26:07 2010 +0200
@@ -174,6 +174,7 @@
, sql_gteq /* >= comparison */
, sql_between /* range predicate */
, sql_like /* like comparison */
+ , sql_similar_to /* similar to comparison */
, sql_in /* in comparison */
, sql_stmt_list /* an item of a list of statments
(second argument of a sql_in operator) */
@@ -793,6 +794,14 @@
* with a certain pattern.
*/
PFsql_t * PFsql_like (const PFsql_t *a, const PFsql_t *b);
+
+/**
+ * Create a tree node representing the SQL99
+ * 'similar to' statement to compare a string with
+ * a certain pattern.
+ */
+PFsql_t * PFsql_similar_to (const PFsql_t *a, const PFsql_t *b);
+
/**
* Create a SQL tree node representing the in operator
*/
diff -r dbec6606e6ec -r 36bf09df0b9c pathfinder/compiler/include/sql_mnemonic.h
--- a/pathfinder/compiler/include/sql_mnemonic.h Thu Jul 29 08:53:57
2010 +0200
+++ b/pathfinder/compiler/include/sql_mnemonic.h Thu Jul 29 13:26:07
2010 +0200
@@ -117,6 +117,7 @@
#define gteq(a,b) PFsql_gteq(a,b)
#define between(c,a,b) PFsql_between(c,a,b)
#define like(a,b) PFsql_like(a,b)
+#define similar_to(a,b) PFsql_similar_to(a,b)
#define in(a,b) PFsql_in(a,b)
#define stmt_list(...) PFsql_stmt_list(__VA_ARGS__)
#define not_(a) PFsql_not(a)
diff -r dbec6606e6ec -r 36bf09df0b9c pathfinder/compiler/mil/milgen.brg
--- a/pathfinder/compiler/mil/milgen.brg Thu Jul 29 08:53:57 2010 +0200
+++ b/pathfinder/compiler/mil/milgen.brg Thu Jul 29 13:26:07 2010 +0200
@@ -5517,6 +5517,7 @@
VAR (L(p)->env, col2, aat_str),
VAR (L(p)->env, col3, aat_str))));
} break; /* fold) */
+ case alg_fun_fn_like:
case alg_fun_fn_contains: /* fold( */
{
PFalg_col_t col1, col2;
@@ -5534,6 +5535,9 @@
VAR (L(p)->env, col2, aat_str)),
lit_int (-1)))));
} break; /* fold) */
+ case alg_fun_fn_similar_to:
+ PFoops (OOPS_FATAL,
+ "fn:similar_to not implemented for MIL");
#ifdef HAVE_GEOXML
case alg_fun_geo_wkb: /* fold( */
{
diff -r dbec6606e6ec -r 36bf09df0b9c pathfinder/compiler/sql/lalg2sql.brg
--- a/pathfinder/compiler/sql/lalg2sql.brg Thu Jul 29 08:53:57 2010 +0200
+++ b/pathfinder/compiler/sql/lalg2sql.brg Thu Jul 29 13:26:07 2010 +0200
@@ -3676,15 +3676,29 @@
case alg_fun_num_divide:
res_expr = div (expr[0], expr[1]); break;
case alg_fun_fn_contains:
+ {
+ /* adding check for constant expression */
+ if (!PFprop_const (L(p)->prop, col[1]) ||
+ ty[1] != aat_str ||
+ expr[1]->kind == sql_column_name)
+ PFoops (OOPS_FATAL, "fn_contains works only with
constant "
+ "string expressions");
+ char *str = PFmalloc
(strlen(expr[1]->sem.atom.val.s)+2);
+ sprintf (str, "%%%s%%", expr[1]->sem.atom.val.s);
+ res_expr = like (expr[0], PFsql_lit_str(str));
+ }
+ break;
+ case alg_fun_fn_like:
/* adding check for constant expression */
if (!PFprop_const (L(p)->prop, col[1]) ||
ty[1] != aat_str ||
expr[1]->kind == sql_column_name)
- PFoops (OOPS_FATAL, "fn_contains works only with
constant "
+ PFoops (OOPS_FATAL, "fn_like works only with constant "
"string expressions");
-
res_expr = like (expr[0], expr[1]);
break;
+ case alg_fun_fn_similar_to:
+ res_expr = similar_to (expr[0], expr[1]); break;
/**< fn:ceiling */
case alg_fun_fn_ceiling:
res_expr = ceil (expr[0]); break;
diff -r dbec6606e6ec -r 36bf09df0b9c pathfinder/compiler/sql/sql.c
--- a/pathfinder/compiler/sql/sql.c Thu Jul 29 08:53:57 2010 +0200
+++ b/pathfinder/compiler/sql/sql.c Thu Jul 29 13:26:07 2010 +0200
@@ -870,6 +870,17 @@
}
/**
+ * Create a tree node representing the SQL99
+ * 'similar to' statement to compare a string with
+ * a certain pattern.
+ */
+PFsql_t *
+PFsql_similar_to (const PFsql_t *a, const PFsql_t *b)
+{
+ return wire2 (sql_similar_to, a, b);
+}
+
+/**
* Create a SQL tree node representing the in operator
*/
PFsql_t *
diff -r dbec6606e6ec -r 36bf09df0b9c pathfinder/compiler/sql/sqlprint.c
--- a/pathfinder/compiler/sql/sqlprint.c Thu Jul 29 08:53:57 2010 +0200
+++ b/pathfinder/compiler/sql/sqlprint.c Thu Jul 29 13:26:07 2010 +0200
@@ -70,7 +70,7 @@
}
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list