Update of /cvsroot/monetdb/pathfinder/compiler/sql
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv1296/compiler/sql
Modified Files:
Tag: xquery-decomposition
lalg2sql.brg
Log Message:
propagated changes up to Thursday Jan 17 2008
from the development trunk to the xquery-decomposition branch
Index: lalg2sql.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/sql/lalg2sql.brg,v
retrieving revision 1.102
retrieving revision 1.102.2.1
diff -u -d -r1.102 -r1.102.2.1
--- lalg2sql.brg 11 Jan 2008 17:15:41 -0000 1.102
+++ lalg2sql.brg 17 Jan 2008 08:36:42 -0000 1.102.2.1
@@ -195,6 +195,7 @@
roots_ (twig (Twig))) = 5 (10);
Query: serialize_seq (Frag, empty_tbl) = 6 (10);
Query: serialize_rel (Rel) = 7 (10);
+Query: serialize_rel (empty_tbl) = 8 (10);
Rel: lit_tbl = 9 (10);
Rel: ref_tbl = 10 (10);
Rel: attach (Rel) = 11 (10);
@@ -671,6 +672,17 @@
return false;
}
+bool
+column_eq (PFsql_col_t *a, PFsql_col_t *b)
+{
+ if (a->id == PF_SQL_COLUMN_SPECIAL &&
+ b->id == PF_SQL_COLUMN_SPECIAL)
+ return (a->spec == b->spec);
+ else
+ return (a->att == b->att) &&
+ (a->ty == b->ty);
+}
+
/**
* Transforms an expression into a selectlist statement.
*/
@@ -682,12 +694,18 @@
/* we have a different strategy when our item is boolean */
if (col->sem.column.name->ty == aat_bln)
- n = (n->kind == sql_column_name)?
+ n = (n->kind == sql_column_name ||
+ n->kind == sql_lit_int)?
n:
case_ (when (n, lit_int (1)), else_ (lit_int (0)));
if (n->kind == sql_column_name)
- return n;
+ {
+ if (column_eq (n->sem.column.name, col->sem.column.name))
+ return n;
+ else
+ return column_assign (n, col);
+ }
else
return column_assign (n, col);
}
@@ -2241,6 +2259,68 @@
}
break;
+ /* Query: serialize_rel(empty_tbl) */
+ case 8:
+ {
+ /*
+ Let's generate a pseudo-query whose result is an empty table:
+
+ SELECT -1 AS iter_nat, -1 AS pos_nat, ... AS item_...
+ FROM sysibm.sysdummy1 AS a0000
+ WHERE 1 = 0;
+ */
+
+ PFsql_t *selectlist = NULL;
+ PFalg_schema_t schema = p->schema;
+ int count = schema.count;
+ for(int i = 0; i < count; i++)
+ {
+ PFalg_schm_item_t schemaItem = schema.items[i];
+
+ PFalg_att_t columnName = schemaItem.name;
+ PFalg_simple_type_t columnType = schemaItem.type;
+
+ PFsql_t* columnPseudoVal;
+ switch (columnType) {
+ case aat_nat: columnPseudoVal = lit_int (-1); break;
+ case aat_int: columnPseudoVal = lit_int (-1); break;
+ case aat_str: columnPseudoVal = lit_str (""); break;
+ case aat_dec: columnPseudoVal = lit_dec (-1); break;
+ default: columnPseudoVal = lit_int (-1); break;
+ }
+
+ selectlist =
+ select_list (
+ selectlist,
+ column_assign (
+ columnPseudoVal,
+ column_name(
+ new_col (
+ columnName,
+ columnType))));
+
+ }
+
+ /* call a helper function that does the 'real' job */
+ PFsql_t* final_query = PFsql_select (
+ false,
+ selectlist,
+ from_list(
+ alias_bind (
+ schema_table_name (
+ "sysibm",
+ table_name (PF_SQL_TABLE_SYSDUMMY1)),
+ alias (new_alias ()))),
+ where_list (
+ eq (lit_int (1), lit_int (0))),
+ NULL,
+ NULL);
+
+
+ sql_stmts = root (nil (), final_query);
+ }
+ break;
+
/* Rel: lit_tbl */
case 9:
if (p->sem.lit_tbl.count == 1) {
@@ -3542,6 +3622,7 @@
p->sem.sort.part,
type_of (L(p), p->sem.sort.part))));
+ if (srtbylist) orderby = order_by (srtbylist);
col_env_add (COLMAP(p),
p->sem.sort.res,
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins