Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
3a87bbfe
Commit
3a87bbfe
authored
Mar 10, 2008
by
tnurnberg@white.intern.koehntopp.de
Browse files
Options
Browse Files
Download
Plain Diff
Merge tnurnberg@bk-internal.mysql.com:/home/bk/mysql-5.0-opt
into mysql.com:/misc/mysql/34749/50-34749
parents
f2b153a2
c6b4d7a7
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
74 additions
and
14 deletions
+74
-14
mysql-test/r/func_misc.result
mysql-test/r/func_misc.result
+19
-0
mysql-test/t/func_misc.test
mysql-test/t/func_misc.test
+18
-0
sql/ha_ndbcluster_cond.cc
sql/ha_ndbcluster_cond.cc
+6
-3
sql/ha_ndbcluster_cond.h
sql/ha_ndbcluster_cond.h
+1
-0
sql/item.cc
sql/item.cc
+26
-1
sql/item.h
sql/item.h
+1
-8
sql/item_func.h
sql/item_func.h
+3
-2
No files found.
mysql-test/r/func_misc.result
View file @
3a87bbfe
...
...
@@ -207,6 +207,25 @@ test
SELECT NAME_CONST('test', 'test');
test
test
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(2),(3);
SELECT NAME_CONST('flag',1) * MAX(a) FROM t1;
NAME_CONST('flag',1) * MAX(a)
3
SELECT NAME_CONST('flag',1.5) * MAX(a) FROM t1;
NAME_CONST('flag',1.5) * MAX(a)
4.5
SELECT NAME_CONST('flag',-1) * MAX(a) FROM t1;
NAME_CONST('flag',-1) * MAX(a)
-3
SELECT NAME_CONST('flag',-1.5) * MAX(a) FROM t1;
NAME_CONST('flag',-1.5) * MAX(a)
-4.5
SELECT NAME_CONST('flag', SQRT(4)) * MAX(a) FROM t1;
ERROR HY000: Incorrect arguments to NAME_CONST
SELECT NAME_CONST('flag',-SQRT(4)) * MAX(a) FROM t1;
ERROR HY000: Incorrect arguments to NAME_CONST
DROP TABLE t1;
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (5), (2);
SELECT NAME_CONST(x,2) FROM (SELECT a x FROM t1) t;
...
...
mysql-test/t/func_misc.test
View file @
3a87bbfe
...
...
@@ -204,6 +204,24 @@ SELECT NAME_CONST('test', 1.0);
SELECT
NAME_CONST
(
'test'
,
-
1.0
);
SELECT
NAME_CONST
(
'test'
,
'test'
);
#
# Bug #34749: Server crash when using NAME_CONST() with an aggregate function
#
CREATE
TABLE
t1
(
a
INT
);
INSERT
INTO
t1
VALUES
(
1
),(
2
),(
3
);
# NAME_CONST() + aggregate.
SELECT
NAME_CONST
(
'flag'
,
1
)
*
MAX
(
a
)
FROM
t1
;
SELECT
NAME_CONST
(
'flag'
,
1.5
)
*
MAX
(
a
)
FROM
t1
;
# Now, wrap the INT_ITEM in Item_func_neg and watch the pretty explosions
SELECT
NAME_CONST
(
'flag'
,
-
1
)
*
MAX
(
a
)
FROM
t1
;
SELECT
NAME_CONST
(
'flag'
,
-
1.5
)
*
MAX
(
a
)
FROM
t1
;
--
error
ER_WRONG_ARGUMENTS
SELECT
NAME_CONST
(
'flag'
,
SQRT
(
4
))
*
MAX
(
a
)
FROM
t1
;
--
error
ER_WRONG_ARGUMENTS
SELECT
NAME_CONST
(
'flag'
,
-
SQRT
(
4
))
*
MAX
(
a
)
FROM
t1
;
DROP
TABLE
t1
;
#
# Bug #27545: erroneous usage of NAME_CONST with a name as the first parameter
# resolved against a column name of a derived table hangs the client
...
...
sql/ha_ndbcluster_cond.cc
View file @
3a87bbfe
...
...
@@ -117,7 +117,8 @@ void ndb_serialize_cond(const Item *item, void *arg)
if
(
item
->
type
()
==
Item
::
FUNC_ITEM
)
{
Item_func
*
func_item
=
(
Item_func
*
)
item
;
if
(
func_item
->
functype
()
==
Item_func
::
UNKNOWN_FUNC
&&
if
((
func_item
->
functype
()
==
Item_func
::
UNKNOWN_FUNC
||
func_item
->
functype
()
==
Item_func
::
NEG_FUNC
)
&&
func_item
->
const_item
())
{
// Skip any arguments since we will evaluate function instead
...
...
@@ -370,7 +371,8 @@ void ndb_serialize_cond(const Item *item, void *arg)
Item_func
*
func_item
=
(
Item_func
*
)
item
;
// Check that we expect a function or functional expression here
if
(
context
->
expecting
(
Item
::
FUNC_ITEM
)
||
func_item
->
functype
()
==
Item_func
::
UNKNOWN_FUNC
)
func_item
->
functype
()
==
Item_func
::
UNKNOWN_FUNC
||
func_item
->
functype
()
==
Item_func
::
NEG_FUNC
)
context
->
expect_nothing
();
else
{
...
...
@@ -584,6 +586,7 @@ void ndb_serialize_cond(const Item *item, void *arg)
context
->
expect
(
Item
::
FUNC_ITEM
);
break
;
}
case
Item_func
:
:
NEG_FUNC
:
case
Item_func
:
:
UNKNOWN_FUNC
:
{
DBUG_PRINT
(
"info"
,
(
"UNKNOWN_FUNC %s"
,
...
...
sql/ha_ndbcluster_cond.h
View file @
3a87bbfe
...
...
@@ -228,6 +228,7 @@ public:
case
(
Item_func
:
:
ISNOTNULL_FUNC
)
:
{
return
NDB_ISNOTNULL_FUNC
;
}
case
(
Item_func
:
:
LIKE_FUNC
)
:
{
return
NDB_LIKE_FUNC
;
}
case
(
Item_func
:
:
NOT_FUNC
)
:
{
return
NDB_NOT_FUNC
;
}
case
(
Item_func
:
:
NEG_FUNC
)
:
{
return
NDB_UNKNOWN_FUNC
;
}
case
(
Item_func
:
:
UNKNOWN_FUNC
)
:
{
return
NDB_UNKNOWN_FUNC
;
}
case
(
Item_func
:
:
COND_AND_FUNC
)
:
{
return
NDB_COND_AND_FUNC
;
}
case
(
Item_func
:
:
COND_OR_FUNC
)
:
{
return
NDB_COND_OR_FUNC
;
}
...
...
sql/item.cc
View file @
3a87bbfe
...
...
@@ -1207,6 +1207,22 @@ bool Item_name_const::is_null()
return
value_item
->
is_null
();
}
Item_name_const
::
Item_name_const
(
Item
*
name_arg
,
Item
*
val
)
:
value_item
(
val
),
name_item
(
name_arg
)
{
if
(
!
(
valid_args
=
name_item
->
basic_const_item
()
&&
(
value_item
->
basic_const_item
()
||
((
value_item
->
type
()
==
FUNC_ITEM
)
&&
(((
Item_func
*
)
value_item
)
->
functype
()
==
Item_func
::
NEG_FUNC
)
&&
(((
Item_func
*
)
value_item
)
->
key_item
()
->
type
()
!=
FUNC_ITEM
)))))
my_error
(
ER_WRONG_ARGUMENTS
,
MYF
(
0
),
"NAME_CONST"
);
Item
::
maybe_null
=
TRUE
;
}
Item
::
Type
Item_name_const
::
type
()
const
{
/*
...
...
@@ -1218,8 +1234,17 @@ Item::Type Item_name_const::type() const
if (item->type() == FIELD_ITEM)
((Item_field *) item)->...
we return NULL_ITEM in the case to avoid wrong casting.
valid_args guarantees value_item->basic_const_item(); if type is
FUNC_ITEM, then we have a fudged item_func_neg() on our hands
and return the underlying type.
*/
return
valid_args
?
value_item
->
type
()
:
NULL_ITEM
;
return
valid_args
?
(((
value_item
->
type
()
==
FUNC_ITEM
)
&&
(((
Item_func
*
)
value_item
)
->
functype
()
==
Item_func
::
NEG_FUNC
))
?
((
Item_func
*
)
value_item
)
->
key_item
()
->
type
()
:
value_item
->
type
())
:
NULL_ITEM
;
}
...
...
sql/item.h
View file @
3a87bbfe
...
...
@@ -1114,14 +1114,7 @@ class Item_name_const : public Item
Item
*
name_item
;
bool
valid_args
;
public:
Item_name_const
(
Item
*
name_arg
,
Item
*
val
)
:
value_item
(
val
),
name_item
(
name_arg
)
{
if
(
!
(
valid_args
=
name_item
->
basic_const_item
()
&
value_item
->
basic_const_item
()))
my_error
(
ER_WRONG_ARGUMENTS
,
MYF
(
0
),
"NAME_CONST"
);
Item
::
maybe_null
=
TRUE
;
}
Item_name_const
(
Item
*
name_arg
,
Item
*
val
);
bool
fix_fields
(
THD
*
,
Item
**
);
...
...
sql/item_func.h
View file @
3a87bbfe
...
...
@@ -54,7 +54,8 @@ public:
NOT_FUNC
,
NOT_ALL_FUNC
,
NOW_FUNC
,
TRIG_COND_FUNC
,
SUSERVAR_FUNC
,
GUSERVAR_FUNC
,
COLLATE_FUNC
,
EXTRACT_FUNC
,
CHAR_TYPECAST_FUNC
,
FUNC_SP
,
UDF_FUNC
};
EXTRACT_FUNC
,
CHAR_TYPECAST_FUNC
,
FUNC_SP
,
UDF_FUNC
,
NEG_FUNC
};
enum
optimize_type
{
OPTIMIZE_NONE
,
OPTIMIZE_KEY
,
OPTIMIZE_OP
,
OPTIMIZE_NULL
,
OPTIMIZE_EQUAL
};
enum
Type
type
()
const
{
return
FUNC_ITEM
;
}
...
...
@@ -466,7 +467,7 @@ public:
longlong
int_op
();
my_decimal
*
decimal_op
(
my_decimal
*
);
const
char
*
func_name
()
const
{
return
"-"
;
}
virtual
bool
basic_const_item
()
const
{
return
args
[
0
]
->
basic_const_item
()
;
}
enum
Functype
functype
()
const
{
return
NEG_FUNC
;
}
void
fix_length_and_dec
();
void
fix_num_length_and_dec
();
uint
decimal_precision
()
const
{
return
args
[
0
]
->
decimal_precision
();
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment