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