Commit f16b8590 authored by Alexander Barkov's avatar Alexander Barkov Committed by Sergei Golubchik

MDEV-19682 sql_mode="oracle" does not support sysdate

parent 7b134ffa
...@@ -109,7 +109,7 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp ...@@ -109,7 +109,7 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
create table SUM (a int); create table SUM (a int);
drop table SUM; drop table SUM;
create table SYSDATE(a int); create table SYSDATE(a int);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SYSDATE(a int)' at line 1 DROP TABLE SYSDATE;
create table SYSDATE (a int); create table SYSDATE (a int);
drop table SYSDATE; drop table SYSDATE;
create table SYSTEM_USER(a int); create table SYSTEM_USER(a int);
...@@ -246,9 +246,9 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp ...@@ -246,9 +246,9 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
create table SUM (a int); create table SUM (a int);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SUM (a int)' at line 1 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SUM (a int)' at line 1
create table SYSDATE(a int); create table SYSDATE(a int);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SYSDATE(a int)' at line 1 DROP TABLE SYSDATE;
create table SYSDATE (a int); create table SYSDATE (a int);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SYSDATE (a int)' at line 1 DROP TABLE SYSDATE;
create table SYSTEM_USER(a int); create table SYSTEM_USER(a int);
drop table SYSTEM_USER; drop table SYSTEM_USER;
create table SYSTEM_USER (a int); create table SYSTEM_USER (a int);
...@@ -2128,5 +2128,44 @@ Warnings: ...@@ -2128,5 +2128,44 @@ Warnings:
Note 1003 (select `test`.`t1`.`x` AS `x` from `test`.`t1` limit 1) Note 1003 (select `test`.`t1`.`x` AS `x` from `test`.`t1` limit 1)
drop table t1; drop table t1;
# #
# MDEV-19682 sql_mode="oracle" does not support sysdate
#
SELECT sysdate LIKE '____-__-__ __:__:__';
ERROR 42S22: Unknown column 'sysdate' in 'field list'
SELECT sysdate = sysdate();
ERROR 42S22: Unknown column 'sysdate' in 'field list'
SELECT sysdate = sysdate(0);
ERROR 42S22: Unknown column 'sysdate' in 'field list'
CREATE DATABASE sysdate;
DROP DATABASE sysdate;
CREATE TABLE sysdate (a INT);
DROP TABLE sysdate;
CREATE TABLE t1 (sysdate INT);
DROP TABLE t1;
CREATE FUNCTION sysdate() RETURNS INT
BEGIN
RETURN 1;
END;
$$
Warnings:
Note 1585 This function 'sysdate' has the same name as a native function
DROP FUNCTION sysdate;
BEGIN NOT ATOMIC
DECLARE sysdate INT DEFAULT 10;
SELECT sysdate;
END;
$$
sysdate
10
BEGIN NOT ATOMIC
DECLARE a INT DEFAULT 0;
sysdate:
WHILE a DO
SELECT 1;
LEAVE sysdate;
END WHILE ;
END;
$$
#
# End of 10.6 tests # End of 10.6 tests
# #
...@@ -158,8 +158,8 @@ create table SUM(a int); ...@@ -158,8 +158,8 @@ create table SUM(a int);
create table SUM (a int); create table SUM (a int);
drop table SUM; drop table SUM;
--error ER_PARSE_ERROR
create table SYSDATE(a int); create table SYSDATE(a int);
DROP TABLE SYSDATE;
create table SYSDATE (a int); create table SYSDATE (a int);
drop table SYSDATE; drop table SYSDATE;
...@@ -332,10 +332,10 @@ create table SUM(a int); ...@@ -332,10 +332,10 @@ create table SUM(a int);
--error ER_PARSE_ERROR --error ER_PARSE_ERROR
create table SUM (a int); create table SUM (a int);
--error ER_PARSE_ERROR
create table SYSDATE(a int); create table SYSDATE(a int);
--error ER_PARSE_ERROR DROP TABLE SYSDATE;
create table SYSDATE (a int); create table SYSDATE (a int);
DROP TABLE SYSDATE;
create table SYSTEM_USER(a int); create table SYSTEM_USER(a int);
drop table SYSTEM_USER; drop table SYSTEM_USER;
...@@ -1900,6 +1900,54 @@ insert into t1 values (1),(2); ...@@ -1900,6 +1900,54 @@ insert into t1 values (1),(2);
explain extended (SELECT x FROM t1 WINDOW w1 as () FOR UPDATE) LIMIT 1; explain extended (SELECT x FROM t1 WINDOW w1 as () FOR UPDATE) LIMIT 1;
explain extended (SELECT x FROM t1 FOR UPDATE) LIMIT 1; explain extended (SELECT x FROM t1 FOR UPDATE) LIMIT 1;
drop table t1; drop table t1;
--echo #
--echo # MDEV-19682 sql_mode="oracle" does not support sysdate
--echo #
--error ER_BAD_FIELD_ERROR
SELECT sysdate LIKE '____-__-__ __:__:__';
--error ER_BAD_FIELD_ERROR
SELECT sysdate = sysdate();
--error ER_BAD_FIELD_ERROR
SELECT sysdate = sysdate(0);
CREATE DATABASE sysdate;
DROP DATABASE sysdate;
CREATE TABLE sysdate (a INT);
DROP TABLE sysdate;
CREATE TABLE t1 (sysdate INT);
DROP TABLE t1;
DELIMITER $$;
CREATE FUNCTION sysdate() RETURNS INT
BEGIN
RETURN 1;
END;
$$
DELIMITER ;$$
DROP FUNCTION sysdate;
DELIMITER $$;
BEGIN NOT ATOMIC
DECLARE sysdate INT DEFAULT 10;
SELECT sysdate;
END;
$$
DELIMITER ;$$
DELIMITER $$;
BEGIN NOT ATOMIC
DECLARE a INT DEFAULT 0;
sysdate:
WHILE a DO
SELECT 1;
LEAVE sysdate;
END WHILE ;
END;
$$
DELIMITER ;$$
--echo # --echo #
--echo # End of 10.6 tests --echo # End of 10.6 tests
......
...@@ -806,3 +806,65 @@ ERROR HY000: Unknown data type: 'BEGIN' ...@@ -806,3 +806,65 @@ ERROR HY000: Unknown data type: 'BEGIN'
# #
# End of 10.5 tests # End of 10.5 tests
# #
#
# Start of 10.6 tests
#
#
# MDEV-19682 sql_mode="oracle" does not support sysdate
#
SELECT sysdate LIKE '____-__-__ __:__:__';
sysdate LIKE '____-__-__ __:__:__'
1
SELECT sysdate = sysdate();
sysdate = sysdate()
1
SELECT sysdate = sysdate(0);
sysdate = sysdate(0)
1
CREATE DATABASE sysdate;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'sysdate' at line 1
CREATE TABLE sysdate (a INT);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'sysdate (a INT)' at line 1
CREATE TABLE t1 (sysdate INT);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'sysdate INT)' at line 1
CREATE TABLE t1 (a sysdate);
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'sysdate)' at line 1
CREATE FUNCTION sysdate RETURN INT AS
BEGIN
RETURN 1;
END;
$$
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'sysdate RETURN INT AS
BEGIN
RETURN 1;
END' at line 1
CREATE FUNCTION sysdate() RETURN INT AS
BEGIN
RETURN 1;
END;
$$
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'sysdate() RETURN INT AS
BEGIN
RETURN 1;
END' at line 1
DECLARE
sysdate INT := 10;
BEGIN
NULL;
END;
$$
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'sysdate INT := 10;
BEGIN
NULL;
END' at line 2
BEGIN
<<sysdate>>
NULL;
END;
$$
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'sysdate>>
NULL;
END' at line 2
#
# End of 10.6 tests
#
...@@ -653,3 +653,75 @@ SELECT CAST(1 AS BEGIN); ...@@ -653,3 +653,75 @@ SELECT CAST(1 AS BEGIN);
--echo # --echo #
--echo # End of 10.5 tests --echo # End of 10.5 tests
--echo # --echo #
--echo #
--echo # Start of 10.6 tests
--echo #
--echo #
--echo # MDEV-19682 sql_mode="oracle" does not support sysdate
--echo #
# SYSDATE is not deterministic. Let's use LIKE and equality.
# The main point here is only to check that SYSDATE
# gets parsed without parentheses. The actial value is not important.
SELECT sysdate LIKE '____-__-__ __:__:__';
SELECT sysdate = sysdate();
SELECT sysdate = sysdate(0);
--error ER_PARSE_ERROR
CREATE DATABASE sysdate;
--error ER_PARSE_ERROR
CREATE TABLE sysdate (a INT);
--error ER_PARSE_ERROR
CREATE TABLE t1 (sysdate INT);
--error ER_PARSE_ERROR
CREATE TABLE t1 (a sysdate);
DELIMITER $$;
--error ER_PARSE_ERROR
CREATE FUNCTION sysdate RETURN INT AS
BEGIN
RETURN 1;
END;
$$
DELIMITER ;$$
DELIMITER $$;
--error ER_PARSE_ERROR
CREATE FUNCTION sysdate() RETURN INT AS
BEGIN
RETURN 1;
END;
$$
DELIMITER ;$$
DELIMITER $$;
--error ER_PARSE_ERROR
DECLARE
sysdate INT := 10;
BEGIN
NULL;
END;
$$
DELIMITER ;$$
DELIMITER $$;
--error ER_PARSE_ERROR
BEGIN
<<sysdate>>
NULL;
END;
$$
DELIMITER ;$$
--echo #
--echo # End of 10.6 tests
--echo #
...@@ -648,6 +648,7 @@ static SYMBOL symbols[] = { ...@@ -648,6 +648,7 @@ static SYMBOL symbols[] = {
{ "SUSPEND", SYM(SUSPEND_SYM)}, { "SUSPEND", SYM(SUSPEND_SYM)},
{ "SWAPS", SYM(SWAPS_SYM)}, { "SWAPS", SYM(SWAPS_SYM)},
{ "SWITCHES", SYM(SWITCHES_SYM)}, { "SWITCHES", SYM(SWITCHES_SYM)},
{ "SYSDATE", SYM(SYSDATE)},
{ "SYSTEM", SYM(SYSTEM)}, { "SYSTEM", SYM(SYSTEM)},
{ "SYSTEM_TIME", SYM(SYSTEM_TIME_SYM)}, { "SYSTEM_TIME", SYM(SYSTEM_TIME_SYM)},
{ "TABLE", SYM(TABLE_SYM)}, { "TABLE", SYM(TABLE_SYM)},
...@@ -787,7 +788,6 @@ static SYMBOL sql_functions[] = { ...@@ -787,7 +788,6 @@ static SYMBOL sql_functions[] = {
{ "SUBSTR", SYM(SUBSTRING)}, { "SUBSTR", SYM(SUBSTRING)},
{ "SUBSTRING", SYM(SUBSTRING)}, { "SUBSTRING", SYM(SUBSTRING)},
{ "SUM", SYM(SUM_SYM)}, { "SUM", SYM(SUM_SYM)},
{ "SYSDATE", SYM(SYSDATE)},
{ "SYSTEM_USER", SYM(USER_SYM)}, { "SYSTEM_USER", SYM(USER_SYM)},
{ "TRIM", SYM(TRIM)}, { "TRIM", SYM(TRIM)},
{ "TRIM_ORACLE", SYM(TRIM_ORACLE)}, { "TRIM_ORACLE", SYM(TRIM_ORACLE)},
......
...@@ -9341,6 +9341,26 @@ Item *LEX::make_item_func_substr(THD *thd, Item *a, Item *b) ...@@ -9341,6 +9341,26 @@ Item *LEX::make_item_func_substr(THD *thd, Item *a, Item *b)
} }
Item *LEX::make_item_func_sysdate(THD *thd, uint fsp)
{
/*
Unlike other time-related functions, SYSDATE() is
replication-unsafe because it is not affected by the
TIMESTAMP variable. It is unsafe even if
sysdate_is_now=1, because the slave may have
sysdate_is_now=0.
*/
set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
Item *item= global_system_variables.sysdate_is_now == 0 ?
(Item *) new (thd->mem_root) Item_func_sysdate_local(thd, fsp) :
(Item *) new (thd->mem_root) Item_func_now_local(thd, fsp);
if (unlikely(item == NULL))
return NULL;
safe_to_cache_query=0;
return item;
}
Item *LEX::make_item_func_replace(THD *thd, Item *LEX::make_item_func_replace(THD *thd,
Item *org, Item *org,
Item *find, Item *find,
......
...@@ -4101,6 +4101,7 @@ struct LEX: public Query_tables_list ...@@ -4101,6 +4101,7 @@ struct LEX: public Query_tables_list
Item *make_item_func_replace(THD *thd, Item *org, Item *find, Item *replace); 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 *c);
Item *make_item_func_substr(THD *thd, Item *a, Item *b); Item *make_item_func_substr(THD *thd, Item *a, Item *b);
Item *make_item_func_sysdate(THD *thd, uint fsp);
Item *make_item_func_call_generic(THD *thd, Lex_ident_cli_st *db, Item *make_item_func_call_generic(THD *thd, Lex_ident_cli_st *db,
Lex_ident_cli_st *name, List<Item> *args); Lex_ident_cli_st *name, List<Item> *args);
Item *make_item_func_call_native_or_parse_error(THD *thd, Item *make_item_func_call_native_or_parse_error(THD *thd,
......
...@@ -10361,23 +10361,22 @@ function_call_nonkeyword: ...@@ -10361,23 +10361,22 @@ function_call_nonkeyword:
if (unlikely(!($$= Lex->make_item_func_substr(thd, $3, $5)))) if (unlikely(!($$= Lex->make_item_func_substr(thd, $3, $5))))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| SYSDATE opt_time_precision /* Start SQL_MODE_ORACLE_SPECIFIC
| SYSDATE
{ {
/* if (unlikely(!($$= Lex->make_item_func_sysdate(thd, 0))))
Unlike other time-related functions, SYSDATE() is MYSQL_YYABORT;
replication-unsafe because it is not affected by the }
TIMESTAMP variable. It is unsafe even if End SQL_MODE_ORACLE_SPECIFIC */
sysdate_is_now=1, because the slave may have | SYSDATE '(' ')'
sysdate_is_now=0. {
*/ if (unlikely(!($$= Lex->make_item_func_sysdate(thd, 0))))
Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); MYSQL_YYABORT;
if (global_system_variables.sysdate_is_now == 0) }
$$= new (thd->mem_root) Item_func_sysdate_local(thd, $2); | SYSDATE '(' real_ulong_num ')'
else {
$$= new (thd->mem_root) Item_func_now_local(thd, $2); if (unlikely(!($$= Lex->make_item_func_sysdate(thd, (uint) $3))))
if (unlikely($$ == NULL)) MYSQL_YYABORT;
MYSQL_YYABORT;
Lex->safe_to_cache_query=0;
} }
| TIMESTAMP_ADD '(' interval_time_stamp ',' expr ',' expr ')' | TIMESTAMP_ADD '(' interval_time_stamp ',' expr ',' expr ')'
{ {
...@@ -16144,6 +16143,9 @@ keyword_sp_var_and_label: ...@@ -16144,6 +16143,9 @@ keyword_sp_var_and_label:
| SUSPEND_SYM | SUSPEND_SYM
| SWAPS_SYM | SWAPS_SYM
| SWITCHES_SYM | SWITCHES_SYM
/* Start SQL_MODE_DEFAULT_SPECIFIC */
| SYSDATE
/* End SQL_MODE_DEFAULT_SPECIFIC */
| SYSTEM | SYSTEM
| SYSTEM_TIME_SYM | SYSTEM_TIME_SYM
| TABLE_NAME_SYM | TABLE_NAME_SYM
...@@ -16393,7 +16395,6 @@ reserved_keyword_udt_not_param_type: ...@@ -16393,7 +16395,6 @@ reserved_keyword_udt_not_param_type:
| STRAIGHT_JOIN | STRAIGHT_JOIN
| SUBSTRING | SUBSTRING
| SUM_SYM | SUM_SYM
| SYSDATE
| TABLE_REF_PRIORITY | TABLE_REF_PRIORITY
| TABLE_SYM | TABLE_SYM
| TERMINATED | TERMINATED
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment