summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <gkodinov@mysql.com>2006-06-19 13:25:28 +0300
committerunknown <gkodinov@mysql.com>2006-06-19 13:25:28 +0300
commit521fdc7a7e941df25f13e5493b9df5c38170c47c (patch)
tree068e92eecb6274e32dd35a9004a27af02e125f6a
parent6b8b4816a19bc41ab2e9c929e88b7d5e07efdee8 (diff)
parent4be0169ee208035688d13092ef7926c0876ed6bb (diff)
downloadmariadb-git-521fdc7a7e941df25f13e5493b9df5c38170c47c.tar.gz
Merge mysql.com:/home/kgeorge/mysql/4.1/teamclean
into mysql.com:/home/kgeorge/mysql/4.1/B9676
-rw-r--r--mysql-test/r/insert_select.result4
-rw-r--r--mysql-test/t/insert_select.test13
-rw-r--r--sql/sql_select.cc12
3 files changed, 25 insertions, 4 deletions
diff --git a/mysql-test/r/insert_select.result b/mysql-test/r/insert_select.result
index 028b40ac3b6..1d7aef256e1 100644
--- a/mysql-test/r/insert_select.result
+++ b/mysql-test/r/insert_select.result
@@ -686,3 +686,7 @@ ERROR 42S22: Unknown column 'z' in 'field list'
insert into t1(x,y) select x,z from t2 on duplicate key update x=values(t2.x);
ERROR 42S02: Unknown table 't2' in field list
drop table t1,t2;
+CREATE TABLE t1 (a int PRIMARY KEY);
+INSERT INTO t1 values (1), (2);
+INSERT INTO t1 SELECT a + 2 FROM t1 LIMIT 1;
+DROP TABLE t1;
diff --git a/mysql-test/t/insert_select.test b/mysql-test/t/insert_select.test
index 48acdf1cbc5..fcea489fcff 100644
--- a/mysql-test/t/insert_select.test
+++ b/mysql-test/t/insert_select.test
@@ -226,4 +226,17 @@ insert into t1(x,y) select x,z from t2 on duplicate key update x=values(z);
insert into t1(x,y) select x,z from t2 on duplicate key update x=values(t2.x);
drop table t1,t2;
+#
+# Bug #9676: INSERT INTO x SELECT .. FROM x LIMIT 1; slows down with big
+# tables
+#
+
+#Note: not an exsaustive test : just a check of the code path.
+CREATE TABLE t1 (a int PRIMARY KEY);
+INSERT INTO t1 values (1), (2);
+
+INSERT INTO t1 SELECT a + 2 FROM t1 LIMIT 1;
+
+DROP TABLE t1;
+
# End of 4.1 tests
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 5a7e9e52aed..709ff9726bb 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -888,8 +888,9 @@ JOIN::optimize()
group_list ? 0 : select_distinct,
group_list && simple_group,
select_options,
- (order == 0 || skip_sort_order) ? select_limit :
- HA_POS_ERROR,
+ (order == 0 || skip_sort_order ||
+ test(select_options & OPTION_BUFFER_RESULT)) ?
+ select_limit : HA_POS_ERROR,
(char *) "")))
DBUG_RETURN(1);
@@ -5530,6 +5531,11 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
keyinfo->key_length+= key_part_info->length;
}
}
+ else
+ {
+ set_if_smaller(table->max_rows, rows_limit);
+ param->end_write_records= rows_limit;
+ }
if (distinct && field_count != param->hidden_field_count)
{
@@ -5544,8 +5550,6 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
null_pack_length-=hidden_null_pack_length;
keyinfo->key_parts= ((field_count-param->hidden_field_count)+
test(null_pack_length));
- set_if_smaller(table->max_rows, rows_limit);
- param->end_write_records= rows_limit;
table->distinct=1;
table->keys=1;
if (blob_count)