diff --git a/mysql-test/suite/compat/oracle/r/func_trim.result b/mysql-test/suite/compat/oracle/r/func_trim.result
new file mode 100644
index 0000000..25f715b
--- /dev/null
+++ b/mysql-test/suite/compat/oracle/r/func_trim.result
@@ -0,0 +1,168 @@
+#
+# MDEV-10574 / Trim functions - sql_mode=Oracle: return null instead of empty string
+#
+SET sql_mode=ORACLE;
+SELECT TRIM('abc'), TRIM('abc ')||'.', '.'||TRIM(' abc ')||'.', TRIM('  '), TRIM(NULL), TRIM(SPACE(0)),TRIM(SPACE(10)) FROM dual;
+TRIM('abc')	TRIM('abc ')||'.'	'.'||TRIM(' abc ')||'.'	TRIM('  ')	TRIM(NULL)	TRIM(SPACE(0))	TRIM(SPACE(10))
+abc	abc.	.abc.	NULL	NULL	NULL	NULL
+SELECT TRIM(TRAILING 'abc' FROM 'abc');
+TRIM(TRAILING 'abc' FROM 'abc')
+NULL
+SELECT TRIM(TRAILING 'abc' FROM 'abc ');
+TRIM(TRAILING 'abc' FROM 'abc ')
+abc 
+SELECT TRIM(TRAILING 'abc' FROM ' abc');
+TRIM(TRAILING 'abc' FROM ' abc')
+ 
+SELECT TRIM(LEADING 'abc' FROM 'abc');
+TRIM(LEADING 'abc' FROM 'abc')
+NULL
+SELECT TRIM(LEADING 'abc' FROM 'abc ');
+TRIM(LEADING 'abc' FROM 'abc ')
+ 
+SELECT TRIM(LEADING 'abc' FROM ' abc');
+TRIM(LEADING 'abc' FROM ' abc')
+ abc
+SELECT TRIM(BOTH 'abc' FROM 'abc');
+TRIM(BOTH 'abc' FROM 'abc')
+NULL
+SELECT TRIM(BOTH 'abc' FROM 'abc ');
+TRIM(BOTH 'abc' FROM 'abc ')
+ 
+SELECT TRIM(BOTH 'abc' FROM ' abc');
+TRIM(BOTH 'abc' FROM ' abc')
+ 
+SELECT RTRIM('abc'), RTRIM('abc ')||'.', RTRIM(' abc ')||'.', RTRIM('  '), RTRIM(NULL), RTRIM(SPACE(0)),RTRIM(SPACE(10)) FROM dual;
+RTRIM('abc')	RTRIM('abc ')||'.'	RTRIM(' abc ')||'.'	RTRIM('  ')	RTRIM(NULL)	RTRIM(SPACE(0))	RTRIM(SPACE(10))
+abc	abc.	 abc.	NULL	NULL	NULL	NULL
+SELECT LTRIM('abc'), LTRIM('abc '), LTRIM(' abc '), LTRIM('  '), LTRIM(NULL), LTRIM(SPACE(0)),LTRIM(SPACE(10)) FROM dual;
+LTRIM('abc')	LTRIM('abc ')	LTRIM(' abc ')	LTRIM('  ')	LTRIM(NULL)	LTRIM(SPACE(0))	LTRIM(SPACE(10))
+abc	abc 	abc 	NULL	NULL	NULL	NULL
+CREATE TABLE t1 (c1 VARCHAR(10),ord INTEGER);
+INSERT INTO t1 VALUES ('abc',1);
+INSERT INTO t1 VALUES (SPACE(0),2);
+INSERT INTO t1 VALUES ('',3);
+INSERT INTO t1 VALUES (' ',4);
+INSERT INTO t1 VALUES ('      ',5);
+INSERT INTO t1 VALUES ('   a     ',6);
+INSERT INTO t1 VALUES ('aa',7);
+INSERT INTO t1 VALUES ('aabb',8);
+INSERT INTO t1 VALUES ('bbaa',9);
+INSERT INTO t1 VALUES ('aabbaa',10);
+SELECT ord,'['||c1||']','.'||COALESCE(TRIM(LEADING 'a' FROM c1),'NULL')||'.' FROM t1 ORDER BY ord;
+ord	'['||c1||']'	'.'||COALESCE(TRIM(LEADING 'a' FROM c1),'NULL')||'.'
+1	[abc]	.bc.
+2	[]	.NULL.
+3	[]	.NULL.
+4	[ ]	. .
+5	[      ]	.      .
+6	[   a     ]	.   a     .
+7	[aa]	.NULL.
+8	[aabb]	.bb.
+9	[bbaa]	.bbaa.
+10	[aabbaa]	.bbaa.
+SELECT ord,'['||c1||']','.'||COALESCE(TRIM(TRAILING 'a' FROM c1),'NULL')||'.' FROM t1 ORDER BY ord;
+ord	'['||c1||']'	'.'||COALESCE(TRIM(TRAILING 'a' FROM c1),'NULL')||'.'
+1	[abc]	.abc.
+2	[]	.NULL.
+3	[]	.NULL.
+4	[ ]	. .
+5	[      ]	.      .
+6	[   a     ]	.   a     .
+7	[aa]	.NULL.
+8	[aabb]	.aabb.
+9	[bbaa]	.bb.
+10	[aabbaa]	.aabb.
+SELECT ord,'['||c1||']','.'||COALESCE(TRIM(BOTH 'a' FROM c1),'NULL')||'.' FROM t1 ORDER BY ord;
+ord	'['||c1||']'	'.'||COALESCE(TRIM(BOTH 'a' FROM c1),'NULL')||'.'
+1	[abc]	.bc.
+2	[]	.NULL.
+3	[]	.NULL.
+4	[ ]	. .
+5	[      ]	.      .
+6	[   a     ]	.   a     .
+7	[aa]	.NULL.
+8	[aabb]	.bb.
+9	[bbaa]	.bb.
+10	[aabbaa]	.bb.
+SELECT ord,'['||c1||']',COALESCE(LTRIM(c1),'NULL') FROM t1 ORDER BY ord;
+ord	'['||c1||']'	COALESCE(LTRIM(c1),'NULL')
+1	[abc]	abc
+2	[]	NULL
+3	[]	NULL
+4	[ ]	NULL
+5	[      ]	NULL
+6	[   a     ]	a     
+7	[aa]	aa
+8	[aabb]	aabb
+9	[bbaa]	bbaa
+10	[aabbaa]	aabbaa
+SELECT ord,'['||c1||']',COALESCE(RTRIM(c1),'NULL')||'.' FROM t1 ORDER BY ord;
+ord	'['||c1||']'	COALESCE(RTRIM(c1),'NULL')||'.'
+1	[abc]	abc.
+2	[]	NULL.
+3	[]	NULL.
+4	[ ]	NULL.
+5	[      ]	NULL.
+6	[   a     ]	   a.
+7	[aa]	aa.
+8	[aabb]	aabb.
+9	[bbaa]	bbaa.
+10	[aabbaa]	aabbaa.
+EXPLAIN EXTENDED SELECT TRIM('abc'),
+TRIM(BOTH 'a' FROM 'abc'),
+TRIM(LEADING 'a' FROM 'abc'),
+TRIM(TRAILING 'a' FROM 'abc') ;
+id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
+1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
+Warnings:
+Note	1003	select trim_oracle('abc') AS "TRIM('abc')",trim_oracle(both 'a' from 'abc') AS "TRIM(BOTH 'a' FROM 'abc')",trim_oracle(leading 'a' from 'abc') AS "TRIM(LEADING 'a' FROM 'abc')",trim_oracle(trailing 'a' from 'abc') AS "TRIM(TRAILING 'a' FROM 'abc')"
+EXPLAIN EXTENDED SELECT RTRIM('abc'),
+LTRIM('abc');
+id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
+1	SIMPLE	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
+Warnings:
+Note	1003	select rtrim_oracle('abc') AS "RTRIM('abc')",ltrim_oracle('abc') AS "LTRIM('abc')"
+CREATE VIEW v1 AS SELECT ord,TRIM('abc'),RTRIM('abc'),LTRIM('abc'),
+'['||c1||']',
+TRIM(LEADING 'a' FROM c1),
+TRIM(TRAILING 'a' FROM c1),
+TRIM(BOTH 'a' FROM c1),
+LTRIM(c1),
+RTRIM(c1)
+FROM t1 ORDER BY ord ;
+SHOW CREATE VIEW v1;
+View	Create View	character_set_client	collation_connection
+v1	CREATE VIEW "v1" AS select "t1"."ord" AS "ord",trim_oracle('abc') AS "TRIM('abc')",rtrim_oracle('abc') AS "RTRIM('abc')",ltrim_oracle('abc') AS "LTRIM('abc')",concat_operator_oracle(concat_operator_oracle('[',"t1"."c1"),']') AS "'['||c1||']'",trim_oracle(leading 'a' from "t1"."c1") AS "TRIM(LEADING 'a' FROM c1)",trim_oracle(trailing 'a' from "t1"."c1") AS "TRIM(TRAILING 'a' FROM c1)",trim_oracle(both 'a' from "t1"."c1") AS "TRIM(BOTH 'a' FROM c1)",ltrim_oracle("t1"."c1") AS "LTRIM(c1)",rtrim_oracle("t1"."c1") AS "RTRIM(c1)" from "t1" order by "t1"."ord"	latin1	latin1_swedish_ci
+SELECT * FROM v1;
+ord	TRIM('abc')	RTRIM('abc')	LTRIM('abc')	'['||c1||']'	TRIM(LEADING 'a' FROM c1)	TRIM(TRAILING 'a' FROM c1)	TRIM(BOTH 'a' FROM c1)	LTRIM(c1)	RTRIM(c1)
+1	abc	abc	abc	[abc]	bc	abc	bc	abc	abc
+2	abc	abc	abc	[]	NULL	NULL	NULL	NULL	NULL
+3	abc	abc	abc	[]	NULL	NULL	NULL	NULL	NULL
+4	abc	abc	abc	[ ]	 	 	 	NULL	NULL
+5	abc	abc	abc	[      ]	      	      	      	NULL	NULL
+6	abc	abc	abc	[   a     ]	   a     	   a     	   a     	a     	   a
+7	abc	abc	abc	[aa]	NULL	NULL	NULL	aa	aa
+8	abc	abc	abc	[aabb]	bb	aabb	bb	aabb	aabb
+9	abc	abc	abc	[bbaa]	bbaa	bb	bb	bbaa	bbaa
+10	abc	abc	abc	[aabbaa]	bbaa	aabb	bb	aabbaa	aabbaa
+DROP VIEW v1;
+DROP TABLE t1;
+CREATE TABLE t1 (c1 VARCHAR(10) NOT NULL);
+CREATE TABLE t2 AS SELECT TRIM(LEADING 'a' FROM c1) AS C1,
+TRIM(TRAILING 'a' FROM c1) AS C2,
+TRIM(BOTH 'a' FROM c1) AS C3,
+LTRIM(c1) AS C4,
+RTRIM(c1) AS C5
+FROM t1;
+SHOW CREATE TABLE t2;
+Table	Create Table
+t2	CREATE TABLE "t2" (
+  "C1" varchar(10) DEFAULT NULL,
+  "C2" varchar(10) DEFAULT NULL,
+  "C3" varchar(10) DEFAULT NULL,
+  "C4" varchar(10) DEFAULT NULL,
+  "C5" varchar(10) DEFAULT NULL
+)
+DROP TABLE t2;
+DROP TABLE t1;
diff --git a/mysql-test/suite/compat/oracle/t/func_trim.test b/mysql-test/suite/compat/oracle/t/func_trim.test
new file mode 100644
index 0000000..82ed002
--- /dev/null
+++ b/mysql-test/suite/compat/oracle/t/func_trim.test
@@ -0,0 +1,74 @@
+--echo #
+--echo # MDEV-10574 / Trim functions - sql_mode=Oracle: return null instead of empty string
+--echo #
+
+SET sql_mode=ORACLE;
+SELECT TRIM('abc'), TRIM('abc ')||'.', '.'||TRIM(' abc ')||'.', TRIM('  '), TRIM(NULL), TRIM(SPACE(0)),TRIM(SPACE(10)) FROM dual;
+
+SELECT TRIM(TRAILING 'abc' FROM 'abc');
+SELECT TRIM(TRAILING 'abc' FROM 'abc ');
+SELECT TRIM(TRAILING 'abc' FROM ' abc');
+
+SELECT TRIM(LEADING 'abc' FROM 'abc');
+SELECT TRIM(LEADING 'abc' FROM 'abc ');
+SELECT TRIM(LEADING 'abc' FROM ' abc');
+
+SELECT TRIM(BOTH 'abc' FROM 'abc');
+SELECT TRIM(BOTH 'abc' FROM 'abc ');
+SELECT TRIM(BOTH 'abc' FROM ' abc');
+
+SELECT RTRIM('abc'), RTRIM('abc ')||'.', RTRIM(' abc ')||'.', RTRIM('  '), RTRIM(NULL), RTRIM(SPACE(0)),RTRIM(SPACE(10)) FROM dual;
+SELECT LTRIM('abc'), LTRIM('abc '), LTRIM(' abc '), LTRIM('  '), LTRIM(NULL), LTRIM(SPACE(0)),LTRIM(SPACE(10)) FROM dual;
+
+CREATE TABLE t1 (c1 VARCHAR(10),ord INTEGER);
+INSERT INTO t1 VALUES ('abc',1);
+INSERT INTO t1 VALUES (SPACE(0),2);
+INSERT INTO t1 VALUES ('',3);
+INSERT INTO t1 VALUES (' ',4);
+INSERT INTO t1 VALUES ('      ',5);
+INSERT INTO t1 VALUES ('   a     ',6);
+INSERT INTO t1 VALUES ('aa',7);
+INSERT INTO t1 VALUES ('aabb',8);
+INSERT INTO t1 VALUES ('bbaa',9);
+INSERT INTO t1 VALUES ('aabbaa',10);
+
+SELECT ord,'['||c1||']','.'||COALESCE(TRIM(LEADING 'a' FROM c1),'NULL')||'.' FROM t1 ORDER BY ord;
+SELECT ord,'['||c1||']','.'||COALESCE(TRIM(TRAILING 'a' FROM c1),'NULL')||'.' FROM t1 ORDER BY ord;
+SELECT ord,'['||c1||']','.'||COALESCE(TRIM(BOTH 'a' FROM c1),'NULL')||'.' FROM t1 ORDER BY ord;
+SELECT ord,'['||c1||']',COALESCE(LTRIM(c1),'NULL') FROM t1 ORDER BY ord;
+SELECT ord,'['||c1||']',COALESCE(RTRIM(c1),'NULL')||'.' FROM t1 ORDER BY ord;
+
+EXPLAIN EXTENDED SELECT TRIM('abc'),
+                        TRIM(BOTH 'a' FROM 'abc'),
+                        TRIM(LEADING 'a' FROM 'abc'),
+                        TRIM(TRAILING 'a' FROM 'abc') ;
+
+EXPLAIN EXTENDED SELECT RTRIM('abc'),
+                        LTRIM('abc');
+
+
+CREATE VIEW v1 AS SELECT ord,TRIM('abc'),RTRIM('abc'),LTRIM('abc'),
+                         '['||c1||']',
+                         TRIM(LEADING 'a' FROM c1),
+                         TRIM(TRAILING 'a' FROM c1),
+                         TRIM(BOTH 'a' FROM c1),
+                         LTRIM(c1),
+                         RTRIM(c1)
+                  FROM t1 ORDER BY ord ;
+SHOW CREATE VIEW v1;
+SELECT * FROM v1;
+DROP VIEW v1;
+
+DROP TABLE t1;
+
+CREATE TABLE t1 (c1 VARCHAR(10) NOT NULL);
+CREATE TABLE t2 AS SELECT TRIM(LEADING 'a' FROM c1) AS C1,
+                          TRIM(TRAILING 'a' FROM c1) AS C2,
+                          TRIM(BOTH 'a' FROM c1) AS C3,
+                          LTRIM(c1) AS C4,
+                          RTRIM(c1) AS C5
+        FROM t1;
+SHOW CREATE TABLE t2;
+DROP TABLE t2;
+DROP TABLE t1;
+
diff --git a/sql/item_create.cc b/sql/item_create.cc
index edff1a8..1380f46 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -2250,6 +2250,19 @@ class Create_func_ltrim : public Create_func_arg1
 };
 
 
