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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
d1f2d927
Commit
d1f2d927
authored
Jun 26, 2003
by
unknown
Browse files
Options
Browse Files
Download
Plain Diff
Merge kishkin.ru:/home/wax/mysql-4.1 into kishkin.ru:/home/wax/mysql-4g
sql/field.h: Auto merged sql/item_sum.cc: Auto merged
parents
56d01518
31f6b81b
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
116 additions
and
54 deletions
+116
-54
mysql-test/r/func_gconcat.result
mysql-test/r/func_gconcat.result
+19
-1
mysql-test/t/func_gconcat.test
mysql-test/t/func_gconcat.test
+15
-1
sql/field.cc
sql/field.cc
+1
-1
sql/field.h
sql/field.h
+1
-0
sql/item_sum.cc
sql/item_sum.cc
+59
-43
sql/item_sum.h
sql/item_sum.h
+21
-8
No files found.
mysql-test/r/func_gconcat.result
View file @
d1f2d927
...
...
@@ -154,8 +154,26 @@ Warning 1258 1 line(s) was(were) cut by group_concat()
show warnings;
Level Code Message
Warning 1258 1 line(s) was(were) cut by group_concat()
set group_concat_max_len = 1024;
drop table if exists T_URL;
Warnings:
Note 1051 Unknown table 'T_URL'
create table T_URL ( URL_ID int(11), URL varchar(80));
drop table if exists T_REQUEST;
Warnings:
Note 1051 Unknown table 'T_REQUEST'
create table T_REQUEST ( REQ_ID int(11), URL_ID int(11));
insert into T_URL values (4,'www.host.com'), (5,'www.google.com'),(5,'www.help.com');
insert into T_REQUEST values (1,4), (5,4), (5,5);
select REQ_ID, Group_Concat(URL) as URL from T_URL, T_REQUEST where
T_REQUEST.URL_ID = T_URL.URL_ID group by REQ_ID;
REQ_ID URL
1 www.host.com
5 www.host.com,www.google.com,www.help.com
drop table T_URL;
drop table T_REQUEST;
select group_concat(sum(a)) from t1 group by grp;
ERROR HY000: Invalid use of group function
select grp,group_concat(c order by 2) from t1 group by grp;
ERROR 42S22: Unknown column '2' in 'group statement'
drop table
if exists
t1;
drop table t1;
mysql-test/t/func_gconcat.test
View file @
d1f2d927
...
...
@@ -68,6 +68,20 @@ select grp,group_concat(c order by c) from t1 group by grp;
set
group_concat_max_len
=
5
;
select
grp
,
group_concat
(
c
)
from
t1
group
by
grp
;
show
warnings
;
set
group_concat_max_len
=
1024
;
# Test variable length
drop
table
if
exists
T_URL
;
create
table
T_URL
(
URL_ID
int
(
11
),
URL
varchar
(
80
));
drop
table
if
exists
T_REQUEST
;
create
table
T_REQUEST
(
REQ_ID
int
(
11
),
URL_ID
int
(
11
));
insert
into
T_URL
values
(
4
,
'www.host.com'
),
(
5
,
'www.google.com'
),(
5
,
'www.help.com'
);
insert
into
T_REQUEST
values
(
1
,
4
),
(
5
,
4
),
(
5
,
5
);
select
REQ_ID
,
Group_Concat
(
URL
)
as
URL
from
T_URL
,
T_REQUEST
where
T_REQUEST
.
URL_ID
=
T_URL
.
URL_ID
group
by
REQ_ID
;
drop
table
T_URL
;
drop
table
T_REQUEST
;
# Test errors
...
...
@@ -76,4 +90,4 @@ select group_concat(sum(a)) from t1 group by grp;
--
error
1054
select
grp
,
group_concat
(
c
order
by
2
)
from
t1
group
by
grp
;
drop
table
if
exists
t1
;
drop
table
t1
;
sql/field.cc
View file @
d1f2d927
...
...
@@ -183,7 +183,7 @@ Field::Field(char *ptr_arg,uint32 length_arg,uchar *null_ptr_arg,
field_name
(
field_name_arg
),
query_id
(
0
),
key_start
(
0
),
part_of_key
(
0
),
part_of_sortkey
(
0
),
unireg_check
(
unireg_check_arg
),
field_length
(
length_arg
),
null_bit
(
null_bit_arg
)
field_length
(
length_arg
),
null_bit
(
null_bit_arg
)
,
abs_offset
(
0
)
{
flags
=
null_ptr
?
0
:
NOT_NULL_FLAG
;
comment
.
str
=
(
char
*
)
""
;
...
...
sql/field.h
View file @
d1f2d927
...
...
@@ -66,6 +66,7 @@ class Field
uint32
field_length
;
// Length of field
uint16
flags
;
uchar
null_bit
;
// Bit used to test null bit
uint
abs_offset
;
// use only in group_concat
Field
(
char
*
ptr_arg
,
uint32
length_arg
,
uchar
*
null_ptr_arg
,
uchar
null_bit_arg
,
utype
unireg_check_arg
,
const
char
*
field_name_arg
,
...
...
sql/item_sum.cc
View file @
d1f2d927
...
...
@@ -1453,27 +1453,28 @@ String *Item_sum_udf_str::val_str(String *str)
GROUP_CONCAT(DISTINCT expr,...)
*/
static
int
group_concat_key_cmp_with_distinct
(
void
*
arg
,
byte
*
key1
,
byte
*
key2
)
int
group_concat_key_cmp_with_distinct
(
void
*
arg
,
byte
*
key1
,
byte
*
key2
)
{
Item_func_group_concat
*
item
=
(
Item_func_group_concat
*
)
arg
;
for
(
uint
i
=
0
;
i
<
item
->
arg_count_field
;
i
++
)
{
Item
*
field_item
=
item
->
expr
[
i
];
Item
*
field_item
=
item
->
args
[
i
];
Field
*
field
=
field_item
->
tmp_table_field
();
if
(
field
)
{
uint
offset
=
field
->
offset
()
;
uint
offset
=
field
->
abs_offset
;
int
res
=
field
->
key_cmp
(
key1
+
offset
,
key2
+
offset
);
/*
if key1 and key2 is not equal than field->key_cmp return offset. This
function must return value 1 for this case.
function must return value 1 for this case.
*/
if
(
res
)
return
1
;
}
}
}
return
0
;
}
...
...
@@ -1483,9 +1484,10 @@ static int group_concat_key_cmp_with_distinct(void* arg, byte* key1,
GROUP_CONCAT(expr,... ORDER BY col,... )
*/
static
int
group_concat_key_cmp_with_order
(
void
*
arg
,
byte
*
key1
,
byte
*
key2
)
int
group_concat_key_cmp_with_order
(
void
*
arg
,
byte
*
key1
,
byte
*
key2
)
{
Item_func_group_concat
*
item
=
(
Item_func_group_concat
*
)
arg
;
for
(
uint
i
=
0
;
i
<
item
->
arg_count_order
;
i
++
)
{
ORDER
*
order_item
=
item
->
order
[
i
];
...
...
@@ -1493,14 +1495,14 @@ static int group_concat_key_cmp_with_order(void* arg, byte* key1, byte* key2)
Field
*
field
=
item
->
tmp_table_field
();
if
(
field
)
{
uint
offset
=
field
->
offset
()
;
uint
offset
=
field
->
abs_offset
;
bool
dir
=
order_item
->
asc
;
int
res
=
field
->
key_cmp
(
key1
+
offset
,
key2
+
offset
);
if
(
res
)
return
dir
?
res
:
-
res
;
}
}
}
/*
We can't return 0 because tree class remove this item as double value.
*/
...
...
@@ -1513,9 +1515,8 @@ static int group_concat_key_cmp_with_order(void* arg, byte* key1, byte* key2)
GROUP_CONCAT(DISTINCT expr,... ORDER BY col,... )
*/
static
int
group_concat_key_cmp_with_distinct_and_order
(
void
*
arg
,
byte
*
key1
,
byte
*
key2
)
int
group_concat_key_cmp_with_distinct_and_order
(
void
*
arg
,
byte
*
key1
,
byte
*
key2
)
{
if
(
!
group_concat_key_cmp_with_distinct
(
arg
,
key1
,
key2
))
return
0
;
...
...
@@ -1528,24 +1529,23 @@ static int group_concat_key_cmp_with_distinct_and_order(void* arg,
item is pointer to Item_func_group_concat
*/
static
int
dump_leaf_key
(
byte
*
key
,
uint32
count
__attribute__
((
unused
)),
int
dump_leaf_key
(
byte
*
key
,
uint32
count
__attribute__
((
unused
)),
Item_func_group_concat
*
group_concat_item
)
{
char
buff
[
MAX_FIELD_WIDTH
];
String
tmp
((
char
*
)
&
buff
,
sizeof
(
buff
),
default_charset_info
);
String
tmp2
((
char
*
)
&
buff
,
sizeof
(
buff
),
default_charset_info
);
tmp
.
length
(
0
);
for
(
uint
i
=
0
;
i
<
group_concat_item
->
arg_show_fields
;
i
++
)
{
Item
*
show_item
=
group_concat_item
->
expr
[
i
];
Item
*
show_item
=
group_concat_item
->
args
[
i
];
if
(
!
show_item
->
const_item
())
{
Field
*
f
=
show_item
->
tmp_table_field
();
uint
offset
=
f
->
offset
();
char
*
sv
=
f
->
ptr
;
f
->
ptr
=
(
char
*
)
key
+
offset
;
f
->
ptr
=
(
char
*
)
key
+
f
->
abs_
offset
;
String
*
res
=
f
->
val_str
(
&
tmp
,
&
tmp2
);
group_concat_item
->
result
.
append
(
*
res
);
f
->
ptr
=
sv
;
...
...
@@ -1595,9 +1595,14 @@ Item_func_group_concat::Item_func_group_concat(bool is_distinct,
List
<
Item
>
*
is_select
,
SQL_LIST
*
is_order
,
String
*
is_separator
)
:
Item_sum
(),
tmp_table_param
(
0
),
warning_available
(
false
),
separator
(
is_separator
),
tree
(
&
tree_base
),
table
(
0
),
count_cut_values
(
0
),
tree_mode
(
0
),
distinct
(
is_distinct
)
:
Item_sum
(),
tmp_table_param
(
0
),
max_elements_in_tree
(
0
),
warning
(
0
),
warning_available
(
0
),
key_length
(
0
),
rec_offset
(
0
),
tree_mode
(
0
),
distinct
(
is_distinct
),
warning_for_row
(
0
),
separator
(
is_separator
),
tree
(
&
tree_base
),
table
(
0
),
order
(
0
),
tables_list
(
0
),
group_concat_max_len
(
0
),
show_elements
(
0
),
arg_count_order
(
0
),
arg_count_field
(
0
),
arg_show_fields
(
0
),
count_cut_values
(
0
)
{
original
=
0
;
quick_group
=
0
;
...
...
@@ -1613,16 +1618,12 @@ Item_func_group_concat::Item_func_group_concat(bool is_distinct,
We need to allocate:
args - arg_count+arg_count_order (for possible order items in temporare
tables)
expr - arg_count_field
order - arg_count_order
*/
args
=
(
Item
**
)
sql_alloc
(
sizeof
(
Item
*
)
*
(
arg_count
+
arg_count_order
+
arg_count_field
)
+
args
=
(
Item
**
)
sql_alloc
(
sizeof
(
Item
*
)
*
(
arg_count
+
arg_count_order
)
+
sizeof
(
ORDER
*
)
*
arg_count_order
);
if
(
!
args
)
return
;
// thd->fatal is set
expr
=
args
;
expr
+=
arg_count
+
arg_count_order
;
return
;
/* fill args items of show and sort */
int
i
=
0
;
...
...
@@ -1630,12 +1631,12 @@ Item_func_group_concat::Item_func_group_concat(bool is_distinct,
Item
*
item_select
;
for
(
;
(
item_select
=
li
++
)
;
i
++
)
args
[
i
]
=
expr
[
i
]
=
item_select
;
args
[
i
]
=
item_select
;
if
(
arg_count_order
)
{
i
=
0
;
order
=
(
ORDER
**
)(
expr
+
arg_count_field
);
order
=
(
ORDER
**
)(
args
+
arg_count
+
arg_count_order
);
for
(
ORDER
*
order_item
=
(
ORDER
*
)
is_order
->
first
;
order_item
!=
NULL
;
order_item
=
order_item
->
next
)
...
...
@@ -1696,13 +1697,15 @@ bool Item_func_group_concat::reset()
bool
Item_func_group_concat
::
add
()
{
if
(
always_null
)
return
0
;
copy_fields
(
tmp_table_param
);
copy_funcs
(
tmp_table_param
->
items_to_copy
);
bool
record_is_null
=
TRUE
;
for
(
uint
i
=
0
;
i
<
arg_show_fields
;
i
++
)
{
Item
*
show_item
=
expr
[
i
];
Item
*
show_item
=
args
[
i
];
if
(
!
show_item
->
const_item
())
{
Field
*
f
=
show_item
->
tmp_table_field
();
...
...
@@ -1718,13 +1721,13 @@ bool Item_func_group_concat::add()
null_value
=
FALSE
;
if
(
tree_mode
)
{
if
(
!
tree_insert
(
tree
,
table
->
record
[
0
]
,
0
,
tree
->
custom_arg
))
if
(
!
tree_insert
(
tree
,
table
->
record
[
0
]
+
rec_offset
,
0
,
tree
->
custom_arg
))
return
1
;
}
else
{
if
(
result
.
length
()
<=
group_concat_max_len
&&
!
warning_for_row
)
dump_leaf_key
(
table
->
record
[
0
]
,
1
,
dump_leaf_key
(
table
->
record
[
0
]
+
rec_offset
,
1
,
(
Item_func_group_concat
*
)
this
);
}
return
0
;
...
...
@@ -1757,12 +1760,6 @@ Item_func_group_concat::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
return
1
;
maybe_null
|=
args
[
i
]
->
maybe_null
;
}
for
(
i
=
0
;
i
<
arg_count_field
;
i
++
)
{
if
(
expr
[
i
]
->
fix_fields
(
thd
,
tables
,
expr
+
i
)
||
expr
[
i
]
->
check_cols
(
1
))
return
1
;
maybe_null
|=
expr
[
i
]
->
maybe_null
;
}
/*
Fix fields for order clause in function:
GROUP_CONCAT(expr,... ORDER BY col,... )
...
...
@@ -1796,6 +1793,7 @@ bool Item_func_group_concat::setup(THD *thd)
/*
all not constant fields are push to list and create temp table
*/
always_null
=
0
;
for
(
uint
i
=
0
;
i
<
arg_count
;
i
++
)
{
Item
*
item
=
args
[
i
];
...
...
@@ -1808,6 +1806,8 @@ bool Item_func_group_concat::setup(THD *thd)
always_null
=
1
;
}
}
if
(
always_null
)
return
0
;
List
<
Item
>
all_fields
(
list
);
if
(
arg_count_order
)
...
...
@@ -1827,12 +1827,25 @@ bool Item_func_group_concat::setup(THD *thd)
return
1
;
table
->
file
->
extra
(
HA_EXTRA_NO_ROWS
);
table
->
no_rows
=
1
;
qsort_cmp2
compare_key
;
tree_mode
=
distinct
||
arg_count_order
;
Field
**
field
,
**
field_end
;
field_end
=
(
field
=
table
->
field
)
+
table
->
fields
;
uint
offset
=
0
;
for
(
key_length
=
0
;
field
<
field_end
;
++
field
)
{
uint32
length
=
(
*
field
)
->
pack_length
();
(
*
field
)
->
abs_offset
=
offset
;
offset
+=
length
;
key_length
+=
length
;
}
rec_offset
=
table
->
reclength
-
key_length
;
/*
choise function of sort
*/
tree_mode
=
distinct
||
arg_count_order
;
qsort_cmp2
compare_key
;
if
(
tree_mode
)
{
if
(
arg_count_order
)
...
...
@@ -1856,9 +1869,9 @@ bool Item_func_group_concat::setup(THD *thd)
*/
init_tree
(
tree
,
min
(
thd
->
variables
.
max_heap_table_size
,
thd
->
variables
.
sortbuff_size
/
16
),
0
,
table
->
rec
length
,
compare_key
,
0
,
NULL
,
(
void
*
)
this
);
max_elements_in_tree
=
((
table
->
rec
length
)
?
thd
->
variables
.
max_heap_table_size
/
table
->
rec
length
:
1
);
key_
length
,
compare_key
,
0
,
NULL
,
(
void
*
)
this
);
max_elements_in_tree
=
((
key_
length
)
?
thd
->
variables
.
max_heap_table_size
/
key_
length
:
1
);
};
item_thd
=
thd
;
...
...
@@ -1909,3 +1922,6 @@ String* Item_func_group_concat::val_str(String* str)
}
return
&
result
;
}
sql/item_sum.h
View file @
d1f2d927
...
...
@@ -644,13 +644,28 @@ class Item_func_group_concat : public Item_sum
uint
max_elements_in_tree
;
MYSQL_ERROR
*
warning
;
bool
warning_available
;
uint
key_length
;
int
rec_offset
;
bool
tree_mode
;
bool
distinct
;
bool
warning_for_row
;
bool
always_null
;
friend
int
group_concat_key_cmp_with_distinct
(
void
*
arg
,
byte
*
key1
,
byte
*
key2
);
friend
int
group_concat_key_cmp_with_order
(
void
*
arg
,
byte
*
key1
,
byte
*
key2
);
friend
int
group_concat_key_cmp_with_distinct_and_order
(
void
*
arg
,
byte
*
key1
,
byte
*
key2
);
friend
int
dump_leaf_key
(
byte
*
key
,
uint32
count
__attribute__
((
unused
)),
Item_func_group_concat
*
group_concat_item
);
public:
String
result
;
String
*
separator
;
TREE
tree_base
;
TREE
*
tree
;
TABLE
*
table
;
Item
**
expr
;
ORDER
**
order
;
TABLE_LIST
*
tables_list
;
ulong
group_concat_max_len
;
...
...
@@ -659,9 +674,6 @@ class Item_func_group_concat : public Item_sum
uint
arg_count_field
;
uint
arg_show_fields
;
uint
count_cut_values
;
bool
tree_mode
,
distinct
;
bool
warning_for_row
;
bool
always_null
;
/*
Following is 0 normal object and pointer to original one for copy
(to correctly free resources)
...
...
@@ -677,10 +689,14 @@ class Item_func_group_concat : public Item_sum
max_elements_in_tree
(
item
.
max_elements_in_tree
),
warning
(
item
.
warning
),
warning_available
(
item
.
warning_available
),
key_length
(
item
.
key_length
),
rec_offset
(
item
.
rec_offset
),
tree_mode
(
0
),
distinct
(
item
.
distinct
),
warning_for_row
(
item
.
warning_for_row
),
separator
(
item
.
separator
),
tree
(
item
.
tree
),
table
(
item
.
table
),
expr
(
item
.
expr
),
order
(
item
.
order
),
tables_list
(
item
.
tables_list
),
group_concat_max_len
(
item
.
group_concat_max_len
),
...
...
@@ -689,9 +705,6 @@ class Item_func_group_concat : public Item_sum
arg_count_field
(
item
.
arg_count_field
),
arg_show_fields
(
item
.
arg_show_fields
),
count_cut_values
(
item
.
count_cut_values
),
tree_mode
(
0
),
distinct
(
item
.
distinct
),
warning_for_row
(
item
.
warning_for_row
),
original
(
&
item
)
{
quick_group
=
0
;
...
...
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