diff --git a/include/mysqld_error.h b/include/mysqld_error.h index 34184f5ba97..60204349de2 100644 --- a/include/mysqld_error.h +++ b/include/mysqld_error.h @@ -296,5 +296,6 @@ #define ER_MISSING_SKIP_SLAVE 1277 #define ER_UNTIL_COND_IGNORED 1278 #define ER_WRONG_INDEX_NAME 1279 -#define ER_BAD_FT_COLUMN 1280 -#define ER_ERROR_MESSAGES 281 +#define ER_WARN_QC_RESIZE 1280 +#define ER_BAD_FT_COLUMN 1281 +#define ER_ERROR_MESSAGES 282 diff --git a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result index a6aca2f983c..1a1eec1f915 100644 --- a/mysql-test/r/query_cache.result +++ b/mysql-test/r/query_cache.result @@ -579,24 +579,32 @@ query_cache_size 0 select * from t1; a set GLOBAL query_cache_size=1024; +Warnings: +Warning 1280 Query cache failed to set size 1024, new query cache size is 0 show global variables like "query_cache_size"; Variable_name Value query_cache_size 0 select * from t1; a set GLOBAL query_cache_size=10240; +Warnings: +Warning 1280 Query cache failed to set size 10240, new query cache size is 0 show global variables like "query_cache_size"; Variable_name Value query_cache_size 0 select * from t1; a set GLOBAL query_cache_size=20480; +Warnings: +Warning 1280 Query cache failed to set size 20480, new query cache size is 0 show global variables like "query_cache_size"; Variable_name Value query_cache_size 0 select * from t1; a set GLOBAL query_cache_size=40960; +Warnings: +Warning 1280 Query cache failed to set size 40960, new query cache size is 0 show global variables like "query_cache_size"; Variable_name Value query_cache_size 0 diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index a196b05b142..a2e83729513 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1489,3 +1489,17 @@ set sort_buffer_size = (select s1 from t1); ERROR 21000: Subquery returns more than 1 row do (select * from t1); drop table t1; +create table t1 (s1 char); +insert into t1 values ('e'); +select * from t1 where 'f' > any (select s1 from t1); +s1 +e +select * from t1 where 'f' > any (select s1 from t1 union select s1 from t1); +s1 +e +explain select * from t1 where 'f' > any (select s1 from t1 union select s1 from t1); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 system NULL NULL NULL NULL 1 +2 SUBQUERY t1 system NULL NULL NULL NULL 1 +3 UNION t1 system NULL NULL NULL NULL 1 +drop table t1; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index e585375b385..3648210b943 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -1010,3 +1010,13 @@ insert into t1 values (2); set sort_buffer_size = (select s1 from t1); do (select * from t1); drop table t1; + +# +# optimized ALL/ANY with union +# +create table t1 (s1 char); +insert into t1 values ('e'); +select * from t1 where 'f' > any (select s1 from t1); +select * from t1 where 'f' > any (select s1 from t1 union select s1 from t1); +explain select * from t1 where 'f' > any (select s1 from t1 union select s1 from t1); +drop table t1; diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 4e6301d2626..2680d5de017 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -421,6 +421,7 @@ bool Item_in_optimizer::fix_left(THD *thd, not_null_tables_cache= args[0]->not_null_tables(); with_sum_func= args[0]->with_sum_func; const_item_cache= args[0]->const_item(); + fixed= 1; return 0; } diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 6ac191af267..589a41052c5 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -35,7 +35,7 @@ inline Item * and_items(Item* cond, Item *item) } Item_subselect::Item_subselect(): - Item_result_field(), engine_owner(1), value_assigned(0), substitution(0), + Item_result_field(), value_assigned(0), substitution(0), engine(0), used_tables_cache(0), have_to_be_excluded(0), const_item_cache(1), engine_changed(0) { @@ -66,8 +66,7 @@ void Item_subselect::init(st_select_lex *select_lex, Item_subselect::~Item_subselect() { - if (engine_owner) - delete engine; + delete engine; } Item_subselect::trans_res @@ -183,7 +182,8 @@ Item_singlerow_subselect::Item_singlerow_subselect(st_select_lex *select_lex) DBUG_VOID_RETURN; } -Item_maxmin_subselect::Item_maxmin_subselect(st_select_lex *select_lex, +Item_maxmin_subselect::Item_maxmin_subselect(Item_subselect *parent, + st_select_lex *select_lex, bool max) :Item_singlerow_subselect() { @@ -192,6 +192,14 @@ Item_maxmin_subselect::Item_maxmin_subselect(st_select_lex *select_lex, max_columns= 1; maybe_null= 1; max_columns= 1; + + /* + Following information was collected during performing fix_fields() + of Items belonged to subquery, which will be not repeated + */ + used_tables_cache= parent->get_used_tables_cache(); + const_item_cache= parent->get_const_item_cache(); + DBUG_VOID_RETURN; } @@ -527,9 +535,16 @@ Item_in_subselect::single_value_transformer(JOIN *join, func == &Item_bool_func2::ge_creator || func == &Item_bool_func2::le_creator)) { + if (substitution) + { + // It is second (third, ...) SELECT of UNION => All is done + DBUG_RETURN(RES_OK); + } + Item *subs; if (!select_lex->group_list.elements && - !select_lex->with_sum_func) + !select_lex->with_sum_func && + !(select_lex->next_select())) { Item *item; subs_type type= substype(); @@ -565,7 +580,7 @@ Item_in_subselect::single_value_transformer(JOIN *join, // remove LIMIT placed by ALL/ANY subquery select_lex->master_unit()->global_parameters->select_limit= HA_POS_ERROR; - subs= new Item_maxmin_subselect(select_lex, + subs= new Item_maxmin_subselect(this, select_lex, (func == &Item_bool_func2::le_creator || func == &Item_bool_func2::lt_creator)); } diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 3a543ff288c..7e735165c02 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -33,7 +33,6 @@ typedef Item_bool_func2* (*compare_func_creator)(Item*, Item*); class Item_subselect :public Item_result_field { - my_bool engine_owner; /* Is this item owner of engine */ my_bool value_assigned; /* value already assigned to subselect */ protected: /* thread handler, will be assigned in fix_fields only */ @@ -90,6 +89,8 @@ public: virtual void fix_length_and_dec(); table_map used_tables() const; bool const_item() const; + inline table_map get_used_tables_cache() { return used_tables_cache; } + inline bool get_const_item_cache() { return const_item_cache; } void update_used_tables(); void print(String *str) { @@ -144,10 +145,11 @@ public: }; /* used in static ALL/ANY optimisation */ -class Item_maxmin_subselect: public Item_singlerow_subselect +class Item_maxmin_subselect :public Item_singlerow_subselect { public: - Item_maxmin_subselect(st_select_lex *select_lex, bool max); + Item_maxmin_subselect(Item_subselect *parent, + st_select_lex *select_lex, bool max); }; /* exists subselect */ diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 9da1b21db72..ed2a03beccf 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -1822,7 +1822,7 @@ bool Item_func_group_concat::setup(THD *thd) if (select_lex->linkage == GLOBAL_OPTIONS_TYPE) DBUG_RETURN(1); /* - all not constant fields are push to list and create temp table + push all not constant fields to list and create temp table */ always_null= 0; for (uint i= 0; i < arg_count; i++) diff --git a/sql/set_var.cc b/sql/set_var.cc index 265d4f968e1..327bcb1a223 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -909,7 +909,12 @@ static void fix_net_retry_count(THD *thd __attribute__(unused), static void fix_query_cache_size(THD *thd, enum_var_type type) { #ifdef HAVE_QUERY_CACHE + ulong requested= query_cache_size; query_cache.resize(query_cache_size); + if (requested != query_cache_size) + push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_QC_RESIZE, ER(ER_WARN_QC_RESIZE), + requested, query_cache_size); #endif } diff --git a/sql/share/czech/errmsg.txt b/sql/share/czech/errmsg.txt index 78e47d72cd6..2176fcbd441 100644 --- a/sql/share/czech/errmsg.txt +++ b/sql/share/czech/errmsg.txt @@ -292,4 +292,5 @@ character-set=latin2 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/danish/errmsg.txt b/sql/share/danish/errmsg.txt index bd4d5cbee66..791060ac744 100644 --- a/sql/share/danish/errmsg.txt +++ b/sql/share/danish/errmsg.txt @@ -286,4 +286,5 @@ character-set=latin1 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/dutch/errmsg.txt b/sql/share/dutch/errmsg.txt index 6bba37d8341..62e210f1016 100644 --- a/sql/share/dutch/errmsg.txt +++ b/sql/share/dutch/errmsg.txt @@ -294,4 +294,5 @@ character-set=latin1 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/english/errmsg.txt b/sql/share/english/errmsg.txt index 5ccfb39478a..a0d746ce0ca 100644 --- a/sql/share/english/errmsg.txt +++ b/sql/share/english/errmsg.txt @@ -283,4 +283,5 @@ character-set=latin1 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/estonian/errmsg.txt b/sql/share/estonian/errmsg.txt index 59cc4baf598..0510e3fc76b 100644 --- a/sql/share/estonian/errmsg.txt +++ b/sql/share/estonian/errmsg.txt @@ -288,4 +288,5 @@ character-set=latin7 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/french/errmsg.txt b/sql/share/french/errmsg.txt index 1405e9025aa..485cbe45724 100644 --- a/sql/share/french/errmsg.txt +++ b/sql/share/french/errmsg.txt @@ -283,4 +283,5 @@ character-set=latin1 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/german/errmsg.txt b/sql/share/german/errmsg.txt index 16ed9982964..c9760879f3c 100644 --- a/sql/share/german/errmsg.txt +++ b/sql/share/german/errmsg.txt @@ -295,4 +295,5 @@ character-set=latin1 "Es wird empfohlen, mit --skip-slave-start zu starten, wenn mit START SLAVE UNTIL eine Schritt-fЭr-Schritt-Replikation ausgefЭhrt wird. Ansonsten gibt es Probleme, wenn der Slave-Server unerwartet neu startet", "SQL-Thread soll nicht gestartet werden. Daher werden UNTIL-Optionen ignoriert" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/greek/errmsg.txt b/sql/share/greek/errmsg.txt index f42cba3cd67..90ab24610ff 100644 --- a/sql/share/greek/errmsg.txt +++ b/sql/share/greek/errmsg.txt @@ -283,4 +283,5 @@ character-set=greek "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/hungarian/errmsg.txt b/sql/share/hungarian/errmsg.txt index ef01f1b5cbf..c456e9580b3 100644 --- a/sql/share/hungarian/errmsg.txt +++ b/sql/share/hungarian/errmsg.txt @@ -285,4 +285,5 @@ character-set=latin2 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/italian/errmsg.txt b/sql/share/italian/errmsg.txt index 8a5f44fc7c4..09b533c0fb7 100644 --- a/sql/share/italian/errmsg.txt +++ b/sql/share/italian/errmsg.txt @@ -283,4 +283,5 @@ character-set=latin1 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/japanese/errmsg.txt b/sql/share/japanese/errmsg.txt index c10302b6271..15b8640cb29 100644 --- a/sql/share/japanese/errmsg.txt +++ b/sql/share/japanese/errmsg.txt @@ -285,4 +285,5 @@ character-set=ujis "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/korean/errmsg.txt b/sql/share/korean/errmsg.txt index 2780644c7d7..d31efc94d46 100644 --- a/sql/share/korean/errmsg.txt +++ b/sql/share/korean/errmsg.txt @@ -283,4 +283,5 @@ character-set=euckr "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/norwegian-ny/errmsg.txt b/sql/share/norwegian-ny/errmsg.txt index 79fc1d9bcd0..515a322f136 100644 --- a/sql/share/norwegian-ny/errmsg.txt +++ b/sql/share/norwegian-ny/errmsg.txt @@ -285,4 +285,5 @@ character-set=latin1 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/norwegian/errmsg.txt b/sql/share/norwegian/errmsg.txt index f62e1053842..faea5402fc6 100644 --- a/sql/share/norwegian/errmsg.txt +++ b/sql/share/norwegian/errmsg.txt @@ -285,4 +285,5 @@ character-set=latin1 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/polish/errmsg.txt b/sql/share/polish/errmsg.txt index 0df79e2bc82..2a7ea3accb8 100644 --- a/sql/share/polish/errmsg.txt +++ b/sql/share/polish/errmsg.txt @@ -287,4 +287,5 @@ character-set=latin2 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/portuguese/errmsg.txt b/sql/share/portuguese/errmsg.txt index 086136b88a7..1f3bbb5c02f 100644 --- a/sql/share/portuguese/errmsg.txt +++ b/sql/share/portuguese/errmsg.txt @@ -284,4 +284,5 @@ character-set=latin1 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/romanian/errmsg.txt b/sql/share/romanian/errmsg.txt index ba9b525d62b..78daafe04d1 100644 --- a/sql/share/romanian/errmsg.txt +++ b/sql/share/romanian/errmsg.txt @@ -287,4 +287,5 @@ character-set=latin2 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/russian/errmsg.txt b/sql/share/russian/errmsg.txt index 1db3b26b6ee..462afdfa782 100644 --- a/sql/share/russian/errmsg.txt +++ b/sql/share/russian/errmsg.txt @@ -285,4 +285,5 @@ character-set=koi8r "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Кеш запросов не может установить размер %lu, новый размер кеша зпросов - %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/serbian/errmsg.txt b/sql/share/serbian/errmsg.txt index 11d83c4da9e..9d12654f150 100644 --- a/sql/share/serbian/errmsg.txt +++ b/sql/share/serbian/errmsg.txt @@ -278,4 +278,5 @@ character-set=cp1250 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/slovak/errmsg.txt b/sql/share/slovak/errmsg.txt index 125eea2bf38..dd222c2ef30 100644 --- a/sql/share/slovak/errmsg.txt +++ b/sql/share/slovak/errmsg.txt @@ -291,4 +291,5 @@ character-set=latin2 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/spanish/errmsg.txt b/sql/share/spanish/errmsg.txt index 71b57aac07d..a21d306a3db 100644 --- a/sql/share/spanish/errmsg.txt +++ b/sql/share/spanish/errmsg.txt @@ -285,4 +285,5 @@ character-set=latin1 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt index 63c572c6853..4d3e69a5b0f 100644 --- a/sql/share/swedish/errmsg.txt +++ b/sql/share/swedish/errmsg.txt @@ -283,4 +283,5 @@ character-set=latin1 "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Query cache failed to set size %lu, new query cache size is %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/share/ukrainian/errmsg.txt b/sql/share/ukrainian/errmsg.txt index 18fca33c3e2..283700b7891 100644 --- a/sql/share/ukrainian/errmsg.txt +++ b/sql/share/ukrainian/errmsg.txt @@ -288,4 +288,5 @@ character-set=koi8u "It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart" "SQL thread is not to be started so UNTIL options are ignored" "Incorrect index name '%-.100s'", +"Кеш запит╕в неспроможен встановити розм╕р %lu, новий розм╕р кеша запит╕в - %lu", "Column '%-.64s' cannot be part of FULLTEXT index" diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 5b05bf096cb..352a79843a9 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1112,8 +1112,11 @@ void st_select_lex_unit::exclude_level() SELECT_LEX_UNIT *units= 0, **units_last= &units; for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select()) { + // unlink current level from global SELECTs list if (sl->link_prev && (*sl->link_prev= sl->link_next)) sl->link_next->link_prev= sl->link_prev; + + // bring up underlay levels SELECT_LEX_UNIT **last= 0; for (SELECT_LEX_UNIT *u= sl->first_inner_unit(); u; u= u->next_unit()) { @@ -1128,11 +1131,20 @@ void st_select_lex_unit::exclude_level() } if (units) { + // include brought up levels in place of current (*prev)= units; (*units_last)= (SELECT_LEX_UNIT*)next; + if (next) + next->prev= (SELECT_LEX_NODE**)units_last; + units->prev= prev; } else + { + // exclude currect unit from list of nodes (*prev)= next; + if (next) + next->prev= prev; + } } @@ -1147,15 +1159,20 @@ void st_select_lex_unit::exclude_tree() SELECT_LEX_UNIT *units= 0, **units_last= &units; for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select()) { + // unlink current level from global SELECTs list if (sl->link_prev && (*sl->link_prev= sl->link_next)) sl->link_next->link_prev= sl->link_prev; + // unlink underlay levels for (SELECT_LEX_UNIT *u= sl->first_inner_unit(); u; u= u->next_unit()) { u->exclude_level(); } } + // exclude currect unit from list of nodes (*prev)= next; + if (next) + next->prev= prev; } diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 522879c863a..da62fc0a262 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -72,7 +72,7 @@ Long data handling: #include "sql_select.h" // for JOIN #include // for isspace() -#define IS_PARAM_NULL(pos, param_no) pos[param_no/8] & (1 << param_no & 7) +#define IS_PARAM_NULL(pos, param_no) (pos[param_no/8] & (1 << (param_no & 7))) #define STMT_QUERY_LOG_LENGTH 8192 diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 3a903d2e896..de2bb4a786c 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -119,13 +119,18 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result, SELECT_LEX *select_cursor,*sl; DBUG_ENTER("st_select_lex_unit::prepare"); + /* + result object should be reassigned even if preparing already done for + max/min subquery (ALL/ANY optimization) + */ + result= sel_result; + if (prepared) DBUG_RETURN(0); prepared= 1; res= 0; found_rows_for_union= first_select_in_union()->options & OPTION_FOUND_ROWS; TMP_TABLE_PARAM tmp_table_param; - result= sel_result; t_and_f= tables_and_fields_initied; bzero((char *)&tmp_table_param,sizeof(TMP_TABLE_PARAM)); diff --git a/tests/client_test.c b/tests/client_test.c index 388d5743cfb..fd9eb380228 100644 --- a/tests/client_test.c +++ b/tests/client_test.c @@ -1289,6 +1289,8 @@ static void test_double_compare() /* tinyint */ bind[0].buffer_type=FIELD_TYPE_TINY; bind[0].buffer=(char *)&tiny_data; + bind[0].buffer_length= 0; + bind[0].length= 0; bind[0].is_null= 0; /* Can never be null */ /* string->float */ @@ -1302,6 +1304,8 @@ static void test_double_compare() /* double */ bind[2].buffer_type=FIELD_TYPE_DOUBLE; bind[2].buffer= (char *)&double_data; + bind[2].buffer_length= 0; + bind[2].length= 0; bind[2].is_null= 0; tiny_data = 1; @@ -1369,6 +1373,7 @@ static void test_null() bind[0].buffer_type=MYSQL_TYPE_LONG; bind[0].is_null= &is_null[0]; + bind[0].length= 0; is_null[0]= 1; bind[1]=bind[0]; @@ -1742,6 +1747,8 @@ static void test_select() bind[0].buffer=(char *)&nData; bind[0].buffer_type=FIELD_TYPE_LONG; + bind[0].buffer_length= 0; + bind[0].length= 0; bind[0].is_null= 0; rc = mysql_bind_param(stmt,bind); @@ -1848,7 +1855,6 @@ static void test_bug1180() MYSQL_BIND bind[1]; ulong length[1]; char szData[11]; - int nData=1; myheader("test_select_bug"); @@ -1917,6 +1923,110 @@ static void test_bug1180() mysql_stmt_close(stmt); } +/* + test BUG#1644 (Insertion of more than 3 NULL columns with + parameter binding fails) +*/ +static void test_bug1644() +{ + MYSQL_STMT *stmt; + MYSQL_RES *result; + MYSQL_ROW row; + MYSQL_BIND bind[4]; + int num; + my_bool isnull; + int rc, i; + + myheader("test_bug1644"); + + rc= mysql_query(mysql, "DROP TABLE IF EXISTS foo_dfr"); + myquery(rc); + + rc= mysql_query(mysql, + "CREATE TABLE foo_dfr(col1 int, col2 int, col3 int, col4 int);"); + myquery(rc); + + strmov(query, "INSERT INTO foo_dfr VALUES (?,?,?,? )"); + stmt = mysql_prepare(mysql, query, strlen(query)); + mystmt_init(stmt); + + verify_param_count(stmt, 4); + + num= 22; + isnull= 0; + for (i = 0 ; i < 4 ; i++) + { + bind[i].buffer_type= FIELD_TYPE_LONG; + bind[i].buffer= (char *)# + bind[i].buffer_length= 0; + bind[i].length= 0; + bind[i].is_null= &isnull; + } + + rc= mysql_bind_param(stmt, bind); + mystmt(stmt, rc); + + rc= mysql_execute(stmt); + mystmt(stmt, rc); + + isnull= 1; + for (i = 0 ; i < 4 ; i++) + bind[i].is_null= &isnull; + + rc= mysql_bind_param(stmt, bind); + mystmt(stmt, rc); + + rc= mysql_execute(stmt); + mystmt(stmt, rc); + + isnull= 0; + num= 88; + for (i = 0 ; i < 4 ; i++) + bind[i].is_null= &isnull; + + rc= mysql_bind_param(stmt, bind); + mystmt(stmt, rc); + + rc= mysql_execute(stmt); + mystmt(stmt, rc); + + mysql_stmt_close(stmt); + + rc= mysql_query(mysql, "SELECT * FROM foo_dfr"); + myquery(rc); + + result= mysql_store_result(mysql); + mytest(result); + + myassert(3 == my_process_result_set(result)); + + mysql_data_seek(result, 0); + + row= mysql_fetch_row(result); + mytest(row); + for (i = 0 ; i < 4 ; i++) + { + myassert(strcmp(row[i], "22") == 0); + } + row= mysql_fetch_row(result); + mytest(row); + for (i = 0 ; i < 4 ; i++) + { + myassert(row[i] == 0); + } + row= mysql_fetch_row(result); + mytest(row); + for (i = 0 ; i < 4 ; i++) + { + myassert(strcmp(row[i], "88") == 0); + } + row= mysql_fetch_row(result); + mytest_r(row); + + mysql_free_result(result); +} + + /******************************************************** * to test simple select show * *********************************************************/ @@ -2035,6 +2145,8 @@ static void test_simple_update() bind[1].buffer=(char *) &nData; bind[1].buffer_type=FIELD_TYPE_LONG; + bind[1].buffer_length= 0; + bind[1].length= 0; bind[1].is_null= 0; rc = mysql_bind_param(stmt,bind); @@ -2105,6 +2217,8 @@ static void test_long_data() bind[0].buffer=(char *)&int_data; bind[0].buffer_type=FIELD_TYPE_LONG; bind[0].is_null=0; + bind[0].buffer_length= 0; + bind[0].length= 0; bind[1].buffer_type=FIELD_TYPE_STRING; bind[1].is_null=0; @@ -2191,6 +2305,8 @@ static void test_long_data_str() bind[0].buffer = (char *)&length; bind[0].buffer_type = FIELD_TYPE_LONG; bind[0].is_null= &is_null[0]; + bind[0].buffer_length= 0; + bind[0].length= 0; is_null[0]=0; length= 0; @@ -2368,6 +2484,8 @@ static void test_long_data_bin() bind[0].buffer = (char *)&length; bind[0].buffer_type = FIELD_TYPE_LONG; + bind[0].buffer_length= 0; + bind[0].length= 0; bind[0].is_null= 0; length= 0; @@ -2470,6 +2588,8 @@ static void test_simple_delete() bind[0].buffer=(char *)&nData; bind[0].buffer_type=FIELD_TYPE_LONG; + bind[0].buffer_length= 0; + bind[0].length= 0; bind[0].is_null= 0; rc = mysql_bind_param(stmt,bind); @@ -2547,6 +2667,8 @@ static void test_update() bind[1].buffer=(char *)&nData; bind[1].buffer_type=FIELD_TYPE_LONG; + bind[1].buffer_length= 0; + bind[1].length= 0; bind[1].is_null= 0; rc = mysql_bind_param(stmt,bind); @@ -2573,6 +2695,8 @@ static void test_update() length[0]= my_sprintf(szData, (szData, "updated-data")); bind[1].buffer=(char *)&nData; bind[1].buffer_type=FIELD_TYPE_LONG; + bind[1].buffer_length= 0; + bind[1].length= 0; bind[1].is_null= 0; rc = mysql_bind_param(stmt,bind); @@ -2917,24 +3041,31 @@ static void test_bind_result_ext1() bind[1].buffer_type=MYSQL_TYPE_FLOAT; bind[1].buffer=(char *)&s_data; + bind[1].buffer_length= 0; bind[2].buffer_type=MYSQL_TYPE_SHORT; bind[2].buffer=(char *)&i_data; + bind[2].buffer_length= 0; bind[3].buffer_type=MYSQL_TYPE_TINY; bind[3].buffer=(char *)&b_data; + bind[3].buffer_length= 0; bind[4].buffer_type=MYSQL_TYPE_LONG; bind[4].buffer=(char *)&f_data; + bind[4].buffer_length= 0; bind[5].buffer_type=MYSQL_TYPE_STRING; bind[5].buffer=(char *)d_data; + bind[5].buffer_length= sizeof(d_data); bind[6].buffer_type=MYSQL_TYPE_LONG; bind[6].buffer=(char *)&bData; + bind[6].buffer_length= 0; bind[7].buffer_type=MYSQL_TYPE_DOUBLE; bind[7].buffer=(char *)&szData; + bind[7].buffer_length= 0; for (i= 0; i < array_elements(bind); i++) { @@ -3011,6 +3142,7 @@ static void bind_fetch(int row_count) { bind[i].buffer_type= MYSQL_TYPE_LONG; bind[i].buffer= (char *) &data[i]; + bind[i].length= 0; bind[i].is_null= 0; } rc = mysql_bind_param(stmt, bind); @@ -3564,7 +3696,11 @@ static void test_prepare_ext() bind[5].buffer= (char *)&bData; for (i= 0; i < array_elements(bind); i++) + { bind[i].is_null=0; + bind[i].buffer_length= 0; + bind[i].length= 0; + } rc = mysql_bind_param(stmt,bind); mystmt(stmt, rc); @@ -3955,6 +4091,8 @@ static void test_stmt_close() count= 100; bind[0].buffer=(char *)&count; bind[0].buffer_type=MYSQL_TYPE_LONG; + bind[0].buffer_length= 0; + bind[0].length= 0; bind[0].is_null=0; rc = mysql_bind_param(stmt_x, bind); @@ -4387,12 +4525,14 @@ static void test_multi_stmt() bind[0].buffer_type= MYSQL_TYPE_SHORT; bind[0].buffer= (char *)&id; bind[0].is_null= &is_null[0]; + bind[0].buffer_length= 0; bind[0].length= &length[0]; is_null[0]= 0; length[0]= 0; bind[1].buffer_type = MYSQL_TYPE_STRING; bind[1].buffer = (char *)name; + bind[1].buffer_length= sizeof(name); bind[1].length = &length[1]; bind[1].is_null= &is_null[1]; @@ -4650,8 +4790,11 @@ static void test_prepare_alter() verify_param_count(stmt,1); + is_null= 0; bind[0].buffer_type= MYSQL_TYPE_SHORT; bind[0].buffer= (char *)&id; + bind[0].buffer_length= 0; + bind[0].length= 0; bind[0].is_null= &is_null; rc = mysql_bind_param(stmt, bind); @@ -5512,6 +5655,8 @@ static void test_buffers() rc = mysql_execute(stmt); mystmt(stmt, rc); + bzero(buffer, 20); /* Avoid overruns in printf() */ + bind[0].length= &length; bind[0].is_null= &is_null; bind[0].buffer_length= 1; @@ -6358,8 +6503,8 @@ static void test_frm_bug() row= mysql_fetch_row(result); mytest(row); - fprintf(stdout,"\n Comment: %s", row[15]); - myassert(row[15] != 0); + fprintf(stdout,"\n Comment: %s", row[16]); + myassert(row[16] != 0); mysql_free_result(result); mysql_stmt_close(stmt); @@ -6503,22 +6648,22 @@ static void test_explain_bug() mysql_num_fields(result)); myassert(6 == mysql_num_fields(result)); - verify_prepare_field(result,0,"Field","",MYSQL_TYPE_STRING, + verify_prepare_field(result,0,"Field","",MYSQL_TYPE_VAR_STRING, "","","",NAME_LEN,0); - verify_prepare_field(result,1,"Type","",MYSQL_TYPE_STRING, + verify_prepare_field(result,1,"Type","",MYSQL_TYPE_VAR_STRING, "","","",40,0); - verify_prepare_field(result,2,"Null","",MYSQL_TYPE_STRING, + verify_prepare_field(result,2,"Null","",MYSQL_TYPE_VAR_STRING, "","","",1,0); - verify_prepare_field(result,3,"Key","",MYSQL_TYPE_STRING, + verify_prepare_field(result,3,"Key","",MYSQL_TYPE_VAR_STRING, "","","",3,0); - verify_prepare_field(result,4,"Default","",MYSQL_TYPE_STRING, + verify_prepare_field(result,4,"Default","",MYSQL_TYPE_VAR_STRING, "","","",NAME_LEN,0); - verify_prepare_field(result,5,"Extra","",MYSQL_TYPE_STRING, + verify_prepare_field(result,5,"Extra","",MYSQL_TYPE_VAR_STRING, "","","",20,0); mysql_free_result(result); @@ -6542,31 +6687,31 @@ static void test_explain_bug() verify_prepare_field(result,0,"id","",MYSQL_TYPE_LONGLONG, "","","",3,0); - verify_prepare_field(result,1,"select_type","",MYSQL_TYPE_STRING, + verify_prepare_field(result,1,"select_type","",MYSQL_TYPE_VAR_STRING, "","","",19,0); - verify_prepare_field(result,2,"table","",MYSQL_TYPE_STRING, + verify_prepare_field(result,2,"table","",MYSQL_TYPE_VAR_STRING, "","","",NAME_LEN,0); - verify_prepare_field(result,3,"type","",MYSQL_TYPE_STRING, + verify_prepare_field(result,3,"type","",MYSQL_TYPE_VAR_STRING, "","","",10,0); - verify_prepare_field(result,4,"possible_keys","",MYSQL_TYPE_STRING, + verify_prepare_field(result,4,"possible_keys","",MYSQL_TYPE_VAR_STRING, "","","",NAME_LEN*32,0); - verify_prepare_field(result,5,"key","",MYSQL_TYPE_STRING, + verify_prepare_field(result,5,"key","",MYSQL_TYPE_VAR_STRING, "","","",NAME_LEN,0); verify_prepare_field(result,6,"key_len","",MYSQL_TYPE_LONGLONG, "","","",3,0); - verify_prepare_field(result,7,"ref","",MYSQL_TYPE_STRING, + verify_prepare_field(result,7,"ref","",MYSQL_TYPE_VAR_STRING, "","","",NAME_LEN*16,0); verify_prepare_field(result,8,"rows","",MYSQL_TYPE_LONGLONG, "","","",10,0); - verify_prepare_field(result,9,"Extra","",MYSQL_TYPE_STRING, + verify_prepare_field(result,9,"Extra","",MYSQL_TYPE_VAR_STRING, "","","",255,0); mysql_free_result(result); @@ -7088,6 +7233,9 @@ static void test_fetch_offset() rc = mysql_fetch_column(stmt,bind,0,0); mystmt_r(stmt,rc); + rc = mysql_bind_result(stmt, bind); + mystmt(stmt,rc); + rc = mysql_stmt_store_result(stmt); mystmt(stmt,rc); @@ -7137,11 +7285,10 @@ static void test_fetch_offset() static void test_fetch_column() { MYSQL_STMT *stmt; - MYSQL_BIND bind[1]; - char c2[20]; - ulong l1, l2; - int rc, c1; - + MYSQL_BIND bind[2]; + char c2[20], bc2[20]; + ulong l1, l2, bl1, bl2; + int rc, c1, bc1; myheader("test_fetch_column"); @@ -7157,25 +7304,41 @@ static void test_fetch_column() stmt = mysql_prepare(mysql,"select * from test_column",50); mystmt_init(stmt); + bind[0].buffer_type= MYSQL_TYPE_LONG; + bind[0].buffer= (char *)&bc1; + bind[0].buffer_length= 0; + bind[0].is_null= 0; + bind[0].length= &bl1; + bind[1].buffer_type= MYSQL_TYPE_STRING; + bind[1].buffer= (char *)bc2; + bind[1].buffer_length= 7; + bind[1].is_null= 0; + bind[1].length= &bl2; + + rc = mysql_execute(stmt); + mystmt(stmt,rc); + + rc = mysql_bind_result(stmt, bind); + mystmt(stmt,rc); + + rc = mysql_stmt_store_result(stmt); + mystmt(stmt,rc); + + rc = mysql_fetch_column(stmt,bind,1,0); /* No-op at this point */ + mystmt_r(stmt,rc); + + rc = mysql_fetch(stmt); + mystmt(stmt,rc); + + fprintf(stdout, "\n row 0: %d,%s", bc1,bc2); + + c2[0]= '\0'; l2= 0; bind[0].buffer_type= MYSQL_TYPE_STRING; bind[0].buffer= (char *)c2; bind[0].buffer_length= 7; bind[0].is_null= 0; bind[0].length= &l2; - rc = mysql_execute(stmt); - mystmt(stmt,rc); - - rc = mysql_stmt_store_result(stmt); - mystmt(stmt,rc); - - rc = mysql_fetch_column(stmt,bind,1,0); - mystmt_r(stmt,rc); - - rc = mysql_fetch(stmt); - mystmt(stmt,rc); - - c2[0]= '\0'; l2= 0; rc = mysql_fetch_column(stmt,bind,1,0); mystmt(stmt,rc); fprintf(stdout, "\n col 1: %s(%ld)", c2, l2); @@ -7187,8 +7350,7 @@ static void test_fetch_column() fprintf(stdout, "\n col 1: %s(%ld)", c2, l2); myassert(strcmp(c2,"venu")==0 && l2 == 4); - c1= 0; - + c1= 0; bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&c1; bind[0].buffer_length= 0; @@ -7206,15 +7368,15 @@ static void test_fetch_column() rc = mysql_fetch(stmt); mystmt(stmt,rc); + fprintf(stdout, "\n row 1: %d,%s", bc1,bc2); + + c2[0]= '\0'; l2= 0; bind[0].buffer_type= MYSQL_TYPE_STRING; bind[0].buffer= (char *)c2; bind[0].buffer_length= 7; bind[0].is_null= 0; bind[0].length= &l2; - fprintf(stdout, "\n row 1: %d,%s", c1,c2); - - c2[0]= '\0'; l2= 0; rc = mysql_fetch_column(stmt,bind,1,0); mystmt(stmt,rc); fprintf(stdout, "\n col 1: %s(%ld)", c2, l2); @@ -7227,7 +7389,6 @@ static void test_fetch_column() myassert(strcmp(c2,"mysql")==0 && l2 == 5); c1= 0; - bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&c1; bind[0].buffer_length= 0; @@ -7359,8 +7520,8 @@ static void test_free_result() MYSQL_STMT *stmt; MYSQL_BIND bind[1]; char c2[5]; - ulong length; - int rc, c1; + ulong bl1, l2; + int rc, c1, bc1; myheader("test_free_result"); @@ -7376,39 +7537,47 @@ static void test_free_result() stmt = mysql_prepare(mysql,"select * from test_free_result",50); mystmt_init(stmt); - bind[0].buffer_type= MYSQL_TYPE_STRING; - bind[0].buffer= (char *)c2; - bind[0].buffer_length= 7; + bind[0].buffer_type= MYSQL_TYPE_LONG; + bind[0].buffer= (char *)&bc1; + bind[0].buffer_length= 0; bind[0].is_null= 0; - bind[0].length= &length; + bind[0].length= &bl1; rc = mysql_execute(stmt); mystmt(stmt,rc); + rc = mysql_bind_result(stmt, bind); + mystmt(stmt,rc); + rc = mysql_fetch(stmt); mystmt(stmt,rc); - c2[0]= '\0'; length= 0; + c2[0]= '\0'; l2= 0; + bind[0].buffer_type= MYSQL_TYPE_STRING; + bind[0].buffer= (char *)c2; + bind[0].buffer_length= 7; + bind[0].is_null= 0; + bind[0].length= &l2; + rc = mysql_fetch_column(stmt,bind,0,0); mystmt(stmt,rc); - fprintf(stdout, "\n col 1: %s(%ld)", c2, length); - myassert(strncmp(c2,"1",1)==0 && length == 1); + fprintf(stdout, "\n col 0: %s(%ld)", c2, l2); + myassert(strncmp(c2,"1",1)==0 && l2 == 1); rc = mysql_fetch(stmt); mystmt(stmt,rc); - c1= 0, length= 0; - + c1= 0, l2= 0; bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&c1; bind[0].buffer_length= 0; bind[0].is_null= 0; - bind[0].length= &length; + bind[0].length= &l2; rc = mysql_fetch_column(stmt,bind,0,0); mystmt(stmt,rc); - fprintf(stdout, "\n col 0: %d(%ld)", c1, length); - myassert(c1 == 2 && length == 4); + fprintf(stdout, "\n col 0: %d(%ld)", c1, l2); + myassert(c1 == 2 && l2 == 4); rc = mysql_query(mysql,"drop table test_free_result"); myquery_r(rc); /* error should be, COMMANDS OUT OF SYNC */ @@ -7430,8 +7599,8 @@ static void test_free_store_result() MYSQL_STMT *stmt; MYSQL_BIND bind[1]; char c2[5]; - ulong length; - int rc, c1; + ulong bl1, l2; + int rc, c1, bc1; myheader("test_free_store_result"); @@ -7447,42 +7616,50 @@ static void test_free_store_result() stmt = mysql_prepare(mysql,"select * from test_free_result",50); mystmt_init(stmt); - bind[0].buffer_type= MYSQL_TYPE_STRING; - bind[0].buffer= (char *)c2; - bind[0].buffer_length= 7; + bind[0].buffer_type= MYSQL_TYPE_LONG; + bind[0].buffer= (char *)&bc1; + bind[0].buffer_length= 0; bind[0].is_null= 0; - bind[0].length= &length; + bind[0].length= &bl1; rc = mysql_execute(stmt); mystmt(stmt,rc); + rc = mysql_bind_result(stmt, bind); + mystmt(stmt,rc); + rc = mysql_stmt_store_result(stmt); mystmt(stmt,rc); rc = mysql_fetch(stmt); mystmt(stmt,rc); - c2[0]= '\0'; length= 0; + c2[0]= '\0'; l2= 0; + bind[0].buffer_type= MYSQL_TYPE_STRING; + bind[0].buffer= (char *)c2; + bind[0].buffer_length= 7; + bind[0].is_null= 0; + bind[0].length= &l2; + rc = mysql_fetch_column(stmt,bind,0,0); mystmt(stmt,rc); - fprintf(stdout, "\n col 1: %s(%ld)", c2, length); - myassert(strncmp(c2,"1",1)==0 && length == 1); + fprintf(stdout, "\n col 1: %s(%ld)", c2, l2); + myassert(strncmp(c2,"1",1)==0 && l2 == 1); rc = mysql_fetch(stmt); mystmt(stmt,rc); - c1= 0, length= 0; - + c1= 0, l2= 0; bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&c1; bind[0].buffer_length= 0; bind[0].is_null= 0; - bind[0].length= &length; + bind[0].length= &l2; rc = mysql_fetch_column(stmt,bind,0,0); mystmt(stmt,rc); - fprintf(stdout, "\n col 0: %d(%ld)", c1, length); - myassert(c1 == 2 && length == 4); + fprintf(stdout, "\n col 0: %d(%ld)", c1, l2); + myassert(c1 == 2 && l2 == 4); rc = mysql_stmt_free_result(stmt); mystmt(stmt,rc); @@ -7866,7 +8043,6 @@ int main(int argc, char **argv) test_count= 1; start_time= time((time_t *)0); - client_query(); /* simple client query test */ #if NOT_YET_WORKING /* Used for internal new development debugging */ @@ -7915,7 +8091,6 @@ int main(int argc, char **argv) test_simple_update(); /* simple prepare with update */ test_simple_delete(); /* prepare with delete */ test_double_compare(); /* float comparision */ - client_query(); /* simple client query test */ client_store_result(); /* usage of mysql_store_result() */ client_use_result(); /* usage of mysql_use_result() */ test_tran_bdb(); /* transaction test on BDB table type */ @@ -7959,9 +8134,6 @@ int main(int argc, char **argv) test_nstmts(); /* test n statements */ test_logs(); ; /* to test logs */ test_cuted_rows(); /* to test for WARNINGS from cuted rows */ - test_fetch_seek(); /* to test stmt seek() functions */ - test_fetch_nobuffs(); /* to fecth without prior bound buffers */ - test_open_direct(); /* direct execution in the middle of open stmts */ test_fetch_offset(); /* to test mysql_fetch_column with offset */ test_fetch_column(); /* to test mysql_fetch_column */ test_mem_overun(); /* test DBD ovverun bug */ @@ -7969,14 +8141,11 @@ int main(int argc, char **argv) test_free_result(); /* test mysql_stmt_free_result() */ test_free_store_result(); /* test to make sure stmt results are cleared during stmt_free_result() */ - test_mem_overun(); /* memory ovverun bug */ - test_list_fields(); /* list_fields test */ - test_fetch_offset(); /* to test mysql_fetch_column with offset */ - test_fetch_column(); /* to test mysql_fetch_column */ test_sqlmode(); /* test for SQL_MODE */ test_ts(); /* test for timestamp BR#819 */ test_bug1115(); /* BUG#1115 */ test_bug1180(); /* BUG#1180 */ + test_bug1644(); /* BUG#1644 */ end_time= time((time_t *)0); total_time+= difftime(end_time, start_time); @@ -7990,4 +8159,3 @@ int main(int argc, char **argv) return(0); } -