Re: [Maria-developers] 773d24d457a: MDEV-15951 system versioning by trx id doesn't work with partitioning

2019-02-28 Thread Nikita Malyavin
> > +DBUG_RETURN(TRUE);
>> > +  }
>> >num_fields++;
>> > +}
>> >}
>> >if (unlikely(num_fields > MAX_REF_PARTS))
>> >{
>> > diff --git a/sql/table.cc b/sql/table.cc
>> > index ce7a34a8fe2..0c2ff1eea5a 100644
>> > --- a/sql/table.cc
>> > +++ b/sql/table.cc
>> > @@ -1776,7 +1776,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD
>> *thd, bool write,
>> >goto err;
>> >  DBUG_PRINT("info", ("Columns with system versioning: [%d, %d]",
>> row_start, row_end));
>> >  versioned= VERS_TIMESTAMP;
>> > -vers_can_native= plugin_hton(se_plugin)->flags &
>> HTON_NATIVE_SYS_VERSIONING;
>> > +vers_can_native= handler_file->vers_can_native(thd);
>>
>> Interesting. How does that work? Your ha_partition::vers_can_native() is
>>
>>   bool can= !thd->lex->part_info
>> || thd->lex->part_info->part_type != VERSIONING_PARTITION;
>>   for (uint i= 0; i < m_tot_parts && can; i++)
>> can= can && m_file[i]->vers_can_native(thd);
>>   return can;
>>
>> But it doesn't look like thd->lex->part_info->part_type is initialized
>> at this point in time. Try to add to your test case
>>
>>   flush tables;
>>   select * from t1;
>>
>> Yes, part_info is going to be filled only if creating, or altering table.
> It works as follows:
> If we're creating/altering, then check thd->lex->part_info;
> else, check m_file array, which is initialized at that point.
>
> Added this as the comment for clarity.
>
No, have rewritten it in another style. Should be sane enough now.
Is it?
-- 
Yours truly,
Nikita Malyavin
___
Mailing list: https://launchpad.net/~maria-developers
Post to : maria-developers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~maria-developers
More help   : https://help.launchpad.net/ListHelp


Re: [Maria-developers] 773d24d457a: MDEV-15951 system versioning by trx id doesn't work with partitioning

2019-02-28 Thread Nikita Malyavin
On Wed, Dec 26, 2018 at 8:53 AM Sergei Golubchik  wrote:

> Hi, Nikita!
>
> On Dec 25, Nikita Malyavin wrote:
> > revision-id: 773d24d457a (versioning-1.0.6-100-g773d24d457a)
> > parent(s): b26736cdb11
> > author: Nikita Malyavin 
> > committer: Nikita Malyavin 
> > timestamp: 2018-12-21 03:13:47 +1000
> > message:
> >
> > MDEV-15951 system versioning by trx id doesn't work with partitioning
> >
> > Fix partitioning for trx_id-versioned tables.
> > `partition by hash`, `range` and others now work.
> > `partition by system_time` is forbidden.
> > Currently we cannot use row_start and row_end in `partition by`, because
> > insertion of versioned field is done by engine's handler, as well as
> > row_start/row_end's value set up, which is a transaction id -- so it's
> > also forbidden.
> >
> > The drawback is that it's now impossible to use `partition by key()`
> > without parameters for such tables, because it references row_start and
> > row_end implicitly.
> >
> > * add handler::vers_can_native()
> > * drop Table_scope_and_contents_source_st::vers_native()
> > * drop partition_element::find_engine_flag as unused
> > * forbid versioning partitioning for trx_id as not supported
> > * adopt vers tests for trx_id partitioning
> > * forbid any row_end referencing in `partition by` clauses,
> >   including implicit `by key()`
> >
> > diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
> > index 9e6c333d3c9..48bcb828d56 100644
> > --- a/sql/sql_partition.cc
> > +++ b/sql/sql_partition.cc
> > @@ -341,7 +341,16 @@ static bool set_up_field_array(THD *thd, TABLE
> *table,
> >while ((field= *(ptr++)))
> >{
> >  if (field->flags & GET_FIXED_FIELDS_FLAG)
> > +{
> > +  if (table->versioned(VERS_TRX_ID)
> > +  && unlikely(field->flags & VERS_SYSTEM_FIELD))
> > +  {
> > +my_error(ER_VERS_NOT_SUPPORTED, MYF(0),
> > + "Using ROW START/END for patitioning",
> "transactional");
>
> This is incorrect usage of error message parameters. The error message
> can be translated, parameters can be reordered - you should not use
> English as parameter values. Consider:
>
>   transactional cистемно-версионированные таблицы не поддерживают Using
> ROW START/END for patitioning
>
> But looks like ER_VERS_NOT_SUPPORTED is not used anywhere at the moment.
> So you can change it to be anything you want, even remove all
> parameters:
>
>   Transactional system versioned tables do not support partitioning by ROW
> START or ROW END
>
> Done as well.


> > +DBUG_RETURN(TRUE);
> > +  }
> >num_fields++;
> > +}
> >}
> >if (unlikely(num_fields > MAX_REF_PARTS))
> >{
> > diff --git a/sql/table.cc b/sql/table.cc
> > index ce7a34a8fe2..0c2ff1eea5a 100644
> > --- a/sql/table.cc
> > +++ b/sql/table.cc
> > @@ -1776,7 +1776,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD
> *thd, bool write,
> >goto err;
> >  DBUG_PRINT("info", ("Columns with system versioning: [%d, %d]",
> row_start, row_end));
> >  versioned= VERS_TIMESTAMP;
> > -vers_can_native= plugin_hton(se_plugin)->flags &
> HTON_NATIVE_SYS_VERSIONING;
> > +vers_can_native= handler_file->vers_can_native(thd);
>
> Interesting. How does that work? Your ha_partition::vers_can_native() is
>
>   bool can= !thd->lex->part_info
> || thd->lex->part_info->part_type != VERSIONING_PARTITION;
>   for (uint i= 0; i < m_tot_parts && can; i++)
> can= can && m_file[i]->vers_can_native(thd);
>   return can;
>
> But it doesn't look like thd->lex->part_info->part_type is initialized
> at this point in time. Try to add to your test case
>
>   flush tables;
>   select * from t1;
>
> Yes, part_info is going to be filled only if creating, or altering table.
It works as follows:
If we're creating/altering, then check thd->lex->part_info;
else, check m_file array, which is initialized at that point.

Added this as the comment for clarity.

-- 
Yours truly,
Nikita Malyavin
___
Mailing list: https://launchpad.net/~maria-developers
Post to : maria-developers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~maria-developers
More help   : https://help.launchpad.net/ListHelp


Re: [Maria-developers] 773d24d457a: MDEV-15951 system versioning by trx id doesn't work with partitioning

2018-12-25 Thread Sergei Golubchik
Hi, Nikita!

On Dec 25, Nikita Malyavin wrote:
> revision-id: 773d24d457a (versioning-1.0.6-100-g773d24d457a)
> parent(s): b26736cdb11
> author: Nikita Malyavin 
> committer: Nikita Malyavin 
> timestamp: 2018-12-21 03:13:47 +1000
> message:
> 
> MDEV-15951 system versioning by trx id doesn't work with partitioning
> 
> Fix partitioning for trx_id-versioned tables.
> `partition by hash`, `range` and others now work.
> `partition by system_time` is forbidden.
> Currently we cannot use row_start and row_end in `partition by`, because
> insertion of versioned field is done by engine's handler, as well as
> row_start/row_end's value set up, which is a transaction id -- so it's
> also forbidden.
> 
> The drawback is that it's now impossible to use `partition by key()`
> without parameters for such tables, because it references row_start and
> row_end implicitly.
> 
> * add handler::vers_can_native()
> * drop Table_scope_and_contents_source_st::vers_native()
> * drop partition_element::find_engine_flag as unused
> * forbid versioning partitioning for trx_id as not supported
> * adopt vers tests for trx_id partitioning
> * forbid any row_end referencing in `partition by` clauses,
>   including implicit `by key()`
> 
> diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
> index 9e6c333d3c9..48bcb828d56 100644
> --- a/sql/sql_partition.cc
> +++ b/sql/sql_partition.cc
> @@ -341,7 +341,16 @@ static bool set_up_field_array(THD *thd, TABLE *table,
>while ((field= *(ptr++))) 
>{
>  if (field->flags & GET_FIXED_FIELDS_FLAG)
> +{
> +  if (table->versioned(VERS_TRX_ID)
> +  && unlikely(field->flags & VERS_SYSTEM_FIELD))
> +  {
> +my_error(ER_VERS_NOT_SUPPORTED, MYF(0),
> + "Using ROW START/END for patitioning", "transactional");

This is incorrect usage of error message parameters. The error message
can be translated, parameters can be reordered - you should not use
English as parameter values. Consider:

  transactional cистемно-версионированные таблицы не поддерживают Using ROW 
START/END for patitioning

But looks like ER_VERS_NOT_SUPPORTED is not used anywhere at the moment.
So you can change it to be anything you want, even remove all
parameters:

  Transactional system versioned tables do not support partitioning by ROW 
START or ROW END

> +DBUG_RETURN(TRUE);
> +  }
>num_fields++;
> +}
>}
>if (unlikely(num_fields > MAX_REF_PARTS))
>{
> diff --git a/sql/table.cc b/sql/table.cc
> index ce7a34a8fe2..0c2ff1eea5a 100644
> --- a/sql/table.cc
> +++ b/sql/table.cc
> @@ -1776,7 +1776,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, 
> bool write,
>goto err;
>  DBUG_PRINT("info", ("Columns with system versioning: [%d, %d]", 
> row_start, row_end));
>  versioned= VERS_TIMESTAMP;
> -vers_can_native= plugin_hton(se_plugin)->flags & 
> HTON_NATIVE_SYS_VERSIONING;
> +vers_can_native= handler_file->vers_can_native(thd);

Interesting. How does that work? Your ha_partition::vers_can_native() is

  bool can= !thd->lex->part_info
|| thd->lex->part_info->part_type != VERSIONING_PARTITION;
  for (uint i= 0; i < m_tot_parts && can; i++)
can= can && m_file[i]->vers_can_native(thd);
  return can;

But it doesn't look like thd->lex->part_info->part_type is initialized
at this point in time. Try to add to your test case

  flush tables;
  select * from t1;

Regards,
Sergei
Chief Architect MariaDB
and secur...@mariadb.org

___
Mailing list: https://launchpad.net/~maria-developers
Post to : maria-developers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~maria-developers
More help   : https://help.launchpad.net/ListHelp