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
da9f2149
Commit
da9f2149
authored
Feb 08, 2007
by
gluh@mysql.com/eagle.(none)
Browse files
Options
Browse Files
Download
Plain Diff
Merge mysql.com:/home/gluh/MySQL/Merge/4.1
into mysql.com:/home/gluh/MySQL/Merge/4.1-opt
parents
097c8431
60ac1f1b
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
189 additions
and
18 deletions
+189
-18
mysql-test/r/subselect.result
mysql-test/r/subselect.result
+74
-0
mysql-test/t/subselect.test
mysql-test/t/subselect.test
+59
-0
sql/filesort.cc
sql/filesort.cc
+5
-1
sql/item.cc
sql/item.cc
+1
-0
sql/item.h
sql/item.h
+3
-0
sql/item_cmpfunc.cc
sql/item_cmpfunc.cc
+4
-3
sql/item_cmpfunc.h
sql/item_cmpfunc.h
+2
-1
sql/item_func.cc
sql/item_func.cc
+1
-0
sql/item_subselect.cc
sql/item_subselect.cc
+4
-0
sql/opt_sum.cc
sql/opt_sum.cc
+5
-5
sql/sql_select.cc
sql/sql_select.cc
+31
-8
No files found.
mysql-test/r/subselect.result
View file @
da9f2149
...
...
@@ -3026,3 +3026,77 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
DROP TABLE t1;
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (2), (4), (1), (3);
CREATE TABLE t2 (b int, c int);
INSERT INTO t2 VALUES
(2,1), (1,3), (2,1), (4,4), (2,2), (1,4);
SELECT a FROM t1 ORDER BY (SELECT c FROM t2 WHERE b > 2 );
a
2
4
1
3
SELECT a FROM t1 ORDER BY (SELECT c FROM t2 WHERE b > 1);
ERROR 21000: Subquery returns more than 1 row
SELECT a FROM t1 ORDER BY (SELECT c FROM t2 WHERE b > 2), a;
a
1
2
3
4
SELECT a FROM t1 ORDER BY (SELECT c FROM t2 WHERE b > 1), a;
ERROR 21000: Subquery returns more than 1 row
SELECT b, MAX(c) FROM t2 GROUP BY b, (SELECT c FROM t2 WHERE b > 2);
b MAX(c)
1 4
2 2
4 4
SELECT b, MAX(c) FROM t2 GROUP BY b, (SELECT c FROM t2 WHERE b > 1);
ERROR 21000: Subquery returns more than 1 row
SELECT a FROM t1 GROUP BY a
HAVING IFNULL((SELECT b FROM t2 WHERE b > 2),
(SELECT c FROM t2 WHERE c=a AND b > 2 ORDER BY b)) > 3;
a
1
2
3
4
SELECT a FROM t1 GROUP BY a
HAVING IFNULL((SELECT b FROM t2 WHERE b > 1),
(SELECT c FROM t2 WHERE c=a AND b > 2 ORDER BY b)) > 3;
ERROR 21000: Subquery returns more than 1 row
SELECT a FROM t1 GROUP BY a
HAVING IFNULL((SELECT b FROM t2 WHERE b > 4),
(SELECT c FROM t2 WHERE c=a AND b > 2 ORDER BY b)) > 3;
a
4
SELECT a FROM t1 GROUP BY a
HAVING IFNULL((SELECT b FROM t2 WHERE b > 4),
(SELECT c FROM t2 WHERE c=a AND b > 1 ORDER BY b)) > 3;
ERROR 21000: Subquery returns more than 1 row
SELECT a FROM t1
ORDER BY IFNULL((SELECT b FROM t2 WHERE b > 2),
(SELECT c FROM t2 WHERE c=a AND b > 2 ORDER BY b));
a
2
4
1
3
SELECT a FROM t1
ORDER BY IFNULL((SELECT b FROM t2 WHERE b > 1),
(SELECT c FROM t2 WHERE c=a AND b > 1 ORDER BY b));
ERROR 21000: Subquery returns more than 1 row
SELECT a FROM t1
ORDER BY IFNULL((SELECT b FROM t2 WHERE b > 4),
(SELECT c FROM t2 WHERE c=a AND b > 2 ORDER BY b));
a
2
1
3
4
SELECT a FROM t1
ORDER BY IFNULL((SELECT b FROM t2 WHERE b > 4),
(SELECT c FROM t2 WHERE c=a AND b > 1 ORDER BY b));
ERROR 21000: Subquery returns more than 1 row
DROP TABLE t1,t2;
mysql-test/t/subselect.test
View file @
da9f2149
...
...
@@ -1993,4 +1993,63 @@ SELECT a FROM t1 WHERE (SELECT 1 FROM DUAL WHERE 1=0) IS NULL;
EXPLAIN
SELECT
a
FROM
t1
WHERE
(
SELECT
1
FROM
DUAL
WHERE
1
=
0
)
IS
NULL
;
DROP
TABLE
t1
;
#
# Bug 24653: sorting by expressions containing subselects
# that return more than one row
#
CREATE
TABLE
t1
(
a
int
);
INSERT
INTO
t1
VALUES
(
2
),
(
4
),
(
1
),
(
3
);
CREATE
TABLE
t2
(
b
int
,
c
int
);
INSERT
INTO
t2
VALUES
(
2
,
1
),
(
1
,
3
),
(
2
,
1
),
(
4
,
4
),
(
2
,
2
),
(
1
,
4
);
SELECT
a
FROM
t1
ORDER
BY
(
SELECT
c
FROM
t2
WHERE
b
>
2
);
--
error
1242
SELECT
a
FROM
t1
ORDER
BY
(
SELECT
c
FROM
t2
WHERE
b
>
1
);
SELECT
a
FROM
t1
ORDER
BY
(
SELECT
c
FROM
t2
WHERE
b
>
2
),
a
;
--
error
1242
SELECT
a
FROM
t1
ORDER
BY
(
SELECT
c
FROM
t2
WHERE
b
>
1
),
a
;
SELECT
b
,
MAX
(
c
)
FROM
t2
GROUP
BY
b
,
(
SELECT
c
FROM
t2
WHERE
b
>
2
);
--
error
1242
SELECT
b
,
MAX
(
c
)
FROM
t2
GROUP
BY
b
,
(
SELECT
c
FROM
t2
WHERE
b
>
1
);
SELECT
a
FROM
t1
GROUP
BY
a
HAVING
IFNULL
((
SELECT
b
FROM
t2
WHERE
b
>
2
),
(
SELECT
c
FROM
t2
WHERE
c
=
a
AND
b
>
2
ORDER
BY
b
))
>
3
;
--
error
1242
SELECT
a
FROM
t1
GROUP
BY
a
HAVING
IFNULL
((
SELECT
b
FROM
t2
WHERE
b
>
1
),
(
SELECT
c
FROM
t2
WHERE
c
=
a
AND
b
>
2
ORDER
BY
b
))
>
3
;
SELECT
a
FROM
t1
GROUP
BY
a
HAVING
IFNULL
((
SELECT
b
FROM
t2
WHERE
b
>
4
),
(
SELECT
c
FROM
t2
WHERE
c
=
a
AND
b
>
2
ORDER
BY
b
))
>
3
;
--
error
1242
SELECT
a
FROM
t1
GROUP
BY
a
HAVING
IFNULL
((
SELECT
b
FROM
t2
WHERE
b
>
4
),
(
SELECT
c
FROM
t2
WHERE
c
=
a
AND
b
>
1
ORDER
BY
b
))
>
3
;
SELECT
a
FROM
t1
ORDER
BY
IFNULL
((
SELECT
b
FROM
t2
WHERE
b
>
2
),
(
SELECT
c
FROM
t2
WHERE
c
=
a
AND
b
>
2
ORDER
BY
b
));
--
error
1242
SELECT
a
FROM
t1
ORDER
BY
IFNULL
((
SELECT
b
FROM
t2
WHERE
b
>
1
),
(
SELECT
c
FROM
t2
WHERE
c
=
a
AND
b
>
1
ORDER
BY
b
));
SELECT
a
FROM
t1
ORDER
BY
IFNULL
((
SELECT
b
FROM
t2
WHERE
b
>
4
),
(
SELECT
c
FROM
t2
WHERE
c
=
a
AND
b
>
2
ORDER
BY
b
));
--
error
1242
SELECT
a
FROM
t1
ORDER
BY
IFNULL
((
SELECT
b
FROM
t2
WHERE
b
>
4
),
(
SELECT
c
FROM
t2
WHERE
c
=
a
AND
b
>
1
ORDER
BY
b
));
DROP
TABLE
t1
,
t2
;
# End of 4.1 tests
sql/filesort.cc
View file @
da9f2149
...
...
@@ -387,7 +387,8 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
byte
*
ref_pos
,
*
next_pos
,
ref_buff
[
MAX_REFLENGTH
];
my_off_t
record
;
TABLE
*
sort_form
;
volatile
my_bool
*
killed
=
&
current_thd
->
killed
;
THD
*
thd
=
current_thd
;
volatile
my_bool
*
killed
=
&
thd
->
killed
;
handler
*
file
;
DBUG_ENTER
(
"find_all_keys"
);
DBUG_PRINT
(
"info"
,(
"using: %s"
,(
select
?
select
->
quick
?
"ranges"
:
"where"
:
"every row"
)));
...
...
@@ -474,6 +475,9 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
}
else
file
->
unlock_row
();
/* It does not make sense to read more keys in case of a fatal error */
if
(
thd
->
net
.
report_error
)
DBUG_RETURN
(
HA_POS_ERROR
);
}
(
void
)
file
->
extra
(
HA_EXTRA_NO_CACHE
);
/* End cacheing of records */
if
(
!
next_pos
)
...
...
sql/item.cc
View file @
da9f2149
...
...
@@ -47,6 +47,7 @@ Item::Item():
collation
.
set
(
&
my_charset_bin
,
DERIVATION_COERCIBLE
);
name
=
0
;
decimals
=
0
;
max_length
=
0
;
with_subselect
=
0
;
/* Put item in free list so that we can free all items at end */
THD
*
thd
=
current_thd
;
...
...
sql/item.h
View file @
da9f2149
...
...
@@ -142,6 +142,9 @@ public:
my_bool
with_sum_func
;
my_bool
fixed
;
/* If item fixed with fix_fields */
DTCollation
collation
;
my_bool
with_subselect
;
/* If this item is a subselect or some
of its arguments is or contains a
subselect */
// alloc & destruct is done as start of select using sql_alloc
Item
();
...
...
sql/item_cmpfunc.cc
View file @
da9f2149
...
...
@@ -2139,6 +2139,7 @@ Item_cond::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
and_tables_cache
&=
tmp_table_map
;
const_item_cache
&=
item
->
const_item
();
with_sum_func
=
with_sum_func
||
item
->
with_sum_func
;
with_subselect
|=
item
->
with_subselect
;
if
(
item
->
maybe_null
)
maybe_null
=
1
;
}
...
...
@@ -2351,7 +2352,7 @@ longlong Item_func_isnull::val_int()
Handle optimization if the argument can't be null
This has to be here because of the test in update_used_tables().
*/
if
(
!
used_tables_cache
)
if
(
!
used_tables_cache
&&
!
with_subselect
)
return
cached_value
;
return
args
[
0
]
->
is_null
()
?
1
:
0
;
}
...
...
@@ -2360,7 +2361,7 @@ longlong Item_is_not_null_test::val_int()
{
DBUG_ASSERT
(
fixed
==
1
);
DBUG_ENTER
(
"Item_is_not_null_test::val_int"
);
if
(
!
used_tables_cache
)
if
(
!
used_tables_cache
&&
!
with_subselect
)
{
owner
->
was_null
|=
(
!
cached_value
);
DBUG_PRINT
(
"info"
,
(
"cached :%d"
,
cached_value
));
...
...
@@ -2387,7 +2388,7 @@ void Item_is_not_null_test::update_used_tables()
else
{
args
[
0
]
->
update_used_tables
();
if
(
!
(
used_tables_cache
=
args
[
0
]
->
used_tables
()))
if
(
!
(
used_tables_cache
=
args
[
0
]
->
used_tables
())
&&
!
with_subselect
)
{
/* Remember if the value is always NULL or never NULL */
cached_value
=
(
longlong
)
!
args
[
0
]
->
is_null
();
...
...
sql/item_cmpfunc.h
View file @
da9f2149
...
...
@@ -843,7 +843,8 @@ public:
else
{
args
[
0
]
->
update_used_tables
();
if
((
const_item_cache
=
!
(
used_tables_cache
=
args
[
0
]
->
used_tables
())))
if
((
const_item_cache
=
!
(
used_tables_cache
=
args
[
0
]
->
used_tables
()))
&&
!
with_subselect
)
{
/* Remember if the value is always NULL or never NULL */
cached_value
=
(
longlong
)
args
[
0
]
->
is_null
();
...
...
sql/item_func.cc
View file @
da9f2149
...
...
@@ -177,6 +177,7 @@ Item_func::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
used_tables_cache
|=
item
->
used_tables
();
not_null_tables_cache
|=
item
->
not_null_tables
();
const_item_cache
&=
item
->
const_item
();
with_subselect
|=
item
->
with_subselect
;
}
}
fix_length_and_dec
();
...
...
sql/item_subselect.cc
View file @
da9f2149
...
...
@@ -39,6 +39,7 @@ Item_subselect::Item_subselect():
engine
(
0
),
old_engine
(
0
),
used_tables_cache
(
0
),
have_to_be_excluded
(
0
),
const_item_cache
(
1
),
engine_changed
(
0
),
changed
(
0
)
{
with_subselect
=
1
;
reset
();
/*
item value is NULL if select_subselect not changed this value
...
...
@@ -201,6 +202,9 @@ bool Item_subselect::exec()
mem root
*/
thd
->
mem_root
=
&
thd
->
main_mem_root
;
if
(
thd
->
net
.
report_error
)
/* Do not execute subselect in case of a fatal error */
return
1
;
res
=
engine
->
exec
();
thd
->
mem_root
=
old_root
;
...
...
sql/opt_sum.cc
View file @
da9f2149
...
...
@@ -68,9 +68,9 @@ static int maxmin_in_range(bool max_fl, Field* field, COND *cond);
GROUP BY part.
RETURN VALUES
0
N
o errors
0
n
o errors
1 if all items were resolved
-1
on impossible conditions
HA_ERR_KEY_NOT_FOUND
on impossible conditions
OR an error number from my_base.h HA_ERR_... if a deadlock or a lock
wait timeout happens, for example
*/
...
...
@@ -216,7 +216,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
if
(
error
)
{
if
(
error
==
HA_ERR_KEY_NOT_FOUND
||
error
==
HA_ERR_END_OF_FILE
)
return
-
1
;
// No rows matching WHERE
return
HA_ERR_KEY_NOT_FOUND
;
// No rows matching WHERE
/* HA_ERR_LOCK_DEADLOCK or some other error */
table
->
file
->
print_error
(
error
,
MYF
(
0
));
return
(
error
);
...
...
@@ -303,7 +303,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
if
(
error
)
{
if
(
error
==
HA_ERR_KEY_NOT_FOUND
||
error
==
HA_ERR_END_OF_FILE
)
return
-
1
;
// No rows matching WHERE
return
HA_ERR_KEY_NOT_FOUND
;
// No rows matching WHERE
/* HA_ERR_LOCK_DEADLOCK or some other error */
table
->
file
->
print_error
(
error
,
MYF
(
0
));
return
(
error
);
...
...
sql/sql_select.cc
View file @
da9f2149
...
...
@@ -531,23 +531,25 @@ JOIN::optimize()
{
int
res
;
/*
opt_sum_query() returns -1 if no rows match to the WHERE conditions,
or 1 if all items were resolved, or 0, or an error number HA_ERR_...
opt_sum_query() returns HA_ERR_KEY_NOT_FOUND if no rows match
to the WHERE conditions,
or 1 if all items were resolved,
or 0, or an error number HA_ERR_...
*/
if
((
res
=
opt_sum_query
(
tables_list
,
all_fields
,
conds
)))
{
if
(
res
==
HA_ERR_KEY_NOT_FOUND
)
{
zero_result_cause
=
"No matching min/max row"
;
error
=
0
;
DBUG_RETURN
(
0
);
}
if
(
res
>
1
)
{
thd
->
fatal_error
();
error
=
res
;
DBUG_RETURN
(
1
);
}
if
(
res
<
0
)
{
zero_result_cause
=
"No matching min/max row"
;
error
=
0
;
DBUG_RETURN
(
0
);
}
zero_result_cause
=
"Select tables optimized away"
;
tables_list
=
0
;
// All tables resolved
/*
...
...
@@ -644,6 +646,13 @@ JOIN::optimize()
{
ORDER
*
org_order
=
order
;
order
=
remove_const
(
this
,
order
,
conds
,
1
,
&
simple_order
);
if
(
thd
->
net
.
report_error
)
{
error
=
1
;
DBUG_PRINT
(
"error"
,(
"Error from remove_const"
));
DBUG_RETURN
(
1
);
}
/*
If we are using ORDER BY NULL or ORDER BY const_expression,
return result in any order (even if we are using a GROUP BY)
...
...
@@ -747,6 +756,12 @@ JOIN::optimize()
group_list
=
remove_const
(
this
,
(
old_group_list
=
group_list
),
conds
,
rollup
.
state
==
ROLLUP
::
STATE_NONE
,
&
simple_group
);
if
(
thd
->
net
.
report_error
)
{
error
=
1
;
DBUG_PRINT
(
"error"
,(
"Error from remove_const"
));
DBUG_RETURN
(
1
);
}
if
(
old_group_list
&&
!
group_list
)
select_distinct
=
0
;
}
...
...
@@ -763,6 +778,12 @@ JOIN::optimize()
{
group_list
=
procedure
->
group
=
remove_const
(
this
,
procedure
->
group
,
conds
,
1
,
&
simple_group
);
if
(
thd
->
net
.
report_error
)
{
error
=
1
;
DBUG_PRINT
(
"error"
,(
"Error from remove_const"
));
DBUG_RETURN
(
1
);
}
calc_group_buffer
(
this
,
group_list
);
}
...
...
@@ -4428,6 +4449,8 @@ remove_const(JOIN *join,ORDER *first_order, COND *cond,
*
simple_order
=
0
;
// Must do a temp table to sort
else
if
(
!
(
order_tables
&
not_const_tables
))
{
if
(
order
->
item
[
0
]
->
with_subselect
)
order
->
item
[
0
]
->
val_str
(
&
order
->
item
[
0
]
->
str_value
);
DBUG_PRINT
(
"info"
,(
"removing: %s"
,
order
->
item
[
0
]
->
full_name
()));
continue
;
// skip const item
}
...
...
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