1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-15004 parser greedily parses AS OF TIMESTAMP

* TIMESTAMP precedence fixed.
This commit is contained in:
Aleksey Midenkov
2018-02-16 19:07:32 +01:00
committed by Sergei Golubchik
parent e2f70d6e10
commit f1bd02d994
11 changed files with 63 additions and 31 deletions

View File

@ -63,7 +63,7 @@ select sys_start into @sys_start from t1;
delete from t1;
select * from t1;
select x = 1 as A, sys_start = @sys_start as B, sys_end > sys_start as C
from t1 for system_time between timestamp '0-0-0' and timestamp '2038-01-19 04:14:07';
from t1 for system_time all;
drop table t1;
end~~
create or replace procedure test_03(
@ -91,8 +91,8 @@ select x as t2_x from t2;
delete t1, t2 from t1 join t2 where t1.x = t2.x;
select x as t1_x from t1;
select x as t2_x from t2;
select x as t1_x_all from t1 for system_time between timestamp '0-0-0' and timestamp '2038-01-19 04:14:07';
select x as t2_x_all from t2 for system_time between timestamp '0-0-0' and timestamp '2038-01-19 04:14:07';
select x as t1_x_all from t1 for system_time all;
select x as t2_x_all from t2 for system_time all;
drop table t1;
drop table t2;
end~~

View File

@ -25,7 +25,7 @@ update parent set id=id+1;
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))
delete from child;
update parent set id=id+1;
select * from child for system_time from timestamp '1-1-1' to timestamp now(6);
select * from child for system_time from timestamp 0 to timestamp now(6);
parent_id
1
1
@ -165,7 +165,7 @@ delete from child where parent_id = 1;
delete from parent where id = 1;
select * from child;
parent_id
select * from child for system_time from timestamp '1-1-1' to timestamp now(6);
select * from child for system_time from timestamp 0 to timestamp now(6);
parent_id
1
1

View File

@ -248,7 +248,7 @@ a b
select * from (select * from (select * from t1 cross join t2) as tmp1) as tmp2;
a b
1 2
select * from (select * from t1 cross join t2 for system_time as of timestamp '0-0-0') as tmp;
select * from (select * from t1 cross join t2 for system_time as of timestamp ('0-0-0')) as tmp;
a b
create or replace table t1(a1 int) with system versioning;
create or replace table t2(a2 int) with system versioning;
@ -475,6 +475,16 @@ f1 f2 f3 f1 f2 f3 f4
3 3 NULL NULL 3 1 1
3 3 NULL NULL 3 2 1
4 NULL NULL NULL NULL NULL NULL
### MDEV-15004 parser greedily parses AS OF TIMESTAMP
select timestamp'2016-02-30 08:07:06';
ERROR HY000: Incorrect DATETIME value: '2016-02-30 08:07:06'
select * from t1 for system_time as of timestamp'2016-02-30 08:07:06';
ERROR HY000: Incorrect DATETIME value: '2016-02-30 08:07:06'
select timestamp('2003-12-31 12:00:00','12:00:00');
timestamp('2003-12-31 12:00:00','12:00:00')
2004-01-01 00:00:00
select * from t1 for system_time as of timestamp('2003-12-31 12:00:00','12:00:00');
f1
drop view v1;
drop table t1, t2, t3, t4;
call verify_vtq_dummy(34);

View File

@ -273,7 +273,7 @@ a b
select * from (select * from (select * from t1 cross join t2) as tmp1) as tmp2;
a b
1 2
select * from (select * from t1 cross join t2 for system_time as of timestamp '0-0-0') as tmp;
select * from (select * from t1 cross join t2 for system_time as of timestamp ('0-0-0')) as tmp;
a b
create or replace table t1(a1 int) with system versioning;
create or replace table t2(a2 int) with system versioning;

View File

@ -79,7 +79,7 @@ create or replace view vt12 as select * from t1 cross join t2;
select * from vt12;
a b
1 2
create or replace view vt12 as select * from t1 for system_time as of timestamp '0-0-0' cross join t2;
create or replace view vt12 as select * from t1 for system_time as of timestamp ('0-0-0') cross join t2;
select * from vt12;
a b
# VIEW improvements [#183]

View File

@ -67,7 +67,7 @@ begin
delete from t1;
select * from t1;
select x = 1 as A, sys_start = @sys_start as B, sys_end > sys_start as C
from t1 for system_time between timestamp '0-0-0' and timestamp '2038-01-19 04:14:07';
from t1 for system_time all;
drop table t1;
end~~
@ -96,8 +96,8 @@ begin
delete t1, t2 from t1 join t2 where t1.x = t2.x;
select x as t1_x from t1;
select x as t2_x from t2;
select x as t1_x_all from t1 for system_time between timestamp '0-0-0' and timestamp '2038-01-19 04:14:07';
select x as t2_x_all from t2 for system_time between timestamp '0-0-0' and timestamp '2038-01-19 04:14:07';
select x as t1_x_all from t1 for system_time all;
select x as t2_x_all from t2 for system_time all;
drop table t1;
drop table t2;
end~~

View File

