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

Modified Files:
        sql.c lalg2sql.brg sqlprint.c 
Log Message:
-- Introduced SQL code generation for la_ref_tbl and la_serialize_rel (The two 
new recently introduced logical algebra ops).

Index: sql.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/sql/sql.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- sql.c       27 Nov 2007 20:23:29 -0000      1.41
+++ sql.c       27 Nov 2007 21:26:45 -0000      1.42
@@ -257,6 +257,31 @@
 }
 
 /**
+ * Construct a SQL tree node representing a reference to a 
+ * column of an external relation. 
+ */
+PFsql_t *
+PFsql_ref_column_name (PFsql_aident_t alias, char* name)
+{
+    PFsql_t *ret = leaf (sql_ref_column_name);
+    ret->sem.column.alias = alias;
+    ret->sem.ref_column_name.name = PFstrdup(name);
+    return ret;
+}
+
+/**
+ * Construct a SQL tree node representing a reference to an 
+ * external relation. 
+ */
+PFsql_t *
+PFsql_ref_table_name (char* name)
+{
+    PFsql_t *ret = leaf (sql_ref_tbl_name);
+    ret->sem.ref_tbl.name = PFstrdup(name);
+    return ret;
+}
+
+/**
  * Construct a SQL tree node representing a SQL `correlation name'.
  */
 PFsql_t *

Index: lalg2sql.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/sql/lalg2sql.brg,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -d -r1.93 -r1.94
--- lalg2sql.brg        26 Nov 2007 20:41:45 -0000      1.93
+++ lalg2sql.brg        27 Nov 2007 21:26:45 -0000      1.94
@@ -82,7 +82,7 @@
                                 tree.) */
 %term lit_tbl         =  4 /**< literal table */
 %term empty_tbl       =  5 /**< empty literal table */
-%term ref_table       =  6 /**< referenced table */
+%term ref_tbl         =  6 /**< referenced table */
 %term attach          =  7 /**< attach constant column */
 %term cross           =  8 /**< cross product (Cartesian product) */
 %term eqjoin          =  9 /**< equi-join */
@@ -186,16 +186,18 @@
                 empty_frag, fragment (twig (Twig))),
             roots_ (twig (Twig)))                    =   5 (10);
 Query:  serialize_seq (Frag, empty_tbl)              =   6 (10);
+Query:  serialize_rel (Rel)                          =   7 (10);
 Rel:    lit_tbl                                      =   9 (10);
-Rel:    attach (Rel)                                 =  10 (10);
+Rel:    ref_tbl                                      =  10 (10);
+Rel:    attach (Rel)                                 =  11 (10);
 
-Rel:    cross (Rel, Rel)                             =  11 (10);
-Rel:    eqjoin (Rel, Rel)                            =  12 (10);
-Rel:    semijoin (Rel, Rel)                          =  13 (10);
-Rel:    thetajoin (Rel, Rel)                         =  14 (10);
-Rel:    project (Rel)                                =  15 (10);
-Rel:    select_ (Rel)                                =  16 (10);
-Rel:    pos_select (Rel)                             =  17 (10);
+Rel:    cross (Rel, Rel)                             =  12 (10);
+Rel:    eqjoin (Rel, Rel)                            =  13 (10);
+Rel:    semijoin (Rel, Rel)                          =  14 (10);
+Rel:    thetajoin (Rel, Rel)                         =  15 (10);
+Rel:    project (Rel)                                =  16 (10);
+Rel:    select_ (Rel)                                =  17 (10);
+Rel:    pos_select (Rel)                             =  18 (10);
 
 Rel:    disjunion (Rel, Rel)                         =  20 (10);
 Rel:    intersect (Rel, Rel)                         =  21 (10);
