summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@hundin.mysql.fi>2001-09-17 22:44:51 +0300
committerunknown <monty@hundin.mysql.fi>2001-09-17 22:44:51 +0300
commit05821367d403ff69e6af3c83ceb45756376f9b94 (patch)
tree84e69c2b39154e624f807c4628e21f3d0fdb1da3
parent28097f40d3d13a1d42ef7a98b2ebc3330fd41a83 (diff)
downloadmariadb-git-05821367d403ff69e6af3c83ceb45756376f9b94.tar.gz
Fixed bug in UNION when doing UNION with the same tables
myisam/mi_extra.c: More debugging information mysql-test/r/union.result: Added test for UNION bug mysql-test/t/union.test: Added test for UNION bug sql/sql_base.cc: Clear field->query_id when using UNION sql/sql_parse.cc: Fix for UNION bug sql/sql_union.cc: Cleanup sql/table.h: Fix for UNION bug tools/Makefile.am: Fix for compiling with MIT-threads
-rw-r--r--myisam/mi_extra.c1
-rw-r--r--mysql-test/r/union.result8
-rw-r--r--mysql-test/t/union.test3
-rw-r--r--sql/sql_base.cc9
-rw-r--r--sql/sql_parse.cc4
-rw-r--r--sql/sql_union.cc2
-rw-r--r--sql/table.h1
-rw-r--r--tools/Makefile.am3
8 files changed, 23 insertions, 8 deletions
diff --git a/myisam/mi_extra.c b/myisam/mi_extra.c
index eb7285491ed..f1401aaae3c 100644
--- a/myisam/mi_extra.c
+++ b/myisam/mi_extra.c
@@ -34,6 +34,7 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function)
int error=0;
MYISAM_SHARE *share=info->s;
DBUG_ENTER("mi_extra");
+ DBUG_PRINT("enter",("function: %d",(int) function));
switch (function) {
case HA_EXTRA_RESET:
diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result
index a0836cf1680..0598bfb9ca0 100644
--- a/mysql-test/r/union.result
+++ b/mysql-test/r/union.result
@@ -62,7 +62,11 @@ t2 ALL NULL NULL NULL NULL 4
pseudo
dekad
joce
+pseudo1
+joce
+testtt
+tsestset
pseudo pseudo1 same
-dekad joce 1
-joce testtt 1
joce tsestset 1
+joce testtt 1
+dekad joce 1
diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test
index 8325e6c7e77..e780e9ec528 100644
--- a/mysql-test/t/union.test
+++ b/mysql-test/t/union.test
@@ -60,5 +60,6 @@ CREATE TABLE t1 (
) TYPE=MyISAM;
INSERT INTO t1 (pseudo,pseudo1,same) VALUES ('joce', 'testtt', 1),('joce', 'tsestset', 1),('dekad', 'joce', 1);
SELECT pseudo FROM t1 WHERE pseudo1='joce' UNION SELECT pseudo FROM t1 WHERE pseudo='joce';
-SELECT * FROM t1 WHERE pseudo1='joce' UNION SELECT * FROM t1 WHERE pseudo='joce';
+SELECT pseudo1 FROM t1 WHERE pseudo1='joce' UNION SELECT pseudo1 FROM t1 WHERE pseudo='joce';
+SELECT * FROM t1 WHERE pseudo1='joce' UNION SELECT * FROM t1 WHERE pseudo='joce' order by pseudo desc;
drop table t1;
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 83be3c1ade1..41093452984 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -1590,7 +1590,8 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length,
else
thd->dupp_field=field;
}
- if (check_grants && !thd->master_access && check_grant_column(thd,table,name,length))
+ if (check_grants && !thd->master_access &&
+ check_grant_column(thd,table,name,length))
return WRONG_GRANT;
return field;
}
@@ -1808,6 +1809,12 @@ bool setup_tables(TABLE_LIST *tables)
DBUG_RETURN(1);
table->keys_in_use_for_query &= ~map;
}
+ if (table_list->shared)
+ {
+ /* Clear query_id that may have been set by previous select */
+ for (Field **ptr=table->field ; *ptr ; ptr++)
+ (*ptr)->query_id=0;
+ }
}
if (tablenr > MAX_TABLES)
{
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index e1131a9ac40..8501bd57b6e 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2921,8 +2921,10 @@ static bool create_total_list(THD *thd, LEX *lex, TABLE_LIST **result)
}
*new_table_list= cursor;
new_table_list= &cursor->next;
- *new_table_list=0; // end result list
+ *new_table_list=0; // end result list
}
+ else
+ aux->shared=1; // Mark that it's used twice
aux->table=(TABLE *) cursor;
}
}
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index 86ecaba6d3b..5dd897ee826 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -37,7 +37,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result)
int res;
DBUG_ENTER("mysql_union");
- /* Fix tables--to-be-unioned-from list to point at opened tables */
+ /* Fix tables 'to-be-unioned-from' list to point at opened tables */
for (sl=&lex->select_lex; sl; sl=sl->next)
{
for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first;
diff --git a/sql/table.h b/sql/table.h
index b25e2d82132..5d50851259d 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -145,6 +145,7 @@ typedef struct st_table_list {
uint outer_join; /* Which join type */
bool straight; /* optimize with prev table */
bool updating; /* for replicate-do/ignore table */
+ bool shared; /* Used twice in union */
} TABLE_LIST;
typedef struct st_open_table_list
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 4e9fc3ac6f8..3c786dc9281 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,7 +1,6 @@
INCLUDES = @MT_INCLUDES@ -I$(srcdir)/../include \
$(openssl_includes) -I../include
-LIBS= @openssl_libs@
-LDADD= @CLIENT_EXTRA_LDFLAGS@ ../libmysql_r/libmysqlclient_r.la
+LDADD= @CLIENT_EXTRA_LDFLAGS@ ../libmysql_r/libmysqlclient_r.la @openssl_libs@
bin_PROGRAMS= mysqlmanager
mysqlmanager_SOURCES= mysqlmanager.c
mysqlmanager_DEPENDENCIES= $(LIBRARIES) $(pkglib_LTLIBRARIES)