diff options
author | unknown <monty@mysql.com> | 2003-12-21 19:39:32 +0200 |
---|---|---|
committer | unknown <monty@mysql.com> | 2003-12-21 19:39:32 +0200 |
commit | d31c6628e1494dd561f96cfb8a1fbfde17fc8ed4 (patch) | |
tree | 82780d2f52e09f3ef112e35fc6f6b3e1dadc3a56 | |
parent | 9e56a0a7711e1f6f2b234db54b3e3d2004069bbf (diff) | |
download | mariadb-git-d31c6628e1494dd561f96cfb8a1fbfde17fc8ed4.tar.gz |
Portability fixes found during 5.0 test compilation
Fixed bug in ORDER BY on a small column (Bug #2147)
Fixed error from pthread_mutex_destroy() when one had wrong errmsg file
client/mysqltest.c:
Added handling of error on query send
(Needed for init_connection.test)
mysql-test/mysql-test-run.sh:
Added tracing of mysqldump and mysqlbinlog
mysql-test/r/init_connect.result:
Updated tests
mysql-test/r/order_by.result:
Added test for bug filesort bug
mysql-test/t/init_connect-master.opt:
Added proper quoting (for Solaris and OSF)
mysql-test/t/init_connect.test:
Portability fix
mysql-test/t/order_by.test:
Added test for bug #2147 (bug in filesort)
sql/filesort.cc:
Fixed bug in filesort (Bug #2147)
sql/item.h:
Clear 'fixed' on cleanup (For prepared statements)
sql/item_func.cc:
Protect mutex destroy.
(Fixed error from pthread_mutex_destroy() when one had wrong errmsg file)
sql/log_event.cc:
Portability fix
sql/sql_class.h:
Fixed compiler warning
sql/sql_prepare.cc:
Portability fix. (Some compilers doesn't support jump over variables declared in for())
-rw-r--r-- | client/mysqltest.c | 19 | ||||
-rw-r--r-- | mysql-test/mysql-test-run.sh | 10 | ||||
-rw-r--r-- | mysql-test/r/init_connect.result | 2 | ||||
-rw-r--r-- | mysql-test/r/order_by.result | 6 | ||||
-rw-r--r-- | mysql-test/t/init_connect-master.opt | 2 | ||||
-rw-r--r-- | mysql-test/t/init_connect.test | 2 | ||||
-rw-r--r-- | mysql-test/t/order_by.test | 8 | ||||
-rw-r--r-- | sql/filesort.cc | 14 | ||||
-rw-r--r-- | sql/item.h | 2 | ||||
-rw-r--r-- | sql/item_func.cc | 14 | ||||
-rw-r--r-- | sql/log_event.cc | 4 | ||||
-rw-r--r-- | sql/sql_class.h | 7 | ||||
-rw-r--r-- | sql/sql_prepare.cc | 4 |
13 files changed, 59 insertions, 35 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c index d034007cb29..bb1151fa178 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -2154,7 +2154,7 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) DYNAMIC_STRING ds_tmp; DYNAMIC_STRING eval_query; char* query; - int query_len; + int query_len, got_error_on_send= 0; DBUG_ENTER("run_query"); if (q->type != Q_EVAL) @@ -2179,9 +2179,13 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) else ds= &ds_res; - if ((flags & QUERY_SEND) && mysql_send_query(mysql, query, query_len)) - die("At line %u: unable to send query '%s'(mysql_errno=%d,errno=%d)", - start_lineno, query, mysql_errno(mysql), errno); + if (flags & QUERY_SEND) + { + got_error_on_send= mysql_send_query(mysql, query, query_len); + if (got_error_on_send && !q->expected_errno[0]) + die("At line %u: unable to send query '%s' (mysql_errno=%d , errno=%d)", + start_lineno, query, mysql_errno(mysql), errno); + } do { @@ -2194,9 +2198,10 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) if (!(flags & QUERY_REAP)) DBUG_RETURN(0); - if ((!counter && (*mysql->methods->read_query_result)(mysql)) || - (!(last_result= res= mysql_store_result(mysql)) && - mysql_field_count(mysql))) + if (got_error_on_send || + (!counter && (*mysql->methods->read_query_result)(mysql)) || + (!(last_result= res= mysql_store_result(mysql)) && + mysql_field_count(mysql))) { if (q->require_file) { diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index c3bba8d7a70..265ff036998 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -198,6 +198,8 @@ USER_TEST= EXTRA_MASTER_OPT="" EXTRA_MYSQL_TEST_OPT="" +EXTRA_MYSQLDUMP_OPT="" +EXTRA_MYSQLBINLOG_OPT="" USE_RUNNING_SERVER="" DO_GCOV="" DO_GDB="" @@ -373,6 +375,10 @@ while test $# -gt 0; do --debug=d:t:i:A,$MYSQL_TEST_DIR/var/log/slave.trace" EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT \ --debug=d:t:A,$MYSQL_TEST_DIR/var/log/mysqltest.trace" + EXTRA_MYSQLDUMP_OPT="$EXTRA_MYSQLDUMP_OPT \ + --debug=d:t:A,$MYSQL_TEST_DIR/var/log/mysqldump.trace" + EXTRA_MYSQLBINLOG_OPT="$EXTRA_MYSQLBINLOG_OPT \ + --debug=d:t:A,$MYSQL_TEST_DIR/var/log/mysqlbinlog.trace" ;; --fast) FAST_START=1 @@ -490,8 +496,8 @@ else fi fi -MYSQL_DUMP="$MYSQL_DUMP --no-defaults -uroot --socket=$MASTER_MYSOCK" -MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR" +MYSQL_DUMP="$MYSQL_DUMP --no-defaults -uroot --socket=$MASTER_MYSOCK $EXTRA_MYSQLDUMP_OPT" +MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR $EXTRA_MYSQLBINLOG_OPT" export MYSQL_DUMP export MYSQL_BINLOG diff --git a/mysql-test/r/init_connect.result b/mysql-test/r/init_connect.result index 3f8e726c775..db1e72dfca9 100644 --- a/mysql-test/r/init_connect.result +++ b/mysql-test/r/init_connect.result @@ -20,5 +20,5 @@ hex(a) 616263 set GLOBAL init_connect="adsfsdfsdfs"; select @a; -ERROR HY000: Lost connection to MySQL server during query +Got one of the listed errors drop table t1; diff --git a/mysql-test/r/order_by.result b/mysql-test/r/order_by.result index a321e8a44f9..4d166a961f3 100644 --- a/mysql-test/r/order_by.result +++ b/mysql-test/r/order_by.result @@ -584,3 +584,9 @@ CREATE TABLE t1 (a INT, b INT); SET @id=0; UPDATE t1 SET a=0 ORDER BY (a=@id), b; DROP TABLE t1; +CREATE TABLE t1 ( id smallint(6) unsigned NOT NULL default '0', menu tinyint(4) NOT NULL default '0', KEY id (id), KEY menu (menu)) ENGINE=MyISAM; +INSERT INTO t1 VALUES (11384, 2),(11392, 2); +SELECT id FROM t1 WHERE id <11984 AND menu =2 ORDER BY id DESC LIMIT 1 ; +id +11392 +drop table t1; diff --git a/mysql-test/t/init_connect-master.opt b/mysql-test/t/init_connect-master.opt index e3316c2def5..108a8687aa2 100644 --- a/mysql-test/t/init_connect-master.opt +++ b/mysql-test/t/init_connect-master.opt @@ -1 +1 @@ ---set-variable=init_connect="set @a='a\0c'" +--set-variable=init_connect="set @a='a\\0c'" diff --git a/mysql-test/t/init_connect.test b/mysql-test/t/init_connect.test index 563ec6178d0..29962abc04d 100644 --- a/mysql-test/t/init_connect.test +++ b/mysql-test/t/init_connect.test @@ -28,7 +28,7 @@ connection con0; set GLOBAL init_connect="adsfsdfsdfs"; connect (con5,localhost,user_1,,); connection con5; ---error 2013 +--error 2013,2006 select @a; connection con0; drop table t1; diff --git a/mysql-test/t/order_by.test b/mysql-test/t/order_by.test index bb72c5278f9..1db783c212b 100644 --- a/mysql-test/t/order_by.test +++ b/mysql-test/t/order_by.test @@ -373,3 +373,11 @@ SET @id=0; UPDATE t1 SET a=0 ORDER BY (a=@id), b; DROP TABLE t1; +# +# Bug when doing an order by on a 1 byte string (Bug #2147) +# + +CREATE TABLE t1 ( id smallint(6) unsigned NOT NULL default '0', menu tinyint(4) NOT NULL default '0', KEY id (id), KEY menu (menu)) ENGINE=MyISAM; +INSERT INTO t1 VALUES (11384, 2),(11392, 2); +SELECT id FROM t1 WHERE id <11984 AND menu =2 ORDER BY id DESC LIMIT 1 ; +drop table t1; diff --git a/sql/filesort.cc b/sql/filesort.cc index 720c059a70b..b69aaf44e46 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -151,8 +151,6 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, records=table->file->estimate_number_of_rows(); selected_records_file= 0; } - if (param.rec_length == param.ref_length && records > param.max_rows) - records=param.max_rows; /* purecov: inspected */ if (multi_byte_charset && !(param.tmp_buffer=my_malloc(param.sort_length,MYF(MY_WME)))) @@ -182,7 +180,7 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, DISK_BUFFER_SIZE, MYF(MY_WME))) goto err; - param.keys--; + param.keys--; /* TODO: check why we do this */ param.sort_form= table; param.end=(param.local_sortorder=sortorder)+s_length; if ((records=find_all_keys(¶m,select,sort_keys, &buffpek_pointers, @@ -408,16 +406,6 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select, if (write_keys(param,sort_keys,idx,buffpek_pointers,tempfile)) DBUG_RETURN(HA_POS_ERROR); idx=0; - if (param->ref_length == param->rec_length && - my_b_tell(tempfile)/param->rec_length >= param->max_rows) - { - /* - We are writing the result index file and have found all - rows that we need. Abort the sort and return the result. - */ - error=HA_ERR_END_OF_FILE; - break; /* Found enough records */ - } indexpos++; } make_sortkey(param,sort_keys[idx++],ref_pos); diff --git a/sql/item.h b/sql/item.h index c6258518213..5def1e2b710 100644 --- a/sql/item.h +++ b/sql/item.h @@ -128,7 +128,7 @@ public: virtual ~Item() { name=0; cleanup(); } /*lint -e1509 */ void set_name(const char *str,uint length, CHARSET_INFO *cs); void init_make_field(Send_field *tmp_field,enum enum_field_types type); - virtual void cleanup() {} + virtual void cleanup() { fixed=0; } virtual void make_field(Send_field *field); virtual bool fix_fields(THD *, struct st_table_list *, Item **); virtual int save_in_field(Field *field, bool no_conversions); diff --git a/sql/item_func.cc b/sql/item_func.cc index 8d8b77e527e..a251be402ce 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1772,17 +1772,25 @@ char *ull_get_key(const ULL *ull,uint *length, return (char*) ull->key; } + +static bool item_user_lock_inited= 0; + void item_user_lock_init(void) { pthread_mutex_init(&LOCK_user_locks,MY_MUTEX_INIT_SLOW); hash_init(&hash_user_locks,system_charset_info, 16,0,0,(hash_get_key) ull_get_key,NULL,0); + item_user_lock_inited= 1; } void item_user_lock_free(void) { - hash_free(&hash_user_locks); - pthread_mutex_destroy(&LOCK_user_locks); + if (item_user_lock_inited) + { + item_user_lock_inited= 0; + hash_free(&hash_user_locks); + pthread_mutex_destroy(&LOCK_user_locks); + } } void item_user_lock_release(ULL *ull) @@ -2442,7 +2450,7 @@ Item_func_get_user_var::val_str(String *str) { DBUG_ENTER("Item_func_get_user_var::val_str"); if (!var_entry) - return (String*) 0; // No such variable + DBUG_RETURN((String*) 0); // No such variable DBUG_RETURN(var_entry->val_str(&null_value, str, decimals)); } diff --git a/sql/log_event.cc b/sql/log_event.cc index b609e6c6b11..1f20948aa82 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -2344,13 +2344,13 @@ int User_var_log_event::exec_event(struct st_relay_log_info* rli) float8get(real_val, val); it= new Item_real(real_val); val= (char*) &real_val; // Pointer to value in native format - val_len= sizeof(real_val); + val_len= 8; break; case INT_RESULT: int_val= (longlong) uint8korr(val); it= new Item_int(int_val); val= (char*) &int_val; // Pointer to value in native format - val_len= sizeof(int_val); + val_len= 8; break; case STRING_RESULT: it= new Item_string(val, val_len, charset); diff --git a/sql/sql_class.h b/sql/sql_class.h index d663521b296..546a90d2be3 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -801,8 +801,11 @@ public: inline void end_time() { time(&start_time); } inline void set_time(time_t t) { time_after_lock=start_time=user_time=t; } inline void lock_time() { time(&time_after_lock); } - inline void insert_id(ulonglong id) - { last_insert_id=id; insert_id_used=1; } + inline void insert_id(ulonglong id_arg) + { + last_insert_id= id_arg; + insert_id_used=1; + } inline ulonglong insert_id(void) { if (!last_insert_id_used) diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index f60e0db58d0..a513e445db9 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -887,7 +887,7 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length) { LEX *lex; Prepared_statement *stmt= new Prepared_statement(thd); - + SELECT_LEX *sl; DBUG_ENTER("mysql_stmt_prepare"); if (stmt == 0) @@ -918,7 +918,7 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length) my_pthread_setprio(pthread_self(),WAIT_PRIOR); // save WHERE clause pointers to avoid damaging they by optimisation - for (SELECT_LEX *sl= thd->lex->all_selects_list; + for (sl= thd->lex->all_selects_list; sl; sl= sl->next_select_in_list()) { |