Update of /cvsroot/monetdb/sql/src/server
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv16545

Modified Files:
        sql_parser.mx sql_select.mx sql_xml.mx 
Log Message:
added more of the SQL/XML publishing functions


Index: sql_xml.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_xml.mx,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- sql_xml.mx  2 Sep 2007 20:07:01 -0000       1.3
+++ sql_xml.mx  9 Sep 2007 09:35:24 -0000       1.4
@@ -210,6 +210,98 @@
        return res;
 }
 
+static stmt *
+sql_xmlcomment(mvc *sql, scope *scp, symbol *sym, group *grp, stmt *subset, 
int f, exp_kind knd ) 
+{
+       dnode *d = sym->data.lval->h;
+       symbol *comment = d->data.sym;
+       lng returning = d->next->data.ival;
+       stmt *comment_st;
+
+       (void)returning;
+       comment_st = sql_value_exp(sql, scp, comment, grp, subset, f, knd); 
+       if (!comment_st)
+               return NULL;
+       return sql_unop_(sql, scp, NULL, "comment", comment_st); 
+}
+
+static stmt *
+sql_xmlconcat(mvc *sql, scope *scp, symbol *sym, group *grp, stmt *subset, int 
f, exp_kind knd ) 
+{
+       dnode *d = sym->data.lval->h;
+       dnode *en = d->data.lval->h;
+       lng returning = d->next->data.ival;
+       stmt *concat_st, *res = NULL;
+
+       (void)returning;
+       for (; en; en = en->next) {
+               symbol *c = en->data.sym;
+               concat_st = sql_value_exp(sql, scp, c, grp, subset, f, knd); 
+               if (!concat_st) {
+                       cond_stmt_destroy(res);
+                       return NULL;
+               }
+               if (res) 
+                       res = sql_binop_(sql, scp, NULL, "concat", res, 
concat_st); 
+               else
+                       res = concat_st;
+       }       
+       return res;
+}
+
+static stmt *
+sql_xmldocument(mvc *sql, scope *scp, symbol *sym, group *grp, stmt *subset, 
int f, exp_kind knd ) 
+{
+       dnode *d = sym->data.lval->h;
+       symbol *val = d->data.sym;
+       lng returning = d->next->data.ival;
+       stmt *val_st;
+
+       (void)returning;
+       val_st = sql_value_exp(sql, scp, val, grp, subset, f, knd); 
+       if (!val_st)
+               return NULL;
+       return sql_unop_(sql, scp, NULL, "document", val_st); 
+}
+
+static stmt *
+sql_xmlpi(mvc *sql, scope *scp, symbol *sym, group *grp, stmt *subset, int f, 
exp_kind knd ) 
+{
+       dnode *d = sym->data.lval->h;
+       char *target = d->data.sval;
+       symbol *val = d->next->data.sym;
+       lng returning = d->next->next->data.ival;
+       stmt *target_st, *val_st;
+
+       (void)returning;
+       target_st = stmt_atom_string(_strdup(target));
+       if (!val)
+               val_st = sql_value_exp(sql, scp, val, grp, subset, f, knd); 
+       else
+               val_st = stmt_atom(atom_general(&str_type, NULL, 0));
+       if (!val_st) {
+               cond_stmt_destroy(target_st);
+               return NULL;
+       }
+       return sql_binop_(sql, scp, NULL, "pi", target_st, val_st); 
+}
+
+/* cast string too xml */
+static stmt *
+sql_xmltext(mvc *sql, scope *scp, symbol *sym, group *grp, stmt *subset, int 
f, exp_kind knd ) 
+{
+       dnode *d = sym->data.lval->h;
+       symbol *text = d->data.sym;
+       lng returning = d->next->data.ival;
+       stmt *text_st;
+
+       (void)returning;
+       text_st = sql_value_exp(sql, scp, text, grp, subset, f, knd); 
+       if (!text_st || (text_st = check_types(sql, &xml_type, text_st, 
type_equal)) == NULL) 
+               return NULL;
+       return text_st;
+}
+
 stmt *
 sql_xml(mvc *sql, scope *scp, symbol *s, group *grp, stmt *subset, int f, 
exp_kind knd)
 {
@@ -230,6 +322,21 @@
        case SQL_XMLFOREST: 
                ret = sql_xmlforest(sql, scp, s, grp, subset, f, knd);
                break;
+       case SQL_XMLCOMMENT: 
+               ret = sql_xmlcomment(sql, scp, s, grp, subset, f, knd);
+               break;
+       case SQL_XMLCONCAT: 
+               ret = sql_xmlconcat(sql, scp, s, grp, subset, f, knd);
+               break;
+       case SQL_XMLDOCUMENT: 
+               ret = sql_xmldocument(sql, scp, s, grp, subset, f, knd);
+               break;
+       case SQL_XMLPI: 
+               ret = sql_xmlpi(sql, scp, s, grp, subset, f, knd);
+               break;
+       case SQL_XMLTEXT: 
+               ret = sql_xmltext(sql, scp, s, grp, subset, f, knd);
+               break;
        default:
                return sql_error(sql, 01, "XML statement unknown 
symbol(%ld)->token = %s", (long) s, token2string(s->token));
        }

Index: sql_parser.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_parser.mx,v
retrieving revision 1.255
retrieving revision 1.256
diff -u -d -r1.255 -r1.256
--- sql_parser.mx       7 Sep 2007 20:09:21 -0000       1.255
+++ sql_parser.mx       9 Sep 2007 09:35:23 -0000       1.256
@@ -412,6 +412,7 @@
        XML_aggregate
        XML_value_expression
        XML_primary
+       opt_comma_string_value_expression
 
 %type <type>
        data_type
@@ -449,6 +450,7 @@
        forest_element_name
        XML_namespace_URI
        XML_namespace_prefix
+       XML_PI_target
 
 %type <l>
        passwd_schema
@@ -528,6 +530,7 @@
        XML_namespace_declaration_item
        XML_regular_namespace_declaration_item
        XML_default_namespace_declaration_item
+       XML_value_expression_list
 
 %type <ival>
        opt_port
@@ -4413,12 +4416,14 @@
 schema_name_list: name_commalist ;
 
 XML_value_expression:
-  XML_primary
+  XML_primary  
   ;
 
 XML_value_expression_list:
-    XML_value_expression
-  | XML_value_expression ',' XML_value_expression_list
+    XML_value_expression       
+               { $$ = append_symbol(L(), $1); }
+  | XML_value_expression_list ',' XML_value_expression
+               { $$ = append_symbol($1, $3); }
   ;
 
 XML_primary:
@@ -4439,18 +4444,27 @@
   ;
 
 XML_comment:
-  XMLCOMMENT '(' value_exp /* should be a string */ opt_XML_returning_clause 
')' 
-       { $$ = NULL; }
+  XMLCOMMENT '(' value_exp /* should be a string */ opt_XML_returning_clause 
')'
+       { dlist *l = L();
+         append_symbol(l, $3);
+         append_int(l, $4);
+         $$ = _symbol_create_list( SQL_XMLCOMMENT, l); }
  ;
 
 XML_concatenation:
   XMLCONCAT '(' XML_value_expression_list opt_XML_returning_clause ')'
-       { $$ = NULL; }
+       { dlist *l = L();
+         append_list(l, $3);
+         append_int(l, $4);
+         $$ = _symbol_create_list( SQL_XMLCONCAT, l); } 
   ;
 
 XML_document:
   XMLDOCUMENT '(' XML_value_expression opt_XML_returning_clause ')'
-       { $$ = NULL; }
+       { dlist *l = L();
+         append_symbol(l, $3);
+         append_int(l, $4);
+         $$ = _symbol_create_list( SQL_XMLDOCUMENT, l); } 
 
 XML_element:
   XMLELEMENT '(' sqlNAME XML_element_name 
@@ -4623,7 +4637,11 @@
   XMLPI '(' sqlNAME XML_PI_target
        opt_comma_string_value_expression
        opt_XML_returning_clause ')'
-       { $$ = NULL; }
+       { dlist *l = L();
+         append_string(l, $4);
+         append_symbol(l, $5);
+         append_int(l, $6);
+         $$ = _symbol_create_list( SQL_XMLPI, l); }
   ;
 
 XML_PI_target:
@@ -4631,8 +4649,9 @@
   ;
 
 opt_comma_string_value_expression:
-       /* empty */
+       /* empty */     { $$ = NULL; }
   | ',' value_exp /* should be a string */
+                       { $$ = $2; }
   ;
 
 XML_query:
@@ -4689,7 +4708,10 @@
 XML_text:
   XMLTEXT '(' value_exp /* should be a string */
       opt_XML_returning_clause ')'
-       { $$ = NULL; }
+       { dlist *l = L();
+         append_symbol(l, $3);
+         append_int(l, $4);
+         $$ = _symbol_create_list( SQL_XMLTEXT, l); } 
 
 XML_validate:
   XMLVALIDATE '('
@@ -4727,8 +4749,6 @@
   XMLBINARY [ USING ] { BASE64 | HEX }
 */
 
-
-
 XML_namespace_declaration:
   XMLNAMESPACES '(' XML_namespace_declaration_item_list ')'
        { $$ = _symbol_create_list(SQL_XMLNAMESPACES, $3); }

Index: sql_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_select.mx,v
retrieving revision 1.200
retrieving revision 1.201
diff -u -d -r1.200 -r1.201
--- sql_select.mx       2 Sep 2007 20:07:01 -0000       1.200
+++ sql_select.mx       9 Sep 2007 09:35:24 -0000       1.201
@@ -67,6 +67,7 @@
 extern stmt *sql_compare(mvc *sql, scope *scp, stmt *ls, stmt *rs, char 
*compare_op, int f);
 extern stmt *complex_find_subset(stmt *subset, stmt *t);
 extern stmt *sql_and(mvc *sql, scope *scp, stmt *ls, stmt *rs, int f);
+extern stmt *sql_unop_(mvc *sql, scope *scp, sql_schema *s, char *fname, stmt 
*rs);
 extern stmt *sql_binop_(mvc *sql, scope *scp, sql_schema *s, char *fname, stmt 
*ls, stmt *rs);
 extern stmt *sql_Nop_(mvc *sql, char *fname, stmt *a1, stmt *a2, stmt *a3, 
stmt *a4);
 extern stmt *find_pivot(stmt *subset, stmt *t);
@@ -1131,24 +1132,13 @@
        return NULL;
 }
 
