mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-10596 Allow VARCHAR and VARCHAR2 without length as a data type of routine parameters and in RETURN clause
This commit is contained in:
@ -652,19 +652,19 @@ Pos Instruction
|
|||||||
0 set total@4 0
|
0 set total@4 0
|
||||||
1 set ia@5 1
|
1 set ia@5 1
|
||||||
2 set [upper_bound]@6 a@0
|
2 set [upper_bound]@6 a@0
|
||||||
3 jump_if_not 17(17) (ia@5 <= [upper_bound]@6)
|
3 jump_if_not 17(17) ia@5 <= [upper_bound]@6
|
||||||
4 set total@4 (total@4 + 1000)
|
4 set total@4 total@4 + 1000
|
||||||
5 set ib@7 1
|
5 set ib@7 1
|
||||||
6 set [upper_bound]@8 b@2
|
6 set [upper_bound]@8 b@2
|
||||||
7 jump_if_not 15(15) (ib@7 <= [upper_bound]@8)
|
7 jump_if_not 15(15) ib@7 <= [upper_bound]@8
|
||||||
8 set total@4 (total@4 + 1)
|
8 set total@4 total@4 + 1
|
||||||
9 jump_if_not 11(0) (ib@7 = limitb@3)
|
9 jump_if_not 11(0) ib@7 = limitb@3
|
||||||
10 jump 15
|
10 jump 15
|
||||||
11 jump_if_not 13(0) (ia@5 = limita@1)
|
11 jump_if_not 13(0) ia@5 = limita@1
|
||||||
12 jump 17
|
12 jump 17
|
||||||
13 set ib@7 (ib@7 + 1)
|
13 set ib@7 ib@7 + 1
|
||||||
14 jump 7
|
14 jump 7
|
||||||
15 set ia@5 (ia@5 + 1)
|
15 set ia@5 ia@5 + 1
|
||||||
16 jump 3
|
16 jump 3
|
||||||
17 freturn 3 total@4
|
17 freturn 3 total@4
|
||||||
SELECT f1(2, 1, 2, 2) FROM DUAL;
|
SELECT f1(2, 1, 2, 2) FROM DUAL;
|
||||||
@ -699,13 +699,13 @@ Pos Instruction
|
|||||||
0 set total@1 0
|
0 set total@1 0
|
||||||
1 set i@2 1
|
1 set i@2 1
|
||||||
2 set [upper_bound]@3 a@0
|
2 set [upper_bound]@3 a@0
|
||||||
3 jump_if_not 11(11) (i@2 <= [upper_bound]@3)
|
3 jump_if_not 11(11) i@2 <= [upper_bound]@3
|
||||||
4 set total@1 (total@1 + 1000)
|
4 set total@1 total@1 + 1000
|
||||||
5 jump_if_not 8(8) (i@2 = 5)
|
5 jump_if_not 8(8) i@2 = 5
|
||||||
6 set i@2 (i@2 + 1)
|
6 set i@2 i@2 + 1
|
||||||
7 jump 3
|
7 jump 3
|
||||||
8 set total@1 (total@1 + 1)
|
8 set total@1 total@1 + 1
|
||||||
9 set i@2 (i@2 + 1)
|
9 set i@2 i@2 + 1
|
||||||
10 jump 3
|
10 jump 3
|
||||||
11 freturn 3 total@1
|
11 freturn 3 total@1
|
||||||
SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
|
SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
|
||||||
@ -736,18 +736,18 @@ Pos Instruction
|
|||||||
0 set total@1 0
|
0 set total@1 0
|
||||||
1 set i@2 1
|
1 set i@2 1
|
||||||
2 set [upper_bound]@3 a@0
|
2 set [upper_bound]@3 a@0
|
||||||
3 jump_if_not 16(16) (i@2 <= [upper_bound]@3)
|
3 jump_if_not 16(16) i@2 <= [upper_bound]@3
|
||||||
4 set j@4 1
|
4 set j@4 1
|
||||||
5 set [upper_bound]@5 2
|
5 set [upper_bound]@5 2
|
||||||
6 jump_if_not 14(14) (j@4 <= [upper_bound]@5)
|
6 jump_if_not 14(14) j@4 <= [upper_bound]@5
|
||||||
7 set total@1 (total@1 + 1000)
|
7 set total@1 total@1 + 1000
|
||||||
8 jump_if_not 11(11) (i@2 = 5)
|
8 jump_if_not 11(11) i@2 = 5
|
||||||
9 set i@2 (i@2 + 1)
|
9 set i@2 i@2 + 1
|
||||||
10 jump 3
|
10 jump 3
|
||||||
11 set total@1 (total@1 + 1)
|
11 set total@1 total@1 + 1
|
||||||
12 set j@4 (j@4 + 1)
|
12 set j@4 j@4 + 1
|
||||||
13 jump 6
|
13 jump 6
|
||||||
14 set i@2 (i@2 + 1)
|
14 set i@2 i@2 + 1
|
||||||
15 jump 3
|
15 jump 3
|
||||||
16 freturn 3 total@1
|
16 freturn 3 total@1
|
||||||
SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
|
SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
|
||||||
@ -779,18 +779,18 @@ Pos Instruction
|
|||||||
0 set total@1 0
|
0 set total@1 0
|
||||||
1 set j@2 1
|
1 set j@2 1
|
||||||
2 set [upper_bound]@3 2
|
2 set [upper_bound]@3 2
|
||||||
3 jump_if_not 16(16) (j@2 <= [upper_bound]@3)
|
3 jump_if_not 16(16) j@2 <= [upper_bound]@3
|
||||||
4 set i@4 1
|
4 set i@4 1
|
||||||
5 set [upper_bound]@5 a@0
|
5 set [upper_bound]@5 a@0
|
||||||
6 jump_if_not 14(14) (i@4 <= [upper_bound]@5)
|
6 jump_if_not 14(14) i@4 <= [upper_bound]@5
|
||||||
7 set total@1 (total@1 + 1000)
|
7 set total@1 total@1 + 1000
|
||||||
8 jump_if_not 11(11) (i@4 = 5)
|
8 jump_if_not 11(11) i@4 = 5
|
||||||
9 set i@4 (i@4 + 1)
|
9 set i@4 i@4 + 1
|
||||||
10 jump 6
|
10 jump 6
|
||||||
11 set total@1 (total@1 + 1)
|
11 set total@1 total@1 + 1
|
||||||
12 set i@4 (i@4 + 1)
|
12 set i@4 i@4 + 1
|
||||||
13 jump 6
|
13 jump 6
|
||||||
14 set j@2 (j@2 + 1)
|
14 set j@2 j@2 + 1
|
||||||
15 jump 3
|
15 jump 3
|
||||||
16 freturn 3 total@1
|
16 freturn 3 total@1
|
||||||
SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
|
SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
|
||||||
@ -815,12 +815,12 @@ Pos Instruction
|
|||||||
0 set total@1 0
|
0 set total@1 0
|
||||||
1 set i@2 1
|
1 set i@2 1
|
||||||
2 set [upper_bound]@3 a@0
|
2 set [upper_bound]@3 a@0
|
||||||
3 jump_if_not 10(10) (i@2 <= [upper_bound]@3)
|
3 jump_if_not 10(10) i@2 <= [upper_bound]@3
|
||||||
4 jump_if_not 7(0) (i@2 = 5)
|
4 jump_if_not 7(0) i@2 = 5
|
||||||
5 set i@2 (i@2 + 1)
|
5 set i@2 i@2 + 1
|
||||||
6 jump 3
|
6 jump 3
|
||||||
7 set total@1 (total@1 + 1)
|
7 set total@1 total@1 + 1
|
||||||
8 set i@2 (i@2 + 1)
|
8 set i@2 i@2 + 1
|
||||||
9 jump 3
|
9 jump 3
|
||||||
10 freturn 3 total@1
|
10 freturn 3 total@1
|
||||||
SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
|
SELECT f1(3), f1(4), f1(5), f1(6) FROM DUAL;
|
||||||
|
132
mysql-test/suite/compat/oracle/r/sp-param.result
Normal file
132
mysql-test/suite/compat/oracle/r/sp-param.result
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
SET sql_mode=ORACLE;
|
||||||
|
#
|
||||||
|
# MDEV-10596 Allow VARCHAR and VARCHAR2 without length as a data type of routine parameters and in RETURN clause
|
||||||
|
#
|
||||||
|
CREATE FUNCTION f1(param CHAR) RETURN CHAR AS BEGIN RETURN param; END;;
|
||||||
|
SHOW CREATE FUNCTION f1;
|
||||||
|
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||||
|
f1 PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param CHAR) RETURN varchar(2000) CHARSET latin1
|
||||||
|
AS BEGIN RETURN param; END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||||
|
SELECT LENGTH(f1(REPEAT('a',2000)));;
|
||||||
|
LENGTH(f1(REPEAT('a',2000)))
|
||||||
|
2000
|
||||||
|
CREATE TABLE t1 AS SELECT f1(REPEAT('a',2000)) AS a;;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE "t1" (
|
||||||
|
"a" text DEFAULT NULL
|
||||||
|
)
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
CREATE FUNCTION f1(param NCHAR) RETURN NCHAR AS BEGIN RETURN param; END;;
|
||||||
|
SHOW CREATE FUNCTION f1;
|
||||||
|
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||||
|
f1 PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param NCHAR) RETURN varchar(2000) CHARSET utf8
|
||||||
|
AS BEGIN RETURN param; END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||||
|
SELECT LENGTH(f1(REPEAT('a',2000)));;
|
||||||
|
LENGTH(f1(REPEAT('a',2000)))
|
||||||
|
2000
|
||||||
|
CREATE TABLE t1 AS SELECT f1(REPEAT('a',2000)) AS a;;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE "t1" (
|
||||||
|
"a" text CHARACTER SET utf8 DEFAULT NULL
|
||||||
|
)
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
CREATE FUNCTION f1(param BINARY) RETURN BINARY AS BEGIN RETURN param; END;;
|
||||||
|
SHOW CREATE FUNCTION f1;
|
||||||
|
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||||
|
f1 PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param BINARY) RETURN varbinary(2000)
|
||||||
|
AS BEGIN RETURN param; END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||||
|
SELECT LENGTH(f1(REPEAT('a',2000)));;
|
||||||
|
LENGTH(f1(REPEAT('a',2000)))
|
||||||
|
2000
|
||||||
|
CREATE TABLE t1 AS SELECT f1(REPEAT('a',2000)) AS a;;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE "t1" (
|
||||||
|
"a" blob DEFAULT NULL
|
||||||
|
)
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
CREATE FUNCTION f1(param VARCHAR) RETURN VARCHAR AS BEGIN RETURN param; END;;
|
||||||
|
SHOW CREATE FUNCTION f1;
|
||||||
|
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||||
|
f1 PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param VARCHAR) RETURN varchar(4000) CHARSET latin1
|
||||||
|
AS BEGIN RETURN param; END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||||
|
SELECT LENGTH(f1(REPEAT('a',4000)));;
|
||||||
|
LENGTH(f1(REPEAT('a',4000)))
|
||||||
|
4000
|
||||||
|
CREATE TABLE t1 AS SELECT f1(REPEAT('a',4000)) AS a;;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE "t1" (
|
||||||
|
"a" text DEFAULT NULL
|
||||||
|
)
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
CREATE FUNCTION f1(param VARCHAR2) RETURN VARCHAR2 AS BEGIN RETURN param; END;;
|
||||||
|
SHOW CREATE FUNCTION f1;
|
||||||
|
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||||
|
f1 PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param VARCHAR2) RETURN varchar(4000) CHARSET latin1
|
||||||
|
AS BEGIN RETURN param; END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||||
|
SELECT LENGTH(f1(REPEAT('a',4000)));;
|
||||||
|
LENGTH(f1(REPEAT('a',4000)))
|
||||||
|
4000
|
||||||
|
CREATE TABLE t1 AS SELECT f1(REPEAT('a',4000)) AS a;;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE "t1" (
|
||||||
|
"a" text DEFAULT NULL
|
||||||
|
)
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
CREATE FUNCTION f1(param NVARCHAR) RETURN NVARCHAR AS BEGIN RETURN param; END;;
|
||||||
|
SHOW CREATE FUNCTION f1;
|
||||||
|
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||||
|
f1 PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param NVARCHAR) RETURN varchar(4000) CHARSET utf8
|
||||||
|
AS BEGIN RETURN param; END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||||
|
SELECT LENGTH(f1(REPEAT('a',4000)));;
|
||||||
|
LENGTH(f1(REPEAT('a',4000)))
|
||||||
|
4000
|
||||||
|
CREATE TABLE t1 AS SELECT f1(REPEAT('a',4000)) AS a;;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE "t1" (
|
||||||
|
"a" text CHARACTER SET utf8 DEFAULT NULL
|
||||||
|
)
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
CREATE FUNCTION f1(param VARBINARY) RETURN VARBINARY AS BEGIN RETURN param; END;;
|
||||||
|
SHOW CREATE FUNCTION f1;
|
||||||
|
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||||
|
f1 PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param VARBINARY) RETURN varbinary(4000)
|
||||||
|
AS BEGIN RETURN param; END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||||
|
SELECT LENGTH(f1(REPEAT('a',4000)));;
|
||||||
|
LENGTH(f1(REPEAT('a',4000)))
|
||||||
|
4000
|
||||||
|
CREATE TABLE t1 AS SELECT f1(REPEAT('a',4000)) AS a;;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE "t1" (
|
||||||
|
"a" blob DEFAULT NULL
|
||||||
|
)
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
CREATE FUNCTION f1(param RAW) RETURN RAW AS BEGIN RETURN param; END;;
|
||||||
|
SHOW CREATE FUNCTION f1;
|
||||||
|
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||||
|
f1 PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param RAW) RETURN varbinary(4000)
|
||||||
|
AS BEGIN RETURN param; END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||||
|
SELECT LENGTH(f1(REPEAT('a',4000)));;
|
||||||
|
LENGTH(f1(REPEAT('a',4000)))
|
||||||
|
4000
|
||||||
|
CREATE TABLE t1 AS SELECT f1(REPEAT('a',4000)) AS a;;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE "t1" (
|
||||||
|
"a" blob DEFAULT NULL
|
||||||
|
)
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP FUNCTION f1;
|
9
mysql-test/suite/compat/oracle/t/sp-param.inc
Normal file
9
mysql-test/suite/compat/oracle/t/sp-param.inc
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
--eval CREATE FUNCTION f1(param $type) RETURN $type AS BEGIN RETURN param; END;
|
||||||
|
SHOW CREATE FUNCTION f1;
|
||||||
|
|
||||||
|
--eval SELECT LENGTH(f1(REPEAT('a',$length)));
|
||||||
|
--eval CREATE TABLE t1 AS SELECT f1(REPEAT('a',$length)) AS a;
|
||||||
|
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP FUNCTION f1;
|
37
mysql-test/suite/compat/oracle/t/sp-param.test
Normal file
37
mysql-test/suite/compat/oracle/t/sp-param.test
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
SET sql_mode=ORACLE;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-10596 Allow VARCHAR and VARCHAR2 without length as a data type of routine parameters and in RETURN clause
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--let type = CHAR
|
||||||
|
--let length = 2000
|
||||||
|
--source sp-param.inc
|
||||||
|
|
||||||
|
--let type = NCHAR
|
||||||
|
--let length = 2000
|
||||||
|
--source sp-param.inc
|
||||||
|
|
||||||
|
--let type = BINARY
|
||||||
|
--let length = 2000
|
||||||
|
--source sp-param.inc
|
||||||
|
|
||||||
|
--let type = VARCHAR
|
||||||
|
--let length = 4000
|
||||||
|
--source sp-param.inc
|
||||||
|
|
||||||
|
--let type = VARCHAR2
|
||||||
|
--let length = 4000
|
||||||
|
--source sp-param.inc
|
||||||
|
|
||||||
|
--let type = NVARCHAR
|
||||||
|
--let length = 4000
|
||||||
|
--source sp-param.inc
|
||||||
|
|
||||||
|
--let type = VARBINARY
|
||||||
|
--let length = 4000
|
||||||
|
--source sp-param.inc
|
||||||
|
|
||||||
|
--let type = RAW
|
||||||
|
--let length = 4000
|
||||||
|
--source sp-param.inc
|
@ -1007,6 +1007,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
|||||||
wild_and_where
|
wild_and_where
|
||||||
field_length opt_field_length opt_field_length_default_1
|
field_length opt_field_length opt_field_length_default_1
|
||||||
colon_with_pos
|
colon_with_pos
|
||||||
|
opt_field_length_default_sp_param_char
|
||||||
|
opt_field_length_default_sp_param_varchar
|
||||||
|
|
||||||
%type <const_simple_string>
|
%type <const_simple_string>
|
||||||
opt_place
|
opt_place
|
||||||
@ -1017,6 +1019,14 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
|||||||
%type <field_type> int_type real_type
|
%type <field_type> int_type real_type
|
||||||
|
|
||||||
%type <Lex_field_type> type_with_opt_collate field_type
|
%type <Lex_field_type> type_with_opt_collate field_type
|
||||||
|
sp_param_type_with_opt_collate
|
||||||
|
sp_param_field_type
|
||||||
|
sp_param_field_type_string
|
||||||
|
field_type_numeric
|
||||||
|
field_type_string
|
||||||
|
field_type_lob
|
||||||
|
field_type_temporal
|
||||||
|
field_type_misc
|
||||||
|
|
||||||
%type <Lex_dyncol_type> opt_dyncol_type dyncol_type
|
%type <Lex_dyncol_type> opt_dyncol_type dyncol_type
|
||||||
numeric_dyncol_type temporal_dyncol_type string_dyncol_type
|
numeric_dyncol_type temporal_dyncol_type string_dyncol_type
|
||||||
@ -2267,7 +2277,7 @@ sp_param_name:
|
|||||||
;
|
;
|
||||||
|
|
||||||
sp_param_name_and_type:
|
sp_param_name_and_type:
|
||||||
sp_param_name type_with_opt_collate
|
sp_param_name sp_param_type_with_opt_collate
|
||||||
{
|
{
|
||||||
if (Lex->sp_param_fill_definition($$= $1))
|
if (Lex->sp_param_fill_definition($$= $1))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
@ -2286,7 +2296,7 @@ sp_pdparams:
|
|||||||
;
|
;
|
||||||
|
|
||||||
sp_pdparam:
|
sp_pdparam:
|
||||||
sp_param_name sp_opt_inout type_with_opt_collate
|
sp_param_name sp_opt_inout sp_param_type_with_opt_collate
|
||||||
{
|
{
|
||||||
$1->mode= $2;
|
$1->mode= $2;
|
||||||
if (Lex->sp_param_fill_definition($1))
|
if (Lex->sp_param_fill_definition($1))
|
||||||
@ -5611,6 +5621,24 @@ column_default_expr:
|
|||||||
;
|
;
|
||||||
|
|
||||||
field_type:
|
field_type:
|
||||||
|
field_type_numeric
|
||||||
|
| field_type_temporal
|
||||||
|
| field_type_string
|
||||||
|
| field_type_lob
|
||||||
|
| field_type_misc
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
sp_param_field_type:
|
||||||
|
field_type_numeric
|
||||||
|
| field_type_temporal
|
||||||
|
| sp_param_field_type_string
|
||||||
|
| field_type_lob
|
||||||
|
| field_type_misc
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
field_type_numeric:
|
||||||
int_type opt_field_length field_options { $$.set($1, $2); }
|
int_type opt_field_length field_options { $$.set($1, $2); }
|
||||||
| real_type opt_precision field_options { $$.set($1, $2); }
|
| real_type opt_precision field_options { $$.set($1, $2); }
|
||||||
| FLOAT_SYM float_options field_options
|
| FLOAT_SYM float_options field_options
|
||||||
@ -5641,7 +5669,24 @@ field_type:
|
|||||||
{
|
{
|
||||||
$$.set(MYSQL_TYPE_TINY, "1");
|
$$.set(MYSQL_TYPE_TINY, "1");
|
||||||
}
|
}
|
||||||
| char opt_field_length_default_1 opt_binary
|
| DECIMAL_SYM float_options field_options
|
||||||
|
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
||||||
|
| NUMBER_SYM float_options field_options
|
||||||
|
{
|
||||||
|
if ($2.length() != 0)
|
||||||
|
$$.set(MYSQL_TYPE_NEWDECIMAL, $2);
|
||||||
|
else
|
||||||
|
$$.set(MYSQL_TYPE_DOUBLE);
|
||||||
|
}
|
||||||
|
| NUMERIC_SYM float_options field_options
|
||||||
|
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
||||||
|
| FIXED_SYM float_options field_options
|
||||||
|
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
field_type_string:
|
||||||
|
char opt_field_length_default_1 opt_binary
|
||||||
{
|
{
|
||||||
$$.set(MYSQL_TYPE_STRING, $2);
|
$$.set(MYSQL_TYPE_STRING, $2);
|
||||||
}
|
}
|
||||||
@ -5678,7 +5723,52 @@ field_type:
|
|||||||
Lex->charset= &my_charset_bin;
|
Lex->charset= &my_charset_bin;
|
||||||
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
||||||
}
|
}
|
||||||
| YEAR_SYM opt_field_length field_options
|
;
|
||||||
|
|
||||||
|
|
||||||
|
sp_param_field_type_string:
|
||||||
|
char opt_field_length_default_sp_param_char opt_binary
|
||||||
|
{
|
||||||
|
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
||||||
|
}
|
||||||
|
| nchar opt_field_length_default_sp_param_char opt_bin_mod
|
||||||
|
{
|
||||||
|
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
||||||
|
bincmp_collation(national_charset_info, $3);
|
||||||
|
}
|
||||||
|
| BINARY opt_field_length_default_sp_param_char
|
||||||
|
{
|
||||||
|
Lex->charset=&my_charset_bin;
|
||||||
|
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
||||||
|
}
|
||||||
|
| varchar opt_field_length_default_sp_param_varchar opt_binary
|
||||||
|
{
|
||||||
|
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
||||||
|
}
|
||||||
|
| VARCHAR2 opt_field_length_default_sp_param_varchar opt_binary
|
||||||
|
{
|
||||||
|
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
||||||
|
}
|
||||||
|
| nvarchar opt_field_length_default_sp_param_varchar opt_bin_mod
|
||||||
|
{
|
||||||
|
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
||||||
|
bincmp_collation(national_charset_info, $3);
|
||||||
|
}
|
||||||
|
| VARBINARY opt_field_length_default_sp_param_varchar
|
||||||
|
{
|
||||||
|
Lex->charset= &my_charset_bin;
|
||||||
|
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
||||||
|
}
|
||||||
|
| RAW opt_field_length_default_sp_param_varchar
|
||||||
|
{
|
||||||
|
Lex->charset= &my_charset_bin;
|
||||||
|
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
field_type_temporal:
|
||||||
|
YEAR_SYM opt_field_length field_options
|
||||||
{
|
{
|
||||||
if ($2)
|
if ($2)
|
||||||
{
|
{
|
||||||
@ -5722,7 +5812,11 @@ field_type:
|
|||||||
| DATETIME opt_field_length
|
| DATETIME opt_field_length
|
||||||
{ $$.set(opt_mysql56_temporal_format ?
|
{ $$.set(opt_mysql56_temporal_format ?
|
||||||
MYSQL_TYPE_DATETIME2 : MYSQL_TYPE_DATETIME, $2); }
|
MYSQL_TYPE_DATETIME2 : MYSQL_TYPE_DATETIME, $2); }
|
||||||
| TINYBLOB
|
;
|
||||||
|
|
||||||
|
|
||||||
|
field_type_lob:
|
||||||
|
TINYBLOB
|
||||||
{
|
{
|
||||||
Lex->charset=&my_charset_bin;
|
Lex->charset=&my_charset_bin;
|
||||||
$$.set(MYSQL_TYPE_TINY_BLOB);
|
$$.set(MYSQL_TYPE_TINY_BLOB);
|
||||||
@ -5770,25 +5864,16 @@ field_type:
|
|||||||
{ $$.set(MYSQL_TYPE_LONG_BLOB); }
|
{ $$.set(MYSQL_TYPE_LONG_BLOB); }
|
||||||
| CLOB opt_binary
|
| CLOB opt_binary
|
||||||
{ $$.set(MYSQL_TYPE_LONG_BLOB); }
|
{ $$.set(MYSQL_TYPE_LONG_BLOB); }
|
||||||
| DECIMAL_SYM float_options field_options
|
| LONG_SYM opt_binary
|
||||||
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
{ $$.set(MYSQL_TYPE_MEDIUM_BLOB); }
|
||||||
| NUMBER_SYM float_options field_options
|
;
|
||||||
{
|
|
||||||
if ($2.length() != 0)
|
|
||||||
$$.set(MYSQL_TYPE_NEWDECIMAL, $2);
|
field_type_misc:
|
||||||
else
|
ENUM '(' string_list ')' opt_binary
|
||||||
$$.set(MYSQL_TYPE_DOUBLE);
|
|
||||||
}
|
|
||||||
| NUMERIC_SYM float_options field_options
|
|
||||||
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
|
||||||
| FIXED_SYM float_options field_options
|
|
||||||
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
|
||||||
| ENUM '(' string_list ')' opt_binary
|
|
||||||
{ $$.set(MYSQL_TYPE_ENUM); }
|
{ $$.set(MYSQL_TYPE_ENUM); }
|
||||||
| SET '(' string_list ')' opt_binary
|
| SET '(' string_list ')' opt_binary
|
||||||
{ $$.set(MYSQL_TYPE_SET); }
|
{ $$.set(MYSQL_TYPE_SET); }
|
||||||
| LONG_SYM opt_binary
|
|
||||||
{ $$.set(MYSQL_TYPE_MEDIUM_BLOB); }
|
|
||||||
;
|
;
|
||||||
|
|
||||||
spatial_type:
|
spatial_type:
|
||||||
@ -5894,6 +5979,33 @@ opt_field_length_default_1:
|
|||||||
/* empty */ { $$= (char*) "1"; }
|
/* empty */ { $$= (char*) "1"; }
|
||||||
| field_length { $$= $1; }
|
| field_length { $$= $1; }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
In sql_mode=ORACLE, a VARCHAR with no length is used
|
||||||
|
in SP parameters and return values and it's translated to VARCHAR(4000),
|
||||||
|
where 4000 is the maximum possible size for VARCHAR.
|
||||||
|
|
||||||
|
In MariaDB the limit for VARCHAR is 65535 bytes.
|
||||||
|
We could translate VARCHAR with no length to VARCHAR(65535), but
|
||||||
|
it would mean that for multi-byte character sets we'd have to translate
|
||||||
|
VARCHAR to MEDIUMTEXT, to guarantee 65535 characters.
|
||||||
|
|
||||||
|
Also we could translate VARCHAR to VARCHAR(16383), where 16383 is
|
||||||
|
the maximum possible length in characters in case of mbmaxlen=4
|
||||||
|
(e.g. utf32, utf16, utf8mb4). However, we'll have character sets with
|
||||||
|
mbmaxlen=5 soon (e.g. gb18030).
|
||||||
|
|
||||||
|
Let's translate VARCHAR to VARCHAR(4000), which covert all possible Oracle
|
||||||
|
values.
|
||||||
|
*/
|
||||||
|
opt_field_length_default_sp_param_varchar:
|
||||||
|
/* empty */ { $$= (char*) "4000"; }
|
||||||
|
| field_length { $$= $1; }
|
||||||
|
|
||||||
|
opt_field_length_default_sp_param_char:
|
||||||
|
/* empty */ { $$= (char*) "2000"; }
|
||||||
|
| field_length { $$= $1; }
|
||||||
|
|
||||||
opt_precision:
|
opt_precision:
|
||||||
/* empty */ { $$.set(0, 0); }
|
/* empty */ { $$.set(0, 0); }
|
||||||
| precision { $$= $1; }
|
| precision { $$= $1; }
|
||||||
@ -6001,6 +6113,19 @@ type_with_opt_collate:
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
sp_param_type_with_opt_collate:
|
||||||
|
sp_param_field_type opt_collate
|
||||||
|
{
|
||||||
|
$$= $1;
|
||||||
|
if ($2)
|
||||||
|
{
|
||||||
|
if (!(Lex->charset= merge_charset_and_collation(Lex->charset, $2)))
|
||||||
|
MYSQL_YYABORT;
|
||||||
|
}
|
||||||
|
Lex->last_field->set_attributes($1, Lex->charset);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
charset:
|
charset:
|
||||||
CHAR_SYM SET {}
|
CHAR_SYM SET {}
|
||||||
| CHARSET {}
|
| CHARSET {}
|
||||||
@ -16116,7 +16241,7 @@ sf_tail:
|
|||||||
lex->init_last_field(&lex->sphead->m_return_field_def, NULL,
|
lex->init_last_field(&lex->sphead->m_return_field_def, NULL,
|
||||||
thd->variables.collation_database);
|
thd->variables.collation_database);
|
||||||
}
|
}
|
||||||
type_with_opt_collate /* $8 */
|
sp_param_type_with_opt_collate /* $8 */
|
||||||
{ /* $9 */
|
{ /* $9 */
|
||||||
if (Lex->sphead->fill_field_definition(thd, Lex->last_field))
|
if (Lex->sphead->fill_field_definition(thd, Lex->last_field))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
|
Reference in New Issue
Block a user