Commit 645aac54 authored by unknown's avatar unknown
Browse files

Fix for bug#23760 ROW_COUNT() and store procedure not owrking together

The problem was that THD::row_count_func was zeroed too. It was zeroed
as a fix for bug 4905 "Stored procedure doesn't clear for "Rows affected"
However, the proper solution is not to zero, because THD::row_count_func has
been set to -1 already in mysql_execute_command(), a later fix, which obsoletes
the incorrect fix of #4095


mysql-test/r/sp.result:
  update result
mysql-test/t/sp.test:
  test for bug#23760 ROW_COUNT() and store procedure not owrking together
sql/sql_parse.cc:
  Remove zeroing for thd->row_count_func
  The fix for #4905 wasn't right. Now, it's ok without this zeroing
  because if there was an error THD::
parent 154c6e06
Loading
Loading
Loading
Loading
+83 −2
Original line number Diff line number Diff line
@@ -2705,11 +2705,11 @@ row_count()
call bug4905()|
select row_count()|
row_count()
0
-1
call bug4905()|
select row_count()|
row_count()
0
-1
select * from t3|
s1
1
@@ -5471,4 +5471,85 @@ CHF
DROP FUNCTION bug21493|
DROP TABLE t3,t4|
End of 5.0 tests
DROP TABLE IF EXISTS bug23760|
DROP TABLE IF EXISTS bug23760_log|
DROP PROCEDURE IF EXISTS bug23760_update_log|
DROP PROCEDURE IF EXISTS bug23760_test_row_count|
DROP FUNCTION IF EXISTS bug23760_rc_test|
CREATE TABLE bug23760 (
id INT NOT NULL AUTO_INCREMENT ,
num INT NOT NULL ,
PRIMARY KEY ( id ) 
)|
CREATE TABLE bug23760_log (
id INT NOT NULL AUTO_INCREMENT ,
reason VARCHAR(50)NULL ,
ammount INT NOT NULL ,
PRIMARY KEY ( id ) 
)|
CREATE PROCEDURE bug23760_update_log(r Varchar(50), a INT)
BEGIN
INSERT INTO bug23760_log (reason, ammount) VALUES(r, a);
END|
CREATE PROCEDURE bug23760_test_row_count()
BEGIN
UPDATE bug23760 SET num = num + 1;
CALL bug23760_update_log('Test is working', ROW_COUNT());
UPDATE bug23760 SET num = num - 1;
END|
CREATE PROCEDURE bug23760_test_row_count2(level INT)
BEGIN
IF level THEN
UPDATE bug23760 SET num = num + 1;
CALL bug23760_update_log('Test2 is working', ROW_COUNT());
CALL bug23760_test_row_count2(level - 1);
END IF;
END|
CREATE FUNCTION bug23760_rc_test(in_var INT) RETURNS INT RETURN in_var|
INSERT INTO bug23760 (num) VALUES (0), (1), (1), (2), (3), (5), (8)|
SELECT ROW_COUNT()|
ROW_COUNT()
7
CALL bug23760_test_row_count()|
SELECT * FROM bug23760_log ORDER BY id|
id	reason	ammount
1	Test is working	7
SET @save_max_sp_recursion= @@max_sp_recursion_depth|
SELECT @save_max_sp_recursion|
@save_max_sp_recursion
0
SET max_sp_recursion_depth= 5|
SELECT @@max_sp_recursion_depth|
@@max_sp_recursion_depth
5
CALL bug23760_test_row_count2(2)|
SELECT ROW_COUNT()|
ROW_COUNT()
1
SELECT * FROM bug23760_log ORDER BY id|
id	reason	ammount
1	Test is working	7
2	Test2 is working	7
3	Test2 is working	7
SELECT * FROM bug23760 ORDER by ID|
id	num
1	2
2	3
3	3
4	4
5	5
6	7
7	10
SET max_sp_recursion_depth= @save_max_sp_recursion|
SELECT bug23760_rc_test(123)|
bug23760_rc_test(123)
123
INSERT INTO bug23760 (num) VALUES (13), (21), (34), (55)|
SELECT bug23760_rc_test(ROW_COUNT())|
bug23760_rc_test(ROW_COUNT())
4
DROP TABLE bug23760, bug23760_log|
DROP PROCEDURE bug23760_update_log|
DROP PROCEDURE bug23760_test_row_count|
DROP FUNCTION bug23760_rc_test|
drop table t1,t2;
+77 −0
Original line number Diff line number Diff line
@@ -6426,6 +6426,83 @@ DROP TABLE t3,t4|
--echo End of 5.0 tests


