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
5ade9e75
Commit
5ade9e75
authored
Jun 02, 2006
by
igor@rurik.mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge rurik.mysql.com:/home/igor/mysql-4.1-opt
into rurik.mysql.com:/home/igor/mysql-5.0-opt
parents
20c057ce
d02f254e
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
61 additions
and
7 deletions
+61
-7
mysql-test/r/func_group.result
mysql-test/r/func_group.result
+24
-0
mysql-test/t/func_group.test
mysql-test/t/func_group.test
+19
-0
sql/opt_sum.cc
sql/opt_sum.cc
+14
-3
sql/sql_select.cc
sql/sql_select.cc
+3
-3
sql/sql_select.h
sql/sql_select.h
+1
-1
No files found.
mysql-test/r/func_group.result
View file @
5ade9e75
...
...
@@ -821,6 +821,30 @@ SELECT MAX(id) FROM t1 WHERE id < 3 AND a=2 AND b=6;
MAX(id)
NULL
DROP TABLE t1;
CREATE TABLE t1 (id int PRIMARY KEY, b char(3), INDEX(b));
INSERT INTO t1 VALUES (1,'xx'), (2,'aa');
SELECT * FROM t1;
id b
1 xx
2 aa
SELECT MAX(b) FROM t1 WHERE b < 'ppppp';
MAX(b)
aa
SHOW WARNINGS;
Level Code Message
SELECT MAX(b) FROM t1 WHERE b < 'pp';
MAX(b)
aa
DROP TABLE t1;
CREATE TABLE t1 (id int PRIMARY KEY, b char(16), INDEX(b(4)));
INSERT INTO t1 VALUES (1, 'xxxxbbbb'), (2, 'xxxxaaaa');
SELECT MAX(b) FROM t1;
MAX(b)
xxxxbbbb
EXPLAIN SELECT MAX(b) FROM t1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
DROP TABLE t1;
create table t2 (ff double);
insert into t2 values (2.2);
select cast(sum(distinct ff) as decimal(5,2)) from t2;
...
...
mysql-test/t/func_group.test
View file @
5ade9e75
...
...
@@ -539,6 +539,25 @@ INSERT INTO t1 VALUES
SELECT
MAX
(
id
)
FROM
t1
WHERE
id
<
3
AND
a
=
2
AND
b
=
6
;
DROP
TABLE
t1
;
#
# Bug #18206: min/max optimization cannot be applied to partial index
#
CREATE
TABLE
t1
(
id
int
PRIMARY
KEY
,
b
char
(
3
),
INDEX
(
b
));
INSERT
INTO
t1
VALUES
(
1
,
'xx'
),
(
2
,
'aa'
);
SELECT
*
FROM
t1
;
SELECT
MAX
(
b
)
FROM
t1
WHERE
b
<
'ppppp'
;
SHOW
WARNINGS
;
SELECT
MAX
(
b
)
FROM
t1
WHERE
b
<
'pp'
;
DROP
TABLE
t1
;
CREATE
TABLE
t1
(
id
int
PRIMARY
KEY
,
b
char
(
16
),
INDEX
(
b
(
4
)));
INSERT
INTO
t1
VALUES
(
1
,
'xxxxbbbb'
),
(
2
,
'xxxxaaaa'
);
SELECT
MAX
(
b
)
FROM
t1
;
EXPLAIN
SELECT
MAX
(
b
)
FROM
t1
;
DROP
TABLE
t1
;
# End of 4.1 tests
#
...
...
sql/opt_sum.cc
View file @
5ade9e75
...
...
@@ -569,6 +569,10 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
break
;
// Found a part od the key for the field
}
#if 0
if (part->length != (((Item_field*) args[0])->field)->field_length)
return 0;
#endif
bool
is_field_part
=
part
==
field_part
;
if
(
!
(
is_field_part
||
eq_type
))
return
0
;
...
...
@@ -608,7 +612,8 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
}
else
{
store_val_in_field
(
part
->
field
,
args
[
between
&&
max_fl
?
2
:
1
]);
store_val_in_field
(
part
->
field
,
args
[
between
&&
max_fl
?
2
:
1
],
CHECK_FIELD_IGNORE
);
if
(
part
->
null_bit
)
*
key_ptr
++=
(
byte
)
test
(
part
->
field
->
is_null
());
part
->
field
->
get_key_image
((
char
*
)
key_ptr
,
part
->
length
,
Field
::
itRAW
);
...
...
@@ -663,6 +668,8 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
field BETWEEN const1 AND const2
3. all references to the columns from the same table as column field
occur only in conjucts mentioned above.
4. each of k first components the index is not partial, i.e. is not
defined on a fixed length proper prefix of the field.
If such an index exists the function through the ref parameter
returns the key value to find max/min for the field using the index,
...
...
@@ -672,8 +679,8 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
of the whole search key)
NOTE
This function may set table->key_read to 1, which must be reset after
index is used! (This can only happen when function returns 1)
This function may set table->key_read to 1, which must be reset after
index is used! (This can only happen when function returns 1)
RETURN
0 Index can not be used to optimize MIN(field)/MAX(field)
...
...
@@ -707,6 +714,10 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
if
(
!
(
table
->
file
->
index_flags
(
idx
,
jdx
,
0
)
&
HA_READ_ORDER
))
return
0
;
/* Check whether the index component is partial */
if
(
part
->
length
<
table
->
field
[
part
->
fieldnr
-
1
]
->
pack_length
())
break
;
if
(
field
->
eq
(
part
->
field
))
{
ref
->
key
=
idx
;
...
...
sql/sql_select.cc
View file @
5ade9e75
...
...
@@ -4788,7 +4788,7 @@ get_store_key(THD *thd, KEYUSE *keyuse, table_map used_tables,
*/
bool
store_val_in_field
(
Field
*
field
,
Item
*
item
)
store_val_in_field
(
Field
*
field
,
Item
*
item
,
enum_check_fields
check_flag
)
{
bool
error
;
THD
*
thd
=
field
->
table
->
in_use
;
...
...
@@ -4799,7 +4799,7 @@ store_val_in_field(Field *field,Item *item)
with select_insert, which make count_cuted_fields= 1
*/
enum_check_fields
old_count_cuted_fields
=
thd
->
count_cuted_fields
;
thd
->
count_cuted_fields
=
CHECK_FIELD_WARN
;
thd
->
count_cuted_fields
=
check_flag
;
error
=
item
->
save_in_field
(
field
,
1
);
thd
->
count_cuted_fields
=
old_count_cuted_fields
;
return
error
||
cuted_fields
!=
thd
->
cuted_fields
;
...
...
@@ -10928,7 +10928,7 @@ static bool test_if_ref(Item_field *left_item,Item *right_item)
field
->
real_type
()
!=
MYSQL_TYPE_VARCHAR
&&
(
field
->
type
()
!=
FIELD_TYPE_FLOAT
||
field
->
decimals
()
==
0
))
{
return
!
store_val_in_field
(
field
,
right_item
);
return
!
store_val_in_field
(
field
,
right_item
,
CHECK_FIELD_WARN
);
}
}
}
...
...
sql/sql_select.h
View file @
5ade9e75
...
...
@@ -404,7 +404,7 @@ extern const char *join_type_str[];
void
TEST_join
(
JOIN
*
join
);
/* Extern functions in sql_select.cc */
bool
store_val_in_field
(
Field
*
field
,
Item
*
val
);
bool
store_val_in_field
(
Field
*
field
,
Item
*
val
,
enum_check_fields
check_flag
);
TABLE
*
create_tmp_table
(
THD
*
thd
,
TMP_TABLE_PARAM
*
param
,
List
<
Item
>
&
fields
,
ORDER
*
group
,
bool
distinct
,
bool
save_sum_fields
,
ulonglong
select_options
,
ha_rows
rows_limit
,
...
...
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