From 87d952746f46679128ad5d73fb690ddfce325ace Mon Sep 17 00:00:00 2001 From: halfspawn Date: Thu, 18 May 2017 11:43:24 +0200 Subject: [PATCH] MDEV-12783 : sql_mode=ORACLE: Functions LENGTH() and LENGTHB() --- mysql-test/r/func_str.result | 11 ++++++++++ .../suite/compat/oracle/r/func_length.result | 21 +++++++++++++++++++ .../suite/compat/oracle/t/func_length.test | 18 ++++++++++++++++ mysql-test/t/func_str.test | 5 +++++ sql/item_create.cc | 3 +-- 5 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 mysql-test/suite/compat/oracle/r/func_length.result create mode 100644 mysql-test/suite/compat/oracle/t/func_length.test diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result index 28ed3cef9b4..34c28e694ce 100644 --- a/mysql-test/r/func_str.result +++ b/mysql-test/r/func_str.result @@ -4876,5 +4876,16 @@ IF(a<' ',HEX(a),a) a DROP TABLE t1; # +# MDEV-12783 sql_mode=ORACLE: Functions LENGTH() and LENGTHB() +# +SELECT LENGTHB('a'), LENGTHB(_utf8 0xC39F), LENGTHB(123), LENGTH(null); +LENGTHB('a') LENGTHB(_utf8 0xC39F) LENGTHB(123) LENGTH(null) +1 2 3 NULL +EXPLAIN EXTENDED SELECT LENGTH('a'), LENGTHB('a'); +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 octet_length('a') AS `LENGTH('a')`,octet_length('a') AS `LENGTHB('a')` +# # End of 10.3 tests # diff --git a/mysql-test/suite/compat/oracle/r/func_length.result b/mysql-test/suite/compat/oracle/r/func_length.result new file mode 100644 index 00000000000..e260f5ad6da --- /dev/null +++ b/mysql-test/suite/compat/oracle/r/func_length.result @@ -0,0 +1,21 @@ +SET sql_mode=ORACLE; +# +# MDEV-12783 sql_mode=ORACLE: Functions LENGTH() and LENGTHB() +# +SELECT LENGTH(null), LENGTH('a'), LENGTH(123); +LENGTH(null) LENGTH('a') LENGTH(123) +NULL 1 3 +SELECT LENGTHB(null), LENGTHB('a'), LENGTHB(123); +LENGTHB(null) LENGTHB('a') LENGTHB(123) +NULL 1 3 +SELECT LENGTH(_utf8 0xC39F), LENGTH(CHAR(14844588 USING utf8)); +LENGTH(_utf8 0xC39F) LENGTH(CHAR(14844588 USING utf8)) +1 1 +SELECT LENGTHB(_utf8 0xC39F), LENGTHB(CHAR(14844588 USING utf8)); +LENGTHB(_utf8 0xC39F) LENGTHB(CHAR(14844588 USING utf8)) +2 3 +EXPLAIN EXTENDED SELECT LENGTH('a'), LENGTHB('a'); +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 char_length('a') AS "LENGTH('a')",octet_length('a') AS "LENGTHB('a')" diff --git a/mysql-test/suite/compat/oracle/t/func_length.test b/mysql-test/suite/compat/oracle/t/func_length.test new file mode 100644 index 00000000000..7b76d33a02f --- /dev/null +++ b/mysql-test/suite/compat/oracle/t/func_length.test @@ -0,0 +1,18 @@ +SET sql_mode=ORACLE; + +--echo # +--echo # MDEV-12783 sql_mode=ORACLE: Functions LENGTH() and LENGTHB() +--echo # +# +# Testing LENGTH / LENGTHB +# +# LENGTH : return the length of char +# LENGTHB : return the length of byte + + +SELECT LENGTH(null), LENGTH('a'), LENGTH(123); +SELECT LENGTHB(null), LENGTHB('a'), LENGTHB(123); + +SELECT LENGTH(_utf8 0xC39F), LENGTH(CHAR(14844588 USING utf8)); +SELECT LENGTHB(_utf8 0xC39F), LENGTHB(CHAR(14844588 USING utf8)); +EXPLAIN EXTENDED SELECT LENGTH('a'), LENGTHB('a'); diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test index 29a9510db00..c4694619a1f 100644 --- a/mysql-test/t/func_str.test +++ b/mysql-test/t/func_str.test @@ -1883,6 +1883,11 @@ INSERT INTO t1 VALUES (0x09),('a'); SELECT IF(a<' ',HEX(a),a) FROM t1 ORDER BY a; DROP TABLE t1; +--echo # +--echo # MDEV-12783 sql_mode=ORACLE: Functions LENGTH() and LENGTHB() +--echo # +SELECT LENGTHB('a'), LENGTHB(_utf8 0xC39F), LENGTHB(123), LENGTH(null); +EXPLAIN EXTENDED SELECT LENGTH('a'), LENGTHB('a'); --echo # --echo # End of 10.3 tests diff --git a/sql/item_create.cc b/sql/item_create.cc index 60b39035d1b..50e7fccee18 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -5684,11 +5684,9 @@ Create_func_length Create_func_length::s_singleton; Item* Create_func_length::create_1_arg(THD *thd, Item *arg1) { -#if 0 // Not yet if (thd->variables.sql_mode & MODE_ORACLE) return new (thd->mem_root) Item_func_char_length(thd, arg1); else -#endif return new (thd->mem_root) Item_func_octet_length(thd, arg1); } @@ -6978,6 +6976,7 @@ static Native_func_registry func_array[] = { { C_STRING_WITH_LEN("LCASE") }, BUILDER(Create_func_lcase)}, { { C_STRING_WITH_LEN("LEAST") }, BUILDER(Create_func_least)}, { { C_STRING_WITH_LEN("LENGTH") }, BUILDER(Create_func_length)}, + { { C_STRING_WITH_LEN("LENGTHB") }, BUILDER(Create_func_octet_length)}, #ifndef DBUG_OFF { { C_STRING_WITH_LEN("LIKE_RANGE_MIN") }, BUILDER(Create_func_like_range_min)}, { { C_STRING_WITH_LEN("LIKE_RANGE_MAX") }, BUILDER(Create_func_like_range_max)},