Skip to content

Commit d509981

Browse files
author
Alexander Barkov
committed
Merge remote-tracking branch 'origin/bb-10.2-ext' into 10.3
2 parents 1a0b573 + 42433a2 commit d509981

File tree

3 files changed

+75
-12
lines changed

3 files changed

+75
-12
lines changed

mysql-test/suite/compat/oracle/r/func_substr.result

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
#
2+
# MDEV-14012 - sql_mode=Oracle: substr(): treat position 0 as position 1
3+
# MDEV-10574 - sql_mode=Oracle: return null instead of empty string
4+
#
15
SET sql_mode=ORACLE;
26
SELECT SUBSTR('abc',2,1),SUBSTR('abc',1,1), SUBSTR('abc',0,1) FROM dual;
37
SUBSTR('abc',2,1) SUBSTR('abc',1,1) SUBSTR('abc',0,1)
@@ -22,19 +26,52 @@ SUBSTR('abc',2,null) SUBSTR('abc',1,null) SUBSTR('abc',0,null)
2226
NULL NULL NULL
2327
SELECT SUBSTR('abc',2,0),SUBSTR('abc',1,0), SUBSTR('abc',0,0) FROM dual;
2428
SUBSTR('abc',2,0) SUBSTR('abc',1,0) SUBSTR('abc',0,0)
25-
26-
create table t1 (c1 varchar(10),start integer, length integer);
29+
NULL NULL NULL
30+
SELECT SUBSTR('abc',2,-1),SUBSTR('abc',1,-1), SUBSTR('abc',0,-1) FROM dual;
31+
SUBSTR('abc',2,-1) SUBSTR('abc',1,-1) SUBSTR('abc',0,-1)
32+
NULL NULL NULL
33+
SELECT SUBSTR(SPACE(0),1) FROM DUAL;
34+
SUBSTR(SPACE(0),1)
35+
NULL
36+
CREATE TABLE t1 (c1 VARCHAR(10),start INTEGER, length INTEGER);
2737
INSERT INTO t1 VALUES ('abc', 1, 1);
2838
INSERT INTO t1 VALUES ('abc', 0, 1);
2939
INSERT INTO t1 VALUES (null, 1, 1);
3040
INSERT INTO t1 VALUES (null, 0, 1);
31-
select substr(c1,start,length) from t1;
32-
substr(c1,start,length)
41+
INSERT INTO t1 VALUES ('abc', 1, 0);
42+
INSERT INTO t1 VALUES ('abc', 0, 0);
43+
INSERT INTO t1 VALUES (null, 1, 0);
44+
INSERT INTO t1 VALUES (null, 0, 0);
45+
INSERT INTO t1 VALUES ('abc', 1, -1);
46+
INSERT INTO t1 VALUES ('abc', 0, -1);
47+
INSERT INTO t1 VALUES (null, 1, -1);
48+
INSERT INTO t1 VALUES (null, 0, -1);
49+
INSERT INTO t1 VALUES (SPACE(0), 0, 1);
50+
SELECT SUBSTR(c1,start,length) FROM t1;
51+
SUBSTR(c1,start,length)
3352
a
3453
a
3554
NULL
3655
NULL
37-
drop table t1;
56+
NULL
57+
NULL
58+
NULL
59+
NULL
60+
NULL
61+
NULL
62+
NULL
63+
NULL
64+
NULL
65+
DROP TABLE t1;
66+
CREATE TABLE t1 (c1 VARCHAR(10) NOT NULL);
67+
CREATE TABLE t2 AS SELECT SUBSTR(C1,1,1) AS C1 from t1;
68+
SHOW CREATE TABLE t2;
69+
Table Create Table
70+
t2 CREATE TABLE "t2" (
71+
"C1" varchar(1) DEFAULT NULL
72+
)
73+
DROP TABLE t2;
74+
DROP TABLE t1;
3875
EXPLAIN EXTENDED SELECT SUBSTR('abc',2,1) ;
3976
id select_type table type possible_keys key key_len ref rows filtered Extra
4077
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used

