summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <ramil@mysql.com>2005-09-22 11:39:01 +0500
committerunknown <ramil@mysql.com>2005-09-22 11:39:01 +0500
commit479ef8f76a5cf724c84b69a681e6378d910fca84 (patch)
tree15b2deb87d6e49ae993329e70c8db4523a9585ed
parentff50190af19ec160031b34e1a81c91f8095d7982 (diff)
parent3e978f8573e4b84667ad4696cabd8b6ef6050122 (diff)
downloadmariadb-git-479ef8f76a5cf724c84b69a681e6378d910fca84.tar.gz
Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/usr/home/ram/work/5.0.b11553 sql/sql_yacc.yy: Auto merged
-rw-r--r--sql/sql_yacc.yy63
1 files changed, 42 insertions, 21 deletions
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 78f93a04981..f28fbe5c803 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -4779,27 +4779,48 @@ simple_expr:
$$= new Item_func_sp(Lex->current_context(), name);
lex->safe_to_cache_query=0;
}
- | IDENT_sys '(' udf_expr_list ')'
+ | IDENT_sys '('
{
#ifdef HAVE_DLOPEN
- udf_func *udf;
+ udf_func *udf= 0;
+ if (using_udf_functions &&
+ (udf= find_udf($1.str, $1.length)) &&
+ udf->type == UDFTYPE_AGGREGATE)
+ {
+ LEX *lex= Lex;
+ if (lex->current_select->inc_in_sum_expr())
+ {
+ yyerror(ER(ER_SYNTAX_ERROR));
+ YYABORT;
+ }
+ }
+ $<udf>$= udf;
+#endif
+ }
+ udf_expr_list ')'
+ {
+#ifdef HAVE_DLOPEN
+ udf_func *udf= $<udf>3;
SELECT_LEX *sel= Select;
- if (using_udf_functions && (udf=find_udf($1.str, $1.length)))
+ if (udf)
{
+ if (udf->type == UDFTYPE_AGGREGATE)
+ Select->in_sum_expr--;
+
switch (udf->returns) {
case STRING_RESULT:
if (udf->type == UDFTYPE_FUNCTION)
{
- if ($3 != NULL)
- $$ = new Item_func_udf_str(udf, *$3);
+ if ($4 != NULL)
+ $$ = new Item_func_udf_str(udf, *$4);
else
$$ = new Item_func_udf_str(udf);
}
else
{
- if ($3 != NULL)
- $$ = new Item_sum_udf_str(udf, *$3);
+ if ($4 != NULL)
+ $$ = new Item_sum_udf_str(udf, *$4);
else
$$ = new Item_sum_udf_str(udf);
}
@@ -4807,15 +4828,15 @@ simple_expr:
case REAL_RESULT:
if (udf->type == UDFTYPE_FUNCTION)
{
- if ($3 != NULL)
- $$ = new Item_func_udf_float(udf, *$3);
+ if ($4 != NULL)
+ $$ = new Item_func_udf_float(udf, *$4);
else
$$ = new Item_func_udf_float(udf);
}
else
{
- if ($3 != NULL)
- $$ = new Item_sum_udf_float(udf, *$3);
+ if ($4 != NULL)
+ $$ = new Item_sum_udf_float(udf, *$4);
else
$$ = new Item_sum_udf_float(udf);
}
@@ -4823,15 +4844,15 @@ simple_expr:
case INT_RESULT:
if (udf->type == UDFTYPE_FUNCTION)
{
- if ($3 != NULL)
- $$ = new Item_func_udf_int(udf, *$3);
+ if ($4 != NULL)
+ $$ = new Item_func_udf_int(udf, *$4);
else
$$ = new Item_func_udf_int(udf);
}
else
{
- if ($3 != NULL)
- $$ = new Item_sum_udf_int(udf, *$3);
+ if ($4 != NULL)
+ $$ = new Item_sum_udf_int(udf, *$4);
else
$$ = new Item_sum_udf_int(udf);
}
@@ -4839,15 +4860,15 @@ simple_expr:
case DECIMAL_RESULT:
if (udf->type == UDFTYPE_FUNCTION)
{
- if ($3 != NULL)
- $$ = new Item_func_udf_decimal(udf, *$3);
+ if ($4 != NULL)
+ $$ = new Item_func_udf_decimal(udf, *$4);
else
$$ = new Item_func_udf_decimal(udf);
}
else
{
- if ($3 != NULL)
- $$ = new Item_sum_udf_decimal(udf, *$3);
+ if ($4 != NULL)
+ $$ = new Item_sum_udf_decimal(udf, *$4);
else
$$ = new Item_sum_udf_decimal(udf);
}
@@ -4863,8 +4884,8 @@ simple_expr:
sp_name *name= sp_name_current_db_new(YYTHD, $1);
sp_add_used_routine(lex, YYTHD, name, TYPE_ENUM_FUNCTION);
- if ($3)
- $$= new Item_func_sp(Lex->current_context(), name, *$3);
+ if ($4)
+ $$= new Item_func_sp(Lex->current_context(), name, *$4);
else
$$= new Item_func_sp(Lex->current_context(), name);
lex->safe_to_cache_query=0;