+class Create_func_ltrim_oracle : public Create_func_arg1
+{
+public:
+  virtual Item *create_1_arg(THD *thd, Item *arg1);
+
+  static Create_func_ltrim_oracle s_singleton;
+
+protected:
+  Create_func_ltrim_oracle() {}
+  virtual ~Create_func_ltrim_oracle() {}
+};
+
+
 class Create_func_makedate : public Create_func_arg2
 {
 public:
@@ -2690,6 +2703,19 @@ class Create_func_rtrim : public Create_func_arg1
 };
 
 
+class Create_func_rtrim_oracle : public Create_func_arg1
+{
+public:
+  virtual Item *create_1_arg(THD *thd, Item *arg1);
+
+  static Create_func_rtrim_oracle s_singleton;
+
+protected:
+  Create_func_rtrim_oracle() {}
+  virtual ~Create_func_rtrim_oracle() {}
+};
+
+
 class Create_func_sec_to_time : public Create_func_arg1
 {
 public:
@@ -3008,6 +3034,19 @@ class Create_func_touches : public Create_func_arg2
 #endif
 
 
+class Create_func_trim_oracle : public Create_func_arg1
+{
+public:
+  virtual Item *create_1_arg(THD *thd, Item *arg1);
+
+  static Create_func_trim_oracle s_singleton;
+
+protected:
+  Create_func_trim_oracle() {}
+  virtual ~Create_func_trim_oracle() {}
+};
+
+
 class Create_func_ucase : public Create_func_arg1
 {
 public:
@@ -5853,7 +5892,16 @@ Create_func_ltrim Create_func_ltrim::s_singleton;
 Item*
 Create_func_ltrim::create_1_arg(THD *thd, Item *arg1)
 {
-  return new (thd->mem_root) Item_func_ltrim(thd, arg1);
+  return thd->lex->make_item_func_ltrim(thd, 5, arg1);
+}
+
+
+Create_func_ltrim_oracle Create_func_ltrim_oracle::s_singleton;
+
+Item*
+Create_func_ltrim_oracle::create_1_arg(THD *thd, Item *arg1)
+{
+  return new (thd->mem_root) Item_func_ltrim_oracle(thd, arg1);
 }
 
 
@@ -6350,7 +6398,16 @@ Create_func_rtrim Create_func_rtrim::s_singleton;
 Item*
 Create_func_rtrim::create_1_arg(THD *thd, Item *arg1)
 {
-  return new (thd->mem_root) Item_func_rtrim(thd, arg1);
+  return thd->lex->make_item_func_rtrim(thd, 5, arg1);
+}
+
+
+Create_func_rtrim_oracle Create_func_rtrim_oracle::s_singleton;
+
+Item*
+Create_func_rtrim_oracle::create_1_arg(THD *thd, Item *arg1)
+{
+  return new (thd->mem_root) Item_func_rtrim_oracle(thd, arg1);
 }
 
 
@@ -6605,6 +6662,15 @@ Create_func_touches::create_2_arg(THD *thd, Item *arg1, Item *arg2)
 #endif
 
 
+Create_func_trim_oracle Create_func_trim_oracle::s_singleton;
+
+Item*
+Create_func_trim_oracle::create_1_arg(THD *thd, Item *arg1)
+{
+  return new (thd->mem_root) Item_func_trim_oracle(thd, arg1);
+}
+
+
 Create_func_ucase Create_func_ucase::s_singleton;
 
 Item*
@@ -7016,6 +7082,7 @@ static Native_func_registry func_array[] =
   { { C_STRING_WITH_LEN("LOWER") }, BUILDER(Create_func_lcase)},
   { { C_STRING_WITH_LEN("LPAD") }, BUILDER(Create_func_lpad)},
   { { C_STRING_WITH_LEN("LTRIM") }, BUILDER(Create_func_ltrim)},
+  { { C_STRING_WITH_LEN("LTRIM_ORACLE") }, BUILDER(Create_func_ltrim_oracle)},
   { { C_STRING_WITH_LEN("MAKEDATE") }, BUILDER(Create_func_makedate)},
   { { C_STRING_WITH_LEN("MAKETIME") }, BUILDER(Create_func_maketime)},
   { { C_STRING_WITH_LEN("MAKE_SET") }, BUILDER(Create_func_make_set)},
@@ -7080,6 +7147,7 @@ static Native_func_registry func_array[] =
   { { C_STRING_WITH_LEN("ROUND") }, BUILDER(Create_func_round)},
   { { C_STRING_WITH_LEN("RPAD") }, BUILDER(Create_func_rpad)},
   { { C_STRING_WITH_LEN("RTRIM") }, BUILDER(Create_func_rtrim)},
+  { { C_STRING_WITH_LEN("RTRIM_ORACLE") }, BUILDER(Create_func_rtrim_oracle)},
   { { C_STRING_WITH_LEN("SEC_TO_TIME") }, BUILDER(Create_func_sec_to_time)},
   { { C_STRING_WITH_LEN("SHA") }, BUILDER(Create_func_sha)},
   { { C_STRING_WITH_LEN("SHA1") }, BUILDER(Create_func_sha)},
@@ -7186,6 +7254,7 @@ static Native_func_registry func_array[] =
   { { C_STRING_WITH_LEN("TO_BASE64") }, BUILDER(Create_func_to_base64)},
   { { C_STRING_WITH_LEN("TO_DAYS") }, BUILDER(Create_func_to_days)},
   { { C_STRING_WITH_LEN("TO_SECONDS") }, BUILDER(Create_func_to_seconds)},
+  { { C_STRING_WITH_LEN("TRIM_ORACLE") }, BUILDER(Create_func_trim_oracle)},
   { { C_STRING_WITH_LEN("UCASE") }, BUILDER(Create_func_ucase)},
   { { C_STRING_WITH_LEN("UNCOMPRESS") }, BUILDER(Create_func_uncompress)},
   { { C_STRING_WITH_LEN("UNCOMPRESSED_LENGTH") }, BUILDER(Create_func_uncompressed_length)},
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 64fc84a..13dd985 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -2116,6 +2116,7 @@ void Item_func_trim::print(String *str, enum_query_type query_type)
     return;
   }
   str->append(Item_func_trim::func_name());
+  str->append(func_name_ext());
   str->append('(');
   str->append(mode_name());
   str->append(' ');
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index 3c8a699..d61bc21 100644
--- a/sql/item_strfunc.h
+++ b/sql/item_strfunc.h
@@ -539,6 +539,9 @@ class Item_func_trim :public Item_str_func
   String remove;
   String *trimmed_value(String *res, uint32 offset, uint32 length)
   {
+    if (length == 0)
+      return make_empty_result();
+
     tmp_value.set(*res, offset, length);
     /*
       Make sure to return correct charset and collation:
@@ -552,6 +555,7 @@ class Item_func_trim :public Item_str_func
   {
     return trimmed_value(res, 0, res->length());
   }
+  virtual const char *func_name_ext() const { return ""; }
 public:
   Item_func_trim(THD *thd, Item *a, Item *b): Item_str_func(thd, a, b) {}
   Item_func_trim(THD *thd, Item *a): Item_str_func(thd, a) {}
@@ -565,6 +569,27 @@ class Item_func_trim :public Item_str_func
 };
 
 
+class Item_func_trim_oracle :public Item_func_trim
+{
+protected:
+  String *make_empty_result()
+  { null_value= 1; return NULL; }
+  const char *func_name_ext() const { return "_oracle"; }
+public:
+  Item_func_trim_oracle(THD *thd, Item *a, Item *b):
+    Item_func_trim(thd, a, b) {}
+  Item_func_trim_oracle(THD *thd, Item *a): Item_func_trim(thd, a) {}
+  const char *func_name() const { return "trim_oracle"; }
+  void fix_length_and_dec()
+  {
+    Item_func_trim::fix_length_and_dec();
+    maybe_null= true;
+  }
+  Item *get_copy(THD *thd, MEM_ROOT *mem_root)
+  { return get_item_copy<Item_func_trim_oracle>(thd, mem_root, this); }
+};
+
+
 class Item_func_ltrim :public Item_func_trim
 {
 public:
@@ -578,6 +603,27 @@ class Item_func_ltrim :public Item_func_trim
 };
 
 
+class Item_func_ltrim_oracle :public Item_func_ltrim
+{
+protected:
+  String *make_empty_result()
+  { null_value= 1; return NULL; }
+  const char *func_name_ext() const { return "_oracle"; }
+public:
+  Item_func_ltrim_oracle(THD *thd, Item *a, Item *b):
+    Item_func_ltrim(thd, a, b) {}
+  Item_func_ltrim_oracle(THD *thd, Item *a): Item_func_ltrim(thd, a) {}
+  const char *func_name() const { return "ltrim_oracle"; }
+  void fix_length_and_dec()
+  {
+    Item_func_ltrim::fix_length_and_dec();
+    maybe_null= true;
+  }
+  Item *get_copy(THD *thd, MEM_ROOT *mem_root)
+  { return get_item_copy<Item_func_ltrim_oracle>(thd, mem_root, this); }
+};
+
+
 class Item_func_rtrim :public Item_func_trim
 {
 public:
@@ -591,6 +637,26 @@ class Item_func_rtrim :public Item_func_trim
 };
 
 
+class Item_func_rtrim_oracle :public Item_func_rtrim
+{
+protected:
+  String *make_empty_result()
+  { null_value= 1; return NULL; }
+  const char *func_name_ext() const { return "_oracle"; }
+public:
+  Item_func_rtrim_oracle(THD *thd, Item *a, Item *b):
+    Item_func_rtrim(thd, a, b) {}
+  Item_func_rtrim_oracle(THD *thd, Item *a): Item_func_rtrim(thd, a) {}
+  const char *func_name() const { return "rtrim_oracle"; }
+  void fix_length_and_dec()
+  {
+    Item_func_rtrim::fix_length_and_dec();
+    maybe_null= true;
+  }
+  Item *get_copy(THD *thd, MEM_ROOT *mem_root)
+  { return get_item_copy<Item_func_rtrim_oracle>(thd, mem_root, this); }
+};
+
 /*
   Item_func_password -- new (4.1.1) PASSWORD() function implementation.
   Returns strcat('*', octet2hex(sha1(sha1(password)))). '*' stands for new
diff --git a/sql/lex.h b/sql/lex.h
index d11ba19..8bdef7d 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -759,6 +759,7 @@ static SYMBOL sql_functions[] = {
   { "SYSDATE",		SYM(SYSDATE)},
   { "SYSTEM_USER",      SYM(USER_SYM)},
   { "TRIM",		SYM(TRIM)},
+  { "TRIM_ORACLE",		SYM(TRIM)},
   { "VARIANCE",		SYM(VARIANCE_SYM)},
   { "VAR_POP",		SYM(VARIANCE_SYM)},
   { "VAR_SAMP",		SYM(VAR_SAMP_SYM)},
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index e870d8e..b053e04 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -7647,3 +7647,51 @@ Item *LEX::make_item_func_replace(THD *thd,
     new (thd->mem_root) Item_func_replace_oracle(thd, org, find, replace) :
     new (thd->mem_root) Item_func_replace(thd, org, find, replace);
 }
+
+
+Item *LEX::make_item_func_trim(THD *thd, uint flen, Item *a, Item *b)
+{
+  return (thd->variables.sql_mode & MODE_ORACLE) || flen > 5 ?
+    new (thd->mem_root) Item_func_trim_oracle(thd, a, b) :
+    new (thd->mem_root) Item_func_trim(thd, a, b);
+}
+
+
+Item *LEX::make_item_func_trim(THD *thd, uint flen, Item *a)
+{
+  return (thd->variables.sql_mode & MODE_ORACLE) || flen > 5 ?
+    new (thd->mem_root) Item_func_trim_oracle(thd, a) :
+    new (thd->mem_root) Item_func_trim(thd, a);
+}
+
+
+Item *LEX::make_item_func_ltrim(THD *thd, uint flen, Item *a, Item *b)
+{
+  return (thd->variables.sql_mode & MODE_ORACLE) || flen > 5 ?
+    new (thd->mem_root) Item_func_ltrim_oracle(thd, a, b) :
+    new (thd->mem_root) Item_func_ltrim(thd, a, b);
+}
+
+
+Item *LEX::make_item_func_ltrim(THD *thd, uint flen, Item *a)
+{
+  return (thd->variables.sql_mode & MODE_ORACLE) || flen > 5 ?
+    new (thd->mem_root) Item_func_ltrim_oracle(thd, a) :
+    new (thd->mem_root) Item_func_ltrim(thd, a);
+}
+
+
+Item *LEX::make_item_func_rtrim(THD *thd, uint flen, Item *a, Item *b)
+{
+  return (thd->variables.sql_mode & MODE_ORACLE) || flen > 5 ?
+    new (thd->mem_root) Item_func_rtrim_oracle(thd, a, b) :
+    new (thd->mem_root) Item_func_rtrim(thd, a, b);
+}
+
+
+Item *LEX::make_item_func_rtrim(THD *thd, uint flen, Item *a)
+{
+  return (thd->variables.sql_mode & MODE_ORACLE) || flen > 5 ?
+    new (thd->mem_root) Item_func_rtrim_oracle(thd, a) :
+    new (thd->mem_root) Item_func_rtrim(thd, a);
+}
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 3fa105a..8e07697 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -3415,6 +3415,13 @@ struct LEX: public Query_tables_list
   Item *make_item_func_replace(THD *thd, Item *org, Item *find, Item *replace);
   Item *make_item_func_substr(THD *thd, Item *a, Item *b, Item *c);
   Item *make_item_func_substr(THD *thd, Item *a, Item *b);
+  Item *make_item_func_trim(THD *thd, uint flen, Item *a, Item *b);
+  Item *make_item_func_trim(THD *thd, uint flen, Item *a);
+  Item *make_item_func_ltrim(THD *thd, uint flen, Item *a, Item *b);
+  Item *make_item_func_ltrim(THD *thd, uint flen, Item *a);
+  Item *make_item_func_rtrim(THD *thd, uint flen, Item *a, Item *b);
+  Item *make_item_func_rtrim(THD *thd, uint flen, Item *a);
+
   my_var *create_outvar(THD *thd, const LEX_CSTRING *name);
 
   /*
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 15413d4..5781d9b 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -9831,50 +9831,58 @@ function_call_keyword:
           }
         | TRIM '(' expr ')'
           {
-            $$= new (thd->mem_root) Item_func_trim(thd, $3);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_trim(thd,
+                                               yyval.symbol.symbol->length,
+                                               $3)))
               MYSQL_YYABORT;
           }
         | TRIM '(' LEADING expr FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_ltrim(thd, $6, $4);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_ltrim(thd,
+                                                yyval.symbol.symbol->length,
+                                                $6, $4)))
               MYSQL_YYABORT;
           }
         | TRIM '(' TRAILING expr FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_rtrim(thd, $6, $4);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_rtrim(thd,
+                                               yyval.symbol.symbol->length,
+                                               $6, $4)))
               MYSQL_YYABORT;
           }
         | TRIM '(' BOTH expr FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_trim(thd, $6, $4);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_trim(thd,
+                                               yyval.symbol.symbol->length,
+                                               $6, $4)))
               MYSQL_YYABORT;
           }
         | TRIM '(' LEADING FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_ltrim(thd, $5);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_ltrim(thd,
+                                                yyval.symbol.symbol->length,
+                                                $5)))
               MYSQL_YYABORT;
           }
         | TRIM '(' TRAILING FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_rtrim(thd, $5);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_rtrim(thd,
+                                                yyval.symbol.symbol->length,
+                                                $5)))
               MYSQL_YYABORT;
           }
         | TRIM '(' BOTH FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_trim(thd, $5);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_trim(thd,
+                                               yyval.symbol.symbol->length,
+                                               $5)))
               MYSQL_YYABORT;
           }
         | TRIM '(' expr FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_trim(thd, $5, $3);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_trim(thd,
+                                               yyval.symbol.symbol->length,
+                                               $5, $3)))
               MYSQL_YYABORT;
           }
         | USER_SYM '(' ')'
diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy
index 46cfdb5..a06bc8e 100644
--- a/sql/sql_yacc_ora.yy
+++ b/sql/sql_yacc_ora.yy
@@ -10042,50 +10042,58 @@ function_call_keyword:
           }
         | TRIM '(' expr ')'
           {
-            $$= new (thd->mem_root) Item_func_trim(thd, $3);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_trim(thd,
+                                               yyval.symbol.symbol->length,
+                                               $3)))
               MYSQL_YYABORT;
           }
         | TRIM '(' LEADING expr FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_ltrim(thd, $6, $4);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_ltrim(thd,
+                                                yyval.symbol.symbol->length,
+                                                $6, $4)))
               MYSQL_YYABORT;
           }
         | TRIM '(' TRAILING expr FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_rtrim(thd, $6, $4);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_rtrim(thd,
+                                                yyval.symbol.symbol->length,
+                                                $6, $4)))
               MYSQL_YYABORT;
           }
         | TRIM '(' BOTH expr FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_trim(thd, $6, $4);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_trim(thd,
+                                               yyval.symbol.symbol->length,
+                                               $6, $4)))
               MYSQL_YYABORT;
           }
         | TRIM '(' LEADING FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_ltrim(thd, $5);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_ltrim(thd,
+                                                yyval.symbol.symbol->length,
+                                                $5)))
               MYSQL_YYABORT;
           }
         | TRIM '(' TRAILING FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_rtrim(thd, $5);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_rtrim(thd,
+                                                yyval.symbol.symbol->length,
+                                                $5)))
               MYSQL_YYABORT;
           }
         | TRIM '(' BOTH FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_trim(thd, $5);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_trim(thd,
+                                               yyval.symbol.symbol->length,
+                                               $5)))
               MYSQL_YYABORT;
           }
         | TRIM '(' expr FROM expr ')'
           {
-            $$= new (thd->mem_root) Item_func_trim(thd, $5, $3);
-            if ($$ == NULL)
+            if (!($$= Lex->make_item_func_trim(thd,
+                                               yyval.symbol.symbol->length,
+                                               $5, $3)))
               MYSQL_YYABORT;
           }
         | USER_SYM '(' ')'
