diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index f1c3672083d..2ce2b5db431 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -806,3 +806,10 @@ execute stmt; @@tx_isolation REPEATABLE-READ deallocate prepare stmt; +create table t1 (id int); +prepare ins_call from "insert into t1 (id) values (1)"; +execute ins_call; +select row_count(); +row_count() +1 +drop table t1; diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index 94ee2b1ca39..cfc49bbfd41 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -843,3 +843,15 @@ execute stmt; deallocate prepare stmt; # End of 4.1 tests + +# +# Bug #14956: ROW_COUNT() returns incorrect result after EXECUTE of prepared +# statement +# +create table t1 (id int); +prepare ins_call from "insert into t1 (id) values (1)"; +execute ins_call; +select row_count(); +drop table t1; + +# End of 5.0 tests diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index c19d54feda5..4f45451ddc4 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4822,11 +4822,15 @@ end_with_restore_list: /* - The return value for ROW_COUNT() is "implementation dependent" if - the statement is not DELETE, INSERT or UPDATE (or a CALL executing - such a statement), but -1 is what JDBC and ODBC wants. + The return value for ROW_COUNT() is "implementation dependent" if the + statement is not DELETE, INSERT or UPDATE, but -1 is what JDBC and ODBC + wants. + + We do not change the value for a CALL or EXECUTE statement, so the value + generated by the last called (or executed) statement is preserved. */ - if (lex->sql_command != SQLCOM_CALL && uc_update_queries[lex->sql_command]<2) + if (lex->sql_command != SQLCOM_CALL && lex->sql_command != SQLCOM_EXECUTE && + uc_update_queries[lex->sql_command]<2) thd->row_count_func= -1; goto cleanup;