Loading mysql-test/t/group_by.test +22 −0 Original line number Diff line number Diff line Loading @@ -633,6 +633,28 @@ SELECT a FROM t1 ORDER BY "a" DESC; SELECT a FROM t1 ORDER BY `a` DESC; 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 # Loading mysql-test/t/insert_select.test +28 −0 Original line number Diff line number Diff line Loading @@ -239,6 +239,34 @@ show status like 'Handler_read%'; 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 # Loading sql/sql_select.cc +3 −1 Original line number Diff line number Diff line Loading @@ -1121,6 +1121,7 @@ JOIN::optimize() order=0; // The output has only one row simple_order=1; select_distinct= 0; // No need in distinct for 1 row group_optimized_away= 1; } calc_group_buffer(this, group_list); Loading Loading @@ -11461,7 +11462,8 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), if (!join->first_record || end_of_records || (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) join->procedure->end_group(); Loading sql/sql_select.h +9 −0 Original line number Diff line number Diff line Loading @@ -282,6 +282,14 @@ class JOIN :public Sql_alloc ROLLUP rollup; // Used with rollup 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 Loading Loading @@ -390,6 +398,7 @@ class JOIN :public Sql_alloc zero_result_cause= 0; optimized= 0; cond_equal= 0; group_optimized_away= 0; all_fields= fields_arg; fields_list= fields_arg; Loading Loading
mysql-test/t/group_by.test +22 −0 Original line number Diff line number Diff line Loading @@ -633,6 +633,28 @@ SELECT a FROM t1 ORDER BY "a" DESC; SELECT a FROM t1 ORDER BY `a` DESC; 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 # Loading
mysql-test/t/insert_select.test +28 −0 Original line number Diff line number Diff line Loading @@ -239,6 +239,34 @@ show status like 'Handler_read%'; 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 # Loading
sql/sql_select.cc +3 −1 Original line number Diff line number Diff line Loading @@ -1121,6 +1121,7 @@ JOIN::optimize() order=0; // The output has only one row simple_order=1; select_distinct= 0; // No need in distinct for 1 row group_optimized_away= 1; } calc_group_buffer(this, group_list); Loading Loading @@ -11461,7 +11462,8 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), if (!join->first_record || end_of_records || (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) join->procedure->end_group(); Loading
sql/sql_select.h +9 −0 Original line number Diff line number Diff line Loading @@ -282,6 +282,14 @@ class JOIN :public Sql_alloc ROLLUP rollup; // Used with rollup 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 Loading Loading @@ -390,6 +398,7 @@ class JOIN :public Sql_alloc zero_result_cause= 0; optimized= 0; cond_equal= 0; group_optimized_away= 0; all_fields= fields_arg; fields_list= fields_arg; Loading