maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #11177
Questions about AS OF (possibly bugs found)
Hi Sergei,
I'm looking at this use rule in sql_yacc.yy:
history_point:
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);
}
;
AS OF DATE 'xxx' - returns Vers_history_point(VERS_TIMESTAMP)
AS OF DATE('xxx') - returns Vers_history_point(VERS_UNDEFINED)
AS OF TIMESTAMP('2001-01-01') - returns Vers_history_point(VERS_TIMESTAMP)
AS OF COALESCE(TIMESTAMP('2001-01-01')) - returns
Vers_history_point(VERS_UNDEFINED)
Perhaps this is not expected.
Also, this code looks suspicious:
void Vers_history_point::resolve_unit(bool timestamps_only)
{
if (item && unit == VERS_UNDEFINED)
{
if (item->type() == Item::FIELD_ITEM || timestamps_only)
unit= VERS_TIMESTAMP;
else if (item->result_type() == INT_RESULT ||
item->result_type() == REAL_RESULT)
unit= VERS_TRX_ID;
else
unit= VERS_TIMESTAMP;
}
}
Why DECIMAL_RESULT is not handled?
Why only Item::FIELD_ITEM is checked?
Can't "history_point" be simplified to something like:
history_point:
simple_expr { $$= Vers_history_point(VERS_UNDEFINED, $1); }
| TRANSACTION_SYM simple_expr { $$= Vers_history_point(VERS_TRX_ID, $2); }
;
I'm saying "something like" because TRANSACTION_SYM will cause a
conflict with simple_expr. So probably it should be cought somehow else,
by catching Item_ident and checking it name.
Btw, an SP variable with name "TRANSACTION" does not work well:
This script works fine:
DELIMITER $$
BEGIN NOT ATOMIC
DECLARE TRANSACTION int DEFAULT 10;
SELECT TRANSACTION;
END;
$$
DELIMITER ;
This script:
DELIMITER $$
BEGIN NOT ATOMIC
DECLARE TRANSACTION int DEFAULT 10;
SELECT * FROM t1 FOR SYSTEM_TIME AS OF TRANSACTION;
END;
$$
DELIMITER ;
returns an error:
ERROR 1064 (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 ';
Note, if I rename "TRANSACTION" to "TRANSACTION1", it works fine.
Thanks!
Follow ups