-static stmt *
-sql_unop(mvc *sql, scope *scp, symbol *se, group *grp, stmt *subset, int fs)
+stmt *
+sql_unop_(mvc *sql, scope *scp, sql_schema *s, char *fname, stmt *rs)
 {
-       dnode *l = se->data.lval->h;
-       char *fname = qname_fname(l->data.lval); 
-       char *sname = qname_schema(l->data.lval);
-       sql_subfunc *f = NULL;
-       sql_subtype *rt = NULL;
-       exp_kind ek = {type_value, card_column, FALSE};
-       stmt *rs = sql_value_exp(sql, scp, l->next->data.sym, grp, subset, fs, 
ek);
-       sql_schema *s = sql->session->schema;
+       sql_subtype *rt = tail_type(rs);
+       sql_subfunc *f = sql_bind_func(s, fname, rt, NULL);
 
-       if (!rs)
-               return NULL;
-       rt = tail_type(rs);
-       if (sname) 
-               s = mvc_bind_schema(sql, sname);
-       f = sql_bind_func(s, fname, rt, NULL);
+       (void)scp;
        /* try to find the function without a type, and convert
         * the value to the type needed by this function!
         */
@@ -1177,6 +1167,23 @@
 }
 
 static stmt *
+sql_unop(mvc *sql, scope *scp, symbol *se, group *grp, stmt *subset, int fs)
+{
+       dnode *l = se->data.lval->h;
+       char *fname = qname_fname(l->data.lval); 
+       char *sname = qname_schema(l->data.lval);
+       exp_kind ek = {type_value, card_column, FALSE};
+       stmt *rs = sql_value_exp(sql, scp, l->next->data.sym, grp, subset, fs, 
ek);
+       sql_schema *s = sql->session->schema;
+
+       if (!rs)
+               return NULL;
+       if (sname) 
+               s = mvc_bind_schema(sql, sname);
+       return sql_unop_(sql, scp, s, fname, rs);
+}
+
+static stmt *
 sql_aggrop(mvc *sql, scope *scp, symbol *se, group *grp, stmt *subset, int f)
 {
        dlist *l = se->data.lval;
@@ -1775,6 +1782,11 @@
                return sql_case_exp(sql, scp, se, grp, subset, f);
        case SQL_XMLELEMENT:
        case SQL_XMLFOREST:
+       case SQL_XMLCOMMENT:
+       case SQL_XMLCONCAT:
+       case SQL_XMLDOCUMENT:
+       case SQL_XMLPI:
+       case SQL_XMLTEXT:
                return sql_xml(sql, scp, se, grp, subset, f, ek);
        default:
                return sql_logical_exp(sql, scp, se, grp, subset, f);


-------------------------------------------------------------------------
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-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to