@ -33,7 +33,7 @@ insert into child values(1);
update parent set id=id+1;
delete from child;
update parent set id=id+1;
select * from child for system_time from timestamp '1-1-1' to timestamp now(6);
select * from child for system_time from timestamp 0 to timestamp now(6);
drop table child;
drop table parent;
@ -188,7 +188,7 @@ delete from child where parent_id = 1;
--echo ## FIXME END
delete from parent where id = 1;
select * from child;
select * from child for system_time from timestamp '1-1-1' to timestamp now(6);
select * from child for system_time from timestamp 0 to timestamp now(6);
delete from child;
insert into parent values(1);
@ -198,7 +198,7 @@ if (0)
{
update parent set id=id+1;
select * from child;
select * from child for system_time from timestamp '1-1-1' to timestamp now(6);
select * from child for system_time from timestamp 0 to timestamp now(6);
}
## FIXME END

View File

@ -159,7 +159,7 @@ insert into t1 values (1);
insert into t2 values (2);
select * from (select * from t1 cross join t2) as tmp;
select * from (select * from (select * from t1 cross join t2) as tmp1) as tmp2;
select * from (select * from t1 cross join t2 for system_time as of timestamp '0-0-0') as tmp;
select * from (select * from t1 cross join t2 for system_time as of timestamp ('0-0-0')) as tmp;
create or replace table t1(a1 int) with system versioning;
create or replace table t2(a2 int) with system versioning;
@ -297,6 +297,13 @@ select * from
left join t2 as t2a left join (t3 as t3a inner join t1) on t2a.f2 = t3a.f3 on t1a.f1 = t2a.f2
left join (t2 join t3 inner join t4) on t2a.f2 = t1a.f1;
--echo ### MDEV-15004 parser greedily parses AS OF TIMESTAMP
--error ER_WRONG_VALUE
select timestamp'2016-02-30 08:07:06';
--error ER_WRONG_VALUE
select * from t1 for system_time as of timestamp'2016-02-30 08:07:06';
select timestamp('2003-12-31 12:00:00','12:00:00');
select * from t1 for system_time as of timestamp('2003-12-31 12:00:00','12:00:00');
drop view v1;
drop table t1, t2, t3, t4;

View File

@ -168,7 +168,7 @@ insert into t1 values (1);
insert into t2 values (2);
select * from (select * from t1 cross join t2) as tmp;
select * from (select * from (select * from t1 cross join t2) as tmp1) as tmp2;
select * from (select * from t1 cross join t2 for system_time as of timestamp '0-0-0') as tmp;
select * from (select * from t1 cross join t2 for system_time as of timestamp ('0-0-0')) as tmp;
create or replace table t1(a1 int) with system versioning;
create or replace table t2(a2 int) with system versioning;

View File

@ -65,7 +65,7 @@ insert into t1 values (1);
insert into t2 values (2);
create or replace view vt12 as select * from t1 cross join t2;
select * from vt12;
create or replace view vt12 as select * from t1 for system_time as of timestamp '0-0-0' cross join t2;
create or replace view vt12 as select * from t1 for system_time as of timestamp ('0-0-0') cross join t2;
select * from vt12;
--echo # VIEW improvements [#183]

View File

@ -884,10 +884,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%parse-param { THD *thd }
%lex-param { THD *thd }
/*
Currently there are 125 shift/reduce conflicts.
Currently there are 139 shift/reduce conflicts.
We should not introduce new conflicts any more.
*/
%expect 125
%expect 139
/*
Comments for TOKENS.
@ -1776,6 +1776,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
percentile_function
inverse_distribution_function_def
function_call_keyword
function_call_keyword_timestamp
function_call_nonkeyword
function_call_generic
function_call_conflict kill_expr
@ -9200,7 +9201,15 @@ opt_history_unit:
;
history_point:
opt_history_unit simple_expr
temporal_literal
{
$$= Vers_history_point(VERS_TIMESTAMP, $1);
}
| function_call_keyword_timestamp
{
$$= Vers_history_point(VERS_TIMESTAMP, $1);
}
| opt_history_unit simple_expr
{
$$= Vers_history_point($1, $2);
}
@ -10099,6 +10108,21 @@ simple_expr:
}
;
function_call_keyword_timestamp:
TIMESTAMP '(' expr ')'
{
$$= new (thd->mem_root) Item_datetime_typecast(thd, $3,
AUTO_SEC_PART_DIGITS);
if ($$ == NULL)
MYSQL_YYABORT;
}
| TIMESTAMP '(' expr ',' expr ')'
{
$$= new (thd->mem_root) Item_func_add_time(thd, $3, $5, 1, 0);
if ($$ == NULL)
MYSQL_YYABORT;
}
;
/*
Function call syntax using official SQL 2003 keywords.
Because the function name is an official token,
@ -10222,18 +10246,9 @@ function_call_keyword:
if ($$ == NULL)
MYSQL_YYABORT;
}
| TIMESTAMP '(' expr ')'
| function_call_keyword_timestamp
{
$$= new (thd->mem_root) Item_datetime_typecast(thd, $3,
AUTO_SEC_PART_DIGITS);
if ($$ == NULL)
MYSQL_YYABORT;
}
| TIMESTAMP '(' expr ',' expr ')'
{
$$= new (thd->mem_root) Item_func_add_time(thd, $3, $5, 1, 0);
if ($$ == NULL)
MYSQL_YYABORT;
$$= $1;
}
| TRIM '(' expr ')'
{