diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result
index 3d76f8e4a9093110790e11b05d8db06375e755b7..9e52fbeac1aeca234acfa4fd54977e7bcb9e869b 100644
--- a/mysql-test/r/variables.result
+++ b/mysql-test/r/variables.result
@@ -218,6 +218,8 @@ show variables like 'net_buffer_length';
 Variable_name	Value
 net_buffer_length	1024
 set net_buffer_length=2000000000;
+Warnings:
+Warning	1292	Truncated incorrect net_buffer_length value: '2000000000'
 show variables like 'net_buffer_length';
 Variable_name	Value
 net_buffer_length	1048576
diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test
index 0ad85a32568acb42dbaca7f12c1f6835ab02687a..ccd487a72ea3734baf8a74adb344f02e2fe54972 100644
--- a/mysql-test/t/variables.test
+++ b/mysql-test/t/variables.test
@@ -139,6 +139,7 @@ show global variables like 'net_%';
 show session variables like 'net_%';
 set net_buffer_length=1;
 show variables like 'net_buffer_length';
+--warning 1292
 set net_buffer_length=2000000000;
 show variables like 'net_buffer_length';
 
diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c
index 623c48b2e55daaad8f65ad01e20d582760b2a450..71630e1b4c262c0e8b887cad6c5b81a314cf0a6a 100644
--- a/mysys/my_getopt.c
+++ b/mysys/my_getopt.c
@@ -19,6 +19,7 @@
 #include <my_sys.h>
 #include <mysys_err.h>
 #include <my_getopt.h>
+#include <errno.h>
 
 static void default_reporter(enum loglevel level, const char *format, ...);
 my_error_reporter my_getopt_error_reporter= &default_reporter;
@@ -693,7 +694,15 @@ static longlong eval_num_suffix (char *argument, int *error, char *option_name)
   longlong num;
   
   *error= 0;
+  errno= 0;
   num= strtoll(argument, &endchar, 10);
+  if (errno == ERANGE)
+  {
+    my_getopt_error_reporter(ERROR_LEVEL,
+                             "Incorrect integer value: '%s'", argument);
+    *error= 1;
+    return 0;
+  }
   if (*endchar == 'k' || *endchar == 'K')
     num*= 1024L;
   else if (*endchar == 'm' || *endchar == 'M')
@@ -730,7 +739,14 @@ static longlong getopt_ll(char *arg, const struct my_option *optp, int *err)
   num= eval_num_suffix(arg, err, (char*) optp->name);
   if (num > 0 && (ulonglong) num > (ulonglong) optp->max_value &&
       optp->max_value) /* if max value is not set -> no upper limit */
+  {
+    char buf[22];
+    my_getopt_error_reporter(WARNING_LEVEL,
+                             "Truncated incorrect %s value: '%s'", 
+                             optp->name, llstr(num, buf));
+    
     num= (ulonglong) optp->max_value;
+  }
   num= ((num - optp->sub_size) / block_size);
   num= (longlong) (num * block_size);
   return max(num, optp->min_value);
diff --git a/sql/set_var.cc b/sql/set_var.cc
index e1246617d84e75767872505977817aa265fdccd5..5c76019efc63f5b942754b9fcdaaa30a72f4eb76 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -1532,16 +1532,31 @@ bool sys_var_thd_ulong::check(THD *thd, set_var *var)
 bool sys_var_thd_ulong::update(THD *thd, set_var *var)
 {
   ulonglong tmp= var->save_result.ulonglong_value;
+  char buf[22];
+  bool truncated= false;
 
   /* Don't use bigger value than given with --maximum-variable-name=.. */
   if ((ulong) tmp > max_system_variables.*offset)
+  {
+    truncated= true;
+    llstr(tmp, buf);
     tmp= max_system_variables.*offset;
+  }
 
 #if SIZEOF_LONG == 4
   /* Avoid overflows on 32 bit systems */
   if (tmp > (ulonglong) ~(ulong) 0)
+  {
+    truncated= true;
+    llstr(tmp, buf);
     tmp= ((ulonglong) ~(ulong) 0);
+  }
 #endif
+  if (truncated)
+    push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
+                        ER_TRUNCATED_WRONG_VALUE,
+                        ER(ER_TRUNCATED_WRONG_VALUE), name,
+                        buf);
 
   if (option_limits)
     tmp= (ulong) getopt_ull_limit_value(tmp, option_limits);