From 59436a6db186d3e4a18d8d2d6ded9e2068b420e3 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 14 Nov 2002 22:08:25 +0200 Subject: [PATCH 01/14] Actually, I do it in order to pull new stuff sql/sql_delete.cc: fix for safe_updates Actually, I do it in order to pull new stuff sql/sql_select.cc: fix for LIMIT 0 Actually, I do it in order to pull new stuff --- sql/sql_delete.cc | 12 +++++------- sql/sql_select.cc | 9 ++++++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 64945fa2d4d..c3e52f42dcd 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -35,13 +35,13 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, SQL_SELECT *select=0; READ_RECORD info; bool using_limit=limit != HA_POS_ERROR; - bool using_transactions; + bool using_transactions, safe_update; ha_rows deleted; DBUG_ENTER("mysql_delete"); if (!table_list->db) table_list->db=thd->db; - if ((thd->options & OPTION_SAFE_UPDATES) && !conds) + if (((safe_update=thd->options & OPTION_SAFE_UPDATES)) && !conds) { send_error(thd,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); DBUG_RETURN(1); @@ -58,7 +58,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, /* Test if the user wants to delete all rows */ if (!using_limit && (!conds || conds->const_item()) && - !(specialflag & (SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE))) + !(specialflag & (SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE)) && !safe_update) { deleted= table->file->records; if (!(error=table->file->delete_all_rows())) @@ -79,9 +79,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, select=make_select(table,0,0,conds,&error); if (error) DBUG_RETURN(-1); - if ((select && select->check_quick(test(thd->options & OPTION_SAFE_UPDATES), - limit)) || - !limit) + if ((select && select->check_quick(safe_update, limit)) || !limit) { delete select; send_ok(thd,0L); @@ -92,7 +90,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, if (!table->quick_keys) { thd->lex.select_lex.options|=QUERY_NO_INDEX_USED; - if ((thd->options & OPTION_SAFE_UPDATES) && limit == HA_POS_ERROR) + if (safe_update && use_limit) { delete select; send_error(thd,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 5f4bfc5462a..b4bec7dd06f 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -378,7 +378,7 @@ JOIN::optimize() error = 0; DBUG_RETURN(1); } - if (cond_value == Item::COND_FALSE || !unit->select_limit_cnt) + if (cond_value == Item::COND_FALSE || (!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS))) { /* Impossible cond */ zero_result_cause= "Impossible WHERE"; DBUG_RETURN(0); @@ -669,10 +669,13 @@ JOIN::exec() result->send_fields(fields_list,1); if (!having || having->val_int()) { - if (do_send_rows && result->send_data(fields_list)) + if (do_send_rows && unit->select_limit_cnt && result->send_data(fields_list)) error= 1; else + { error= (int) result->send_eof(); + send_records=1; + } } else error=(int) result->send_eof(); @@ -5151,7 +5154,7 @@ end_send(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), error=0; if (join->procedure) error=join->procedure->send_row(*join->fields); - else if (join->do_send_rows) + else if (join->do_send_rows && join->unit->select_limit_cnt) error=join->result->send_data(*join->fields); if (error) DBUG_RETURN(-1); /* purecov: inspected */ From 183a207fd7bc734a1747fa9cfe0eae194d2d1b50 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 15 Nov 2002 16:37:44 +0200 Subject: [PATCH 02/14] few small bug fixes ... sql/sql_delete.cc: A better fix for safe updates sql/sql_table.cc: A fix for foreign key handling ... --- sql/sql_delete.cc | 2 +- sql/sql_table.cc | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index c3e52f42dcd..2d869fdda49 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -90,7 +90,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, if (!table->quick_keys) { thd->lex.select_lex.options|=QUERY_NO_INDEX_USED; - if (safe_update && use_limit) + if (safe_update && !using_limit) { delete select; send_error(thd,ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 5187351258e..abb4cf8d3f9 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -523,19 +523,19 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, key_iterator.rewind(); key_number=0; - for (; (key=key_iterator++) ; key_info++, key_number++) + for (; (key=key_iterator++) ; key_number++) { uint key_length=0; key_part_spec *column; switch(key->type){ - case Key::MULTIPLE: + case Key::MULTIPLE: key_info->flags = 0; break; - case Key::FULLTEXT: + case Key::FULLTEXT: key_info->flags = HA_FULLTEXT; break; - case Key::SPATIAL: + case Key::SPATIAL: key_info->flags = HA_SPATIAL; break; case Key::FOREIGN_KEY: @@ -734,6 +734,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, my_error(ER_TOO_LONG_KEY,MYF(0),max_key_length); DBUG_RETURN(-1); } + key_info++; } if (!unique_key && !primary_key && (file->table_flags() & HA_REQUIRE_PRIMARY_KEY)) From 27b7b8abbd399982ffb8a16cf3dd2ac882acca57 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 15 Nov 2002 19:58:07 +0200 Subject: [PATCH 03/14] A fix for the bug when MyISAM tmp table has to be created in order to resolve derived table. Will make a test case for this quite soon. --- sql/sql_derived.cc | 3 ++- sql/sql_union.cc | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 7cbc1ea6db3..44183a95473 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -88,6 +88,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) if ((derived_result=new select_union(table))) { + derived_result->tmp_table_param=&tmp_table_param; unit->offset_limit_cnt= sl->offset_limit; unit->select_limit_cnt= sl->select_limit+sl->offset_limit; if (unit->select_limit_cnt < sl->select_limit) @@ -118,7 +119,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) table->tmp_table=TMP_TABLE; if (!lex->describe) sl->exclude(); - t->db=""; + t->db=(char *)""; t->derived=(SELECT_LEX *)0; // just in case ... } } diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 53f89747ce7..f48b879838f 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -80,6 +80,7 @@ bool select_union::send_data(List &values) { if (create_myisam_from_heap(table, tmp_table_param, info.last_errno, 0)) return 1; + thd->net.report_error=0; // donno why does it work, but it does ... } return 0; } From a40a9d59161e2de19551b0bd1ad016681741e918 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 16 Nov 2002 16:41:29 +0200 Subject: [PATCH 04/14] Some new tests................... mysql-test/r/derived.result: A test for derived table which requires creation on temporary MyISAM table ... mysql-test/r/select_found.result: A test for LIMIT ) mysql-test/t/derived.test: A test for derived table which requires creation on temporary MyISAM table ... mysql-test/t/select_found.test: A test for LIMIT 0 --- mysql-test/r/derived.result | 25 +++++++++++++++++++++++++ mysql-test/r/select_found.result | 10 ++++++++++ mysql-test/t/derived.test | 12 ++++++++++++ mysql-test/t/select_found.test | 4 ++++ 4 files changed, 51 insertions(+) diff --git a/mysql-test/r/derived.result b/mysql-test/r/derived.result index 0290d0755d5..204ca86f306 100644 --- a/mysql-test/r/derived.result +++ b/mysql-test/r/derived.result @@ -40,3 +40,28 @@ a select 1 from (select 1); 1 1 +drop table if exists t1; +create table t1(a int not null, t char(8), index(a)); +SELECT * FROM (SELECT * FROM t1) ORDER BY a ASC LIMIT 0,20; +a t +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +drop table if exists t1; diff --git a/mysql-test/r/select_found.result b/mysql-test/r/select_found.result index 1c2cd7da894..6fb9ea0ee0b 100644 --- a/mysql-test/r/select_found.result +++ b/mysql-test/r/select_found.result @@ -168,4 +168,14 @@ test2 2 2 SELECT FOUND_ROWS(); FOUND_ROWS() 2 +SELECT SQL_CALC_FOUND_ROWS 1 FROM (SELECT 1) LIMIT 0; +1 +SELECT FOUND_ROWS(); +FOUND_ROWS() +1 +SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 0; +titre numeropost maxnumrep +SELECT FOUND_ROWS(); +FOUND_ROWS() +3 drop table t1; diff --git a/mysql-test/t/derived.test b/mysql-test/t/derived.test index 501d4db26fa..de765a0e280 100644 --- a/mysql-test/t/derived.test +++ b/mysql-test/t/derived.test @@ -22,3 +22,15 @@ drop table if exists t1.t2,t3; select * from (select 1); select a from (select 1 as a); select 1 from (select 1); +drop table if exists t1; +create table t1(a int not null, t char(8), index(a)); +disable_query_log; +let $1 = 10000; +while ($1) + { + eval insert into t1 values ($1,'$1'); + dec $1; + } +enable_query_log; +SELECT * FROM (SELECT * FROM t1) ORDER BY a ASC LIMIT 0,20; +drop table if exists t1; \ No newline at end of file diff --git a/mysql-test/t/select_found.test b/mysql-test/t/select_found.test index 0a483c860cb..c67c99924c3 100644 --- a/mysql-test/t/select_found.test +++ b/mysql-test/t/select_found.test @@ -84,4 +84,8 @@ INSERT INTO t1 (titre,maxnumrep) VALUES ('test1','1'),('test2','2'),('test3','3'); SELECT SQL_CALC_FOUND_ROWS titre,numeropost,maxnumrep FROM t1 WHERE numeropost IN (1,2) ORDER BY maxnumrep DESC LIMIT 0, 1; SELECT FOUND_ROWS(); +SELECT SQL_CALC_FOUND_ROWS 1 FROM (SELECT 1) LIMIT 0; +SELECT FOUND_ROWS(); +SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 0; +SELECT FOUND_ROWS(); drop table t1; From 849b9ed9131257426a92671c2ede72b9c962eb74 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 17 Nov 2002 00:31:57 +0100 Subject: [PATCH 05/14] typelib.h is required by mysql.h and should be installed BitKeeper/deleted/.del-.my_sys.h.swp~f6a4a7f8dae03f18: Delete: include/.my_sys.h.swp --- include/.my_sys.h.swp | Bin 16384 -> 0 bytes include/Makefile.am | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 include/.my_sys.h.swp diff --git a/include/.my_sys.h.swp b/include/.my_sys.h.swp deleted file mode 100644 index e9d01f0e65d1d4e4ce698ca12b4c8342d2ad1697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 diff --git a/include/Makefile.am b/include/Makefile.am index 2df8b46d369..c88e1ee1e40 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -20,7 +20,7 @@ pkginclude_HEADERS = dbug.h m_string.h my_sys.h my_list.h \ mysql.h mysql_com.h mysqld_error.h mysql_embed.h \ my_semaphore.h my_pthread.h my_no_pthread.h raid.h \ errmsg.h my_global.h my_net.h my_alloc.h \ - my_getopt.h sslopt-longopts.h \ + my_getopt.h sslopt-longopts.h typelib.h \ sslopt-vars.h sslopt-case.h $(BUILT_SOURCES) noinst_HEADERS = config-win.h config-os2.h \ nisam.h heap.h merge.h my_bitmap.h\ From 0fb3b8d9abc3eb2e3072c2f8681099e7db0a256e Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 17 Nov 2002 22:23:57 +0200 Subject: [PATCH 06/14] fixed subselect explain bug mysql-test/r/subselect.result: test of subselect explain bug mysql-test/t/subselect.test: test of subselect explain bug sql/sql_select.cc: remuved difference between optimization for execution and optimization for description --- mysql-test/r/subselect.result | 18 ++++++++++++++++++ mysql-test/t/subselect.test | 15 +++++++++++++++ sql/sql_select.cc | 11 +++-------- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index d1a3056d8e9..f4341e5dd71 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -269,3 +269,21 @@ INSERT INTO iftest VALUES (); SELECT field FROM iftest WHERE 1=(SELECT 1 UNION ALL SELECT 1 FROM (SELECT 1) HAVING field='b'); Subselect returns more than 1 record drop table iftest; +drop table if exists threadhardwarefr7; +CREATE TABLE `threadhardwarefr7` ( +`numeropost` mediumint(8) unsigned NOT NULL default '0', +`numreponse` int(10) unsigned NOT NULL auto_increment, +`pseudo` varchar(35) NOT NULL default '', +PRIMARY KEY (`numeropost`,`numreponse`), +UNIQUE KEY `numreponse` (`numreponse`), +KEY `pseudo` (`pseudo`,`numeropost`) +) TYPE=MyISAM; +INSERT INTO threadhardwarefr7 (numeropost,numreponse,pseudo) VALUES (1,1,'joce'),(1,2,'joce'),(1,3,'test'); +EXPLAIN SELECT MAX(numreponse) FROM threadhardwarefr7 WHERE numeropost='1'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE Select tables optimized away +EXPLAIN SELECT numreponse FROM threadhardwarefr7 WHERE numeropost='1' AND numreponse=(SELECT MAX(numreponse) FROM threadhardwarefr7 WHERE numeropost='1'); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY threadhardwarefr7 const PRIMARY,numreponse PRIMARY 7 const,const 1 +2 SUBSELECT Select tables optimized away +drop table if exists threadhardwarefrtest7; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 63f689d2608..a81b3f62945 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -166,3 +166,18 @@ INSERT INTO iftest VALUES (); -- error 1240 SELECT field FROM iftest WHERE 1=(SELECT 1 UNION ALL SELECT 1 FROM (SELECT 1) HAVING field='b'); drop table iftest; + +drop table if exists threadhardwarefr7; +CREATE TABLE `threadhardwarefr7` ( + `numeropost` mediumint(8) unsigned NOT NULL default '0', + `numreponse` int(10) unsigned NOT NULL auto_increment, + `pseudo` varchar(35) NOT NULL default '', + PRIMARY KEY (`numeropost`,`numreponse`), + UNIQUE KEY `numreponse` (`numreponse`), + KEY `pseudo` (`pseudo`,`numeropost`) +) TYPE=MyISAM; +INSERT INTO threadhardwarefr7 (numeropost,numreponse,pseudo) VALUES (1,1,'joce'),(1,2,'joce'),(1,3,'test'); + +EXPLAIN SELECT MAX(numreponse) FROM threadhardwarefr7 WHERE numeropost='1'; +EXPLAIN SELECT numreponse FROM threadhardwarefr7 WHERE numeropost='1' AND numreponse=(SELECT MAX(numreponse) FROM threadhardwarefr7 WHERE numeropost='1'); +drop table if exists threadhardwarefrtest7; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index b3838628d35..7861d6c5541 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -395,13 +395,7 @@ JOIN::optimize() zero_result_cause= "No matching min/max row"; DBUG_RETURN(0); } - if (select_options & SELECT_DESCRIBE) - { - select_describe(this, false, false, false, - "Select tables optimized away"); - delete procedure; - DBUG_RETURN(1); - } + zero_result_cause= "Select tables optimized away"; tables_list= 0; // All tables resolved } } @@ -663,7 +657,8 @@ JOIN::exec() { // Only test of functions error=0; if (select_options & SELECT_DESCRIBE) - select_describe(this, false, false, false, "No tables used"); + select_describe(this, false, false, false, + (zero_result_cause?zero_result_cause:"No tables used")); else { result->send_fields(fields_list,1); From 8e2346e88409006fddec39d2db08563275e0682f Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Nov 2002 18:28:51 +0200 Subject: [PATCH 07/14] lot's of fixes with test cases mysql-test/r/create.result: A test case for foreign key bug that is resolved mysql-test/r/select_found.result: test case for new select ... limit 0 behaviour mysql-test/t/create.test: test case for foreign key bug that is fixed mysql-test/t/select_found.test: test case for new behaviour of SELECT ... LIMIT 0 sql/sql_select.cc: SELECT ... LIMIT 0 sql/sql_union.cc: replacing my dirty hack with Sanja's "proper" fix --- mysql-test/r/create.result | 3 +++ mysql-test/r/select_found.result | 4 ++-- mysql-test/t/create.test | 3 +++ mysql-test/t/select_found.test | 2 +- sql/sql_select.cc | 7 ++++--- sql/sql_union.cc | 1 - 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index cc1780a12d0..49a42872fa3 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -158,3 +158,6 @@ select * from t1; if('2002'='2002','Y','N') Y drop table if exists t1; +create table t1 (a int, key(a)); +create table t2 (b int, foreign key(b) references t1(a), key(b)); +drop table if exists t1,t2; diff --git a/mysql-test/r/select_found.result b/mysql-test/r/select_found.result index 6fb9ea0ee0b..bbf0a8ba09f 100644 --- a/mysql-test/r/select_found.result +++ b/mysql-test/r/select_found.result @@ -173,9 +173,9 @@ SELECT SQL_CALC_FOUND_ROWS 1 FROM (SELECT 1) LIMIT 0; SELECT FOUND_ROWS(); FOUND_ROWS() 1 -SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 0; +SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE numeropost > 1 LIMIT 0; titre numeropost maxnumrep SELECT FOUND_ROWS(); FOUND_ROWS() -3 +2 drop table t1; diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test index 65be9683061..3bad053875c 100644 --- a/mysql-test/t/create.test +++ b/mysql-test/t/create.test @@ -110,3 +110,6 @@ drop table t1; create table t1 select if('2002'='2002','Y','N'); select * from t1; drop table if exists t1; +create table t1 (a int, key(a)); +create table t2 (b int, foreign key(b) references t1(a), key(b)); +drop table if exists t1,t2; diff --git a/mysql-test/t/select_found.test b/mysql-test/t/select_found.test index c67c99924c3..c8458dd3aea 100644 --- a/mysql-test/t/select_found.test +++ b/mysql-test/t/select_found.test @@ -86,6 +86,6 @@ SELECT SQL_CALC_FOUND_ROWS titre,numeropost,maxnumrep FROM t1 WHERE numeropost I SELECT FOUND_ROWS(); SELECT SQL_CALC_FOUND_ROWS 1 FROM (SELECT 1) LIMIT 0; SELECT FOUND_ROWS(); -SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 0; +SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE numeropost > 1 LIMIT 0; SELECT FOUND_ROWS(); drop table t1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 9f9e2c67c2d..db3acfba909 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -324,6 +324,7 @@ JOIN::prepare(TABLE_LIST *tables_init, this->group= group_list != 0; row_limit= ((select_distinct || order || group_list) ? HA_POS_ERROR : unit->select_limit_cnt); + do_send_rows = (row_limit) ? 1 : 0; this->unit= unit; #ifdef RESTRICTED_GROUP @@ -664,7 +665,7 @@ JOIN::exec() result->send_fields(fields_list,1); if (!having || having->val_int()) { - if (do_send_rows && unit->select_limit_cnt && result->send_data(fields_list)) + if (do_send_rows && result->send_data(fields_list)) error= 1; else { @@ -2611,8 +2612,8 @@ make_simple_join(JOIN *join,TABLE *tmp_table) join->sum_funcs=0; join->send_records=(ha_rows) 0; join->group=0; - join->do_send_rows = 1; join->row_limit=join->unit->select_limit_cnt; + join->do_send_rows = (join->row_limit) ? 1 : 0; join_tab->cache.buff=0; /* No cacheing */ join_tab->table=tmp_table; @@ -5184,7 +5185,7 @@ end_send(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), error=0; if (join->procedure) error=join->procedure->send_row(*join->fields); - else if (join->do_send_rows && join->unit->select_limit_cnt) + else if (join->do_send_rows) error=join->result->send_data(*join->fields); if (error) DBUG_RETURN(-1); /* purecov: inspected */ diff --git a/sql/sql_union.cc b/sql/sql_union.cc index aeaae92f0c3..0e6de306c0d 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -86,7 +86,6 @@ bool select_union::send_data(List &values) } else return 1; - thd->net.report_error=0; // donno why does it work, but it does ... } return 0; } From f22010c835d6f7baa184c4647c9c9eca5c0a6ef2 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Nov 2002 20:58:04 +0200 Subject: [PATCH 08/14] fix for message being sent in EXPLAIN ... sql/sql_base.cc: temporary removal ... --- sql/sql_base.cc | 2 +- sql/sql_class.cc | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sql/sql_base.cc b/sql/sql_base.cc index fd6c2c48020..be630fd375c 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1078,7 +1078,7 @@ TABLE *open_table(THD *thd,const char *db,const char *table_name, table->status=STATUS_NO_RECORD; table->keys_in_use_for_query= table->keys_in_use; table->used_keys= table->keys_for_keyread; - DBUG_ASSERT(table->key_read == 0); +// DBUG_ASSERT(table->key_read == 0); put in comment as this fails on EXPLAIN DBUG_RETURN(table); } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index e6acab6a244..ebea620ffa1 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -882,7 +882,8 @@ bool select_singleval_subselect::send_data(List &items) DBUG_ENTER("select_singleval_subselect::send_data"); Item_singleval_subselect *it= (Item_singleval_subselect *)item; if (it->assigned()){ - my_message(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0)); + if (!current_thd->lex.describe) + my_message(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0)); DBUG_RETURN(1); } if (unit->offset_limit_cnt) From 2eb4a1ea383e7db5fc5549dcc9d0557aaffc928e Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Nov 2002 22:19:15 +0200 Subject: [PATCH 09/14] Fixed explain error handling mysql-test/r/subselect.result: test of subselect explain mysql-test/t/subselect.test: test of subselect explain --- mysql-test/r/subselect.result | 2 ++ mysql-test/t/subselect.test | 3 ++- sql/sql_select.cc | 16 ++++++++++------ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index f4341e5dd71..e54e1fb0fef 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -279,6 +279,8 @@ UNIQUE KEY `numreponse` (`numreponse`), KEY `pseudo` (`pseudo`,`numeropost`) ) TYPE=MyISAM; INSERT INTO threadhardwarefr7 (numeropost,numreponse,pseudo) VALUES (1,1,'joce'),(1,2,'joce'),(1,3,'test'); +EXPLAIN SELECT numreponse FROM threadhardwarefr7 WHERE numeropost='1' AND numreponse=(SELECT 1 FROM threadhardwarefr7 WHERE numeropost='1'); +Subselect returns more than 1 record EXPLAIN SELECT MAX(numreponse) FROM threadhardwarefr7 WHERE numeropost='1'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE Select tables optimized away diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index a81b3f62945..7a507be4ed2 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -177,7 +177,8 @@ CREATE TABLE `threadhardwarefr7` ( KEY `pseudo` (`pseudo`,`numeropost`) ) TYPE=MyISAM; INSERT INTO threadhardwarefr7 (numeropost,numreponse,pseudo) VALUES (1,1,'joce'),(1,2,'joce'),(1,3,'test'); - +-- error 1240 +EXPLAIN SELECT numreponse FROM threadhardwarefr7 WHERE numeropost='1' AND numreponse=(SELECT 1 FROM threadhardwarefr7 WHERE numeropost='1'); EXPLAIN SELECT MAX(numreponse) FROM threadhardwarefr7 WHERE numeropost='1'; EXPLAIN SELECT numreponse FROM threadhardwarefr7 WHERE numeropost='1' AND numreponse=(SELECT MAX(numreponse) FROM threadhardwarefr7 WHERE numeropost='1'); drop table if exists threadhardwarefrtest7; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 7861d6c5541..6221fb87ef2 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -371,13 +371,17 @@ JOIN::optimize() } #endif - conds=optimize_cond(conds,&cond_value); - if (thd->fatal_error || thd->net.report_error) + conds= optimize_cond(conds,&cond_value); + if (thd->fatal_error) { + // quick abort delete procedure; - error = 0; + error= 0; DBUG_RETURN(1); - } + } else if (thd->net.report_error) + // normal error processing & cleanup + DBUG_RETURN(-1); + if (cond_value == Item::COND_FALSE || !unit->select_limit_cnt) { /* Impossible cond */ zero_result_cause= "Impossible WHERE"; @@ -7516,8 +7520,8 @@ int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result) break; } - if (res > 0) - res= -res; // mysql_explain_select do not report error + if (res > 0 || thd->net.report_error) + res= -1; // mysql_explain_select do not report error DBUG_RETURN(res); } From 1556ea9ae71fa4ed6683cf848887e7b41611126b Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Nov 2002 22:41:57 +0200 Subject: [PATCH 10/14] small change sql/sql_class.cc: reverting some changes and fixig C style of Sanja ... ;o) --- sql/sql_class.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index ebea620ffa1..996c70a0305 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -881,8 +881,8 @@ bool select_singleval_subselect::send_data(List &items) { DBUG_ENTER("select_singleval_subselect::send_data"); Item_singleval_subselect *it= (Item_singleval_subselect *)item; - if (it->assigned()){ - if (!current_thd->lex.describe) + if (it->assigned()) + { my_message(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0)); DBUG_RETURN(1); } From fb23575c7ac4511d6a3e6ab09a9af3c08e00ed36 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Nov 2002 23:11:45 +0200 Subject: [PATCH 11/14] small revert sql/sql_base.cc: one more change reverted --- sql/sql_base.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sql_base.cc b/sql/sql_base.cc index be630fd375c..fd6c2c48020 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1078,7 +1078,7 @@ TABLE *open_table(THD *thd,const char *db,const char *table_name, table->status=STATUS_NO_RECORD; table->keys_in_use_for_query= table->keys_in_use; table->used_keys= table->keys_for_keyread; -// DBUG_ASSERT(table->key_read == 0); put in comment as this fails on EXPLAIN + DBUG_ASSERT(table->key_read == 0); DBUG_RETURN(table); } From 56b6433e66cd461dfd9e9ad269ab65a588b81331 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Nov 2002 16:02:19 +0400 Subject: [PATCH 12/14] fix for BDB --- bdb/dist/RELEASE | 2 +- bdb/dist/s_all | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/bdb/dist/RELEASE b/bdb/dist/RELEASE index 20b648efa04..61151b8589c 100644 --- a/bdb/dist/RELEASE +++ b/bdb/dist/RELEASE @@ -16,7 +16,7 @@ DB_VERSION_STRING="Sleepycat Software: Berkeley DB $DB_VERSION: ($DB_RELEASE_DAT # bitkeeper doesn't like somebody to mess with permissions! chmod() { - #echo "chmod $1 $2" + echo "chmod $1 $2" >/dev/null } # useful trick to find auto-generated files diff --git a/bdb/dist/s_all b/bdb/dist/s_all index c0e3ac72f3a..51c9afabcae 100644 --- a/bdb/dist/s_all +++ b/bdb/dist/s_all @@ -1,7 +1,22 @@ #!/bin/sh - # $Id: s_all,v 1.10 2001/08/04 14:01:44 bostic Exp $ -sh s_perm # permissions. +make_dir() +{ + if test ! -d $1; then + echo "mkdir $1" + mkdir $1 + status=$? + if test $status -ne 0 && test ! -d $1; then + echo "error: $status" + fi + fi +} + +make_dir ../test_server +make_dir ../dbinc_auto + +#sh s_perm # permissions. sh s_symlink # symbolic links. sh s_readme # db/README file. From 951669f048155a6366a5cecc9cfe3f03ce77a141 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Nov 2002 18:48:22 +0400 Subject: [PATCH 13/14] fix for byte ordering bug in HEAP rb-tree --- heap/hp_create.c | 16 ++++++++++++++++ heap/hp_hash.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/heap/hp_create.c b/heap/hp_create.c index 6c38d54cb12..40b8202d94f 100644 --- a/heap/hp_create.c +++ b/heap/hp_create.c @@ -55,6 +55,22 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, if (keyinfo->algorithm == HA_KEY_ALG_BTREE) keyinfo->rb_tree.size_of_element++; } + switch (keyinfo->seg[j].type) { + case HA_KEYTYPE_SHORT_INT: + case HA_KEYTYPE_LONG_INT: + case HA_KEYTYPE_FLOAT: + case HA_KEYTYPE_DOUBLE: + case HA_KEYTYPE_USHORT_INT: + case HA_KEYTYPE_ULONG_INT: + case HA_KEYTYPE_LONGLONG: + case HA_KEYTYPE_ULONGLONG: + case HA_KEYTYPE_INT24: + case HA_KEYTYPE_UINT24: + case HA_KEYTYPE_INT8: + keyinfo->seg[j].flag|= HA_SWAP_KEY; + default: + break; + } } keyinfo->length= length; length+= keyinfo->rb_tree.size_of_element + diff --git a/heap/hp_hash.c b/heap/hp_hash.c index 946659621fe..cd70d2ab532 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -443,6 +443,43 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, byte *key, if (!(*key++= 1 - test(rec[seg->null_pos] & seg->null_bit))) continue; } + if (seg->flag & HA_SWAP_KEY) + { + uint length= seg->length; + byte *pos= (byte*) rec + seg->start; + +#ifdef HAVE_ISNAN + if (seg->type == HA_KEYTYPE_FLOAT) + { + float nr; + float4get(nr, pos); + if (isnan(nr)) + { + /* Replace NAN with zero */ + bzero(key, length); + key+= length; + continue; + } + } + else if (seg->type == HA_KEYTYPE_DOUBLE) + { + double nr; + float8get(nr, pos); + if (isnan(nr)) + { + bzero(key, length); + key+= length; + continue; + } + } +#endif + pos+= length; + while (length--) + { + *key++= *--pos; + } + continue; + } memcpy(key, rec + seg->start, (size_t) seg->length); key+= seg->length; } @@ -467,6 +504,18 @@ uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old, uint k_len) continue; } } + if (seg->flag & HA_SWAP_KEY) + { + uint length= seg->length; + byte *pos= (byte*) old + length; + + k_len-= length; + while (length--) + { + *key++= *--pos; + } + continue; + } memcpy((byte*) key, old, seg->length); key+= seg->length; k_len-= seg->length; From 9705257270b28757eec9aac63f664a93dd5ac601 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Nov 2002 17:20:57 +0200 Subject: [PATCH 14/14] Makng sure that LIMIT 0 works in this case to: select sql_calc_found_rows * from table limit 0; It does ... --- mysql-test/r/select_found.result | 5 +++++ mysql-test/t/select_found.test | 2 ++ 2 files changed, 7 insertions(+) diff --git a/mysql-test/r/select_found.result b/mysql-test/r/select_found.result index bbf0a8ba09f..a48e1e16d37 100644 --- a/mysql-test/r/select_found.result +++ b/mysql-test/r/select_found.result @@ -178,4 +178,9 @@ titre numeropost maxnumrep SELECT FOUND_ROWS(); FOUND_ROWS() 2 +SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 0; +titre numeropost maxnumrep +SELECT FOUND_ROWS(); +FOUND_ROWS() +3 drop table t1; diff --git a/mysql-test/t/select_found.test b/mysql-test/t/select_found.test index c8458dd3aea..b380c86d2db 100644 --- a/mysql-test/t/select_found.test +++ b/mysql-test/t/select_found.test @@ -88,4 +88,6 @@ SELECT SQL_CALC_FOUND_ROWS 1 FROM (SELECT 1) LIMIT 0; SELECT FOUND_ROWS(); SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE numeropost > 1 LIMIT 0; SELECT FOUND_ROWS(); +SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 0; +SELECT FOUND_ROWS(); drop table t1;