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
791ae8d3
Commit
791ae8d3
authored
Jul 01, 2003
by
bell@sanja.is.com.ua
Browse files
Options
Browse Files
Download
Plain Diff
merge
parents
0330f0cc
98ffed18
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
65 additions
and
5 deletions
+65
-5
mysql-test/r/subselect.result
mysql-test/r/subselect.result
+12
-0
mysql-test/t/subselect.test
mysql-test/t/subselect.test
+11
-0
sql/sql_select.cc
sql/sql_select.cc
+41
-4
sql/sql_select.h
sql/sql_select.h
+1
-1
No files found.
mysql-test/r/subselect.result
View file @
791ae8d3
...
@@ -1200,3 +1200,15 @@ SELECT 'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1
...
@@ -1200,3 +1200,15 @@ SELECT 'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1
'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1.PARENTID='2f6161e879db43c1a5b82c21ddc49089' AND t1.FOLDERNAME = 'Level1')
'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1.PARENTID='2f6161e879db43c1a5b82c21ddc49089' AND t1.FOLDERNAME = 'Level1')
0
0
drop table t1;
drop table t1;
create table t1 (a int, b int);
create table t2 (a int, b int);
create table t3 (a int, b int);
insert into t1 values (0,100),(1,2), (1,3), (2,2), (2,7), (2,-1), (3,10);
insert into t2 values (0,0), (1,1), (2,1), (3,1), (4,1);
insert into t3 values (3,3), (2,2), (1,1);
select a,(select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 and t1.a <= t3.b group by t1.a order by sum limit 1) from t3;
a (select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 and t1.a <= t3.b group by t1.a order by sum limit 1)
3 1
2 2
1 2
drop table t1,t2,t3;
mysql-test/t/subselect.test
View file @
791ae8d3
...
@@ -792,3 +792,14 @@ INSERT INTO t1 VALUES("2f6161e879db43c1a5b82c21ddc49089", "Default", "System", "
...
@@ -792,3 +792,14 @@ INSERT INTO t1 VALUES("2f6161e879db43c1a5b82c21ddc49089", "Default", "System", "
INSERT
INTO
t1
VALUES
(
"c373e9f5ad0791724315444553544200"
,
"AddDocumentTest"
,
"admin"
,
"2003-06-09 10:51:25"
,
"Movie Reviews"
,
"0"
,
"2003-06-09 10:51:25"
,
"admin"
,
"0"
,
"2f6161e879db43c1a5b82c21ddc49089"
,
"03eea05112b845949f3fd03278b5fe43"
,
NULL
);
INSERT
INTO
t1
VALUES
(
"c373e9f5ad0791724315444553544200"
,
"AddDocumentTest"
,
"admin"
,
"2003-06-09 10:51:25"
,
"Movie Reviews"
,
"0"
,
"2003-06-09 10:51:25"
,
"admin"
,
"0"
,
"2f6161e879db43c1a5b82c21ddc49089"
,
"03eea05112b845949f3fd03278b5fe43"
,
NULL
);
SELECT
'c373e9f5ad0791a0dab5444553544200'
IN
(
SELECT
t1
.
FOLDERID
FROM
t1
WHERE
t1
.
PARENTID
=
'2f6161e879db43c1a5b82c21ddc49089'
AND
t1
.
FOLDERNAME
=
'Level1'
);
SELECT
'c373e9f5ad0791a0dab5444553544200'
IN
(
SELECT
t1
.
FOLDERID
FROM
t1
WHERE
t1
.
PARENTID
=
'2f6161e879db43c1a5b82c21ddc49089'
AND
t1
.
FOLDERNAME
=
'Level1'
);
drop
table
t1
;
drop
table
t1
;
#
# alloc_group_fields() working
#
create
table
t1
(
a
int
,
b
int
);
create
table
t2
(
a
int
,
b
int
);
create
table
t3
(
a
int
,
b
int
);
insert
into
t1
values
(
0
,
100
),(
1
,
2
),
(
1
,
3
),
(
2
,
2
),
(
2
,
7
),
(
2
,
-
1
),
(
3
,
10
);
insert
into
t2
values
(
0
,
0
),
(
1
,
1
),
(
2
,
1
),
(
3
,
1
),
(
4
,
1
);
insert
into
t3
values
(
3
,
3
),
(
2
,
2
),
(
1
,
1
);
select
a
,(
select
count
(
distinct
t1
.
b
)
as
sum
from
t1
,
t2
where
t1
.
a
=
t2
.
a
and
t2
.
b
>
0
and
t1
.
a
<=
t3
.
b
group
by
t1
.
a
order
by
sum
limit
1
)
from
t3
;
drop
table
t1
,
t2
,
t3
;
s
sql/sql_select.cc
View file @
791ae8d3
...
@@ -137,6 +137,7 @@ static ORDER *create_distinct_group(THD *thd, ORDER *order,
...
@@ -137,6 +137,7 @@ static ORDER *create_distinct_group(THD *thd, ORDER *order,
static bool test_if_subpart(ORDER *a,ORDER *b);
static bool test_if_subpart(ORDER *a,ORDER *b);
static TABLE *get_sort_by_table(ORDER *a,ORDER *b,TABLE_LIST *tables);
static TABLE *get_sort_by_table(ORDER *a,ORDER *b,TABLE_LIST *tables);
static void calc_group_buffer(JOIN *join,ORDER *group);
static void calc_group_buffer(JOIN *join,ORDER *group);
static bool make_group_fields(JOIN *main_join, JOIN *curr_join);
static bool alloc_group_fields(JOIN *join,ORDER *group);
static bool alloc_group_fields(JOIN *join,ORDER *group);
// Create list for using with tempory table
// Create list for using with tempory table
static bool change_to_use_tmp_fields(THD *thd, Item **ref_pointer_array,
static bool change_to_use_tmp_fields(THD *thd, Item **ref_pointer_array,
...
@@ -1114,12 +1115,12 @@ JOIN::exec()
...
@@ -1114,12 +1115,12 @@ JOIN::exec()
DBUG_VOID_RETURN;
DBUG_VOID_RETURN;
curr_join->exec_tmp_table2= exec_tmp_table2;
curr_join->exec_tmp_table2= exec_tmp_table2;
}
}
if
(
group_list
)
if (
curr_join->
group_list)
{
{
thd->proc_info= "Creating sort index";
thd->proc_info= "Creating sort index";
if (create_sort_index(thd, curr_join->join_tab, curr_join->group_list,
if (create_sort_index(thd, curr_join->join_tab, curr_join->group_list,
HA_POS_ERROR, HA_POS_ERROR) ||
HA_POS_ERROR, HA_POS_ERROR) ||
alloc_group_fields
(
curr_join
,
curr_join
->
group_list
))
make_group_fields(this, curr_join
))
{
{
DBUG_VOID_RETURN;
DBUG_VOID_RETURN;
}
}
...
@@ -1186,7 +1187,10 @@ JOIN::exec()
...
@@ -1186,7 +1187,10 @@ JOIN::exec()
if (curr_join->group || curr_join->tmp_table_param.sum_func_count ||
if (curr_join->group || curr_join->tmp_table_param.sum_func_count ||
(procedure && (procedure->flags & PROC_GROUP)))
(procedure && (procedure->flags & PROC_GROUP)))
{
{
alloc_group_fields
(
curr_join
,
curr_join
->
group_list
);
if (make_group_fields(this, curr_join))
{
DBUG_VOID_RETURN;
}
if (!items3)
if (!items3)
{
{
if (!items0)
if (!items0)
...
@@ -7561,6 +7565,37 @@ calc_group_buffer(JOIN *join,ORDER *group)
...
@@ -7561,6 +7565,37 @@ calc_group_buffer(JOIN *join,ORDER *group)
join->tmp_table_param.group_null_parts=null_parts;
join->tmp_table_param.group_null_parts=null_parts;
}
}
/*
alloc group fields or take prepared (chached)
SYNOPSYS
make_group_fields()
main_join - join of current select
curr_join - current join (join of current select or temporary copy of it)
RETURN
0 - ok
1 - failed
*/
static bool
make_group_fields(JOIN *main_join, JOIN *curr_join)
{
if (main_join->group_fields_cache.elements)
{
curr_join->group_fields= main_join->group_fields_cache;
curr_join->sort_and_group= 1;
}
else
{
if (alloc_group_fields(curr_join, curr_join->group_list))
{
return (1);
}
main_join->group_fields_cache= curr_join->group_fields;
}
return (0);
}
/*
/*
Get a list of buffers for saveing last group
Get a list of buffers for saveing last group
...
@@ -7587,6 +7622,7 @@ alloc_group_fields(JOIN *join,ORDER *group)
...
@@ -7587,6 +7622,7 @@ alloc_group_fields(JOIN *join,ORDER *group)
static int
static int
test_if_group_changed(List<Item_buff> &list)
test_if_group_changed(List<Item_buff> &list)
{
{
DBUG_ENTER("test_if_group_changed");
List_iterator<Item_buff> li(list);
List_iterator<Item_buff> li(list);
int idx= -1,i;
int idx= -1,i;
Item_buff *buff;
Item_buff *buff;
...
@@ -7596,7 +7632,8 @@ test_if_group_changed(List<Item_buff> &list)
...
@@ -7596,7 +7632,8 @@ test_if_group_changed(List<Item_buff> &list)
if (buff->cmp())
if (buff->cmp())
idx=i;
idx=i;
}
}
return
idx
;
DBUG_PRINT("info", ("idx: %d", idx));
DBUG_RETURN(idx);
}
}
...
...
sql/sql_select.h
View file @
791ae8d3
...
@@ -137,7 +137,7 @@ class JOIN :public Sql_alloc
...
@@ -137,7 +137,7 @@ class JOIN :public Sql_alloc
POSITION
positions
[
MAX_TABLES
+
1
],
best_positions
[
MAX_TABLES
+
1
];
POSITION
positions
[
MAX_TABLES
+
1
],
best_positions
[
MAX_TABLES
+
1
];
double
best_read
;
double
best_read
;
List
<
Item
>
*
fields
;
List
<
Item
>
*
fields
;
List
<
Item_buff
>
group_fields
;
List
<
Item_buff
>
group_fields
,
group_fields_cache
;
TABLE
*
tmp_table
;
TABLE
*
tmp_table
;
// used to store 2 possible tmp table of SELECT
// used to store 2 possible tmp table of SELECT
TABLE
*
exec_tmp_table1
,
*
exec_tmp_table2
;
TABLE
*
exec_tmp_table1
,
*
exec_tmp_table2
;
...
...
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