maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #13321
Re: 24c653be25a: unpack_row: unpack a correct number of fields
Hi, Nikita,
On May 05, Nikita Malyavin wrote:
> revision-id: 24c653be25a (mariadb-11.0.1-123-g24c653be25a)
> parent(s): c1cbda5a2c8
> author: Nikita Malyavin
> committer: Nikita Malyavin
> timestamp: 2023-05-04 20:49:43 +0300
> message:
>
> unpack_row: unpack a correct number of fields
>
> diff --git a/sql/rpl_record.cc b/sql/rpl_record.cc
> index 908d2c39d97..30bd80bdfc7 100644
> --- a/sql/rpl_record.cc
> +++ b/sql/rpl_record.cc
> @@ -228,24 +228,30 @@ int unpack_row(const rpl_group_info *rgi, TABLE *table, uint const colcnt,
> const TABLE *conv_table= rpl_data.conv_table;
> DBUG_PRINT("debug", ("Table data: tabldef: %p, conv_table: %p",
> tabledef, conv_table));
> -
> + bool is_online_alter= rpl_data.is_online_alter();
> DBUG_ASSERT(rgi);
>
> - for (field_ptr= begin_ptr; field_ptr < end_ptr && *field_ptr; ++field_ptr)
> + for (field_ptr= begin_ptr; field_ptr < end_ptr
> + /* In Online Alter conv_table can be wider than
> + original table, but we need to unpack it all. */
> + && (*field_ptr || is_online_alter);
I failed to understand this, could you please explain? The comment didn't
help much, unfortunately. The test case didn't either.
> + ++field_ptr)
> {
> + intptr fidx= field_ptr - begin_ptr;
intptr is a variant of int with sizeof(intptr) == sizeof(void*).
it's needed to cast a pointer to int, do some math, cast back.
here you need my_ptrdiff_t or ptrdiff_t
> /*
> If there is a conversion table, we pick up the field pointer to
> the conversion table. If the conversion table or the field
> pointer is NULL, no conversions are necessary.
> */
> - Field *conv_field= conv_table ? conv_table->field[field_ptr - begin_ptr] : NULL;
> + Field *conv_field= conv_table ? conv_table->field[fidx] : NULL;
> Field *const f= conv_field ? conv_field : *field_ptr;
> +#ifdef DBUG_TRACE
> + Field *dbg= is_online_alter ? f : *field_ptr;
> +#endif
> DBUG_PRINT("debug", ("Conversion %srequired for field '%s' (#%ld)",
> conv_field ? "" : "not ",
> - (*field_ptr)->field_name.str,
> - (long) (field_ptr - begin_ptr)));
> + dbg->field_name.str,
> + (long) ()));
eh? you surely meant `(long) fidx` ?
how did it even compile?
> DBUG_ASSERT(f != NULL);
Regards,
Sergei
VP of MariaDB Server Engineering
and security@xxxxxxxxxxx
Follow ups