summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbell@sanja.is.com.ua <>2002-11-25 21:27:14 +0200
committerbell@sanja.is.com.ua <>2002-11-25 21:27:14 +0200
commitb8f5fc3a139c1411aa6ecd6f727864a0c0016789 (patch)
treef7de0958810c8e567d83564ff9a09bbaf6b694ac
parentf5dab36a63c4eda2a0492f33a56f195af1199ea4 (diff)
downloadmariadb-git-b8f5fc3a139c1411aa6ecd6f727864a0c0016789.tar.gz
subselet in delete (SCRUM)
-rw-r--r--mysql-test/r/subselect.result19
-rw-r--r--mysql-test/t/subselect.test11
-rw-r--r--sql/sql_delete.cc8
3 files changed, 36 insertions, 2 deletions
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result
index a2d29b1c0cf..02f05ce50d6 100644
--- a/mysql-test/r/subselect.result
+++ b/mysql-test/r/subselect.result
@@ -335,3 +335,22 @@ a b
1 21
2 22
drop table t1, t2;
+drop table if exists t1, t2;
+create table t1 (a int NOT NULL, b int, primary key (a));
+create table t2 (a int NOT NULL, b int, primary key (a));
+insert into t1 values (0, 10),(1, 11),(2, 12);
+insert into t2 values (1, 21),(2, 12),(3, 23);
+select * from t1;
+a b
+0 10
+1 11
+2 12
+select * from t1 where b = (select b from t2 where t1.a = t2.a);
+a b
+2 12
+delete from t1 where b = (select b from t2 where t1.a = t2.a);
+select * from t1;
+a b
+0 10
+1 11
+drop table t1, t2;
diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test
index 6bba9d4f3cd..3f20abe803a 100644
--- a/mysql-test/t/subselect.test
+++ b/mysql-test/t/subselect.test
@@ -215,3 +215,14 @@ update t1 set b= (select b from t2 where t1.a = t2.a);
select * from t1;
drop table t1, t2;
+#delete with subselects
+drop table if exists t1, t2;
+create table t1 (a int NOT NULL, b int, primary key (a));
+create table t2 (a int NOT NULL, b int, primary key (a));
+insert into t1 values (0, 10),(1, 11),(2, 12);
+insert into t2 values (1, 21),(2, 12),(3, 23);
+select * from t1;
+select * from t1 where b = (select b from t2 where t1.a = t2.a);
+delete from t1 where b = (select b from t2 where t1.a = t2.a);
+select * from t1;
+drop table t1, t2;
diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc
index 16d6b6d4631..5b97b2f7750 100644
--- a/sql/sql_delete.cc
+++ b/sql/sql_delete.cc
@@ -37,14 +37,18 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order,
bool using_limit=limit != HA_POS_ERROR;
bool transactional_table, log_delayed, safe_update, const_cond;
ha_rows deleted;
+ TABLE_LIST *delete_table_list= (TABLE_LIST*)
+ thd->lex.select_lex.table_list.first;
DBUG_ENTER("mysql_delete");
- if (!(table = open_ltable(thd, table_list, table_list->lock_type)))
+ if ((open_and_lock_tables(thd, table_list)))
DBUG_RETURN(-1);
+ fix_tables_pointers(&thd->lex.select_lex);
+ table= table_list->table;
table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
thd->proc_info="init";
table->map=1;
- if (setup_conds(thd,table_list,&conds) ||
+ if (setup_conds(thd, delete_table_list, &conds) ||
setup_ftfuncs(&thd->lex.select_lex))
DBUG_RETURN(-1);