maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #10368
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