Update of /cvsroot/monetdb/pathfinder/compiler/sql
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv20678

Modified Files:
        lalg2sql.brg 
Log Message:


-- Implementation of the serialize_rel operator.
-- Bugfixes regarding ref_column
-- Bugfix   in substitute_aliases


Index: lalg2sql.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/sql/lalg2sql.brg,v
retrieving revision 1.98
retrieving revision 1.99
diff -u -d -r1.98 -r1.99
--- lalg2sql.brg        8 Jan 2008 16:54:24 -0000       1.98
+++ lalg2sql.brg        9 Jan 2008 16:01:38 -0000       1.99
@@ -683,7 +683,7 @@
     if (col->sem.column.name->ty == aat_bln)
         n = case_ (when (n, lit_int (1)), else_ (lit_int (0)));
 
-    if (n->kind == sql_column_name)
+    if (n->kind == sql_column_name || n->kind == sql_ref_column_name)
         return n;
     else
         return column_assign (n, col);
@@ -730,12 +730,20 @@
     for (unsigned int i = 0; i < PFarray_last (col_env); i++) {
         sql_column_env_t * colitem =
             (sql_column_env_t *) PFarray_at (col_env, i);
-        if (colitem->expression->kind == sql_column_name)
+        if (colitem->expression->kind == sql_column_name) {
             colitem->expression =
                        ext_column_name (
                               ident,
                               colitem->expression->sem.column.name
                               );
+        } 
+        else if (colitem->expression->kind == sql_ref_column_name) {
+            colitem->expression =
+                       ref_column_name (
+                              ident,
+                              colitem->expression->sem.ref_column_name.name
+                              );
+        }
     }
 }
 
@@ -902,13 +910,20 @@
     for (unsigned int i = 0; i < PFSQL_OP_MAXCHILD && sqlnode->child[i]; i++)
         substitute_aliases_helper (sqlnode->child[i], map, map_count);
 
-    if (sqlnode->kind == sql_column_name &&
-        sqlnode->sem.column.alias != PF_SQL_ALIAS_UNBOUND)
+    if ((sqlnode->kind == sql_column_name &&
+        sqlnode->sem.column.alias != PF_SQL_ALIAS_UNBOUND)) {
+            for (unsigned int i = 0; i < map_count; i++)
+                if (map[i].old == sqlnode->sem.column.alias) {
+                    sqlnode->sem.column.alias = map[i].new;
+                    break;
+                }
+    } else if (sqlnode->kind == sql_ref_column_name) {
         for (unsigned int i = 0; i < map_count; i++)
-            if (map[i].old == sqlnode->sem.column.alias) {
-                sqlnode->sem.column.alias = map[i].new;
+            if (map[i].old == sqlnode->sem.ref_column_name.alias) {
+                sqlnode->sem.ref_column_name.alias = map[i].new;
                 break;
             }
+    } 
 }
 
 /**
@@ -929,11 +944,14 @@
     for (unsigned int i = 0; i < count; i++) {
         map[i].new = new_alias ();
         map[i].old = (from_list_at (FROMLIST(p), i)).alias->sem.alias.name;
-        (from_list_at (FROMLIST(p), i)).alias->sem.alias.name = map[i].new;
 
         /* Copy the expressions in the fromlist */
+        (from_list_at (FROMLIST(p), i)).alias
+            = duplicate ((from_list_at (FROMLIST(p), i)).alias);
         (from_list_at (FROMLIST(p), i)).table
             = duplicate ((from_list_at (FROMLIST(p), i)).table);
+
+        (from_list_at (FROMLIST(p), i)).alias->sem.alias.name = map[i].new;
     }
 
     for (unsigned int i = 0; i < PFarray_last (COLMAP(p)); i++) {
@@ -1044,7 +1062,8 @@
                 }
             } else
                 where_list_add (WHERELIST(p),
-                                between (PRE(step), add (PRE(ctx), lit_int 
(1)),
+                                between (PRE(step), add (PRE(ctx),
+                                         lit_int (1)),
                                          add (PRE(ctx), SIZE(ctx))));
             break;
 
@@ -2167,28 +2186,40 @@
         /* Query:  serialize_rel(Rel) */
         case 7:
         {
-    
+            PFla_op_t          *query      = L(p);
 
-            /* construct schema information for serialization */
-            /*
-            PFsql_t * ser_info = ser_info_item (
-                           ser_comment ("START SCHEMA INFORMATION **"
-                                        " DO NOT EDIT THESE LINES"),
-                           ser_info_item (
-                               ser_comment ("END SCHEMA INFORMATION **"
-                                            " DO NOT EDIT THESE LINES"),
-                       nil ()));
-            */
+            PFalg_att_t         iter       = p->sem.ser_rel.iter;
+            PFalg_simple_type_t iter_ty    = type_of (p, p->sem.ser_rel.iter);
+
+            PFalg_att_t         pos        = p->sem.ser_rel.pos;
+            PFalg_simple_type_t pos_ty     = type_of (p, p->sem.ser_rel.pos);
 
+            PFsql_t* orderbyITER = col_env_lookup (COLMAP(query),
+                                                   iter, iter_ty);
+            PFsql_t* orderbyPOS  = col_env_lookup (COLMAP(query), pos, pos_ty);
+
+            /* check if pos and iter column are literals */
+            orderbyITER = IS_LITERAL(orderbyITER)?NULL:orderbyITER;  
+            orderbyPOS = IS_LITERAL(orderbyPOS)?NULL:orderbyPOS;  
+
+            PFsql_t* orderby = NULL;
+
+            /* we don't have to use literals in our order by criterion */
+            if(orderbyITER && orderbyPOS)
+                orderby = sortkey_list (sortkey_item (orderbyITER, true),
+                                        sortkey_item (orderbyPOS, true));
+            else if(orderbyPOS) 
+                orderby = sortkey_list (sortkey_item (orderbyPOS, true));
+            else if(orderbyITER) 
+                orderby = sortkey_list (sortkey_item (orderbyITER, true));
     
             /* call a helper function that does the 'real' job */
             PFsql_t* final_query = PFsql_select (false,
-                   transform_selectlist (COLMAP(L(p))),
-                   transform_frommap (L(p)),
-                   transform_wheremap (L(p)),
-                   NULL,
-                   NULL);
-    
+                                       transform_selectlist (COLMAP(L(p))),
+                                       transform_frommap (L(p)),
+                                       transform_wheremap (L(p)),
+                                       orderby,
+                                       NULL);
                 
             /* Check if there are already common-table expressions
                or we have a standalone query */
@@ -2199,10 +2230,6 @@
         }
         break;
 
-
-
-
-
         /* Rel:    lit_tbl */
         case 9:
             if (p->sem.lit_tbl.count == 1) {
@@ -2308,8 +2335,6 @@
 
             break;
 
-
-
         /* Rel:  ref_tbl */
         case 10:
         {
@@ -2348,8 +2373,6 @@
         }
         break;
 
-
-
         /* Rel:    attach (Rel) */
         case 11:
             /* copy all existing column, from, and where lists */
@@ -3478,8 +3501,7 @@
                                        p->sem.sort.part,
                                        type_of (L(p), p->sem.sort.part))));
 
-            orderby = (srtbylist->kind == sql_nil)?NULL:order_by(srtbylist);
-
+            
             col_env_add (COLMAP(p),
                          p->sem.sort.res,
                          aat_nat,


-------------------------------------------------------------------------
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

Reply via email to