From 506f648b3a104bf107ebe7a49bcf6b044682a7b8 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 21 Oct 2004 18:33:53 +0400 Subject: A fix and test case for bug#6059 "mysql_stmt_field_count returns positive numbers when no resultset is available": when sending result set metadata we need to use virtual select_result::send_fields, and not address protocol directly, because select_result descendents may intercept result set (it's the case for example for SELECT INTO OUTFILE). sql/sql_class.h: A fix for bug#6059 "mysql_stmt_field_count returns positive numbers when no resultset is available": introducing select_result::field_count() method to report actual number of fields in a result set, if any result set is sent to client. sql/sql_prepare.cc: A fix for bug#6059 "mysql_stmt_field_count returns positive numbers when no resultset is available": when sending result set metadata we need to use virtual select_result::send_fields, and not address protocol directly, because select_result descendents may intercept result set (it's the case for example for SELECT INTO OUTFILE). Now we need to always have lex->result set if we're in prepared statements. tests/client_test.c: A test case for Bug#6059 "mysql_stmt_field_count returns positive numbers when no resultset is available" --- sql/sql_prepare.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'sql/sql_prepare.cc') diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 27d98fdfeba..545bc7bcc21 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1065,6 +1065,12 @@ static int mysql_test_select(Prepared_statement *stmt, DBUG_RETURN(1); #endif + if (!lex->result && !(lex->result= new (&stmt->mem_root) select_send)) + { + send_error(thd); + goto err; + } + if (open_and_lock_tables(thd, tables)) { send_error(thd); @@ -1088,8 +1094,13 @@ static int mysql_test_select(Prepared_statement *stmt, } else { - if (send_prep_stmt(stmt, lex->select_lex.item_list.elements) || - thd->protocol_simple.send_fields(&lex->select_lex.item_list, 0) + List &fields= lex->select_lex.item_list; + /* + We can use lex->result as it should've been + prepared in unit->prepare call above. + */ + if (send_prep_stmt(stmt, lex->result->field_count(fields)) || + lex->result->send_fields(fields, 0) #ifndef EMBEDDED_LIBRARY || net_flush(&thd->net) #endif -- cgit v1.2.1