diff --git a/maxscale-system-test/CMakeLists.txt b/maxscale-system-test/CMakeLists.txt index 6d7915feb..442a255fc 100644 --- a/maxscale-system-test/CMakeLists.txt +++ b/maxscale-system-test/CMakeLists.txt @@ -641,6 +641,10 @@ add_test_executable(mxs1776_ps_exec_hang.cpp mxs1776_ps_exec_hang replication LA # https://jira.mariadb.org/browse/MXS-1786 add_test_executable(mxs1786_statistics.cpp mxs1786_statistics replication LABELS readwritesplit REPL_BACKEND) +# MXS-1787: Crash with PS: CALL p1((SELECT f1()), ?) +# https://jira.mariadb.org/browse/MXS-1787 +add_test_executable(mxs1787_call_ps.cpp mxs1787_call_ps replication LABELS readwritesplit REPL_BACKEND) + # 'namedserverfilter' test add_test_executable(namedserverfilter.cpp namedserverfilter namedserverfilter LABELS namedserverfilter LIGHT REPL_BACKEND) diff --git a/maxscale-system-test/mxs1787_call_ps.cpp b/maxscale-system-test/mxs1787_call_ps.cpp new file mode 100644 index 000000000..364026874 --- /dev/null +++ b/maxscale-system-test/mxs1787_call_ps.cpp @@ -0,0 +1,62 @@ +/** + * MXS-1787: Crash with PS: CALL p1((SELECT f1()), ?) + */ + +#include "testconnections.h" + +using namespace std; + +struct Bind +{ + Bind() + { + bind.buffer = &data; + bind.buffer_type = MYSQL_TYPE_LONG; + bind.error = &err; + bind.is_null = &is_null; + bind.length = &length; + } + + MYSQL_BIND bind; + char err = 0; + char is_null = 0; + char is_unsigned = 0; + uint32_t data = 1234; + unsigned long length = sizeof(data); +}; + +int main(int argc, char* argv[]) +{ + TestConnections test(argc, argv); + + test.maxscales->connect(); + + execute_query(test.maxscales->conn_rwsplit[0], "USE test"); + execute_query(test.maxscales->conn_rwsplit[0], "CREATE OR REPLACE TABLE t1 AS SELECT 1 AS id"); + execute_query(test.maxscales->conn_rwsplit[0], "CREATE OR REPLACE FUNCTION f1() RETURNS INT DETERMINISTIC BEGIN RETURN 1; END"); + execute_query(test.maxscales->conn_rwsplit[0], "CREATE OR REPLACE PROCEDURE p1(IN i INT, IN j INT) BEGIN SELECT i + j; END"); + + test.maxscales->disconnect(); + + test.maxscales->connect(); + + MYSQL_STMT* stmt = mysql_stmt_init(test.maxscales->conn_rwsplit[0]); + std::string query = "CALL p1((SELECT f1()), ?)"; + Bind bind; + + test.set_timeout(30); + + test.assert(mysql_stmt_prepare(stmt, query.c_str(), query.size()) == 0, + "Prepared statement failure: %s", mysql_stmt_error(stmt)); + test.assert(mysql_stmt_bind_param(stmt, &bind.bind) == 0, + "Bind failure: %s", mysql_stmt_error(stmt)); + test.assert(mysql_stmt_execute(stmt) == 0, + "Execute failure: %s", mysql_stmt_error(stmt)); + + mysql_stmt_close(stmt); + + test.assert(mysql_query(test.maxscales->conn_rwsplit[0], "SELECT 1") == 0, "Normal queries should work"); + test.maxscales->disconnect(); + + return test.global_result; +}