#
# BUG#23760: ROW_COUNT() and store procedure not owrking together
#
--disable_warnings
DROP TABLE IF EXISTS bug23760|
DROP TABLE IF EXISTS bug23760_log|
DROP PROCEDURE IF EXISTS bug23760_update_log|
DROP PROCEDURE IF EXISTS bug23760_test_row_count|
DROP FUNCTION IF EXISTS bug23760_rc_test|
--enable_warnings
CREATE TABLE bug23760 (
  id INT NOT NULL AUTO_INCREMENT ,
  num INT NOT NULL ,
  PRIMARY KEY ( id ) 
)|

CREATE TABLE bug23760_log (
 id INT NOT NULL AUTO_INCREMENT ,
 reason VARCHAR(50)NULL ,
 ammount INT NOT NULL ,
  PRIMARY KEY ( id ) 
)|

CREATE PROCEDURE bug23760_update_log(r Varchar(50), a INT)
BEGIN
  INSERT INTO bug23760_log (reason, ammount) VALUES(r, a);
END|

CREATE PROCEDURE bug23760_test_row_count()
BEGIN
  UPDATE bug23760 SET num = num + 1;
  CALL bug23760_update_log('Test is working', ROW_COUNT());
  UPDATE bug23760 SET num = num - 1;
END|


CREATE PROCEDURE bug23760_test_row_count2(level INT)
BEGIN
  IF level THEN
    UPDATE bug23760 SET num = num + 1;
    CALL bug23760_update_log('Test2 is working', ROW_COUNT());
    CALL bug23760_test_row_count2(level - 1);
  END IF;
END|

CREATE FUNCTION bug23760_rc_test(in_var INT) RETURNS INT RETURN in_var|

INSERT INTO bug23760 (num) VALUES (0), (1), (1), (2), (3), (5), (8)|
SELECT ROW_COUNT()|

CALL bug23760_test_row_count()|
SELECT * FROM bug23760_log ORDER BY id|

SET @save_max_sp_recursion= @@max_sp_recursion_depth|
SELECT @save_max_sp_recursion|
SET max_sp_recursion_depth= 5|
SELECT @@max_sp_recursion_depth|
CALL bug23760_test_row_count2(2)|
SELECT ROW_COUNT()|
SELECT * FROM bug23760_log ORDER BY id|
SELECT * FROM bug23760 ORDER by ID|
SET max_sp_recursion_depth= @save_max_sp_recursion|

SELECT bug23760_rc_test(123)|
INSERT INTO bug23760 (num) VALUES (13), (21), (34), (55)|
SELECT bug23760_rc_test(ROW_COUNT())|

DROP TABLE bug23760, bug23760_log|
DROP PROCEDURE bug23760_update_log|
DROP PROCEDURE bug23760_test_row_count|
DROP FUNCTION bug23760_rc_test|

#
# NOTE: The delimiter is `|`, and not `;`. It is changed to `;`
#       at the end of the file!
#

#
# BUG#NNNN: New bug synopsis
#
+0 −2
Original line number Diff line number Diff line
@@ -4456,8 +4456,6 @@ mysql_execute_command(THD *thd)
	select_limit= thd->variables.select_limit;
	thd->variables.select_limit= HA_POS_ERROR;

        thd->row_count_func= 0;
        
        /* 
          We never write CALL statements into binlog:
           - If the mode is non-prelocked, each statement will be logged