Update of /cvsroot/monetdb/pathfinder/compiler/sql
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv32686
Modified Files:
lalg2sql.brg sql.c
Log Message:
-- Integration of namespace handling in path steps
-- Bugfix: handling ref_column_names like normal sql_expression not like columns
Index: sql.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/sql/sql.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- sql.c 11 Jan 2008 11:04:06 -0000 1.46
+++ sql.c 11 Jan 2008 17:15:41 -0000 1.47
@@ -1292,19 +1292,20 @@
if (name->id == PF_SQL_COLUMN_SPECIAL)
switch (name->spec) {
- case sql_col_pre: return "pre";
- case sql_col_level: return "level";
- case sql_col_size: return "size";
- case sql_col_kind: return "kind";
- case sql_col_prop: return "prop";
- case sql_col_nameid: return "nameid";
- case sql_col_value: return "value";
- case sql_col_name: return "name";
- case sql_col_twig_pre: return "twig_pre";
- case sql_col_iter: return "iter";
- case sql_col_pos: return "pos";
- case sql_col_guide: return "guide";
- case sql_col_max: return "max";
+ case sql_col_pre: return "pre";
+ case sql_col_level: return "level";
+ case sql_col_size: return "size";
+ case sql_col_kind: return "kind";
+ case sql_col_prop: return "prop";
+ case sql_col_nameid: return "nameid";
+ case sql_col_value: return "value";
+ case sql_col_name: return "name";
+ case sql_col_namespace: return "namespace";
+ case sql_col_twig_pre: return "twig_pre";
+ case sql_col_iter: return "iter";
+ case sql_col_pos: return "pos";
+ case sql_col_guide: return "guide";
+ case sql_col_max: return "max";
case sql_col_dist:
assert (name->ty < 100);
res = (char *) PFmalloc (7 * sizeof (char));
Index: lalg2sql.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/sql/lalg2sql.brg,v
retrieving revision 1.101
retrieving revision 1.102
diff -u -d -r1.101 -r1.102
--- lalg2sql.brg 11 Jan 2008 11:04:06 -0000 1.101
+++ lalg2sql.brg 11 Jan 2008 17:15:41 -0000 1.102
@@ -482,17 +482,18 @@
#define MAX_ column_name (special_col (sql_col_max))
#define DIST_ column_name (special_col (sql_col_dist))
-#define PRE(n) ext_column_name (n, special_col (sql_col_pre))
-#define SIZE(n) ext_column_name (n, special_col (sql_col_size))
-#define LEVEL(n) ext_column_name (n, special_col (sql_col_level))
-#define KIND(n) ext_column_name (n, special_col (sql_col_kind))
-#define NAME(n) ext_column_name (n, special_col (sql_col_name))
-#define GUIDE(n) ext_column_name (n, special_col (sql_col_guide))
-#define VALUE(n) ext_column_name (n, special_col (sql_col_value))
-#define TWIG_PRE(n) ext_column_name (n, special_col (sql_col_twig_pre))
-#define ITER(n) ext_column_name (n, special_col (sql_col_iter))
-#define POS(n) ext_column_name (n, special_col (sql_col_pos))
-#define MAX(n) ext_column_name (n, special_col (sql_col_max))
+#define PRE(n) ext_column_name (n, special_col (sql_col_pre))
+#define SIZE(n) ext_column_name (n, special_col (sql_col_size))
+#define LEVEL(n) ext_column_name (n, special_col (sql_col_level))
+#define KIND(n) ext_column_name (n, special_col (sql_col_kind))
+#define NAME(n) ext_column_name (n, special_col (sql_col_name))
+#define NAMESPACE(n) ext_column_name (n, special_col (sql_col_namespace))
+#define GUIDE(n) ext_column_name (n, special_col (sql_col_guide))
+#define VALUE(n) ext_column_name (n, special_col (sql_col_value))
+#define TWIG_PRE(n) ext_column_name (n, special_col (sql_col_twig_pre))
+#define ITER(n) ext_column_name (n, special_col (sql_col_iter))
+#define POS(n) ext_column_name (n, special_col (sql_col_pos))
+#define MAX(n) ext_column_name (n, special_col (sql_col_max))
/**
* Returns a new column name
@@ -685,7 +686,7 @@
n:
case_ (when (n, lit_int (1)), else_ (lit_int (0)));
- if (n->kind == sql_column_name || n->kind == sql_ref_column_name)
+ if (n->kind == sql_column_name)
return n;
else
return column_assign (n, col);
@@ -1198,78 +1199,84 @@
step_name (PFla_op_t *p, PFsql_aident_t step, PFty_t ty)
{
PFsql_t *name = NULL;
+ PFsql_t *namespace = NULL;
if (!PFty_subtype (ty, PFty_xs_anyElement ()) &&
!PFty_subtype (ty, PFty_xs_anyAttribute ()))
return;
- /* This is a test for element nodes */
+ /* This is a test for element nodes */
- /* This is just a generic kind test */
- if (PFty_subtype (PFty_xs_anyElement (), ty) ||
- PFty_subtype (PFty_xs_anyAttribute (), ty))
- return;
- /* test on local name only */
- else if (PFty_subtype (
- PFty_elem (
- PFqname (
- PFns_wild,
- PFqname_loc (PFty_name (PFty_defn (ty)))),
- PFty_xs_anyType ()),
- ty) ||
- PFty_subtype (
- PFty_attr (
- PFqname (
- PFns_wild,
- PFqname_loc (PFty_name (PFty_defn (ty)))),
- PFty_xs_anySimpleType ()),
- ty))
- name = lit_str (PFqname_loc (PFty_name (PFty_defn (ty))));
- /* test on namespace only */
- else if (PFty_subtype (
- PFty_elem (
- PFqname (
- PFqname_ns (PFty_name (PFty_defn (ty))),
- NULL),
- PFty_xs_anyType ()),
- ty) ||
- PFty_subtype (
- PFty_attr (
- PFqname (
- PFqname_ns (PFty_name (PFty_defn (ty))),
- NULL),
- PFty_xs_anySimpleType ()),
- ty))
- PFoops (OOPS_FATAL, "SQLgen: namespace tests only not supported");
- /* test on full QName */
- else if (PFty_subtype (
- PFty_elem (
- PFty_name (PFty_defn (ty)),
- PFty_xs_anyType ()),
- ty) ||
- PFty_subtype (
- PFty_attr (
- PFty_name (PFty_defn (ty)),
- PFty_xs_anySimpleType ()),
- ty))
- /* we simply ignore the namespace here */
- name = lit_str (PFqname_loc (PFty_name (PFty_defn (ty))));
- else
- /*
- * If we couldn't figure out what name test we got,
- * give up.
- *
- * NOTE: The surface language actually allows such tests. We
- * just cannot implement them (yet):
- *
- * doc("foo")/attribute::attribute(shoeSize, xs:integer)
- */
- PFoops (OOPS_FATAL,
- "SQLgen: Problem with an XPath step: cannot evaluate "
- "node test `%s'", PFty_str (ty));
+ /* This is just a generic kind test */
+ if (PFty_subtype (PFty_xs_anyElement (), ty) ||
+ PFty_subtype (PFty_xs_anyAttribute (), ty))
+ return;
+ /* test on local name only */
+ else if (PFty_subtype (
+ PFty_elem (
+ PFqname (
+ PFns_wild,
+ PFqname_loc (PFty_name (PFty_defn (ty)))),
+ PFty_xs_anyType ()),
+ ty) ||
+ PFty_subtype (
+ PFty_attr (
+ PFqname (
+ PFns_wild,
+ PFqname_loc (PFty_name (PFty_defn (ty)))),
+ PFty_xs_anySimpleType ()),
+ ty))
+ name = lit_str (PFqname_loc (PFty_name (PFty_defn (ty))));
+ /* test on namespace only */
+ else if (PFty_subtype (
+ PFty_elem (
+ PFqname (
+ PFqname_ns (PFty_name (PFty_defn (ty))),
+ NULL),
+ PFty_xs_anyType ()),
+ ty) ||
+ PFty_subtype (
+ PFty_attr (
+ PFqname (
+ PFqname_ns (PFty_name (PFty_defn (ty))),
+ NULL),
+ PFty_xs_anySimpleType ()),
+ ty))
+ /* get the URI of the given namespace */
+ namespace = lit_str (PFqname_uri (PFty_name (PFty_defn (ty))));
+ /* test on full QName */
+ else if (PFty_subtype (
+ PFty_elem (
+ PFty_name (PFty_defn (ty)),
+ PFty_xs_anyType ()),
+ ty) ||
+ PFty_subtype (
+ PFty_attr (
+ PFty_name (PFty_defn (ty)),
+ PFty_xs_anySimpleType ()),
+ ty)) {
+ /* get the uri of the given namespace */
+ namespace = lit_str (PFqname_uri (PFty_name (PFty_defn(ty))));
+ name = lit_str (PFqname_loc (PFty_name (PFty_defn (ty))));
+ }
+ else
+ /*
+ * If we couldn't figure out what name test we got,
+ * give up.
+ *
+ * NOTE: The surface language actually allows such tests. We
+ * just cannot implement them (yet):
+ *
+ * doc("foo")/attribute::attribute(shoeSize, xs:integer)
+ */
+ PFoops (OOPS_FATAL,
+ "SQLgen: Problem with an XPath step: cannot evaluate "
+ "node test `%s'", PFty_str (ty));
if (name)
where_list_add (WHERELIST(p), eq (NAME(step), name));
+ if (namespace)
+ where_list_add (WHERELIST(p), eq (NAMESPACE(step), namespace));
}
static void
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins