Commit 7b797aaa authored by gkodinov/kgeorge@magare.gmz's avatar gkodinov/kgeorge@magare.gmz

Merge gkodinov@bk-internal.mysql.com:/home/bk/mysql-5.1-opt

into  magare.gmz:/home/kgeorge/mysql/autopush/B27417-5.1-opt
parents 992698ce 355c25f0
...@@ -824,6 +824,23 @@ a ...@@ -824,6 +824,23 @@ a
2 2
1 1
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (
f1 int(10) unsigned NOT NULL auto_increment primary key,
f2 varchar(100) NOT NULL default ''
);
CREATE TABLE t2 (
f1 varchar(10) NOT NULL default '',
f2 char(3) NOT NULL default '',
PRIMARY KEY (`f1`),
KEY `k1` (`f2`,`f1`)
);
INSERT INTO t1 values(NULL, '');
INSERT INTO `t2` VALUES ('486878','WDT'),('486910','WDT');
SELECT SQL_BUFFER_RESULT avg(t2.f1) FROM t1, t2 where t2.f2 = 'SIR' GROUP BY t1.f1;
avg(t2.f1)
SELECT avg(t2.f1) FROM t1, t2 where t2.f2 = 'SIR' GROUP BY t1.f1;
avg(t2.f1)
DROP TABLE t1, t2;
create table t1 (c1 char(3), c2 char(3)); create table t1 (c1 char(3), c2 char(3));
create table t2 (c3 char(3), c4 char(3)); create table t2 (c3 char(3), c4 char(3));
insert into t1 values ('aaa', 'bb1'), ('aaa', 'bb2'); insert into t1 values ('aaa', 'bb1'), ('aaa', 'bb2');
......
...@@ -699,6 +699,32 @@ Handler_read_prev 0 ...@@ -699,6 +699,32 @@ Handler_read_prev 0
Handler_read_rnd 0 Handler_read_rnd 0
Handler_read_rnd_next 1 Handler_read_rnd_next 1
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (
f1 int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
f2 varchar(100) NOT NULL default ''
);
CREATE TABLE t2 (
f1 varchar(10) NOT NULL default '',
f2 char(3) NOT NULL default '',
PRIMARY KEY (`f1`),
KEY `k1` (`f2`, `f1`)
);
INSERT INTO t1 values(NULL, '');
INSERT INTO `t2` VALUES ('486878','WDT'),('486910','WDT');
SELECT COUNT(*) FROM t1;
COUNT(*)
1
SELECT min(t2.f1) FROM t1, t2 where t2.f2 = 'SIR' GROUP BY t1.f1;
min(t2.f1)
INSERT INTO t1 (f2)
SELECT min(t2.f1) FROM t1, t2 where t2.f2 = 'SIR' GROUP BY t1.f1;
SELECT COUNT(*) FROM t1;
COUNT(*)
1
SELECT * FROM t1;
f1 f2
1
DROP TABLE t1, t2;
CREATE TABLE t1 (x int, y int); CREATE TABLE t1 (x int, y int);
CREATE TABLE t2 (z int, y int); CREATE TABLE t2 (z int, y int);
CREATE TABLE t3 (a int, b int); CREATE TABLE t3 (a int, b int);
......
...@@ -6378,6 +6378,17 @@ Level Code Message ...@@ -6378,6 +6378,17 @@ Level Code Message
use test; use test;
drop procedure sp_bug29050; drop procedure sp_bug29050;
drop table t1; drop table t1;
SET NAMES latin1;
CREATE PROCEDURE p1()
BEGIN
DECLARE INT;
SELECT ;
END|
CALL p1();
NULL
SET NAMES default;
DROP PROCEDURE p1;
drop procedure if exists proc_25411_a; drop procedure if exists proc_25411_a;
drop procedure if exists proc_25411_b; drop procedure if exists proc_25411_b;
drop procedure if exists proc_25411_c; drop procedure if exists proc_25411_c;
...@@ -6420,7 +6431,7 @@ select 1; ...@@ -6420,7 +6431,7 @@ select 1;
select 3; select 3;
select 4; select 4;
end utf8 utf8_general_ci latin1_swedish_ci end latin1 latin1_swedish_ci latin1_swedish_ci
call proc_25411_a(); call proc_25411_a();
1 1
1 1
...@@ -6440,7 +6451,7 @@ proc_25411_b CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_25411_b`( ...@@ -6440,7 +6451,7 @@ proc_25411_b CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_25411_b`(
) )
begin begin
select p1, p2; select p1, p2;
end utf8 utf8_general_ci latin1_swedish_ci end latin1 latin1_swedish_ci latin1_swedish_ci
select name, param_list, body from mysql.proc where name like "%25411%"; select name, param_list, body from mysql.proc where name like "%25411%";
name param_list body name param_list body
proc_25411_a begin proc_25411_a begin
...@@ -6478,7 +6489,7 @@ select 1 ,2 ,3; ...@@ -6478,7 +6489,7 @@ select 1 ,2 ,3;
select 1,2 ,3 ; select 1,2 ,3 ;
select 1 ,2 ,3 ; select 1 ,2 ,3 ;
select 1 ,2 ,3 ; select 1 ,2 ,3 ;
end utf8 utf8_general_ci latin1_swedish_ci end latin1 latin1_swedish_ci latin1_swedish_ci
call proc_25411_c(); call proc_25411_c();
1 2 3 1 2 3
1 2 3 1 2 3
...@@ -6499,7 +6510,7 @@ select 1 /* testing */; ...@@ -6499,7 +6510,7 @@ select 1 /* testing */;
show create procedure proc_26302; show create procedure proc_26302;
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
proc_26302 CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_26302`() proc_26302 CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_26302`()
select 1 /* testing */ utf8 utf8_general_ci latin1_swedish_ci select 1 /* testing */ latin1 latin1_swedish_ci latin1_swedish_ci
select ROUTINE_NAME, ROUTINE_DEFINITION from information_schema.ROUTINES select ROUTINE_NAME, ROUTINE_DEFINITION from information_schema.ROUTINES
where ROUTINE_NAME = "proc_26302"; where ROUTINE_NAME = "proc_26302";
ROUTINE_NAME ROUTINE_DEFINITION ROUTINE_NAME ROUTINE_DEFINITION
......
...@@ -25,4 +25,3 @@ ctype_big5 : BUG#26711 2007-06-21 Lars Test has never worked on Do ...@@ -25,4 +25,3 @@ ctype_big5 : BUG#26711 2007-06-21 Lars Test has never worked on Do
mysql_upgrade : Bug#28560 test links to /usr/local/mysql/lib libraries, causes non-determinism and failures on ABI breakage mysql_upgrade : Bug#28560 test links to /usr/local/mysql/lib libraries, causes non-determinism and failures on ABI breakage
federated_transactions : Bug#29523 Transactions do not work federated_transactions : Bug#29523 Transactions do not work
ddl_i18n_koi8r : Bug #30120 SP with local variables with non-ASCII names crashes server
...@@ -633,6 +633,28 @@ SELECT a FROM t1 ORDER BY "a" DESC; ...@@ -633,6 +633,28 @@ SELECT a FROM t1 ORDER BY "a" DESC;
SELECT a FROM t1 ORDER BY `a` DESC; SELECT a FROM t1 ORDER BY `a` DESC;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #29717 INSERT INTO SELECT inserts values even if SELECT statement itself
# returns empty
#
CREATE TABLE t1 (
f1 int(10) unsigned NOT NULL auto_increment primary key,
f2 varchar(100) NOT NULL default ''
);
CREATE TABLE t2 (
f1 varchar(10) NOT NULL default '',
f2 char(3) NOT NULL default '',
PRIMARY KEY (`f1`),
KEY `k1` (`f2`,`f1`)
);
INSERT INTO t1 values(NULL, '');
INSERT INTO `t2` VALUES ('486878','WDT'),('486910','WDT');
SELECT SQL_BUFFER_RESULT avg(t2.f1) FROM t1, t2 where t2.f2 = 'SIR' GROUP BY t1.f1;
SELECT avg(t2.f1) FROM t1, t2 where t2.f2 = 'SIR' GROUP BY t1.f1;
DROP TABLE t1, t2;
# End of 4.1 tests # End of 4.1 tests
# #
......
...@@ -239,6 +239,34 @@ show status like 'Handler_read%'; ...@@ -239,6 +239,34 @@ show status like 'Handler_read%';
DROP TABLE t1; DROP TABLE t1;
#
# Bug #29717 INSERT INTO SELECT inserts values even if SELECT statement itself returns empty
#
CREATE TABLE t1 (
f1 int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
f2 varchar(100) NOT NULL default ''
);
CREATE TABLE t2 (
f1 varchar(10) NOT NULL default '',
f2 char(3) NOT NULL default '',
PRIMARY KEY (`f1`),
KEY `k1` (`f2`, `f1`)
);
INSERT INTO t1 values(NULL, '');
INSERT INTO `t2` VALUES ('486878','WDT'),('486910','WDT');
SELECT COUNT(*) FROM t1;
SELECT min(t2.f1) FROM t1, t2 where t2.f2 = 'SIR' GROUP BY t1.f1;
INSERT INTO t1 (f2)
SELECT min(t2.f1) FROM t1, t2 where t2.f2 = 'SIR' GROUP BY t1.f1;
SELECT COUNT(*) FROM t1;
SELECT * FROM t1;
DROP TABLE t1, t2;
# End of 4.1 tests # End of 4.1 tests
# #
......
...@@ -7364,6 +7364,27 @@ use test; ...@@ -7364,6 +7364,27 @@ use test;
drop procedure sp_bug29050; drop procedure sp_bug29050;
drop table t1; drop table t1;
#
# Bug #30120 SP with local variables with non-ASCII names crashes server.
#
SET NAMES latin1;
DELIMITER |;
CREATE PROCEDURE p1()
BEGIN
DECLARE INT;
SELECT ;
END|
DELIMITER ;|
CALL p1();
SET NAMES default;
DROP PROCEDURE p1;
# #
# Bug#25411 (trigger code truncated) # Bug#25411 (trigger code truncated)
# #
......
...@@ -1082,9 +1082,9 @@ bool Item_sp_variable::is_null() ...@@ -1082,9 +1082,9 @@ bool Item_sp_variable::is_null()
Item_splocal::Item_splocal(const LEX_STRING &sp_var_name, Item_splocal::Item_splocal(const LEX_STRING &sp_var_name,
uint sp_var_idx, uint sp_var_idx,
enum_field_types sp_var_type, enum_field_types sp_var_type,
uint pos_in_q) uint pos_in_q, uint len_in_q)
:Item_sp_variable(sp_var_name.str, sp_var_name.length), :Item_sp_variable(sp_var_name.str, sp_var_name.length),
m_var_idx(sp_var_idx), pos_in_query(pos_in_q) m_var_idx(sp_var_idx), pos_in_query(pos_in_q), len_in_query(len_in_q)
{ {
maybe_null= TRUE; maybe_null= TRUE;
......
...@@ -1054,9 +1054,18 @@ class Item_splocal :public Item_sp_variable, ...@@ -1054,9 +1054,18 @@ class Item_splocal :public Item_sp_variable,
SP variable in query text. SP variable in query text.
*/ */
uint pos_in_query; uint pos_in_query;
/*
Byte length of SP variable name in the statement (see pos_in_query).
The value of this field may differ from the name_length value because
name_length contains byte length of UTF8-encoded item name, but
the query string (see sp_instr_stmt::m_query) is currently stored with
a charset from the SET NAMES statement.
*/
uint len_in_query;
Item_splocal(const LEX_STRING &sp_var_name, uint sp_var_idx, Item_splocal(const LEX_STRING &sp_var_name, uint sp_var_idx,
enum_field_types sp_var_type, uint pos_in_q= 0); enum_field_types sp_var_type,
uint pos_in_q= 0, uint len_in_q= 0);
bool is_splocal() { return 1; } /* Needed for error checking */ bool is_splocal() { return 1; } /* Needed for error checking */
......
...@@ -927,7 +927,7 @@ subst_spvars(THD *thd, sp_instr *instr, LEX_STRING *query_str) ...@@ -927,7 +927,7 @@ subst_spvars(THD *thd, sp_instr *instr, LEX_STRING *query_str)
/* append the text between sp ref occurences */ /* append the text between sp ref occurences */
res|= qbuf.append(cur + prev_pos, (*splocal)->pos_in_query - prev_pos); res|= qbuf.append(cur + prev_pos, (*splocal)->pos_in_query - prev_pos);
prev_pos= (*splocal)->pos_in_query + (*splocal)->m_name.length; prev_pos= (*splocal)->pos_in_query + (*splocal)->len_in_query;
/* append the spvar substitute */ /* append the spvar substitute */
res|= qbuf.append(STRING_WITH_LEN(" NAME_CONST('")); res|= qbuf.append(STRING_WITH_LEN(" NAME_CONST('"));
......
...@@ -1134,6 +1134,7 @@ JOIN::optimize() ...@@ -1134,6 +1134,7 @@ JOIN::optimize()
order=0; // The output has only one row order=0; // The output has only one row
simple_order=1; simple_order=1;
select_distinct= 0; // No need in distinct for 1 row select_distinct= 0; // No need in distinct for 1 row
group_optimized_away= 1;
} }
calc_group_buffer(this, group_list); calc_group_buffer(this, group_list);
...@@ -11742,7 +11743,8 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), ...@@ -11742,7 +11743,8 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
if (!join->first_record || end_of_records || if (!join->first_record || end_of_records ||
(idx=test_if_group_changed(join->group_fields)) >= 0) (idx=test_if_group_changed(join->group_fields)) >= 0)
{ {
if (join->first_record || (end_of_records && !join->group)) if (join->first_record ||
(end_of_records && !join->group && !join->group_optimized_away))
{ {
if (join->procedure) if (join->procedure)
join->procedure->end_group(); join->procedure->end_group();
......
...@@ -321,6 +321,14 @@ class JOIN :public Sql_alloc ...@@ -321,6 +321,14 @@ class JOIN :public Sql_alloc
ROLLUP rollup; // Used with rollup ROLLUP rollup; // Used with rollup
bool select_distinct; // Set if SELECT DISTINCT bool select_distinct; // Set if SELECT DISTINCT
/*
If we have the GROUP BY statement in the query,
but the group_list was emptied by optimizer, this
flag is TRUE.
It happens when fields in the GROUP BY are from
constant table
*/
bool group_optimized_away;
/* /*
simple_xxxxx is set if ORDER/GROUP BY doesn't include any references simple_xxxxx is set if ORDER/GROUP BY doesn't include any references
...@@ -429,6 +437,7 @@ class JOIN :public Sql_alloc ...@@ -429,6 +437,7 @@ class JOIN :public Sql_alloc
zero_result_cause= 0; zero_result_cause= 0;
optimized= 0; optimized= 0;
cond_equal= 0; cond_equal= 0;
group_optimized_away= 0;
all_fields= fields_arg; all_fields= fields_arg;
fields_list= fields_arg; fields_list= fields_arg;
......
...@@ -9505,7 +9505,8 @@ simple_ident: ...@@ -9505,7 +9505,8 @@ simple_ident:
Item_splocal *splocal; Item_splocal *splocal;
splocal= new Item_splocal($1, spv->offset, spv->type, splocal= new Item_splocal($1, spv->offset, spv->type,
lip->get_tok_start_prev() - lip->get_tok_start_prev() -
lex->sphead->m_tmp_query); lex->sphead->m_tmp_query,
lip->get_tok_end() - lip->get_tok_start_prev());
#ifndef DBUG_OFF #ifndef DBUG_OFF
if (splocal) if (splocal)
splocal->m_sp= lex->sphead; splocal->m_sp= lex->sphead;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment