Commit bf3fbb44 authored by kostja@bodhi.local's avatar kostja@bodhi.local

Merge bk-internal.mysql.com:/home/bk/mysql-4.1

into  bodhi.local:/opt/local/work/mysql-4.1-runtime
parents 08e0e06e 21daae58
...@@ -2496,6 +2496,8 @@ static my_bool execute(MYSQL_STMT *stmt, char *packet, ulong length) ...@@ -2496,6 +2496,8 @@ static my_bool execute(MYSQL_STMT *stmt, char *packet, ulong length)
NET *net= &mysql->net; NET *net= &mysql->net;
char buff[4 /* size of stmt id */ + char buff[4 /* size of stmt id */ +
5 /* execution flags */]; 5 /* execution flags */];
my_bool res;
DBUG_ENTER("execute"); DBUG_ENTER("execute");
DBUG_PRINT("enter",("packet: %s, length :%d",packet ? packet :" ", length)); DBUG_PRINT("enter",("packet: %s, length :%d",packet ? packet :" ", length));
...@@ -2503,15 +2505,17 @@ static my_bool execute(MYSQL_STMT *stmt, char *packet, ulong length) ...@@ -2503,15 +2505,17 @@ static my_bool execute(MYSQL_STMT *stmt, char *packet, ulong length)
int4store(buff, stmt->stmt_id); /* Send stmt id to server */ int4store(buff, stmt->stmt_id); /* Send stmt id to server */
buff[4]= (char) 0; /* no flags */ buff[4]= (char) 0; /* no flags */
int4store(buff+5, 1); /* iteration count */ int4store(buff+5, 1); /* iteration count */
if (cli_advanced_command(mysql, COM_EXECUTE, buff, sizeof(buff),
res= test(cli_advanced_command(mysql, COM_EXECUTE, buff, sizeof(buff),
packet, length, 1, NULL) || packet, length, 1, NULL) ||
(*mysql->methods->read_query_result)(mysql)) (*mysql->methods->read_query_result)(mysql));
stmt->affected_rows= mysql->affected_rows;
stmt->insert_id= mysql->insert_id;
if (res)
{ {
set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate); set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
stmt->affected_rows= mysql->affected_rows;
stmt->insert_id= mysql->insert_id;
DBUG_RETURN(0); DBUG_RETURN(0);
} }
......
...@@ -224,20 +224,24 @@ static int emb_stmt_execute(MYSQL_STMT *stmt) ...@@ -224,20 +224,24 @@ static int emb_stmt_execute(MYSQL_STMT *stmt)
{ {
DBUG_ENTER("emb_stmt_execute"); DBUG_ENTER("emb_stmt_execute");
char header[4]; char header[4];
my_bool res;
int4store(header, stmt->stmt_id); int4store(header, stmt->stmt_id);
THD *thd= (THD*)stmt->mysql->thd; THD *thd= (THD*)stmt->mysql->thd;
thd->client_param_count= stmt->param_count; thd->client_param_count= stmt->param_count;
thd->client_params= stmt->params; thd->client_params= stmt->params;
if (emb_advanced_command(stmt->mysql, COM_EXECUTE,0,0,
res= test(emb_advanced_command(stmt->mysql, COM_EXECUTE,0,0,
header, sizeof(header), 1, stmt) || header, sizeof(header), 1, stmt) ||
emb_mysql_read_query_result(stmt->mysql)) emb_mysql_read_query_result(stmt->mysql));
stmt->affected_rows= stmt->mysql->affected_rows;
stmt->insert_id= stmt->mysql->insert_id;
if (res)
{ {
NET *net= &stmt->mysql->net; NET *net= &stmt->mysql->net;
set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate); set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
stmt->affected_rows= stmt->mysql->affected_rows;
stmt->insert_id= stmt->mysql->insert_id;
DBUG_RETURN(0); DBUG_RETURN(0);
} }
......
...@@ -202,3 +202,11 @@ select count(*) from t1 where id not in (1,2); ...@@ -202,3 +202,11 @@ select count(*) from t1 where id not in (1,2);
count(*) count(*)
1 1
drop table t1; drop table t1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 SELECT 1 IN (2, NULL);
SELECT should return NULL.
SELECT * FROM t1;
1 IN (2, NULL)
NULL
DROP TABLE t1;
End of 4.1 tests
...@@ -775,12 +775,12 @@ set @old_max_prepared_stmt_count= @@max_prepared_stmt_count; ...@@ -775,12 +775,12 @@ set @old_max_prepared_stmt_count= @@max_prepared_stmt_count;
show variables like 'max_prepared_stmt_count'; show variables like 'max_prepared_stmt_count';
Variable_name Value Variable_name Value
max_prepared_stmt_count 16382 max_prepared_stmt_count 16382
show variables like 'prepared_stmt_count'; show status like 'prepared_stmt_count';
Variable_name Value Variable_name Value
prepared_stmt_count 0 Prepared_stmt_count 0
select @@max_prepared_stmt_count, @@prepared_stmt_count; select @@max_prepared_stmt_count;
@@max_prepared_stmt_count @@prepared_stmt_count @@max_prepared_stmt_count
16382 0 16382
set global max_prepared_stmt_count=-1; set global max_prepared_stmt_count=-1;
select @@max_prepared_stmt_count; select @@max_prepared_stmt_count;
@@max_prepared_stmt_count @@max_prepared_stmt_count
...@@ -799,67 +799,70 @@ set max_prepared_stmt_count=1; ...@@ -799,67 +799,70 @@ set max_prepared_stmt_count=1;
ERROR HY000: Variable 'max_prepared_stmt_count' is a GLOBAL variable and should be set with SET GLOBAL ERROR HY000: Variable 'max_prepared_stmt_count' is a GLOBAL variable and should be set with SET GLOBAL
set local max_prepared_stmt_count=1; set local max_prepared_stmt_count=1;
ERROR HY000: Variable 'max_prepared_stmt_count' is a GLOBAL variable and should be set with SET GLOBAL ERROR HY000: Variable 'max_prepared_stmt_count' is a GLOBAL variable and should be set with SET GLOBAL
set local prepared_stmt_count=0;
ERROR HY000: Variable 'prepared_stmt_count' is a GLOBAL variable and should be set with SET GLOBAL
set @@prepared_stmt_count=0;
ERROR HY000: Variable 'prepared_stmt_count' is a GLOBAL variable and should be set with SET GLOBAL
set global prepared_stmt_count=1;
ERROR 42000: Incorrect argument type to variable 'prepared_stmt_count'
set global max_prepared_stmt_count=1; set global max_prepared_stmt_count=1;
select @@max_prepared_stmt_count; select @@max_prepared_stmt_count;
@@max_prepared_stmt_count @@max_prepared_stmt_count
1 1
set global max_prepared_stmt_count=0; set global max_prepared_stmt_count=0;
select @@max_prepared_stmt_count, @@prepared_stmt_count; select @@max_prepared_stmt_count;
@@max_prepared_stmt_count @@prepared_stmt_count @@max_prepared_stmt_count
0 0 0
show status like 'prepared_stmt_count';
Variable_name Value
Prepared_stmt_count 0
prepare stmt from "select 1"; prepare stmt from "select 1";
ERROR HY000: Unknown error ERROR HY000: Unknown error
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
@@prepared_stmt_count Variable_name Value
0 Prepared_stmt_count 0
set global max_prepared_stmt_count=1; set global max_prepared_stmt_count=1;
prepare stmt from "select 1"; prepare stmt from "select 1";
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
@@prepared_stmt_count Variable_name Value
1 Prepared_stmt_count 1
prepare stmt1 from "select 1"; prepare stmt1 from "select 1";
ERROR HY000: Unknown error ERROR HY000: Unknown error
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
@@prepared_stmt_count Variable_name Value
1 Prepared_stmt_count 1
deallocate prepare stmt; deallocate prepare stmt;
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
@@prepared_stmt_count Variable_name Value
0 Prepared_stmt_count 0
prepare stmt from "select 1"; prepare stmt from "select 1";
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
@@prepared_stmt_count Variable_name Value
1 Prepared_stmt_count 1
prepare stmt from "select 2"; prepare stmt from "select 2";
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
@@prepared_stmt_count Variable_name Value
Prepared_stmt_count 1
show status like 'prepared_stmt_count';
Variable_name Value
Prepared_stmt_count 1
select @@max_prepared_stmt_count;
@@max_prepared_stmt_count
1 1
select @@prepared_stmt_count, @@max_prepared_stmt_count;
@@prepared_stmt_count @@max_prepared_stmt_count
1 1
set global max_prepared_stmt_count=0; set global max_prepared_stmt_count=0;
prepare stmt from "select 1"; prepare stmt from "select 1";
ERROR HY000: Unknown error ERROR HY000: Unknown error
execute stmt; execute stmt;
ERROR HY000: Unknown prepared statement handler (stmt) given to EXECUTE ERROR HY000: Unknown prepared statement handler (stmt) given to EXECUTE
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
@@prepared_stmt_count Variable_name Value
0 Prepared_stmt_count 0
prepare stmt from "select 1"; prepare stmt from "select 1";
ERROR HY000: Unknown error ERROR HY000: Unknown error
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
@@prepared_stmt_count Variable_name Value
0 Prepared_stmt_count 0
set global max_prepared_stmt_count=3; set global max_prepared_stmt_count=3;
select @@max_prepared_stmt_count, @@prepared_stmt_count; select @@max_prepared_stmt_count;
@@max_prepared_stmt_count @@prepared_stmt_count @@max_prepared_stmt_count
3 0 3
show status like 'prepared_stmt_count';
Variable_name Value
Prepared_stmt_count 0
prepare stmt from "select 1"; prepare stmt from "select 1";
prepare stmt from "select 2"; prepare stmt from "select 2";
prepare stmt1 from "select 3"; prepare stmt1 from "select 3";
...@@ -867,13 +870,13 @@ prepare stmt2 from "select 4"; ...@@ -867,13 +870,13 @@ prepare stmt2 from "select 4";
ERROR HY000: Unknown error ERROR HY000: Unknown error
prepare stmt2 from "select 4"; prepare stmt2 from "select 4";
ERROR HY000: Unknown error ERROR HY000: Unknown error
select @@max_prepared_stmt_count, @@prepared_stmt_count; select @@max_prepared_stmt_count;
@@max_prepared_stmt_count @@prepared_stmt_count @@max_prepared_stmt_count
3 3 3
show status like 'prepared_stmt_count';
Variable_name Value
Prepared_stmt_count 3
deallocate prepare stmt; deallocate prepare stmt;
select @@max_prepared_stmt_count, @@prepared_stmt_count;
@@max_prepared_stmt_count @@prepared_stmt_count
3 0
set global max_prepared_stmt_count= @old_max_prepared_stmt_count; set global max_prepared_stmt_count= @old_max_prepared_stmt_count;
drop table if exists t1; drop table if exists t1;
create temporary table if not exists t1 (a1 int); create temporary table if not exists t1 (a1 int);
......
...@@ -109,4 +109,24 @@ select count(*) from t1 where id not in (1); ...@@ -109,4 +109,24 @@ select count(*) from t1 where id not in (1);
select count(*) from t1 where id not in (1,2); select count(*) from t1 where id not in (1,2);
drop table t1; drop table t1;
# End of 4.1 tests
#
# BUG#17047: CHAR() and IN() can return NULL without signaling NULL
# result
#
# The problem was in the IN() function that ignored maybe_null flags
# of all arguments except the first (the one _before_ the IN
# keyword, '1' in the test case below).
#
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE t1 SELECT 1 IN (2, NULL);
--echo SELECT should return NULL.
SELECT * FROM t1;
DROP TABLE t1;
--echo End of 4.1 tests
...@@ -811,6 +811,9 @@ drop table t1; ...@@ -811,6 +811,9 @@ drop table t1;
# Bug#16365 Prepared Statements: DoS with too many open statements # Bug#16365 Prepared Statements: DoS with too many open statements
# Check that the limit @@max_prpeared_stmt_count works. # Check that the limit @@max_prpeared_stmt_count works.
# #
# This is also the test for bug#23159 prepared_stmt_count should be
# status variable.
#
# Save the old value # Save the old value
set @old_max_prepared_stmt_count= @@max_prepared_stmt_count; set @old_max_prepared_stmt_count= @@max_prepared_stmt_count;
# #
...@@ -820,17 +823,17 @@ set @old_max_prepared_stmt_count= @@max_prepared_stmt_count; ...@@ -820,17 +823,17 @@ set @old_max_prepared_stmt_count= @@max_prepared_stmt_count;
# #
--disable_ps_protocol --disable_ps_protocol
# #
# A. Check that the new variables are present in SHOW VARIABLES list. # A. Check that the new variables are present in SHOW VARIABLES and
# SHOW STATUS lists.
# #
show variables like 'max_prepared_stmt_count'; show variables like 'max_prepared_stmt_count';
show variables like 'prepared_stmt_count'; show status like 'prepared_stmt_count';
# #
# B. Check that the new variables are selectable. # B. Check that the new system variable is selectable.
# #
select @@max_prepared_stmt_count, @@prepared_stmt_count; select @@max_prepared_stmt_count;
# #
# C. Check that max_prepared_stmt_count is settable (global only), # C. Check that max_prepared_stmt_count is settable (global only).
# whereas prepared_stmt_count is readonly.
# #
set global max_prepared_stmt_count=-1; set global max_prepared_stmt_count=-1;
select @@max_prepared_stmt_count; select @@max_prepared_stmt_count;
...@@ -844,12 +847,6 @@ set @@max_prepared_stmt_count=1; ...@@ -844,12 +847,6 @@ set @@max_prepared_stmt_count=1;
set max_prepared_stmt_count=1; set max_prepared_stmt_count=1;
--error 1229 # ER_GLOBAL_VARIABLE --error 1229 # ER_GLOBAL_VARIABLE
set local max_prepared_stmt_count=1; set local max_prepared_stmt_count=1;
--error 1229 # ER_GLOBAL_VARIABLE
set local prepared_stmt_count=0;
--error 1229 # ER_GLOBAL_VARIABLE
set @@prepared_stmt_count=0;
--error 1232 # ER_WRONG_TYPE_FOR_VAR
set global prepared_stmt_count=1;
# set to a reasonable limit works # set to a reasonable limit works
set global max_prepared_stmt_count=1; set global max_prepared_stmt_count=1;
select @@max_prepared_stmt_count; select @@max_prepared_stmt_count;
...@@ -857,47 +854,50 @@ select @@max_prepared_stmt_count; ...@@ -857,47 +854,50 @@ select @@max_prepared_stmt_count;
# D. Check that the variables actually work. # D. Check that the variables actually work.
# #
set global max_prepared_stmt_count=0; set global max_prepared_stmt_count=0;
select @@max_prepared_stmt_count, @@prepared_stmt_count; select @@max_prepared_stmt_count;
show status like 'prepared_stmt_count';
--error 1105 # ER_UNKNOWN_ERROR --error 1105 # ER_UNKNOWN_ERROR
prepare stmt from "select 1"; prepare stmt from "select 1";
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
set global max_prepared_stmt_count=1; set global max_prepared_stmt_count=1;
prepare stmt from "select 1"; prepare stmt from "select 1";
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
--error 1105 # ER_UNKNOWN_ERROR --error 1105 # ER_UNKNOWN_ERROR
prepare stmt1 from "select 1"; prepare stmt1 from "select 1";
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
deallocate prepare stmt; deallocate prepare stmt;
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
# #
# E. Check that we can prepare a statement with the same name # E. Check that we can prepare a statement with the same name
# successfully, without hitting the limit. # successfully, without hitting the limit.
# #
prepare stmt from "select 1"; prepare stmt from "select 1";
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
prepare stmt from "select 2"; prepare stmt from "select 2";
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
# #
# F. We can set the max below the current count. In this case no new # F. We can set the max below the current count. In this case no new
# statements should be allowed to prepare. # statements should be allowed to prepare.
# #
select @@prepared_stmt_count, @@max_prepared_stmt_count; show status like 'prepared_stmt_count';
select @@max_prepared_stmt_count;
set global max_prepared_stmt_count=0; set global max_prepared_stmt_count=0;
--error 1105 # ER_UNKNOWN_ERROR --error 1105 # ER_UNKNOWN_ERROR
prepare stmt from "select 1"; prepare stmt from "select 1";
# Result: the old statement is deallocated, the new is not created. # Result: the old statement is deallocated, the new is not created.
--error 1243 # ER_UNKNOWN_STMT_HANDLER --error 1243 # ER_UNKNOWN_STMT_HANDLER
execute stmt; execute stmt;
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
--error 1105 # ER_UNKNOWN_ERROR --error 1105 # ER_UNKNOWN_ERROR
prepare stmt from "select 1"; prepare stmt from "select 1";
select @@prepared_stmt_count; show status like 'prepared_stmt_count';
# #
# G. Show that the variables are up to date even after a connection with all # G. Show that the variables are up to date even after a connection with all
# statements in it was terminated. # statements in it was terminated.
# #
set global max_prepared_stmt_count=3; set global max_prepared_stmt_count=3;
select @@max_prepared_stmt_count, @@prepared_stmt_count; select @@max_prepared_stmt_count;
show status like 'prepared_stmt_count';
prepare stmt from "select 1"; prepare stmt from "select 1";
connect (con1,localhost,root,,); connect (con1,localhost,root,,);
connection con1; connection con1;
...@@ -908,18 +908,11 @@ prepare stmt2 from "select 4"; ...@@ -908,18 +908,11 @@ prepare stmt2 from "select 4";
connection default; connection default;
--error 1105 # ER_UNKNOWN_ERROR --error 1105 # ER_UNKNOWN_ERROR
prepare stmt2 from "select 4"; prepare stmt2 from "select 4";
select @@max_prepared_stmt_count, @@prepared_stmt_count; select @@max_prepared_stmt_count;
show status like 'prepared_stmt_count';
disconnect con1; disconnect con1;
connection default; connection default;
# Wait for the connection to die: deal with a possible race
deallocate prepare stmt; deallocate prepare stmt;
let $count= `select @@prepared_stmt_count`;
if ($count)
{
--sleep 2
let $count= `select @@prepared_stmt_count`;
}
select @@max_prepared_stmt_count, @@prepared_stmt_count;
# #
# Restore the old value. # Restore the old value.
# #
......
...@@ -1998,7 +1998,6 @@ void Item_func_in::fix_length_and_dec() ...@@ -1998,7 +1998,6 @@ void Item_func_in::fix_length_and_dec()
if (cmp_type == STRING_RESULT) if (cmp_type == STRING_RESULT)
in_item->cmp_charset= cmp_collation.collation; in_item->cmp_charset= cmp_collation.collation;
} }
maybe_null= args[0]->maybe_null;
max_length= 1; max_length= 1;
} }
......
...@@ -71,9 +71,13 @@ void Item_sum::make_field(Send_field *tmp_field) ...@@ -71,9 +71,13 @@ void Item_sum::make_field(Send_field *tmp_field)
if (args[0]->type() == Item::FIELD_ITEM && keep_field_type()) if (args[0]->type() == Item::FIELD_ITEM && keep_field_type())
{ {
((Item_field*) args[0])->field->make_field(tmp_field); ((Item_field*) args[0])->field->make_field(tmp_field);
tmp_field->db_name=(char*)""; /* For expressions only col_name should be non-empty string. */
tmp_field->org_table_name=tmp_field->table_name=(char*)""; char *empty_string= (char*)"";
tmp_field->org_col_name=tmp_field->col_name=name; 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) if (maybe_null)
tmp_field->flags&= ~NOT_NULL_FLAG; tmp_field->flags&= ~NOT_NULL_FLAG;
} }
......
...@@ -5722,6 +5722,7 @@ struct show_var_st status_vars[]= { ...@@ -5722,6 +5722,7 @@ struct show_var_st status_vars[]= {
{"Open_streams", (char*) &my_stream_opened, SHOW_LONG_CONST}, {"Open_streams", (char*) &my_stream_opened, SHOW_LONG_CONST},
{"Open_tables", (char*) 0, SHOW_OPENTABLES}, {"Open_tables", (char*) 0, SHOW_OPENTABLES},
{"Opened_tables", (char*) &opened_tables, SHOW_LONG}, {"Opened_tables", (char*) &opened_tables, SHOW_LONG},
{"Prepared_stmt_count", (char*) &prepared_stmt_count, SHOW_LONG_CONST},
#ifdef HAVE_QUERY_CACHE #ifdef HAVE_QUERY_CACHE
{"Qcache_free_blocks", (char*) &query_cache.free_memory_blocks, {"Qcache_free_blocks", (char*) &query_cache.free_memory_blocks,
SHOW_LONG_CONST}, SHOW_LONG_CONST},
...@@ -5892,6 +5893,7 @@ static void mysql_init_variables(void) ...@@ -5892,6 +5893,7 @@ static void mysql_init_variables(void)
binlog_cache_use= binlog_cache_disk_use= 0; binlog_cache_use= binlog_cache_disk_use= 0;
max_used_connections= slow_launch_threads = 0; max_used_connections= slow_launch_threads = 0;
mysqld_user= mysqld_chroot= opt_init_file= opt_bin_logname = 0; mysqld_user= mysqld_chroot= opt_init_file= opt_bin_logname = 0;
prepared_stmt_count= 0;
errmesg= 0; errmesg= 0;
mysqld_unix_port= opt_mysql_tmpdir= my_bind_addr_str= NullS; mysqld_unix_port= opt_mysql_tmpdir= my_bind_addr_str= NullS;
bzero((gptr) &mysql_tmpdir_list, sizeof(mysql_tmpdir_list)); bzero((gptr) &mysql_tmpdir_list, sizeof(mysql_tmpdir_list));
......
...@@ -119,7 +119,6 @@ static KEY_CACHE *create_key_cache(const char *name, uint length); ...@@ -119,7 +119,6 @@ static KEY_CACHE *create_key_cache(const char *name, uint length);
void fix_sql_mode_var(THD *thd, enum_var_type type); void fix_sql_mode_var(THD *thd, enum_var_type type);
static byte *get_error_count(THD *thd); static byte *get_error_count(THD *thd);
static byte *get_warning_count(THD *thd); static byte *get_warning_count(THD *thd);
static byte *get_prepared_stmt_count(THD *thd);
static byte *get_have_innodb(THD *thd); static byte *get_have_innodb(THD *thd);
/* /*
...@@ -482,9 +481,6 @@ static sys_var_readonly sys_warning_count("warning_count", ...@@ -482,9 +481,6 @@ static sys_var_readonly sys_warning_count("warning_count",
OPT_SESSION, OPT_SESSION,
SHOW_LONG, SHOW_LONG,
get_warning_count); get_warning_count);
static sys_var_readonly sys_prepared_stmt_count("prepared_stmt_count",
OPT_GLOBAL, SHOW_LONG,
get_prepared_stmt_count);
/* alias for last_insert_id() to be compatible with Sybase */ /* alias for last_insert_id() to be compatible with Sybase */
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
...@@ -604,7 +600,6 @@ sys_var *sys_variables[]= ...@@ -604,7 +600,6 @@ sys_var *sys_variables[]=
&sys_new_mode, &sys_new_mode,
&sys_old_passwords, &sys_old_passwords,
&sys_preload_buff_size, &sys_preload_buff_size,
&sys_prepared_stmt_count,
&sys_pseudo_thread_id, &sys_pseudo_thread_id,
&sys_query_alloc_block_size, &sys_query_alloc_block_size,
&sys_query_cache_size, &sys_query_cache_size,
...@@ -860,7 +855,6 @@ struct show_var_st init_vars[]= { ...@@ -860,7 +855,6 @@ struct show_var_st init_vars[]= {
{"pid_file", (char*) pidfile_name, SHOW_CHAR}, {"pid_file", (char*) pidfile_name, SHOW_CHAR},
{"port", (char*) &mysqld_port, SHOW_INT}, {"port", (char*) &mysqld_port, SHOW_INT},
{sys_preload_buff_size.name, (char*) &sys_preload_buff_size, SHOW_SYS}, {sys_preload_buff_size.name, (char*) &sys_preload_buff_size, SHOW_SYS},
{sys_prepared_stmt_count.name, (char*) &sys_prepared_stmt_count, SHOW_SYS},
{"protocol_version", (char*) &protocol_version, SHOW_INT}, {"protocol_version", (char*) &protocol_version, SHOW_INT},
{sys_query_alloc_block_size.name, (char*) &sys_query_alloc_block_size, {sys_query_alloc_block_size.name, (char*) &sys_query_alloc_block_size,
SHOW_SYS}, SHOW_SYS},
...@@ -2715,14 +2709,6 @@ static byte *get_have_innodb(THD *thd) ...@@ -2715,14 +2709,6 @@ static byte *get_have_innodb(THD *thd)
} }
static byte *get_prepared_stmt_count(THD *thd)
{
pthread_mutex_lock(&LOCK_prepared_stmt_count);
thd->sys_var_tmp.ulong_value= prepared_stmt_count;
pthread_mutex_unlock(&LOCK_prepared_stmt_count);
return (byte*) &thd->sys_var_tmp.ulong_value;
}
/**************************************************************************** /****************************************************************************
Main handling of variables: Main handling of variables:
- Initialisation - Initialisation
......
...@@ -11949,6 +11949,150 @@ static void test_bug21726() ...@@ -11949,6 +11949,150 @@ static void test_bug21726()
} }
/*
BUG#23383: mysql_affected_rows() returns different values than
mysql_stmt_affected_rows()
Test that both mysql_affected_rows() and mysql_stmt_affected_rows()
return -1 on error, 0 when no rows were affected, and (positive) row
count when some rows were affected.
*/
static void test_bug23383()
{
const char *insert_query= "INSERT INTO t1 VALUES (1), (2)";
const char *update_query= "UPDATE t1 SET i= 4 WHERE i = 3";
MYSQL_STMT *stmt;
my_ulonglong row_count;
int rc;
DBUG_ENTER("test_bug23383");
myheader("test_bug23383");
rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
myquery(rc);
rc= mysql_query(mysql, "CREATE TABLE t1 (i INT UNIQUE)");
myquery(rc);
rc= mysql_query(mysql, insert_query);
myquery(rc);
row_count= mysql_affected_rows(mysql);
DIE_UNLESS(row_count == 2);
rc= mysql_query(mysql, insert_query);
DIE_UNLESS(rc != 0);
row_count= mysql_affected_rows(mysql);
DIE_UNLESS(row_count == (my_ulonglong)-1);
rc= mysql_query(mysql, update_query);
myquery(rc);
row_count= mysql_affected_rows(mysql);
DIE_UNLESS(row_count == 0);
rc= mysql_query(mysql, "DELETE FROM t1");
myquery(rc);
stmt= mysql_stmt_init(mysql);
DIE_UNLESS(stmt != 0);
rc= mysql_stmt_prepare(stmt, insert_query, strlen(insert_query));
check_execute(stmt, rc);
rc= mysql_stmt_execute(stmt);
check_execute(stmt, rc);
row_count= mysql_stmt_affected_rows(stmt);
DIE_UNLESS(row_count == 2);
rc= mysql_stmt_execute(stmt);
DIE_UNLESS(rc != 0);
row_count= mysql_stmt_affected_rows(stmt);
DIE_UNLESS(row_count == (my_ulonglong)-1);
rc= mysql_stmt_prepare(stmt, update_query, strlen(update_query));
check_execute(stmt, rc);
rc= mysql_stmt_execute(stmt);
check_execute(stmt, rc);
row_count= mysql_stmt_affected_rows(stmt);
DIE_UNLESS(row_count == 0);
rc= mysql_stmt_close(stmt);
check_execute(stmt, rc);
rc= mysql_query(mysql, "DROP TABLE t1");
myquery(rc);
DBUG_VOID_RETURN;
}
/*
BUG#21635: MYSQL_FIELD struct's member strings seem to misbehave for
expression cols
Check that for MIN(), MAX(), COUNT() only MYSQL_FIELD::name is set
to either expression or its alias, and db, org_table, table,
org_name fields are empty strings.
*/
static void test_bug21635()
{
const char *expr[]=
{
"MIN(i)", "MIN(i)",
"MIN(i) AS A1", "A1",
"MAX(i)", "MAX(i)",
"MAX(i) AS A2", "A2",
"COUNT(i)", "COUNT(i)",
"COUNT(i) AS A3", "A3",
};
char *query_end;
MYSQL_RES *result;
MYSQL_FIELD *field;
unsigned int field_count, i;
int rc;
DBUG_ENTER("test_bug21635");
myheader("test_bug21635");
query_end= strxmov(query, "SELECT ", NullS);
for (i= 0; i < sizeof(expr) / sizeof(*expr) / 2; ++i)
query_end= strxmov(query_end, expr[i * 2], ", ", NullS);
query_end= strxmov(query_end - 2, " FROM t1 GROUP BY i", NullS);
DIE_UNLESS(query_end - query < MAX_TEST_QUERY_LENGTH);
rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
myquery(rc);
rc= mysql_query(mysql, "CREATE TABLE t1 (i INT)");
myquery(rc);
rc= mysql_query(mysql, "INSERT INTO t1 VALUES (1)");
myquery(rc);
rc= mysql_real_query(mysql, query, query_end - query);
myquery(rc);
result= mysql_use_result(mysql);
DIE_UNLESS(result);
field_count= mysql_field_count(mysql);
for (i= 0; i < field_count; ++i)
{
field= mysql_fetch_field_direct(result, i);
printf("%s -> %s ... ", expr[i * 2], field->name);
fflush(stdout);
DIE_UNLESS(field->db[0] == 0 && field->org_table[0] == 0 &&
field->table[0] == 0 && field->org_name[0] == 0);
DIE_UNLESS(strcmp(field->name, expr[i * 2 + 1]) == 0);
puts("OK");
}
mysql_free_result(result);
rc= mysql_query(mysql, "DROP TABLE t1");
myquery(rc);
DBUG_VOID_RETURN;
}
/* /*
Read and parse arguments and MySQL options from my.cnf Read and parse arguments and MySQL options from my.cnf
*/ */
...@@ -12176,6 +12320,8 @@ static struct my_tests_st my_tests[]= { ...@@ -12176,6 +12320,8 @@ static struct my_tests_st my_tests[]= {
{ "test_bug15613", test_bug15613 }, { "test_bug15613", test_bug15613 },
{ "test_bug20152", test_bug20152 }, { "test_bug20152", test_bug20152 },
{ "test_bug21726", test_bug21726 }, { "test_bug21726", test_bug21726 },
{ "test_bug23383", test_bug23383 },
{ "test_bug21635", test_bug21635 },
{ 0, 0 } { 0, 0 }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment