diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index 742f68be445..994c375da83 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -825,3 +825,10 @@ execute stmt; drop table t1; set names default; 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 774424a8d55..22d0abf645e 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -871,3 +871,15 @@ set names default; 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 00124225719..c05529da745 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4844,11 +4844,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;