mysql-test/suite/compat/oracle/t/func_substr.test

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
#
2-
# MDEV-14012 - sql_mode=Oracle: substr(): treat position 0 as position 1
3-
#
1+
--echo #
2+
--echo # MDEV-14012 - sql_mode=Oracle: substr(): treat position 0 as position 1
3+
--echo # MDEV-10574 - sql_mode=Oracle: return null instead of empty string
4+
--echo #
45

56
SET sql_mode=ORACLE;
67
SELECT SUBSTR('abc',2,1),SUBSTR('abc',1,1), SUBSTR('abc',0,1) FROM dual;
@@ -11,14 +12,32 @@ SELECT SUBSTR('abc',-2,1),SUBSTR('abc',-1,1), SUBSTR('abc',-0,1) FROM dual;
1112
SELECT SUBSTR('abc',null) FROM dual;
1213
SELECT SUBSTR('abc',2,null),SUBSTR('abc',1,null), SUBSTR('abc',0,null) FROM dual;
1314
SELECT SUBSTR('abc',2,0),SUBSTR('abc',1,0), SUBSTR('abc',0,0) FROM dual;
15+
SELECT SUBSTR('abc',2,-1),SUBSTR('abc',1,-1), SUBSTR('abc',0,-1) FROM dual;
16+
SELECT SUBSTR(SPACE(0),1) FROM DUAL;
1417

15-
create table t1 (c1 varchar(10),start integer, length integer);
18+
CREATE TABLE t1 (c1 VARCHAR(10),start INTEGER, length INTEGER);
1619
INSERT INTO t1 VALUES ('abc', 1, 1);
1720
INSERT INTO t1 VALUES ('abc', 0, 1);
1821
INSERT INTO t1 VALUES (null, 1, 1);
1922
INSERT INTO t1 VALUES (null, 0, 1);
20-
select substr(c1,start,length) from t1;
21-
drop table t1;
23+
INSERT INTO t1 VALUES ('abc', 1, 0);
24+
INSERT INTO t1 VALUES ('abc', 0, 0);
25+
INSERT INTO t1 VALUES (null, 1, 0);
26+
INSERT INTO t1 VALUES (null, 0, 0);
27+
INSERT INTO t1 VALUES ('abc', 1, -1);
28+
INSERT INTO t1 VALUES ('abc', 0, -1);
29+
INSERT INTO t1 VALUES (null, 1, -1);
30+
INSERT INTO t1 VALUES (null, 0, -1);
31+
INSERT INTO t1 VALUES (SPACE(0), 0, 1);
32+
33+
SELECT SUBSTR(c1,start,length) FROM t1;
34+
DROP TABLE t1;
35+
36+
CREATE TABLE t1 (c1 VARCHAR(10) NOT NULL);
37+
CREATE TABLE t2 AS SELECT SUBSTR(C1,1,1) AS C1 from t1;
38+
SHOW CREATE TABLE t2;
39+
DROP TABLE t2;
40+
DROP TABLE t1;
2241

2342
EXPLAIN EXTENDED SELECT SUBSTR('abc',2,1) ;
2443

sql/item_strfunc.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class Item_str_func :public Item_func
3535
character set. No memory is allocated.
3636
@retval A pointer to the str_value member.
3737
*/
38-
String *make_empty_result()
38+
virtual String *make_empty_result()
3939
{
4040
/*
4141
Reset string length to an empty string. We don't use str_value.set() as
@@ -500,11 +500,18 @@ class Item_func_substr_oracle :public Item_func_substr
500500
protected:
501501
longlong get_position()
502502
{ longlong pos= args[1]->val_int(); return pos == 0 ? 1 : pos; }
503+
String *make_empty_result()
504+
{ null_value= 1; return NULL; }
503505
public:
504506
Item_func_substr_oracle(THD *thd, Item *a, Item *b):
505507
Item_func_substr(thd, a, b) {}
506508
Item_func_substr_oracle(THD *thd, Item *a, Item *b, Item *c):
507509
Item_func_substr(thd, a, b, c) {}
510+
void fix_length_and_dec()
511+
{
512+
Item_func_substr::fix_length_and_dec();
513+
maybe_null= true;
514+
}
508515
const char *func_name() const { return "substr_oracle"; }
509516
Item *get_copy(THD *thd)
510517
{ return get_item_copy<Item_func_substr_oracle>(thd, this); }

0 commit comments

Comments
 (0)