← Back to team overview

maria-developers team mailing list archive

Re: [Commits] 3a8f101: MDEV-11379 - AliSQL: [Feature] Issue#8: SELECT FOR UPDATE WAIT

 

Hi!

>>>>> "Sergey" == Sergey Vojtovich <svoj@xxxxxxxxxxx> writes:

Sergey> revision-id: 3a8f101a173b987b314ba5fcc5c74d80ab56802b (mariadb-10.2.2-160-g3a8f101)
Sergey> parent(s): c846ebe9df9adc90a5c25be0dce816c5d4302794
Sergey> committer: Sergey Vojtovich
Sergey> timestamp: 2017-02-07 13:27:42 +0400
Sergey> message:

Sergey> MDEV-11379 - AliSQL: [Feature] Issue#8: SELECT FOR UPDATE WAIT

Sergey> Extended syntax so that it is now possible to set lock_wait_timeout for the
Sergey> following statements:
Sergey> SELECT ... FOR UPDATE [WAIT n|NOWAIT]
Sergey> SELECT ... LOCK IN SHARED MODE [WAIT n|NOWAIT]
Sergey> LOCK TABLE ... [WAIT n|NOWAIT]

Sergey> This is amended AliSQL patch. We prefer Oracle syntax for [WAIT n|NOWAIT]
Sergey> instead of original [WAIT [n]|NO_WAIT].

Agree it's better to use a syntax that someone else is using.


Sergey> diff --git a/include/mysql/plugin.h b/include/mysql/plugin.h
Sergey> index b3c71c65..b0a5849 100644
Sergey> --- a/include/mysql/plugin.h
Sergey> +++ b/include/mysql/plugin.h
Sergey> @@ -633,6 +633,7 @@ void thd_storage_lock_wait(MYSQL_THD thd, long long value);
Sergey>  int thd_tx_isolation(const MYSQL_THD thd);
Sergey>  int thd_tx_is_read_only(const MYSQL_THD thd);
Sergey>  int thd_rpl_is_parallel(const MYSQL_THD thd);
Sergey> +unsigned long thd_lex_lock_wait_timeout(const MYSQL_THD thd);
Sergey>  /**
Sergey>    Create a temporary file.

<cut>

Sergey> +++ b/sql/sql_base.cc
Sergey> @@ -2723,13 +2723,18 @@ Open_table_context::Open_table_context(THD *thd, uint flags)
Sergey>    :m_thd(thd),
Sergey>     m_failed_table(NULL),
Sergey>     m_start_of_statement_svp(thd->mdl_context.mdl_savepoint()),
Sergey> -   m_timeout(flags & MYSQL_LOCK_IGNORE_TIMEOUT ?
Sergey> -             LONG_TIMEOUT : thd->variables.lock_wait_timeout),
Sergey>     m_flags(flags),
Sergey>     m_action(OT_NO_ACTION),
Sergey>     m_has_locks(thd->mdl_context.has_locks()),
Sergey>     m_has_protection_against_grl(FALSE)
Sergey> -{}
Sergey> +{
Sergey> +  if (flags & MYSQL_LOCK_IGNORE_TIMEOUT)
Sergey> +    m_timeout= LONG_TIMEOUT;
Sergey> +  else if (thd->lex->lock_wait_timeout == ULONG_MAX)
Sergey> +    m_timeout= thd->variables.lock_wait_timeout;
Sergey> +  else
Sergey> +    m_timeout= thd->lex->lock_wait_timeout;
Sergey> +}

Instead of adding thd->lex->lock_wait_timeout I suggest that we
instead use the existing facititliy of

SET STATEMENT innodb_lock_wait_timeout=xxx SELECT

This has the following benefits:
- We only need one innodb timeout variable, not two
- Probably simpler code. Very few changes needed in InnoDB
- One will get exactly same behaviour independent of the syntax that is
  used

This would change the task to be implemented the following wat:
- If WAIT|NOWAIT is used, change in sql_yacc.yy to use the SET
  STATEMENT facility to set innodb_lock_wait_timeout and
  lock_wait_timeout
- Add support for nowait (timeout == 0 would mean nowait)

I agree that having the new syntax is good as it's used by other
databases and simpler than having to set two variables.

Regards,
Monty