@@ -1664,13 +1666,13 @@
 
     switch (rule) {
         /* Rel:    cross (Rel, Rel) */
-        case 11:
-        /* Rel:    eqjoin (Rel, Rel) */
         case 12:
-        /* Rel:    semijoin (Rel, Rel) */
+        /* Rel:    eqjoin (Rel, Rel) */
         case 13:
-        /* Rel:    thetajoin (Rel, Rel) */
+        /* Rel:    semijoin (Rel, Rel) */
         case 14:
+        /* Rel:    thetajoin (Rel, Rel) */
+        case 15:
         /* Rel:    string_join (Rel, Rel) */
         case 43:
         /* Rel:    cond_err (Rel, Rel) */
@@ -2155,6 +2157,49 @@
             assert (!"missing");
             break;
 
+
+        /* Query:  serialize_rel(Rel) */
+        case 7:
+        {
+    
+
+            /* 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 ()));
+            */
+
+    
+            /* 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);
+    
+                
+            /* Check if there are already common-table expressions
+               or we have a standalone query */
+            if (sql_stmts)
+                /* sql_stmts = root (ser_info, with (sql_stmts, final_query)); 
*/
+                sql_stmts = root (nil (), with (sql_stmts, final_query));
+               else
+                /* sql_stmts = root (ser_info, final_query); */
+                sql_stmts = root (nil (), final_query);
+    
+        }
+        break;
+
+
+
+
+
         /* Rel:    lit_tbl */
         case 9:
             if (p->sem.lit_tbl.count == 1) {
@@ -2260,8 +2305,50 @@
 
             break;
 
-        /* Rel:    attach (Rel) */
+
+
+        /* Rel:  ref_tbl */
         case 10:
+        {
+            PFsql_aident_t tabalias = new_alias();
+
+            /* add the tables "external"/"real" name to the fromlist */
+            from_list_add (FROMLIST(p),
+                           ref_table_name (p->sem.ref_tbl.name),
+                           tabalias);
+
+            /* lookup the "internal" column names (and types) in the 
+               schema info */
+            PFalg_schema_t schema = p->schema;
+            /* lookup the "external"/"real" column names in the 
+               semantical info */
+            PFarray_t* externalCNames = p->sem.ref_tbl.tatts;
+
+            /* iterate the schema and generate a column-mapping for each
+               "internal"-"external"-column-name-pair */
+            int count = schema.count;
+            for(int i = 0; i < count; i++)
+            {
+                PFalg_schm_item_t schemaItem = schema.items[i];
+
+                PFalg_att_t columnNameInternal = schemaItem.name;
+                char* columnNameExternal = 
+                    *(char**) PFarray_at (externalCNames, i);
+                PFalg_simple_type_t columnType = schemaItem.type;
+
+                col_env_add (COLMAP(p),
+                         columnNameInternal,
+                         columnType,
+                         ref_column_name(tabalias, columnNameExternal)
+                           );
+            }
+        }
+        break;
+
+
+
+        /* Rel:    attach (Rel) */
+        case 11:
             /* copy all existing column, from, and where lists */
             copy_cols_from_where (p, L(p));
 
@@ -2273,11 +2360,11 @@
             break;
 
         /* Rel:    cross (Rel, Rel) */
-        case 11:
-        /* Rel:    eqjoin (Rel, Rel) */
         case 12:
+        /* Rel:    eqjoin (Rel, Rel) */
+        case 13:
         /* Rel:    thetajoin (Rel, Rel) */
-        case 14:
+        case 15:
         {
             assert (kids[0] && nts[0]);
             assert (kids[1] && nts[1]);
@@ -2389,7 +2476,7 @@
         }       break;
 
         /* Rel:    semijoin (Rel, Rel) */
-        case 13:
+        case 14:
         {
             assert (kids[0] && nts[0]);
             assert (kids[1] && nts[0]);
@@ -2469,7 +2556,7 @@
         }   break;
 
         /* Rel:    project (Rel) */
-        case 15:
+        case 16:
         {
             sql_column_env_t entry;
 
@@ -2495,7 +2582,7 @@
         }   break;
 
         /* Rel:    select_ (Rel) */
-        case 16:
+        case 17:
         {
             PFsql_t *sqlnode;
 
@@ -2520,7 +2607,7 @@
         }   break;
 
         /* Rel:    pos_select (Rel) */
-        case 17:
+        case 18:
             /* create a special translation for the positional
                predicates [1] and [last()] */
             if (p->schema.count <= 2 &&
@@ -4731,7 +4818,7 @@
  
     assert (n);
  
-    if (n->kind != la_serialize_seq)
+    if ((n->kind != la_serialize_seq) && (n->kind != la_serialize_rel))
         PFoops (OOPS_FATAL,
                 "SQL code generation can only "
                 "cope with result sequences.");

Index: sqlprint.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/sql/sqlprint.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- sqlprint.c  26 Nov 2007 09:12:31 -0000      1.40
+++ sqlprint.c  27 Nov 2007 21:26:45 -0000      1.41
@@ -75,6 +75,8 @@
       [sql_tbl_def]           = "tbl_def",
       [sql_schema_tbl_name]   = "schema_tbl_name",
       [sql_tbl_name]          = "tbl_name",
+      [sql_ref_tbl_name]      = "ref_tbl_name",
+      [sql_ref_column_name]   = "ref_column_name",
       [sql_alias]             = "alias",
       [sql_column_list]       = "column_list",
       [sql_column_name]       = "column_name",
@@ -190,18 +192,45 @@
 static void
 print_column_name (PFsql_t *n)
 {
-    assert (n->kind == sql_column_name);
+    assert ((n->kind == sql_column_name) || (n->kind == sql_ref_column_name));
     
     if (n->sem.column.alias != PF_SQL_ALIAS_UNBOUND)
+    {
         PFprettyprintf (
             "%s.", 
             PFsql_alias_name_str (n->sem.column.alias));
     
-    PFprettyprintf (
-        "%s",
-        PFsql_column_name_str (n->sem.column.name));
+     }
+
+
+    switch (n->kind)
+    {
+        case  sql_column_name:
+
+            PFprettyprintf (
+                "%s",
+                PFsql_column_name_str (n->sem.column.name));
+            break;
+
+        case  sql_ref_column_name:
+
+            PFprettyprintf (
+                "%s",
+                n->sem.ref_column_name.name);    
+            break;
+
+    default:
+
+         PFoops (OOPS_FATAL,
+                    "SQL grammar conflict. (Expected: column reference; "
+                    "Got: %s)", ID[n->kind]);
+
+    }
+   
 }
 
+
+
 static void
 print_column_name_list (PFsql_t *n)
 {
@@ -487,7 +516,7 @@
 
 static void
 print_statement (PFsql_t *n)
-{
+{           
     switch (n->kind) {
         case sql_sortkey_item:
             print_statement (L(n));
@@ -548,9 +577,12 @@
             print_window_clause (R(n));
             PFprettyprintf ("%c)", END_BLOCK);
             break;
-    
+
+        case sql_ref_column_name:
         case sql_column_name:
-            print_column_name (n);
+
+                  print_column_name (n);
+      
             break;
 
         case sql_lit_int:
@@ -591,7 +623,7 @@
         default:
             PFoops (OOPS_FATAL,
                     "SQL grammar conflict. (Expected: statement; "
-                    "Got: %s)", ID[n->kind]);
+                    "Got: %s), %i", ID[n->kind], n->kind);
     }
 }
 
@@ -665,8 +697,12 @@
                 print_tablereference (f, L(n), i);
             fprintf (f, " AS %s", PFsql_alias_name_str (R(n)->sem.alias.name));
             break;
+        case sql_ref_tbl_name:
+            /* prettyprint ref table name */
+            fprintf (f, "%s", n->sem.ref_tbl.name);
+            break;
 
-        case sql_tbl_name:
+    case sql_tbl_name:
             /* prettyprint table name */
             fprintf (f, "%s", PFsql_table_str (n->sem.tbl.name));
             break;
@@ -929,8 +965,8 @@
     assert (n);
     assert (n->kind == sql_root);
 
-    assert (L(n));
-    assert (R(n));    
+    assert (L(n)); /* serialize info */
+    assert (R(n)); /* common table expression */   
 
     /* first print all schema information */
     print_schema_information (f, L(n));


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
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