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

Reply via email to