Merge bk-internal.mysql.com:/data0/bk/mysql-5.1
into bk-internal.mysql.com:/data0/bk/mysql-5.1-arch
This commit is contained in:
commit
37f7e29db2
@ -7,7 +7,7 @@ AC_INIT(sql/mysqld.cc)
|
|||||||
AC_CANONICAL_SYSTEM
|
AC_CANONICAL_SYSTEM
|
||||||
# The Docs Makefile.am parses this line!
|
# The Docs Makefile.am parses this line!
|
||||||
# remember to also change ndb version below and update version.c in ndb
|
# remember to also change ndb version below and update version.c in ndb
|
||||||
AM_INIT_AUTOMAKE(mysql, 5.1.14-beta)
|
AM_INIT_AUTOMAKE(mysql, 5.1.15-beta)
|
||||||
AM_CONFIG_HEADER(config.h)
|
AM_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
PROTOCOL_VERSION=10
|
PROTOCOL_VERSION=10
|
||||||
|
@ -786,6 +786,9 @@ sub command_line_setup () {
|
|||||||
{
|
{
|
||||||
# Only platforms that have native symlinks can use the vardir trick
|
# Only platforms that have native symlinks can use the vardir trick
|
||||||
$opt_mem= $opt_vardir;
|
$opt_mem= $opt_vardir;
|
||||||
|
# Delete the default directory in case it exists since we're going to create
|
||||||
|
# a new one later anyway, and the mkpath below throws a fatal error otherwise
|
||||||
|
eval { rmtree($default_vardir, 1, 1); };
|
||||||
mtr_report("Using 4.1 vardir trick");
|
mtr_report("Using 4.1 vardir trick");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -373,3 +373,104 @@ select yearweek();
|
|||||||
ERROR 42000: Incorrect parameter count in the call to native function 'yearweek'
|
ERROR 42000: Incorrect parameter count in the call to native function 'yearweek'
|
||||||
select yearweek(1, 2, 3);
|
select yearweek(1, 2, 3);
|
||||||
ERROR 42000: Incorrect parameter count in the call to native function 'yearweek'
|
ERROR 42000: Incorrect parameter count in the call to native function 'yearweek'
|
||||||
|
select abs(3);
|
||||||
|
abs(3)
|
||||||
|
3
|
||||||
|
select abs(3 AS three);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'abs'
|
||||||
|
select abs(3 three);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'abs'
|
||||||
|
select abs(3 AS "three");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'abs'
|
||||||
|
select abs(3 "three");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'abs'
|
||||||
|
set @bar="bar";
|
||||||
|
set @foobar="foobar";
|
||||||
|
select instr("foobar", "bar");
|
||||||
|
instr("foobar", "bar")
|
||||||
|
4
|
||||||
|
select instr("foobar" AS p1, "bar");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||||
|
select instr("foobar" p1, "bar");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||||
|
select instr("foobar" AS "p1", "bar");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||||
|
select instr("foobar" "p1", "bar");
|
||||||
|
instr("foobar" "p1", "bar")
|
||||||
|
4
|
||||||
|
select instr(@foobar "p1", "bar");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||||
|
select instr("foobar", "bar" AS p2);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||||
|
select instr("foobar", "bar" p2);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||||
|
select instr("foobar", "bar" AS "p2");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||||
|
select instr("foobar", "bar" "p2");
|
||||||
|
instr("foobar", "bar" "p2")
|
||||||
|
0
|
||||||
|
select instr("foobar", @bar "p2");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||||
|
select instr("foobar" AS p1, "bar" AS p2);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||||
|
select conv(255, 10, 16);
|
||||||
|
conv(255, 10, 16)
|
||||||
|
FF
|
||||||
|
select conv(255 AS p1, 10, 16);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255 p1, 10, 16);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255 AS "p1", 10, 16);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255 "p1", 10, 16);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255, 10 AS p2, 16);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255, 10 p2, 16);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255, 10 AS "p2", 16);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255, 10 "p2", 16);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255, 10, 16 AS p3);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255, 10, 16 p3);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255, 10, 16 AS "p3");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255, 10, 16 "p3");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select conv(255 AS p1, 10 AS p2, 16 AS p3);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||||
|
select atan(10);
|
||||||
|
atan(10)
|
||||||
|
1.4711276743037
|
||||||
|
select atan(10 AS p1);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10 p1);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10 AS "p1");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10 "p1");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10, 20);
|
||||||
|
atan(10, 20)
|
||||||
|
0.46364760900081
|
||||||
|
select atan(10 AS p1, 20);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10 p1, 20);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10 AS "p1", 20);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10 "p1", 20);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10, 20 AS p2);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10, 20 p2);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10, 20 AS "p2");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10, 20 "p2");
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
select atan(10 AS p1, 20 AS p2);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||||
|
@ -5633,7 +5633,7 @@ drop function if exists pi;
|
|||||||
create function pi() returns varchar(50)
|
create function pi() returns varchar(50)
|
||||||
return "pie, my favorite desert.";
|
return "pie, my favorite desert.";
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1578 This function 'pi' has the same name as a native function.
|
Note 1579 This function 'pi' has the same name as a native function.
|
||||||
SET @save_sql_mode=@@sql_mode;
|
SET @save_sql_mode=@@sql_mode;
|
||||||
SET SQL_MODE='IGNORE_SPACE';
|
SET SQL_MODE='IGNORE_SPACE';
|
||||||
select pi(), pi ();
|
select pi(), pi ();
|
||||||
@ -5682,15 +5682,15 @@ use test;
|
|||||||
create function `database`() returns varchar(50)
|
create function `database`() returns varchar(50)
|
||||||
return "Stored function database";
|
return "Stored function database";
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1578 This function 'database' has the same name as a native function.
|
Note 1579 This function 'database' has the same name as a native function.
|
||||||
create function `current_user`() returns varchar(50)
|
create function `current_user`() returns varchar(50)
|
||||||
return "Stored function current_user";
|
return "Stored function current_user";
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1578 This function 'current_user' has the same name as a native function.
|
Note 1579 This function 'current_user' has the same name as a native function.
|
||||||
create function md5(x varchar(50)) returns varchar(50)
|
create function md5(x varchar(50)) returns varchar(50)
|
||||||
return "Stored function md5";
|
return "Stored function md5";
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1578 This function 'md5' has the same name as a native function.
|
Note 1579 This function 'md5' has the same name as a native function.
|
||||||
SET SQL_MODE='IGNORE_SPACE';
|
SET SQL_MODE='IGNORE_SPACE';
|
||||||
select database(), database ();
|
select database(), database ();
|
||||||
database() database ()
|
database() database ()
|
||||||
|
@ -7,11 +7,11 @@ return 1;
|
|||||||
create function x() returns int
|
create function x() returns int
|
||||||
return 2;
|
return 2;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1578 This function 'x' has the same name as a native function.
|
Note 1579 This function 'x' has the same name as a native function.
|
||||||
create function y() returns int
|
create function y() returns int
|
||||||
return 3;
|
return 3;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1578 This function 'y' has the same name as a native function.
|
Note 1579 This function 'y' has the same name as a native function.
|
||||||
select a();
|
select a();
|
||||||
a()
|
a()
|
||||||
1
|
1
|
||||||
|
@ -488,3 +488,4 @@ t 0
|
|||||||
Warnings:
|
Warnings:
|
||||||
Warning 1292 Truncated incorrect INTEGER value: '1a'
|
Warning 1292 Truncated incorrect INTEGER value: '1a'
|
||||||
Warning 1292 Truncated incorrect INTEGER value: 't'
|
Warning 1292 Truncated incorrect INTEGER value: 't'
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -132,9 +132,9 @@ a c
|
|||||||
1 1
|
1 1
|
||||||
2 2
|
2 2
|
||||||
SELECT a, fn(MIN(b) xx) as c FROM t1 GROUP BY a;
|
SELECT a, fn(MIN(b) xx) as c FROM t1 GROUP BY a;
|
||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xx) as c FROM t1 GROUP BY a' at line 1
|
ERROR 42000: Incorrect parameters in the call to stored function 'fn'
|
||||||
SELECT myfunc_int(fn(MIN(b) xx)) as c FROM t1 GROUP BY a;
|
SELECT myfunc_int(fn(MIN(b) xx)) as c FROM t1 GROUP BY a;
|
||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xx)) as c FROM t1 GROUP BY a' at line 1
|
ERROR 42000: Incorrect parameters in the call to stored function 'fn'
|
||||||
SELECT myfunc_int(test.fn(MIN(b) xx)) as c FROM t1 GROUP BY a;
|
SELECT myfunc_int(test.fn(MIN(b) xx)) as c FROM t1 GROUP BY a;
|
||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xx)) as c FROM t1 GROUP BY a' at line 1
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xx)) as c FROM t1 GROUP BY a' at line 1
|
||||||
SELECT myfunc_int(fn(MIN(b)) xx) as c FROM t1 GROUP BY a;
|
SELECT myfunc_int(fn(MIN(b)) xx) as c FROM t1 GROUP BY a;
|
||||||
@ -185,6 +185,28 @@ DROP VIEW v1;
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP FUNCTION fn;
|
DROP FUNCTION fn;
|
||||||
End of 5.0 tests.
|
End of 5.0 tests.
|
||||||
|
select myfunc_double(3);
|
||||||
|
myfunc_double(3)
|
||||||
|
51.00
|
||||||
|
select myfunc_double(3 AS three);
|
||||||
|
myfunc_double(3 AS three)
|
||||||
|
51.00
|
||||||
|
select myfunc_double(abs(3));
|
||||||
|
myfunc_double(abs(3))
|
||||||
|
51.00
|
||||||
|
select myfunc_double(abs(3) AS named_param);
|
||||||
|
myfunc_double(abs(3) AS named_param)
|
||||||
|
51.00
|
||||||
|
select abs(myfunc_double(3));
|
||||||
|
abs(myfunc_double(3))
|
||||||
|
51.00
|
||||||
|
select abs(myfunc_double(3 AS three));
|
||||||
|
abs(myfunc_double(3 AS three))
|
||||||
|
51.00
|
||||||
|
select myfunc_double(abs(3 AS wrong));
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'abs'
|
||||||
|
select abs(myfunc_double(3) AS wrong);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'abs'
|
||||||
drop function if exists pi;
|
drop function if exists pi;
|
||||||
CREATE FUNCTION pi RETURNS STRING SONAME "should_not_parse.so";
|
CREATE FUNCTION pi RETURNS STRING SONAME "should_not_parse.so";
|
||||||
ERROR HY000: This function 'pi' has the same name as a native function.
|
ERROR HY000: This function 'pi' has the same name as a native function.
|
||||||
|
@ -493,3 +493,113 @@ select yearweek();
|
|||||||
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
select yearweek(1, 2, 3);
|
select yearweek(1, 2, 3);
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#24736: UDF functions parsed as Stored Functions
|
||||||
|
#
|
||||||
|
|
||||||
|
# Verify that the syntax for calling UDF : foo(expr AS param, ...)
|
||||||
|
# can not be used when calling native functions
|
||||||
|
|
||||||
|
# Native function with 1 argument
|
||||||
|
|
||||||
|
select abs(3);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select abs(3 AS three);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select abs(3 three);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select abs(3 AS "three");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select abs(3 "three");
|
||||||
|
|
||||||
|
# Native function with 2 arguments
|
||||||
|
|
||||||
|
set @bar="bar";
|
||||||
|
set @foobar="foobar";
|
||||||
|
|
||||||
|
select instr("foobar", "bar");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select instr("foobar" AS p1, "bar");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select instr("foobar" p1, "bar");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select instr("foobar" AS "p1", "bar");
|
||||||
|
## String concatenation, valid syntax
|
||||||
|
select instr("foobar" "p1", "bar");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select instr(@foobar "p1", "bar");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select instr("foobar", "bar" AS p2);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select instr("foobar", "bar" p2);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select instr("foobar", "bar" AS "p2");
|
||||||
|
## String concatenation, valid syntax
|
||||||
|
select instr("foobar", "bar" "p2");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select instr("foobar", @bar "p2");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select instr("foobar" AS p1, "bar" AS p2);
|
||||||
|
|
||||||
|
# Native function with 3 arguments
|
||||||
|
|
||||||
|
select conv(255, 10, 16);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255 AS p1, 10, 16);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255 p1, 10, 16);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255 AS "p1", 10, 16);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255 "p1", 10, 16);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255, 10 AS p2, 16);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255, 10 p2, 16);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255, 10 AS "p2", 16);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255, 10 "p2", 16);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255, 10, 16 AS p3);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255, 10, 16 p3);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255, 10, 16 AS "p3");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255, 10, 16 "p3");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select conv(255 AS p1, 10 AS p2, 16 AS p3);
|
||||||
|
|
||||||
|
# Native function with a variable number of arguments
|
||||||
|
|
||||||
|
select atan(10);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10 AS p1);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10 p1);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10 AS "p1");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10 "p1");
|
||||||
|
|
||||||
|
select atan(10, 20);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10 AS p1, 20);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10 p1, 20);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10 AS "p1", 20);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10 "p1", 20);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10, 20 AS p2);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10, 20 p2);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10, 20 AS "p2");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10, 20 "p2");
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select atan(10 AS p1, 20 AS p2);
|
||||||
|
|
||||||
|
@ -196,3 +196,4 @@ INSERT INTO t1 VALUES (10), (50), (30), ('1a'), (60), ('t');
|
|||||||
SELECT a,(a + 0) FROM t1 ORDER BY a;
|
SELECT a,(a + 0) FROM t1 ORDER BY a;
|
||||||
SELECT a,(a DIV 2) FROM t1 ORDER BY a;
|
SELECT a,(a DIV 2) FROM t1 ORDER BY a;
|
||||||
SELECT a,CAST(a AS SIGNED) FROM t1 ORDER BY a;
|
SELECT a,CAST(a AS SIGNED) FROM t1 ORDER BY a;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -149,9 +149,9 @@ EXPLAIN EXTENDED SELECT myfunc_int(a AS attr_name) FROM t1;
|
|||||||
EXPLAIN EXTENDED SELECT myfunc_int(a) FROM t1;
|
EXPLAIN EXTENDED SELECT myfunc_int(a) FROM t1;
|
||||||
SELECT a,c FROM v1;
|
SELECT a,c FROM v1;
|
||||||
|
|
||||||
--error ER_PARSE_ERROR
|
--error ER_WRONG_PARAMETERS_TO_STORED_FCT
|
||||||
SELECT a, fn(MIN(b) xx) as c FROM t1 GROUP BY a;
|
SELECT a, fn(MIN(b) xx) as c FROM t1 GROUP BY a;
|
||||||
--error ER_PARSE_ERROR
|
--error ER_WRONG_PARAMETERS_TO_STORED_FCT
|
||||||
SELECT myfunc_int(fn(MIN(b) xx)) as c FROM t1 GROUP BY a;
|
SELECT myfunc_int(fn(MIN(b) xx)) as c FROM t1 GROUP BY a;
|
||||||
--error ER_PARSE_ERROR
|
--error ER_PARSE_ERROR
|
||||||
SELECT myfunc_int(test.fn(MIN(b) xx)) as c FROM t1 GROUP BY a;
|
SELECT myfunc_int(test.fn(MIN(b) xx)) as c FROM t1 GROUP BY a;
|
||||||
@ -173,6 +173,22 @@ DROP FUNCTION fn;
|
|||||||
|
|
||||||
--echo End of 5.0 tests.
|
--echo End of 5.0 tests.
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#24736: UDF functions parsed as Stored Functions
|
||||||
|
#
|
||||||
|
|
||||||
|
select myfunc_double(3);
|
||||||
|
select myfunc_double(3 AS three);
|
||||||
|
select myfunc_double(abs(3));
|
||||||
|
select myfunc_double(abs(3) AS named_param);
|
||||||
|
select abs(myfunc_double(3));
|
||||||
|
select abs(myfunc_double(3 AS three));
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select myfunc_double(abs(3 AS wrong));
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select abs(myfunc_double(3) AS wrong);
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#18239: Possible to overload internal functions with stored functions
|
# BUG#18239: Possible to overload internal functions with stored functions
|
||||||
#
|
#
|
||||||
|
@ -27,6 +27,37 @@
|
|||||||
=============================================================================
|
=============================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
Adapter for native functions with a variable number of arguments.
|
||||||
|
The main use of this class is to discard the following calls:
|
||||||
|
<code>foo(expr1 AS name1, expr2 AS name2, ...)</code>
|
||||||
|
which are syntactically correct (the syntax can refer to a UDF),
|
||||||
|
but semantically invalid for native functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Create_native_func : public Create_func
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Builder method, with no arguments.
|
||||||
|
@param thd The current thread
|
||||||
|
@param name The native function name
|
||||||
|
@param item_list The function parameters, none of which are named
|
||||||
|
@return An item representing the function call
|
||||||
|
*/
|
||||||
|
virtual Item* create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/** Constructor. */
|
||||||
|
Create_native_func() {}
|
||||||
|
/** Destructor. */
|
||||||
|
virtual ~Create_native_func() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Adapter for functions that takes exactly zero arguments.
|
Adapter for functions that takes exactly zero arguments.
|
||||||
*/
|
*/
|
||||||
@ -302,10 +333,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_atan : public Create_func
|
class Create_func_atan : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_atan s_singleton;
|
static Create_func_atan s_singleton;
|
||||||
|
|
||||||
@ -434,10 +465,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_concat : public Create_func
|
class Create_func_concat : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_concat s_singleton;
|
static Create_func_concat s_singleton;
|
||||||
|
|
||||||
@ -447,10 +478,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_concat_ws : public Create_func
|
class Create_func_concat_ws : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_concat_ws s_singleton;
|
static Create_func_concat_ws s_singleton;
|
||||||
|
|
||||||
@ -672,10 +703,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_des_decrypt : public Create_func
|
class Create_func_des_decrypt : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_des_decrypt s_singleton;
|
static Create_func_des_decrypt s_singleton;
|
||||||
|
|
||||||
@ -685,10 +716,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_des_encrypt : public Create_func
|
class Create_func_des_encrypt : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_des_encrypt s_singleton;
|
static Create_func_des_encrypt s_singleton;
|
||||||
|
|
||||||
@ -728,10 +759,10 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
class Create_func_elt : public Create_func
|
class Create_func_elt : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_elt s_singleton;
|
static Create_func_elt s_singleton;
|
||||||
|
|
||||||
@ -754,10 +785,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_encrypt : public Create_func
|
class Create_func_encrypt : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_encrypt s_singleton;
|
static Create_func_encrypt s_singleton;
|
||||||
|
|
||||||
@ -825,10 +856,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_export_set : public Create_func
|
class Create_func_export_set : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_export_set s_singleton;
|
static Create_func_export_set s_singleton;
|
||||||
|
|
||||||
@ -853,10 +884,10 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
class Create_func_field : public Create_func
|
class Create_func_field : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_field s_singleton;
|
static Create_func_field s_singleton;
|
||||||
|
|
||||||
@ -931,10 +962,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_from_unixtime : public Create_func
|
class Create_func_from_unixtime : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_from_unixtime s_singleton;
|
static Create_func_from_unixtime s_singleton;
|
||||||
|
|
||||||
@ -945,10 +976,10 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_SPATIAL
|
#ifdef HAVE_SPATIAL
|
||||||
class Create_func_geometry_from_text : public Create_func
|
class Create_func_geometry_from_text : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_geometry_from_text s_singleton;
|
static Create_func_geometry_from_text s_singleton;
|
||||||
|
|
||||||
@ -960,10 +991,10 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_SPATIAL
|
#ifdef HAVE_SPATIAL
|
||||||
class Create_func_geometry_from_wkb : public Create_func
|
class Create_func_geometry_from_wkb : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_geometry_from_wkb s_singleton;
|
static Create_func_geometry_from_wkb s_singleton;
|
||||||
|
|
||||||
@ -1032,10 +1063,10 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
class Create_func_greatest : public Create_func
|
class Create_func_greatest : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_greatest s_singleton;
|
static Create_func_greatest s_singleton;
|
||||||
|
|
||||||
@ -1237,10 +1268,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_last_insert_id : public Create_func
|
class Create_func_last_insert_id : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_last_insert_id s_singleton;
|
static Create_func_last_insert_id s_singleton;
|
||||||
|
|
||||||
@ -1263,10 +1294,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_least : public Create_func
|
class Create_func_least : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_least s_singleton;
|
static Create_func_least s_singleton;
|
||||||
|
|
||||||
@ -1315,10 +1346,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_locate : public Create_func
|
class Create_func_locate : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_locate s_singleton;
|
static Create_func_locate s_singleton;
|
||||||
|
|
||||||
@ -1328,10 +1359,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_log : public Create_func
|
class Create_func_log : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_log s_singleton;
|
static Create_func_log s_singleton;
|
||||||
|
|
||||||
@ -1419,10 +1450,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_make_set : public Create_func
|
class Create_func_make_set : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_make_set s_singleton;
|
static Create_func_make_set s_singleton;
|
||||||
|
|
||||||
@ -1432,10 +1463,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_master_pos_wait : public Create_func
|
class Create_func_master_pos_wait : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_master_pos_wait s_singleton;
|
static Create_func_master_pos_wait s_singleton;
|
||||||
|
|
||||||
@ -1676,10 +1707,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_rand : public Create_func
|
class Create_func_rand : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_rand s_singleton;
|
static Create_func_rand s_singleton;
|
||||||
|
|
||||||
@ -1715,10 +1746,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_round : public Create_func
|
class Create_func_round : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_round s_singleton;
|
static Create_func_round s_singleton;
|
||||||
|
|
||||||
@ -2085,10 +2116,10 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_unix_timestamp : public Create_func
|
class Create_func_unix_timestamp : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_unix_timestamp s_singleton;
|
static Create_func_unix_timestamp s_singleton;
|
||||||
|
|
||||||
@ -2221,10 +2252,10 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
class Create_func_year_week : public Create_func
|
class Create_func_year_week : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
virtual Item* create_native(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_year_week s_singleton;
|
static Create_func_year_week s_singleton;
|
||||||
|
|
||||||
@ -2240,6 +2271,29 @@ protected:
|
|||||||
=============================================================================
|
=============================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
Checks if there are named parameters in a parameter list.
|
||||||
|
The syntax to name parameters in a function call is as follow:
|
||||||
|
<code>foo(expr AS named, expr named, expr AS "named", expr "named")</code>
|
||||||
|
@param params The parameter list, can be null
|
||||||
|
@return true if one or more parameter is named
|
||||||
|
*/
|
||||||
|
static bool has_named_parameters(List<Item> *params)
|
||||||
|
{
|
||||||
|
if (params)
|
||||||
|
{
|
||||||
|
Item *param;
|
||||||
|
List_iterator<Item> it(*params);
|
||||||
|
while ((param= it++))
|
||||||
|
{
|
||||||
|
if (! param->is_autogenerated_name)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef HAVE_SPATIAL
|
#ifndef HAVE_SPATIAL
|
||||||
Create_func_no_geom Create_func_no_geom::s_singleton;
|
Create_func_no_geom Create_func_no_geom::s_singleton;
|
||||||
|
|
||||||
@ -2387,11 +2441,27 @@ Create_sp_func::create(THD *thd, LEX_STRING db, LEX_STRING name,
|
|||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
LEX *lex= thd->lex;
|
LEX *lex= thd->lex;
|
||||||
sp_name *qname= new (thd->mem_root) sp_name(db, name);
|
sp_name *qname;
|
||||||
|
|
||||||
|
if (has_named_parameters(item_list))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
The syntax "db.foo(expr AS p1, expr AS p2, ...) is invalid,
|
||||||
|
and has been rejected during syntactic parsing already,
|
||||||
|
because a stored function call may not have named parameters.
|
||||||
|
|
||||||
|
The syntax "foo(expr AS p1, expr AS p2, ...)" is correct,
|
||||||
|
because it can refer to a User Defined Function call.
|
||||||
|
For a Stored Function however, this has no semantic.
|
||||||
|
*/
|
||||||
|
my_error(ER_WRONG_PARAMETERS_TO_STORED_FCT, MYF(0), name.str);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (item_list != NULL)
|
if (item_list != NULL)
|
||||||
arg_count= item_list->elements;
|
arg_count= item_list->elements;
|
||||||
|
|
||||||
|
qname= new (thd->mem_root) sp_name(db, name);
|
||||||
qname->init_qname(thd);
|
qname->init_qname(thd);
|
||||||
sp_add_used_routine(lex, thd, qname, TYPE_ENUM_FUNCTION);
|
sp_add_used_routine(lex, thd, qname, TYPE_ENUM_FUNCTION);
|
||||||
|
|
||||||
@ -2406,6 +2476,19 @@ Create_sp_func::create(THD *thd, LEX_STRING db, LEX_STRING name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Item*
|
||||||
|
Create_native_func::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
||||||
|
{
|
||||||
|
if (has_named_parameters(item_list))
|
||||||
|
{
|
||||||
|
my_error(ER_WRONG_PARAMETERS_TO_NATIVE_FCT, MYF(0), name.str);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return create_native(thd, name, item_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_arg0::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_arg0::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
||||||
{
|
{
|
||||||
@ -2439,6 +2522,13 @@ Create_func_arg1::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Item *param_1= item_list->pop();
|
Item *param_1= item_list->pop();
|
||||||
|
|
||||||
|
if (! param_1->is_autogenerated_name)
|
||||||
|
{
|
||||||
|
my_error(ER_WRONG_PARAMETERS_TO_NATIVE_FCT, MYF(0), name.str);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return create(thd, param_1);
|
return create(thd, param_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2459,6 +2549,14 @@ Create_func_arg2::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
|||||||
|
|
||||||
Item *param_1= item_list->pop();
|
Item *param_1= item_list->pop();
|
||||||
Item *param_2= item_list->pop();
|
Item *param_2= item_list->pop();
|
||||||
|
|
||||||
|
if ( (! param_1->is_autogenerated_name)
|
||||||
|
|| (! param_2->is_autogenerated_name))
|
||||||
|
{
|
||||||
|
my_error(ER_WRONG_PARAMETERS_TO_NATIVE_FCT, MYF(0), name.str);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return create(thd, param_1, param_2);
|
return create(thd, param_1, param_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2480,6 +2578,15 @@ Create_func_arg3::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
|||||||
Item *param_1= item_list->pop();
|
Item *param_1= item_list->pop();
|
||||||
Item *param_2= item_list->pop();
|
Item *param_2= item_list->pop();
|
||||||
Item *param_3= item_list->pop();
|
Item *param_3= item_list->pop();
|
||||||
|
|
||||||
|
if ( (! param_1->is_autogenerated_name)
|
||||||
|
|| (! param_2->is_autogenerated_name)
|
||||||
|
|| (! param_3->is_autogenerated_name))
|
||||||
|
{
|
||||||
|
my_error(ER_WRONG_PARAMETERS_TO_NATIVE_FCT, MYF(0), name.str);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return create(thd, param_1, param_2, param_3);
|
return create(thd, param_1, param_2, param_3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2574,7 +2681,8 @@ Create_func_asin::create(THD *thd, Item *arg1)
|
|||||||
Create_func_atan Create_func_atan::s_singleton;
|
Create_func_atan Create_func_atan::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_atan::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_atan::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item* func= NULL;
|
Item* func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -2687,7 +2795,8 @@ Create_func_coercibility::create(THD *thd, Item *arg1)
|
|||||||
Create_func_concat Create_func_concat::s_singleton;
|
Create_func_concat Create_func_concat::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_concat::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_concat::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
|
|
||||||
@ -2707,7 +2816,8 @@ Create_func_concat::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
|||||||
Create_func_concat_ws Create_func_concat_ws::s_singleton;
|
Create_func_concat_ws Create_func_concat_ws::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_concat_ws::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_concat_ws::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
|
|
||||||
@ -2897,8 +3007,8 @@ Create_func_degrees::create(THD *thd, Item *arg1)
|
|||||||
Create_func_des_decrypt Create_func_des_decrypt::s_singleton;
|
Create_func_des_decrypt Create_func_des_decrypt::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_des_decrypt::create(THD *thd, LEX_STRING name,
|
Create_func_des_decrypt::create_native(THD *thd, LEX_STRING name,
|
||||||
List<Item> *item_list)
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -2934,8 +3044,8 @@ Create_func_des_decrypt::create(THD *thd, LEX_STRING name,
|
|||||||
Create_func_des_encrypt Create_func_des_encrypt::s_singleton;
|
Create_func_des_encrypt Create_func_des_encrypt::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_des_encrypt::create(THD *thd, LEX_STRING name,
|
Create_func_des_encrypt::create_native(THD *thd, LEX_STRING name,
|
||||||
List<Item> *item_list)
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -2994,7 +3104,8 @@ Create_func_disjoint::create(THD *thd, Item *arg1, Item *arg2)
|
|||||||
Create_func_elt Create_func_elt::s_singleton;
|
Create_func_elt Create_func_elt::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_elt::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_elt::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
|
|
||||||
@ -3023,7 +3134,8 @@ Create_func_encode::create(THD *thd, Item *arg1, Item *arg2)
|
|||||||
Create_func_encrypt Create_func_encrypt::s_singleton;
|
Create_func_encrypt Create_func_encrypt::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_encrypt::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_encrypt::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -3104,7 +3216,8 @@ Create_func_exp::create(THD *thd, Item *arg1)
|
|||||||
Create_func_export_set Create_func_export_set::s_singleton;
|
Create_func_export_set Create_func_export_set::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_export_set::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_export_set::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -3168,7 +3281,8 @@ Create_func_exteriorring::create(THD *thd, Item *arg1)
|
|||||||
Create_func_field Create_func_field::s_singleton;
|
Create_func_field Create_func_field::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_field::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_field::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
|
|
||||||
@ -3234,8 +3348,8 @@ Create_func_from_days::create(THD *thd, Item *arg1)
|
|||||||
Create_func_from_unixtime Create_func_from_unixtime::s_singleton;
|
Create_func_from_unixtime Create_func_from_unixtime::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_from_unixtime::create(THD *thd, LEX_STRING name,
|
Create_func_from_unixtime::create_native(THD *thd, LEX_STRING name,
|
||||||
List<Item> *item_list)
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -3273,8 +3387,8 @@ Create_func_from_unixtime::create(THD *thd, LEX_STRING name,
|
|||||||
Create_func_geometry_from_text Create_func_geometry_from_text::s_singleton;
|
Create_func_geometry_from_text Create_func_geometry_from_text::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_geometry_from_text::create(THD *thd, LEX_STRING name,
|
Create_func_geometry_from_text::create_native(THD *thd, LEX_STRING name,
|
||||||
List<Item> *item_list)
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -3313,8 +3427,8 @@ Create_func_geometry_from_text::create(THD *thd, LEX_STRING name,
|
|||||||
Create_func_geometry_from_wkb Create_func_geometry_from_wkb::s_singleton;
|
Create_func_geometry_from_wkb Create_func_geometry_from_wkb::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_geometry_from_wkb::create(THD *thd, LEX_STRING name,
|
Create_func_geometry_from_wkb::create_native(THD *thd, LEX_STRING name,
|
||||||
List<Item> *item_list)
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -3396,7 +3510,8 @@ Create_func_glength::create(THD *thd, Item *arg1)
|
|||||||
Create_func_greatest Create_func_greatest::s_singleton;
|
Create_func_greatest Create_func_greatest::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_greatest::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_greatest::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
|
|
||||||
@ -3556,8 +3671,8 @@ Create_func_last_day::create(THD *thd, Item *arg1)
|
|||||||
Create_func_last_insert_id Create_func_last_insert_id::s_singleton;
|
Create_func_last_insert_id Create_func_last_insert_id::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_last_insert_id::create(THD *thd, LEX_STRING name,
|
Create_func_last_insert_id::create_native(THD *thd, LEX_STRING name,
|
||||||
List<Item> *item_list)
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -3602,7 +3717,8 @@ Create_func_lcase::create(THD *thd, Item *arg1)
|
|||||||
Create_func_least Create_func_least::s_singleton;
|
Create_func_least Create_func_least::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_least::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_least::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
|
|
||||||
@ -3650,7 +3766,8 @@ Create_func_load_file::create(THD *thd, Item *arg1)
|
|||||||
Create_func_locate Create_func_locate::s_singleton;
|
Create_func_locate Create_func_locate::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_locate::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_locate::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -3690,7 +3807,8 @@ Create_func_locate::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
|||||||
Create_func_log Create_func_log::s_singleton;
|
Create_func_log Create_func_log::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_log::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_log::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -3780,7 +3898,8 @@ Create_func_maketime::create(THD *thd, Item *arg1, Item *arg2, Item *arg3)
|
|||||||
Create_func_make_set Create_func_make_set::s_singleton;
|
Create_func_make_set Create_func_make_set::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_make_set::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_make_set::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
|
|
||||||
@ -3801,8 +3920,8 @@ Create_func_make_set::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
|||||||
Create_func_master_pos_wait Create_func_master_pos_wait::s_singleton;
|
Create_func_master_pos_wait Create_func_master_pos_wait::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_master_pos_wait::create(THD *thd, LEX_STRING name,
|
Create_func_master_pos_wait::create_native(THD *thd, LEX_STRING name,
|
||||||
List<Item> *item_list)
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -4010,7 +4129,8 @@ Create_func_radians::create(THD *thd, Item *arg1)
|
|||||||
Create_func_rand Create_func_rand::s_singleton;
|
Create_func_rand Create_func_rand::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_rand::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_rand::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -4065,7 +4185,8 @@ Create_func_reverse::create(THD *thd, Item *arg1)
|
|||||||
Create_func_round Create_func_round::s_singleton;
|
Create_func_round Create_func_round::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_round::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_round::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -4374,8 +4495,8 @@ Create_func_unhex::create(THD *thd, Item *arg1)
|
|||||||
Create_func_unix_timestamp Create_func_unix_timestamp::s_singleton;
|
Create_func_unix_timestamp Create_func_unix_timestamp::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_unix_timestamp::create(THD *thd, LEX_STRING name,
|
Create_func_unix_timestamp::create_native(THD *thd, LEX_STRING name,
|
||||||
List<Item> *item_list)
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
@ -4506,7 +4627,8 @@ Create_func_y::create(THD *thd, Item *arg1)
|
|||||||
Create_func_year_week Create_func_year_week::s_singleton;
|
Create_func_year_week Create_func_year_week::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_year_week::create(THD *thd, LEX_STRING name, List<Item> *item_list)
|
Create_func_year_week::create_native(THD *thd, LEX_STRING name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
Item *func= NULL;
|
Item *func= NULL;
|
||||||
int arg_count= 0;
|
int arg_count= 0;
|
||||||
|
@ -897,7 +897,8 @@ void Item_func_signed::print(String *str)
|
|||||||
|
|
||||||
longlong Item_func_signed::val_int_from_str(int *error)
|
longlong Item_func_signed::val_int_from_str(int *error)
|
||||||
{
|
{
|
||||||
char buff[MAX_FIELD_WIDTH], *end;
|
char buff[MAX_FIELD_WIDTH], *end, *start;
|
||||||
|
uint32 length;
|
||||||
String tmp(buff,sizeof(buff), &my_charset_bin), *res;
|
String tmp(buff,sizeof(buff), &my_charset_bin), *res;
|
||||||
longlong value;
|
longlong value;
|
||||||
|
|
||||||
@ -913,13 +914,21 @@ longlong Item_func_signed::val_int_from_str(int *error)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
null_value= 0;
|
null_value= 0;
|
||||||
end= (char*) res->ptr()+ res->length();
|
start= (char *)res->ptr();
|
||||||
value= my_strtoll10(res->ptr(), &end, error);
|
length= res->length();
|
||||||
if (*error > 0 || end != res->ptr()+ res->length())
|
|
||||||
|
end= start + length;
|
||||||
|
value= my_strtoll10(start, &end, error);
|
||||||
|
if (*error > 0 || end != start+ length)
|
||||||
|
{
|
||||||
|
char err_buff[128];
|
||||||
|
String err_tmp(err_buff,(uint32) sizeof(err_buff), system_charset_info);
|
||||||
|
err_tmp.copy(start, length, system_charset_info);
|
||||||
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||||
ER_TRUNCATED_WRONG_VALUE,
|
ER_TRUNCATED_WRONG_VALUE,
|
||||||
ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER",
|
ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER",
|
||||||
res->c_ptr());
|
err_tmp.c_ptr());
|
||||||
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6010,6 +6010,8 @@ ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT 42000
|
|||||||
eng "Incorrect parameter count in the call to native function '%-.64s'"
|
eng "Incorrect parameter count in the call to native function '%-.64s'"
|
||||||
ER_WRONG_PARAMETERS_TO_NATIVE_FCT 42000
|
ER_WRONG_PARAMETERS_TO_NATIVE_FCT 42000
|
||||||
eng "Incorrect parameters in the call to native function '%-.64s'"
|
eng "Incorrect parameters in the call to native function '%-.64s'"
|
||||||
|
ER_WRONG_PARAMETERS_TO_STORED_FCT 42000
|
||||||
|
eng "Incorrect parameters in the call to stored function '%-.64s'"
|
||||||
ER_NATIVE_FCT_NAME_COLLISION
|
ER_NATIVE_FCT_NAME_COLLISION
|
||||||
eng "This function '%-.64s' has the same name as a native function."
|
eng "This function '%-.64s' has the same name as a native function."
|
||||||
ER_BINLOG_PURGE_EMFILE
|
ER_BINLOG_PURGE_EMFILE
|
||||||
|
@ -164,7 +164,6 @@ void lex_start(THD *thd, const uchar *buf, uint length)
|
|||||||
lex->select_lex.ftfunc_list= &lex->select_lex.ftfunc_list_alloc;
|
lex->select_lex.ftfunc_list= &lex->select_lex.ftfunc_list_alloc;
|
||||||
lex->select_lex.group_list.empty();
|
lex->select_lex.group_list.empty();
|
||||||
lex->select_lex.order_list.empty();
|
lex->select_lex.order_list.empty();
|
||||||
lex->select_lex.udf_list.empty();
|
|
||||||
lex->ignore_space=test(thd->variables.sql_mode & MODE_IGNORE_SPACE);
|
lex->ignore_space=test(thd->variables.sql_mode & MODE_IGNORE_SPACE);
|
||||||
lex->sql_command= SQLCOM_END;
|
lex->sql_command= SQLCOM_END;
|
||||||
lex->duplicates= DUP_ERROR;
|
lex->duplicates= DUP_ERROR;
|
||||||
@ -1182,7 +1181,6 @@ void st_select_lex::init_select()
|
|||||||
braces= 0;
|
braces= 0;
|
||||||
when_list.empty();
|
when_list.empty();
|
||||||
expr_list.empty();
|
expr_list.empty();
|
||||||
udf_list.empty();
|
|
||||||
interval_list.empty();
|
interval_list.empty();
|
||||||
use_index.empty();
|
use_index.empty();
|
||||||
ftfunc_list_alloc.empty();
|
ftfunc_list_alloc.empty();
|
||||||
|
@ -609,8 +609,6 @@ public:
|
|||||||
/* exclude this select from check of unique_table() */
|
/* exclude this select from check of unique_table() */
|
||||||
bool exclude_from_table_unique_test;
|
bool exclude_from_table_unique_test;
|
||||||
|
|
||||||
List<udf_func> udf_list; /* udf function calls stack */
|
|
||||||
|
|
||||||
void init_query();
|
void init_query();
|
||||||
void init_select();
|
void init_select();
|
||||||
st_select_lex_unit* master_unit();
|
st_select_lex_unit* master_unit();
|
||||||
|
@ -6426,7 +6426,7 @@ function_call_generic:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Temporary placing the result of find_udf in $3 */
|
/* Temporary placing the result of find_udf in $3 */
|
||||||
lex->current_select->udf_list.push_front(udf);
|
$<udf>$= udf;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
udf_expr_list ')'
|
udf_expr_list ')'
|
||||||
@ -6454,10 +6454,10 @@ function_call_generic:
|
|||||||
{
|
{
|
||||||
#ifdef HAVE_DLOPEN
|
#ifdef HAVE_DLOPEN
|
||||||
/* Retrieving the result of find_udf */
|
/* Retrieving the result of find_udf */
|
||||||
udf_func *udf;
|
udf_func *udf= $<udf>3;
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
|
|
||||||
if (NULL != (udf= lex->current_select->udf_list.pop()))
|
if (udf)
|
||||||
{
|
{
|
||||||
if (udf->type == UDFTYPE_AGGREGATE)
|
if (udf->type == UDFTYPE_AGGREGATE)
|
||||||
{
|
{
|
||||||
@ -6553,7 +6553,6 @@ udf_expr_list3:
|
|||||||
udf_expr:
|
udf_expr:
|
||||||
remember_name expr remember_end select_alias
|
remember_name expr remember_end select_alias
|
||||||
{
|
{
|
||||||
udf_func *udf= Select->udf_list.head();
|
|
||||||
/*
|
/*
|
||||||
Use Item::name as a storage for the attribute value of user
|
Use Item::name as a storage for the attribute value of user
|
||||||
defined function argument. It is safe to use Item::name
|
defined function argument. It is safe to use Item::name
|
||||||
@ -6562,20 +6561,10 @@ udf_expr:
|
|||||||
*/
|
*/
|
||||||
if ($4.str)
|
if ($4.str)
|
||||||
{
|
{
|
||||||
if (!udf)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
Disallow using AS to specify explicit names for the arguments
|
|
||||||
of stored routine calls
|
|
||||||
*/
|
|
||||||
yyerror(ER(ER_SYNTAX_ERROR));
|
|
||||||
YYABORT;
|
|
||||||
}
|
|
||||||
|
|
||||||
$2->is_autogenerated_name= FALSE;
|
$2->is_autogenerated_name= FALSE;
|
||||||
$2->set_name($4.str, $4.length, system_charset_info);
|
$2->set_name($4.str, $4.length, system_charset_info);
|
||||||
}
|
}
|
||||||
else if (udf)
|
else
|
||||||
$2->set_name($1, (uint) ($3 - $1), YYTHD->charset());
|
$2->set_name($1, (uint) ($3 - $1), YYTHD->charset());
|
||||||
$$= $2;
|
$$= $2;
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ File_class::size(FILE* f)
|
|||||||
MY_STAT s;
|
MY_STAT s;
|
||||||
|
|
||||||
// Note that my_fstat behaves *differently* than my_stat. ARGGGHH!
|
// Note that my_fstat behaves *differently* than my_stat. ARGGGHH!
|
||||||
if(my_fstat(::fileno(f), &s, MYF(0)))
|
if (my_fstat(fileno(f), &s, MYF(0)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return s.st_size;
|
return s.st_size;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user