diff --git a/mysql-test/r/insert_update.result b/mysql-test/r/insert_update.result
index 7027d7eff79ba5399e8e1db8a8f8748d948a959a..1817500973edeca8865b131bce3e0197a4e74009 100644
--- a/mysql-test/r/insert_update.result
+++ b/mysql-test/r/insert_update.result
@@ -140,10 +140,10 @@ a	b	c
 5	6	130
 TRUNCATE TABLE t1;
 INSERT t1 VALUES (1,2,10), (3,4,20);
-CREATE TABLE t2 (x INT, y INT, z INT, d INT);
+CREATE TABLE t2 (a INT, b INT, c INT, d INT);
 INSERT t2 VALUES (5,6,30,1), (7,4,40,1), (8,9,60,1);
 INSERT t2 VALUES (2,1,11,2), (7,4,40,2);
-INSERT t1 SELECT x,y,z FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100;
+INSERT t1 SELECT a,b,c FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100;
 SELECT * FROM t1;
 a	b	c
 1	2	10
@@ -157,7 +157,7 @@ a	b	c
 3	4	120
 5	0	30
 8	9	60
-INSERT t1 SELECT x,y,z FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a);
+INSERT t1 SELECT a,b,c FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a);
 SELECT *, VALUES(a) FROM t1;
 a	b	c	VALUES(a)
 1	2	10	NULL
diff --git a/mysql-test/t/insert_update.test b/mysql-test/t/insert_update.test
index 182baa641dad6711183fc9f7d241d52055aac734..188de8a5379200cc9a1b066cd84209705e4943e9 100644
--- a/mysql-test/t/insert_update.test
+++ b/mysql-test/t/insert_update.test
@@ -68,14 +68,15 @@ INSERT t1 SELECT 1,9,70 FROM DUAL ON DUPLICATE KEY UPDATE c=c+100000, b=4;
 SELECT * FROM t1;
 TRUNCATE TABLE t1;
 INSERT t1 VALUES (1,2,10), (3,4,20);
-CREATE TABLE t2 (x INT, y INT, z INT, d INT);
+CREATE TABLE t2 (a INT, b INT, c INT, d INT);
+# column names deliberately clash with columns in t1 (Bug#8147)
 INSERT t2 VALUES (5,6,30,1), (7,4,40,1), (8,9,60,1);
 INSERT t2 VALUES (2,1,11,2), (7,4,40,2);
-INSERT t1 SELECT x,y,z FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100;
+INSERT t1 SELECT a,b,c FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100;
 SELECT * FROM t1;
 INSERT t1 SET a=5 ON DUPLICATE KEY UPDATE b=0;
 SELECT * FROM t1;
-INSERT t1 SELECT x,y,z FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a);
+INSERT t1 SELECT a,b,c FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a);
 SELECT *, VALUES(a) FROM t1;
 DROP TABLE t1;
 DROP TABLE t2;
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index fa6f1e05dc6ce2024f4fb1f19da0a24d166008ca..b7e31dd126d6ec6f2c0aba0439f236fdcb82c2e1 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -671,6 +671,7 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list, TABLE *table,
   bool insert_into_view= (table_list->view != 0);
   /* TODO: use this condition for 'WITH CHECK OPTION' */
   bool res;
+  TABLE_LIST *next_local;
   DBUG_ENTER("mysql_prepare_insert");
   DBUG_PRINT("enter", ("table_list 0x%lx, table 0x%lx, view %d",
 		       (ulong)table_list, (ulong)table,
@@ -687,6 +688,8 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list, TABLE *table,
                                        select_insert))
     DBUG_RETURN(TRUE);
 
+  next_local= table_list->next_local;
+  table_list->next_local= 0;
   if ((values && check_insert_fields(thd, table_list, fields, *values, 1,
                                      !insert_into_view)) ||
       (values && setup_fields(thd, 0, table_list, *values, 0, 0, 0)) ||
@@ -697,6 +700,7 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list, TABLE *table,
          res) ||
         setup_fields(thd, 0, table_list, update_values, 1, 0, 0))))
     DBUG_RETURN(TRUE);
+  table_list->next_local= next_local;
 
   if (!table)
     table= table_list->table;