diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 8ac880982fb..f39fa3e7576 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -127,7 +127,6 @@ insert into t1 values (1); show open tables; Database Table In_use Name_locked test t1 0 0 -mysql proc 0 0 drop table t1; create table t1 (a int not null, b VARCHAR(10), INDEX (b) ) AVG_ROW_LENGTH=10 CHECKSUM=1 COMMENT="test" ENGINE=MYISAM MIN_ROWS=10 MAX_ROWS=100 PACK_KEYS=1 DELAY_KEY_WRITE=1 ROW_FORMAT=fixed; show create table t1; diff --git a/mysql-test/r/status.result b/mysql-test/r/status.result index 3134fdcf5ee..e9616232fa1 100644 --- a/mysql-test/r/status.result +++ b/mysql-test/r/status.result @@ -14,6 +14,6 @@ update t1 set n = 3; unlock tables; show status like 'Table_lock%'; Variable_name Value -Table_locks_immediate 4 +Table_locks_immediate 3 Table_locks_waited 1 drop table t1; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index b0381ae1d30..b66ec95d5ed 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -166,38 +166,6 @@ static int find_keyword(LEX *lex, uint len, bool function) lex->yylval->symbol.length=len; return symbol->tok; } - - LEX_STRING ls; - ls.str = (char *)tok; ls.length= len; - if (function && sp_function_exists(current_thd, &ls)) // QQ temp fix - { - lex->safe_to_cache_query= 0; - lex->yylval->lex_str.str= lex->thd->strmake((char*)lex->tok_start, len); - lex->yylval->lex_str.length= len; - return SP_FUNC; - } - -#ifdef HAVE_DLOPEN - udf_func *udf; - if (function && using_udf_functions && (udf=find_udf((char*) tok, len))) - { - lex->safe_to_cache_query=0; - lex->yylval->udf=udf; - switch (udf->returns) { - case STRING_RESULT: - return (udf->type == UDFTYPE_FUNCTION) ? UDF_CHAR_FUNC : UDA_CHAR_SUM; - case REAL_RESULT: - return (udf->type == UDFTYPE_FUNCTION) ? UDF_FLOAT_FUNC : UDA_FLOAT_SUM; - case INT_RESULT: - return (udf->type == UDFTYPE_FUNCTION) ? UDF_INT_FUNC : UDA_INT_SUM; - case ROW_RESULT: - default: - // This case should never be choosen - DBUG_ASSERT(0); - return 0; - } - } -#endif return 0; } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index f35b7f12fd1..b0513240f82 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -568,17 +568,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token SECOND_SYM %token SECOND_MICROSECOND_SYM %token SHARE_SYM -%token SP_FUNC %token SUBDATE_SYM %token SUBSTRING %token SUBSTRING_INDEX %token TRIM -%token UDA_CHAR_SUM -%token UDA_FLOAT_SUM -%token UDA_INT_SUM -%token UDF_CHAR_FUNC -%token UDF_FLOAT_FUNC -%token UDF_INT_FUNC %token UNIQUE_USERS %token UNIX_TIMESTAMP %token USER @@ -640,7 +633,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); LEX_HOSTNAME ULONGLONG_NUM field_ident select_alias ident ident_or_text UNDERSCORE_CHARSET IDENT_sys TEXT_STRING_sys TEXT_STRING_literal NCHAR_STRING opt_component key_cache_name - SP_FUNC ident_or_spfunc sp_opt_label + sp_opt_label %type opt_table_alias @@ -682,7 +675,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); simple_ident_nospvar simple_ident_q %type - expr_list sp_expr_list udf_expr_list udf_expr_list2 when_list + expr_list udf_expr_list udf_expr_list2 when_list ident_list ident_list_arg %type @@ -700,10 +693,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type join_table_list join_table -%type - UDF_CHAR_FUNC UDF_FLOAT_FUNC UDF_INT_FUNC - UDA_CHAR_SUM UDA_FLOAT_SUM UDA_INT_SUM - %type date_time_type; %type interval @@ -1029,7 +1018,7 @@ create: lex->name=$4.str; lex->create_info.options=$3; } - | CREATE udf_func_type FUNCTION_SYM ident_or_spfunc + | CREATE udf_func_type FUNCTION_SYM IDENT_sys { LEX *lex=Lex; lex->udf.name = $4; @@ -1097,11 +1086,6 @@ create: } ; -ident_or_spfunc: - IDENT_sys { $$= $1; } - | SP_FUNC { $$= $1; } - ; - create_function_tail: RETURNS_SYM udf_type UDF_SONAME_SYM TEXT_STRING_sys { @@ -1218,7 +1202,7 @@ sp_suid: ; call: - CALL_SYM ident_or_spfunc + CALL_SYM IDENT_sys { LEX *lex = Lex; @@ -3901,55 +3885,80 @@ simple_expr: { $$= new Item_func_round($3,$5,1); } | TRUE_SYM { $$= new Item_int((char*) "TRUE",1,1); } - | SP_FUNC '(' sp_expr_list ')' + | IDENT_sys '(' udf_expr_list ')' { - sp_add_fun_to_lex(Lex, $1); - if ($3) - $$= new Item_func_sp($1, *$3); + if (sp_function_exists(YYTHD, &$1)) + { + LEX *lex= Lex; + + sp_add_fun_to_lex(lex, $1); + if ($3) + $$= new Item_func_sp($1, *$3); + else + $$= new Item_func_sp($1); + } else - $$= new Item_func_sp($1); - } - | UDA_CHAR_SUM '(' udf_expr_list ')' - { - if ($3 != NULL) - $$ = new Item_sum_udf_str($1, *$3); - else - $$ = new Item_sum_udf_str($1); - } - | UDA_FLOAT_SUM '(' udf_expr_list ')' - { - if ($3 != NULL) - $$ = new Item_sum_udf_float($1, *$3); - else - $$ = new Item_sum_udf_float($1); - } - | UDA_INT_SUM '(' udf_expr_list ')' - { - if ($3 != NULL) - $$ = new Item_sum_udf_int($1, *$3); - else - $$ = new Item_sum_udf_int($1); - } - | UDF_CHAR_FUNC '(' udf_expr_list ')' - { - if ($3 != NULL) - $$ = new Item_func_udf_str($1, *$3); - else - $$ = new Item_func_udf_str($1); - } - | UDF_FLOAT_FUNC '(' udf_expr_list ')' - { - if ($3 != NULL) - $$ = new Item_func_udf_float($1, *$3); - else - $$ = new Item_func_udf_float($1); - } - | UDF_INT_FUNC '(' udf_expr_list ')' - { - if ($3 != NULL) - $$ = new Item_func_udf_int($1, *$3); - else - $$ = new Item_func_udf_int($1); + { +#ifdef HAVE_DLOPEN + udf_func *udf; + + if (using_udf_functions && (udf=find_udf($1.str, $1.length))) + { + switch (udf->returns) { + case STRING_RESULT: + if (udf->type == UDFTYPE_FUNCTION) + { + if ($3 != NULL) + $$ = new Item_func_udf_str(udf, *$3); + else + $$ = new Item_func_udf_str(udf); + } + else + { + if ($3 != NULL) + $$ = new Item_sum_udf_str(udf, *$3); + else + $$ = new Item_sum_udf_str(udf); + } + break; + case REAL_RESULT: + if (udf->type == UDFTYPE_FUNCTION) + { + if ($3 != NULL) + $$ = new Item_func_udf_float(udf, *$3); + else + $$ = new Item_func_udf_float(udf); + } + else + { + if ($3 != NULL) + $$ = new Item_sum_udf_float(udf, *$3); + else + $$ = new Item_sum_udf_float(udf); + } + break; + case INT_RESULT: + if (udf->type == UDFTYPE_FUNCTION) + { + if ($3 != NULL) + $$ = new Item_func_udf_int(udf, *$3); + else + $$ = new Item_func_udf_int(udf); + } + else + { + if ($3 != NULL) + $$ = new Item_sum_udf_int(udf, *$3); + else + $$ = new Item_sum_udf_int(udf); + } + break; + default: + YYABORT; + } + } +#endif /* HAVE_DLOPEN */ + } } | UNIQUE_USERS '(' text_literal ',' NUM ',' NUM ',' expr_list ')' { @@ -3997,10 +4006,6 @@ fulltext_options: | IN_SYM BOOLEAN_SYM MODE_SYM { $$= FT_BOOL; } ; -sp_expr_list: - /* empty */ { $$= NULL; } - | expr_list { $$= $1;}; - udf_expr_list: /* empty */ { $$= NULL; } | udf_expr_list2 { $$= $1;}