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