diff --git a/include/m_string.h b/include/m_string.h
index fabd6c9bb59dde7f9d11da8d026601849a74aef9..15a488fe72a07eb3e5f0beeda1a3d9a5827c16a9 100644
--- a/include/m_string.h
+++ b/include/m_string.h
@@ -31,6 +31,9 @@
 #include <string.h>
 #endif
 
+/* need by my_vsnprintf */
+#include <stdarg.h> 
+
 /* Correct some things for UNIXWARE7 */
 #ifdef HAVE_UNIXWARE7_THREADS
 #undef HAVE_STRINGS_H
diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result
index 94f304c77b126f881ca9e31ac088ef90bc9215ed..e546a8c82843554524e549c7ff5bae69fca97939 100644
--- a/mysql-test/r/union.result
+++ b/mysql-test/r/union.result
@@ -85,7 +85,7 @@ a	b
 2	b
 1	a
 (select a,b from t1 limit 2)  union all (select a,b from t2 order by a limit 1) order by t1.b;
-Table 't1' from one of SELECT's can not be used  in order clause
+Table 't1' from one of SELECT's can not be used  in global ORDER clause
 explain (select a,b from t1 limit 2)  union all (select a,b from t2 order by a limit 1) order by b desc;
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	4	
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index a384e723e32de14979da4868c40db8c944e4249f..038a286f4df461cef4dcb4c1def0a020e05473f0 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -1749,12 +1749,8 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables,
       }
       if (report_error)
       {
-	if (thd->lex.current_select->get_master()->order_list.elements)
-	  my_printf_error(ER_TABLENAME_NOT_ALLOWED_HERE, ER(ER_TABLENAME_NOT_ALLOWED_HERE), 
-			  MYF(0), table_name, thd->where);
-	else
-	  my_printf_error(ER_UNKNOWN_TABLE, ER(ER_UNKNOWN_TABLE), MYF(0),
-			  table_name, thd->where);
+	my_printf_error(ER_UNKNOWN_TABLE, ER(ER_UNKNOWN_TABLE), MYF(0),
+			table_name, thd->where);
       }
       else
 	return (Field*) not_found_field;
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index dda3d4e822e7fa3628225b3f7614b4eee49a810a..b656f698e89ae7d17c6e021a2ffbc20c0ac72d80 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -943,7 +943,7 @@ int yylex(void *arg, void *yythd)
 
 void st_select_lex_node::init_query()
 {
-  dependent= 0;
+  no_table_names_allowed= dependent= 0;
 }
 
 void st_select_lex_node::init_select()
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 4b6ac927f07422b491a50453b44e2d0188fcb471..e4a17838cd2318d66838b3a10f548bccc5a96305 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -212,6 +212,7 @@ public:
   bool with_sum_func;
   bool	create_refs;
   bool dependent;	/* dependent from outer select subselect */
+  bool no_table_names_allowed; /* used for global order by */
 
   static void *operator new(size_t size)
   {
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 0985859caae1254c9497d53ce6808a7f1ac0e900..318d563b88a56ee49d54582bd7eebd0d36d988cd 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -3740,17 +3740,41 @@ simple_ident:
 	}
 	| ident '.' ident
 	{
-	  SELECT_LEX_NODE *sel=Select;
+	  THD *thd= YYTHD;
+	  LEX *lex= &thd->lex;
+	  SELECT_LEX_NODE *sel= lex->current_select;
+	  if (sel->no_table_names_allowed)
+	  {
+	    my_printf_error(ER_TABLENAME_NOT_ALLOWED_HERE, 
+			    ER(ER_TABLENAME_NOT_ALLOWED_HERE),
+			    MYF(0), $1.str, thd->where);
+	  }
 	  $$ = !sel->create_refs || sel->get_in_sum_expr() > 0 ? (Item*) new Item_field(NullS,$1.str,$3.str) : (Item*) new Item_ref(NullS,$1.str,$3.str);
 	}
 	| '.' ident '.' ident
 	{
-	  SELECT_LEX_NODE *sel=Select;
+	  THD *thd= YYTHD;
+	  LEX *lex= &thd->lex;
+	  SELECT_LEX_NODE *sel= lex->current_select;
+	  if (sel->no_table_names_allowed)
+	  {
+	    my_printf_error(ER_TABLENAME_NOT_ALLOWED_HERE, 
+			    ER(ER_TABLENAME_NOT_ALLOWED_HERE),
+			    MYF(0), $2.str, thd->where);
+	  }
 	  $$ = !sel->create_refs || sel->get_in_sum_expr() > 0 ? (Item*) new Item_field(NullS,$2.str,$4.str) : (Item*) new Item_ref(NullS,$2.str,$4.str);
 	}
 	| ident '.' ident '.' ident
 	{
-	  SELECT_LEX_NODE *sel=Select;
+	  THD *thd= YYTHD;
+	  LEX *lex= &thd->lex;
+	  SELECT_LEX_NODE *sel= lex->current_select;
+	  if (sel->no_table_names_allowed)
+	  {
+	    my_printf_error(ER_TABLENAME_NOT_ALLOWED_HERE, 
+			    ER(ER_TABLENAME_NOT_ALLOWED_HERE),
+			    MYF(0), $3.str, thd->where);
+	  }
 	  $$ = !sel->create_refs || sel->get_in_sum_expr() > 0 ? (Item*) new Item_field((YYTHD->client_capabilities & CLIENT_NO_SCHEMA ? NullS :$1.str),$3.str,$5.str) : (Item*) new Item_ref((YYTHD->client_capabilities & CLIENT_NO_SCHEMA ? NullS :$1.str),$3.str,$5.str);
 	};
 
@@ -4535,7 +4559,8 @@ optional_order_or_limit:
       	/* Empty */ {}
 	|
 	  {
-	    LEX *lex=Lex;
+	    THD *thd= YYTHD;
+	    LEX *lex= &thd->lex;
 	    if (!lex->current_select->linkage == GLOBAL_OPTIONS_TYPE)
 	    {
 	      send_error(lex->thd, ER_SYNTAX_ERROR);
@@ -4547,8 +4572,15 @@ optional_order_or_limit:
 	    lex->current_select= sel->master_unit();
 	    lex->current_select->select_limit=
 	      lex->thd->variables.select_limit;
+	    lex->current_select->no_table_names_allowed= 1;
+	    thd->where= "global ORDER clause";
 	  }
 	order_or_limit
+          {
+	    THD *thd= YYTHD;
+	    thd->lex.current_select->no_table_names_allowed= 0;
+	    thd->where= "";
+          }
 	;
 
 order_or_limit: