Below is the list of changes that have just been committed into a local
5.0 repository of kostja. When kostja does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2006-11-29 02:44:12+03:00, kostja@stripped +11 -0
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into bodhi.local:/opt/local/work/mysql-5.0-runtime
MERGE: 1.2301.1.21
libmysql/libmysql.c@stripped, 2006-11-29 02:41:09+03:00, kostja@stripped +0 -0
Auto merged
MERGE: 1.247.2.1
libmysqld/lib_sql.cc@stripped, 2006-11-29 02:41:09+03:00, kostja@stripped +0 -0
Auto merged
MERGE: 1.115.1.2
mysql-test/t/func_str.test@stripped, 2006-11-29 02:41:09+03:00, kostja@stripped +0 -0
Auto merged
MERGE: 1.95.1.1
mysql-test/t/wait_for_socket.sh@stripped, 2006-11-29 02:44:07+03:00, kostja@stripped +0 -1
Manual merge.
MERGE: 1.1.1.1
sql/item_cmpfunc.cc@stripped, 2006-11-29 02:41:12+03:00, kostja@stripped +0 -0
Auto merged
MERGE: 1.223.1.1
sql/item_func.cc@stripped, 2006-11-29 02:41:12+03:00, kostja@stripped +0 -0
Auto merged
MERGE: 1.312.1.1
sql/item_sum.cc@stripped, 2006-11-29 02:41:12+03:00, kostja@stripped +0 -0
Auto merged
MERGE: 1.185.1.1
sql/mysqld.cc@stripped, 2006-11-29 02:41:13+03:00, kostja@stripped +0 -0
Auto merged
MERGE: 1.578.1.1
sql/sql_cache.cc@stripped, 2006-11-29 02:44:08+03:00, kostja@stripped +0 -8
Manual merge.
MERGE: 1.93.1.1
sql/sql_yacc.yy@stripped, 2006-11-29 02:41:14+03:00, kostja@stripped +0 -0
Auto merged
MERGE: 1.494.1.1
tests/mysql_client_test.c@stripped, 2006-11-29 02:41:15+03:00, kostja@stripped +0 -0
Auto merged
MERGE: 1.212.1.1
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: kostja
# Host: bodhi.local
# Root: /opt/local/work/mysql-5.0-runtime/RESYNC
--- 1.250/libmysql/libmysql.c 2006-11-29 02:44:29 +03:00
+++ 1.251/libmysql/libmysql.c 2006-11-29 02:44:29 +03:00
@@ -2478,6 +2478,8 @@ static my_bool execute(MYSQL_STMT *stmt,
NET *net= &mysql->net;
char buff[4 /* size of stmt id */ +
5 /* execution flags */];
+ my_bool res;
+
DBUG_ENTER("execute");
DBUG_DUMP("packet", packet, length);
@@ -2485,16 +2487,18 @@ static my_bool execute(MYSQL_STMT *stmt,
int4store(buff, stmt->stmt_id); /* Send stmt id to server */
buff[4]= (char) stmt->flags;
int4store(buff+5, 1); /* iteration count */
- if (cli_advanced_command(mysql, COM_STMT_EXECUTE, buff, sizeof(buff),
- packet, length, 1, NULL) ||
- (*mysql->methods->read_query_result)(mysql))
+
+ res= test(cli_advanced_command(mysql, COM_STMT_EXECUTE, buff, sizeof(buff),
+ packet, length, 1, NULL) ||
+ (*mysql->methods->read_query_result)(mysql));
+ stmt->affected_rows= mysql->affected_rows;
+ stmt->server_status= mysql->server_status;
+ stmt->insert_id= mysql->insert_id;
+ if (res)
{
set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate);
DBUG_RETURN(1);
}
- stmt->affected_rows= mysql->affected_rows;
- stmt->server_status= mysql->server_status;
- stmt->insert_id= mysql->insert_id;
DBUG_RETURN(0);
}
--- 1.225/sql/item_cmpfunc.cc 2006-11-29 02:44:29 +03:00
+++ 1.226/sql/item_cmpfunc.cc 2006-11-29 02:44:29 +03:00
@@ -2497,7 +2497,6 @@ void Item_func_in::fix_length_and_dec()
if (cmp_type == STRING_RESULT)
in_item->cmp_charset= cmp_collation.collation;
}
- maybe_null= args[0]->maybe_null;
max_length= 1;
}
--- 1.313/sql/item_func.cc 2006-11-29 02:44:29 +03:00
+++ 1.314/sql/item_func.cc 2006-11-29 02:44:29 +03:00
@@ -964,7 +964,14 @@ longlong Item_func_unsigned::val_int()
longlong value;
int error;
- if (args[0]->cast_to_int_type() != STRING_RESULT)
+ if (args[0]->cast_to_int_type() == DECIMAL_RESULT)
+ {
+ my_decimal tmp, *dec= args[0]->val_decimal(&tmp);
+ if (!(null_value= args[0]->null_value))
+ my_decimal2int(E_DEC_FATAL_ERROR, dec, 1, &value);
+ return value;
+ }
+ else if (args[0]->cast_to_int_type() != STRING_RESULT)
{
value= args[0]->val_int();
null_value= args[0]->null_value;
@@ -2879,6 +2886,20 @@ void Item_udf_func::cleanup()
{
udf.cleanup();
Item_func::cleanup();
+}
+
+
+void Item_udf_func::print(String *str)
+{
+ str->append(func_name());
+ str->append('(');
+ for (uint i=0 ; i < arg_count ; i++)
+ {
+ if (i != 0)
+ str->append(',');
+ args[i]->print_item_w_name(str);
+ }
+ str->append(')');
}
--- 1.189/sql/item_sum.cc 2006-11-29 02:44:29 +03:00
+++ 1.190/sql/item_sum.cc 2006-11-29 02:44:30 +03:00
@@ -322,9 +322,13 @@ void Item_sum::make_field(Send_field *tm
if (args[0]->type() == Item::FIELD_ITEM && keep_field_type())
{
((Item_field*) args[0])->field->make_field(tmp_field);
- tmp_field->db_name=(char*)"";
- tmp_field->org_table_name=tmp_field->table_name=(char*)"";
- tmp_field->org_col_name=tmp_field->col_name=name;
+ /* For expressions only col_name should be non-empty string. */
+ char *empty_string= (char*)"";
+ tmp_field->db_name= empty_string;
+ tmp_field->org_table_name= empty_string;
+ tmp_field->table_name= empty_string;
+ tmp_field->org_col_name= empty_string;
+ tmp_field->col_name= name;
if (maybe_null)
tmp_field->flags&= ~NOT_NULL_FLAG;
}
--- 1.579/sql/mysqld.cc 2006-11-29 02:44:30 +03:00
+++ 1.580/sql/mysqld.cc 2006-11-29 02:44:30 +03:00
@@ -6177,6 +6177,7 @@ struct show_var_st status_vars[]= {
{"Open_streams", (char*) &my_stream_opened, SHOW_LONG_CONST},
{"Open_tables", (char*) 0, SHOW_OPENTABLES},
{"Opened_tables", (char*) offsetof(STATUS_VAR, opened_tables), SHOW_LONG_STATUS},
+ {"Prepared_stmt_count", (char*) &prepared_stmt_count, SHOW_LONG_CONST},
#ifdef HAVE_QUERY_CACHE
{"Qcache_free_blocks", (char*) &query_cache.free_memory_blocks, SHOW_LONG_CONST},
{"Qcache_free_memory", (char*) &query_cache.free_memory, SHOW_LONG_CONST},
@@ -6346,6 +6347,7 @@ static void mysql_init_variables(void)
binlog_cache_use= binlog_cache_disk_use= 0;
max_used_connections= slow_launch_threads = 0;
mysqld_user= mysqld_chroot= opt_init_file= opt_bin_logname = 0;
+ prepared_stmt_count= 0;
errmesg= 0;
mysqld_unix_port= opt_mysql_tmpdir= my_bind_addr_str= NullS;
bzero((gptr) &mysql_tmpdir_list, sizeof(mysql_tmpdir_list));
--- 1.94/sql/sql_cache.cc 2006-11-29 02:44:30 +03:00
+++ 1.95/sql/sql_cache.cc 2006-11-29 02:44:30 +03:00
@@ -527,7 +527,8 @@ void Query_cache_query::init_n_lock()
my_rwlock_init(&lock, NULL);
lock_writing();
DBUG_PRINT("qcache", ("inited & locked query for block 0x%lx",
- ((byte*) this)-ALIGN_SIZE(sizeof(Query_cache_block))));
+ (long) (((byte*) this) -
+ ALIGN_SIZE(sizeof(Query_cache_block)))));
DBUG_VOID_RETURN;
}
@@ -536,7 +537,8 @@ void Query_cache_query::unlock_n_destroy
{
DBUG_ENTER("Query_cache_query::unlock_n_destroy");
DBUG_PRINT("qcache", ("destroyed & unlocked query for block 0x%lx",
- ((byte*)this)-ALIGN_SIZE(sizeof(Query_cache_block))));
+ (long) (((byte*) this) -
+ ALIGN_SIZE(sizeof(Query_cache_block)))));
/*
The following call is not needed on system where one can destroy an
active semaphore
@@ -874,8 +876,8 @@ sql mode: 0x%lx, sort len: %lu, conncat
flags.character_set_client_num,
flags.character_set_results_num,
flags.collation_connection_num,
- flags.limit,
- (ulong)flags.time_zone,
+ (ulong) flags.limit,
+ (ulong) flags.time_zone,
flags.sql_mode,
flags.max_sort_length,
flags.group_concat_max_len));
@@ -1117,8 +1119,8 @@ sql mode: 0x%lx, sort len: %lu, conncat
flags.character_set_client_num,
flags.character_set_results_num,
flags.collation_connection_num,
- flags.limit,
- (ulong)flags.time_zone,
+ (ulong) flags.limit,
+ (ulong) flags.time_zone,
flags.sql_mode,
flags.max_sort_length,
flags.group_concat_max_len));
@@ -1255,7 +1257,7 @@ sql mode: 0x%lx, sort len: %lu, conncat
#ifndef EMBEDDED_LIBRARY
do
{
- DBUG_PRINT("qcache", ("Results (len %lu, used %lu, headers %lu)",
+ DBUG_PRINT("qcache", ("Results (len: %lu used: %lu headers: %u)",
result_block->length, result_block->used,
result_block->headers_len()+
ALIGN_SIZE(sizeof(Query_cache_result))));
@@ -2032,7 +2034,7 @@ Query_cache::append_result_data(Query_ca
{
DBUG_ENTER("Query_cache::append_result_data");
DBUG_PRINT("qcache", ("append %lu bytes to 0x%lx query",
- data_len, query_block));
+ data_len, (long) query_block));
if (query_block->query()->add(data_len) > query_cache_limit)
{
@@ -3039,10 +3041,10 @@ Query_cache::is_cacheable(THD *thd, uint
OPTION_TO_QUERY_CACHE))) &&
lex->safe_to_cache_query)
{
- DBUG_PRINT("qcache", ("options %lx %lx, type %u",
- OPTION_TO_QUERY_CACHE,
- lex->select_lex.options,
- (int) thd->variables.query_cache_type));
+ DBUG_PRINT("qcache", ("options: %lx %lx type: %u",
+ OPTION_TO_QUERY_CACHE,
+ (long) lex->select_lex.options,
+ (int) thd->variables.query_cache_type));
if (!(table_count= process_and_count_tables(tables_used, tables_type)))
DBUG_RETURN(0);
@@ -3058,10 +3060,10 @@ Query_cache::is_cacheable(THD *thd, uint
}
DBUG_PRINT("qcache",
- ("not interesting query: %d or not cacheable, options %lx %lx, type %u",
+ ("not interesting query: %d or not cacheable, options %lx %lx type: %u",
(int) lex->sql_command,
OPTION_TO_QUERY_CACHE,
- lex->select_lex.options,
+ (long) lex->select_lex.options,
(int) thd->variables.query_cache_type));
DBUG_RETURN(0);
}
@@ -3661,7 +3663,8 @@ void Query_cache::queries_dump()
DBUG_PRINT("qcache", ("F:%u C:%u L:%lu T:'%s' (%u) '%s' '%s'",
flags.client_long_flag,
flags.character_set_client_num,
- (ulong)flags.limit, flags.time_zone->get_name(),
+ (ulong)flags.limit,
+ flags.time_zone->get_name()->ptr(),
len, str, strend(str)+1));
DBUG_PRINT("qcache", ("-b- 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx", (ulong) block,
(ulong) block->next, (ulong) block->prev,
@@ -3881,9 +3884,8 @@ my_bool Query_cache::check_integrity(boo
break;
}
default:
- DBUG_PRINT("error",
- ("block 0x%lx have incorrect type %u",
- block, block->type));
+ DBUG_PRINT("error", ("block 0x%lx have incorrect type %u",
+ (long) block, block->type));
result = 1;
}
@@ -3981,8 +3983,8 @@ my_bool Query_cache::check_integrity(boo
} while (block != bins[i].free_blocks);
if (count != bins[i].number)
{
- DBUG_PRINT("error", ("bin[%d].number is %d, but bin have %d blocks",
- bins[i].number, count));
+ DBUG_PRINT("error", ("bins[%d].number = %d, but bin have %d blocks",
+ i, bins[i].number, count));
result = 1;
}
}
--- 1.495/sql/sql_yacc.yy 2006-11-29 02:44:30 +03:00
+++ 1.496/sql/sql_yacc.yy 2006-11-29 02:44:30 +03:00
@@ -761,7 +761,7 @@ bool my_yyoverflow(short **a, YYSTYPE **
%type <item_list>
expr_list udf_expr_list udf_expr_list2 when_list
- ident_list ident_list_arg
+ ident_list ident_list_arg opt_expr_list
%type <var_type>
option_type opt_var_type opt_var_ident_type
@@ -4701,7 +4701,7 @@ simple_expr:
{ $$= new Item_func_trim($5,$3); }
| TRUNCATE_SYM '(' expr ',' expr ')'
{ $$= new Item_func_round($3,$5,1); }
- | ident '.' ident '(' udf_expr_list ')'
+ | ident '.' ident '(' opt_expr_list ')'
{
LEX *lex= Lex;
sp_name *name= new sp_name($1, $3);
@@ -4718,27 +4718,27 @@ simple_expr:
{
#ifdef HAVE_DLOPEN
udf_func *udf= 0;
+ LEX *lex= Lex;
if (using_udf_functions &&
(udf= find_udf($1.str, $1.length)) &&
udf->type == UDFTYPE_AGGREGATE)
{
- LEX *lex= Lex;
if (lex->current_select->inc_in_sum_expr())
{
yyerror(ER(ER_SYNTAX_ERROR));
YYABORT;
}
}
- $<udf>$= udf;
+ lex->current_select->udf_list.push_front(udf);
#endif
}
udf_expr_list ')'
{
#ifdef HAVE_DLOPEN
- udf_func *udf= $<udf>3;
- SELECT_LEX *sel= Select;
+ udf_func *udf;
+ LEX *lex= Lex;
- if (udf)
+ if (NULL != (udf= lex->current_select->udf_list.pop()))
{
if (udf->type == UDFTYPE_AGGREGATE)
Select->in_sum_expr--;
@@ -4965,12 +4965,29 @@ udf_expr_list3:
udf_expr:
remember_name expr remember_end select_alias
{
+ udf_func *udf= Select->udf_list.head();
+ /*
+ Use Item::name as a storage for the attribute value of user
+ defined function argument. It is safe to use Item::name
+ because the syntax will not allow having an explicit name here.
+ See WL#1017 re. udf attributes.
+ */
if ($4.str)
{
+ if (!udf)
+ {
+ /*
+ Disallow using AS to specify explicit names for the arguments
+ of stored routine calls
+ */
+ yyerror(ER(ER_SYNTAX_ERROR));
+ YYABORT;
+ }
+
$2->is_autogenerated_name= FALSE;
$2->set_name($4.str, $4.length, system_charset_info);
}
- else
+ else if (udf)
$2->set_name($1, (uint) ($3 - $1), YYTHD->charset());
$$= $2;
}
@@ -5129,6 +5146,11 @@ cast_type:
| TIME_SYM { $$=ITEM_CAST_TIME; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; }
| DATETIME { $$=ITEM_CAST_DATETIME; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; }
| DECIMAL_SYM float_options { $$=ITEM_CAST_DECIMAL; Lex->charset= NULL; }
+ ;
+
+opt_expr_list:
+ /* empty */ { $$= NULL; }
+ | expr_list { $$= $1;}
;
expr_list:
--- 1.2/mysql-test/t/wait_for_socket.sh 2006-11-29 02:44:30 +03:00
+++ 1.3/mysql-test/t/wait_for_socket.sh 2006-11-29 02:44:30 +03:00
@@ -2,9 +2,25 @@
###########################################################################
-if [ $# -ne 6 ]; then
- echo "Usage: wait_for_socket.sh <executable path> <socket path> <username> <password> <db> <timeout>"
- exit 0
+# NOTE: this script returns 0 (success) even in case of failure (except for
+# usage-error). This is because this script is executed under
+# mysql-test-run[.pl] and it's better to examine particular problem in log
+# file, than just having said that the test case has failed.
+
+###########################################################################
+
+basename=`basename "$0"`
+dirname=`dirname "$0"`
+
+###########################################################################
+
+. "$dirname/utils.sh"
+
+###########################################################################
+
+if [ $# -ne 7 ]; then
+ echo "Usage: wait_for_socket.sh <executable path> <socket path> <username> <password> <db> <timeout> <test id>"
+ exit 1
fi
client_exe="$1"
@@ -13,22 +29,34 @@ username="$3"
password="$4"
db="$5"
total_timeout="$6"
+test_id="$7"
+log_file="$MYSQLTEST_VARDIR/log/$test_id.log"
+
+log_debug "-- $basename: starting --"
+log_debug "client_exe: '$client_exe'"
+log_debug "socket_path: '$socket_path'"
+log_debug "username: '$username'"
+log_debug "password: '$password'"
+log_debug "db: '$db'"
+log_debug "total_timeout: '$total_timeout'"
+log_debug "test_id: '$test_id'"
+log_debug "log_file: '$log_file'"
###########################################################################
if [ -z "$client_exe" ]; then
- echo "Error: invalid path to client executable ($client_exe)."
- exit 0;
+ log_error "Invalid path to client executable ($client_exe)."
+ quit 0;
fi
if [ ! -x "$client_exe" ]; then
- echo "Error: client by path '$client_exe' is not available."
- exit 0;
+ log_error "Client by path '$client_exe' is not available."
+ quit 0;
fi
if [ -z "$socket_path" ]; then
- echo "Error: invalid socket patch."
- exit 0
+ log_error "Invalid socket patch ($socket_path)."
+ quit 0
fi
###########################################################################
@@ -39,15 +67,19 @@ client_args="--silent --socket=$socket_p
[ -n "$password" ] && client_args="$client_args --password=$password "
[ -n "$db" ] && client_args="$client_args $db"
+log_debug "client_args: '$client_args'"
+
###########################################################################
cur_attempt=1
while true; do
+ log_debug "cur_attempt: $cur_attempt."
+
if ( echo 'quit' | "$client_exe" $client_args >/dev/null 2>&1 ); then
- echo "Success: server is ready to accept connection on socket."
- exit 0
+ log_info "Success: server is ready to accept connection on socket."
+ quit 0
fi
[ $cur_attempt -ge $total_timeout ] && break
@@ -58,5 +90,5 @@ while true; do
done
-echo "Error: server does not accept connections after $total_timeout seconds."
-exit 0
+log_error "Server does not accept connections after $total_timeout seconds."
+quit 0
--- 1.96/mysql-test/t/func_str.test 2006-11-29 02:44:30 +03:00
+++ 1.97/mysql-test/t/func_str.test 2006-11-29 02:44:30 +03:00
@@ -300,18 +300,26 @@ select POSITION(_latin1'B' COLLATE latin
select POSITION(_latin1'B' IN _latin2'abcd');
select FIND_IN_SET(_latin1'B',_latin1'a,b,c,d');
---fix this:
---select FIND_IN_SET(_latin1'B',_latin1'a,b,c,d' COLLATE latin1_bin);
---select FIND_IN_SET(_latin1'B' COLLATE latin1_bin,_latin1'a,b,c,d');
+
+# fix this:
+--disable_parsing
+select FIND_IN_SET(_latin1'B',_latin1'a,b,c,d' COLLATE latin1_bin);
+select FIND_IN_SET(_latin1'B' COLLATE latin1_bin,_latin1'a,b,c,d');
+--enable_parsing
+
--error 1267
select FIND_IN_SET(_latin1'B' COLLATE latin1_general_ci,_latin1'a,b,c,d' COLLATE latin1_bin);
--error 1267
select FIND_IN_SET(_latin1'B',_latin2'a,b,c,d');
select SUBSTRING_INDEX(_latin1'abcdabcdabcd',_latin1'd',2);
---fix this:
---select SUBSTRING_INDEX(_latin1'abcdabcdabcd' COLLATE latin1_bin,_latin1'd',2);
---select SUBSTRING_INDEX(_latin1'abcdabcdabcd',_latin1'd' COLLATE latin1_bin,2);
+
+# fix this:
+--disable_parsing
+select SUBSTRING_INDEX(_latin1'abcdabcdabcd' COLLATE latin1_bin,_latin1'd',2);
+select SUBSTRING_INDEX(_latin1'abcdabcdabcd',_latin1'd' COLLATE latin1_bin,2);
+--enable_parsing
+
--error 1267
select SUBSTRING_INDEX(_latin1'abcdabcdabcd',_latin2'd',2);
--error 1267
--- 1.117/libmysqld/lib_sql.cc 2006-11-29 02:44:30 +03:00
+++ 1.118/libmysqld/lib_sql.cc 2006-11-29 02:44:30 +03:00
@@ -278,26 +278,27 @@ static int emb_stmt_execute(MYSQL_STMT *
{
DBUG_ENTER("emb_stmt_execute");
char header[5];
- MYSQL_DATA *res;
THD *thd;
+ my_bool res;
int4store(header, stmt->stmt_id);
header[4]= stmt->flags;
thd= (THD*)stmt->mysql->thd;
thd->client_param_count= stmt->param_count;
thd->client_params= stmt->params;
- if (emb_advanced_command(stmt->mysql, COM_STMT_EXECUTE,0,0,
- header, sizeof(header), 1, stmt) ||
- emb_read_query_result(stmt->mysql))
+
+ res= test(emb_advanced_command(stmt->mysql, COM_STMT_EXECUTE, 0, 0,
+ header, sizeof(header), 1, stmt) ||
+ emb_read_query_result(stmt->mysql));
+ stmt->affected_rows= stmt->mysql->affected_rows;
+ stmt->insert_id= stmt->mysql->insert_id;
+ stmt->server_status= stmt->mysql->server_status;
+ if (res)
{
NET *net= &stmt->mysql->net;
set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate);
DBUG_RETURN(1);
}
- stmt->affected_rows= stmt->mysql->affected_rows;
- stmt->insert_id= stmt->mysql->insert_id;
- stmt->server_status= stmt->mysql->server_status;
-
DBUG_RETURN(0);
}
--- 1.215/tests/mysql_client_test.c 2006-11-29 02:44:31 +03:00
+++ 1.216/tests/mysql_client_test.c 2006-11-29 02:44:31 +03:00
@@ -13686,7 +13686,8 @@ static void test_bug11172()
hired.year, hired.month, hired.day);
}
DIE_UNLESS(rc == MYSQL_NO_DATA);
- mysql_stmt_free_result(stmt) || mysql_stmt_reset(stmt);
+ if (!mysql_stmt_free_result(stmt))
+ mysql_stmt_reset(stmt);
}
mysql_stmt_close(stmt);
mysql_rollback(mysql);
@@ -14828,6 +14829,8 @@ static void test_opt_reconnect()
}
+#ifndef EMBEDDED_LIBRARY
+
static void test_bug12744()
{
MYSQL_STMT *prep_stmt = NULL;
@@ -14858,6 +14861,8 @@ static void test_bug12744()
rc= mysql_stmt_close(prep_stmt);
client_connect(0);
}
+
+#endif /* EMBEDDED_LIBRARY */
/* Bug #16143: mysql_stmt_sqlstate returns an empty string instead of '00000' */
| Thread |
|---|
| • bk commit into 5.0 tree (kostja:1.2311) | konstantin | 29 Nov |