← Back to team overview

maria-developers team mailing list archive

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