Commit 51e4650e authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 5.5 into 10.0

parents eef2bc5a 20fab71b
# truncate a giving file, all contents of the file are be cleared # truncate a giving file, all contents of the file are be cleared
if (!$file) if (!$TRUNCATE_FILE)
{ {
--echo Please assign a file name to $file!! die TRUNCATE_FILE is not set;
exit;
} }
let TRUNCATE_FILE= $file;
perl; perl;
use Env; open FILE, '>', $ENV{TRUNCATE_FILE} or die "open(>$ENV{TRUNCATE_FILE}): $!";
Env::import('TRUNCATE_FILE');
open FILE, '>', $TRUNCATE_FILE || die "Can not open file $file";
close FILE; close FILE;
EOF EOF
...@@ -4322,4 +4322,22 @@ set join_cache_level=@join_cache_level_save; ...@@ -4322,4 +4322,22 @@ set join_cache_level=@join_cache_level_save;
deallocate prepare stmt; deallocate prepare stmt;
drop view v1,v2,v3; drop view v1,v2,v3;
drop table t1,t2,t3; drop table t1,t2,t3;
#
# MDEV-10657: incorrect result returned with binary protocol
# (prepared statements)
#
create table t1 (code varchar(10) primary key);
INSERT INTO t1(code) VALUES ('LINE1'), ('LINE2'), ('LINE3');
SELECT X.*
FROM
(SELECT CODE, RN
FROM
(SELECT A.CODE, @cnt := @cnt + 1 AS RN
FROM t1 A, (SELECT @cnt := 0) C) T
) X;
CODE RN
LINE1 1
LINE2 2
LINE3 3
drop table t1;
# End of 5.5 tests # End of 5.5 tests
...@@ -25,7 +25,7 @@ sync_slave_with_master; ...@@ -25,7 +25,7 @@ sync_slave_with_master;
connection master; connection master;
# Delete './master-bin.000001' from index file. # Delete './master-bin.000001' from index file.
let $MYSQLD_DATADIR= `SELECT @@DATADIR`; let $MYSQLD_DATADIR= `SELECT @@DATADIR`;
let $file= $MYSQLD_DATADIR/master-bin.index; let TRUNCATE_FILE= $MYSQLD_DATADIR/master-bin.index;
source include/truncate_file.inc; source include/truncate_file.inc;
if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`) if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`)
......
...@@ -3843,4 +3843,19 @@ deallocate prepare stmt; ...@@ -3843,4 +3843,19 @@ deallocate prepare stmt;
drop view v1,v2,v3; drop view v1,v2,v3;
drop table t1,t2,t3; drop table t1,t2,t3;
--echo #
--echo # MDEV-10657: incorrect result returned with binary protocol
--echo # (prepared statements)
--echo #
create table t1 (code varchar(10) primary key);
INSERT INTO t1(code) VALUES ('LINE1'), ('LINE2'), ('LINE3');
SELECT X.*
FROM
(SELECT CODE, RN
FROM
(SELECT A.CODE, @cnt := @cnt + 1 AS RN
FROM t1 A, (SELECT @cnt := 0) C) T
) X;
drop table t1;
--echo # End of 5.5 tests --echo # End of 5.5 tests
...@@ -2394,6 +2394,8 @@ void THD::nocheck_register_item_tree_change(Item **place, Item *old_value, ...@@ -2394,6 +2394,8 @@ void THD::nocheck_register_item_tree_change(Item **place, Item *old_value,
MEM_ROOT *runtime_memroot) MEM_ROOT *runtime_memroot)
{ {
Item_change_record *change; Item_change_record *change;
DBUG_ENTER("THD::nocheck_register_item_tree_change");
DBUG_PRINT("enter", ("Register %p <- %p", old_value, (*place)));
/* /*
Now we use one node per change, which adds some memory overhead, Now we use one node per change, which adds some memory overhead,
but still is rather fast as we use alloc_root for allocations. but still is rather fast as we use alloc_root for allocations.
...@@ -2406,12 +2408,13 @@ void THD::nocheck_register_item_tree_change(Item **place, Item *old_value, ...@@ -2406,12 +2408,13 @@ void THD::nocheck_register_item_tree_change(Item **place, Item *old_value,
OOM, thd->fatal_error() is called by the error handler of the OOM, thd->fatal_error() is called by the error handler of the
memroot. Just return. memroot. Just return.
*/ */
return; DBUG_VOID_RETURN;
} }
change= new (change_mem) Item_change_record; change= new (change_mem) Item_change_record;
change->place= place; change->place= place;
change->old_value= old_value; change->old_value= old_value;
change_list.append(change); change_list.append(change);
DBUG_VOID_RETURN;
} }
/** /**
...@@ -2452,7 +2455,11 @@ void THD::rollback_item_tree_changes() ...@@ -2452,7 +2455,11 @@ void THD::rollback_item_tree_changes()
DBUG_ENTER("rollback_item_tree_changes"); DBUG_ENTER("rollback_item_tree_changes");
while ((change= it++)) while ((change= it++))
{
DBUG_PRINT("info", ("revert %p -> %p",
change->old_value, (*change->place)));
*change->place= change->old_value; *change->place= change->old_value;
}
/* We can forget about changes memory: it's allocated in runtime memroot */ /* We can forget about changes memory: it's allocated in runtime memroot */
change_list.empty(); change_list.empty();
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
......
...@@ -362,6 +362,9 @@ bool mysql_derived_merge(THD *thd, LEX *lex, TABLE_LIST *derived) ...@@ -362,6 +362,9 @@ bool mysql_derived_merge(THD *thd, LEX *lex, TABLE_LIST *derived)
SELECT_LEX *parent_lex= derived->select_lex; SELECT_LEX *parent_lex= derived->select_lex;
Query_arena *arena, backup; Query_arena *arena, backup;
DBUG_ENTER("mysql_derived_merge"); DBUG_ENTER("mysql_derived_merge");
DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
(derived->alias ? derived->alias : "<NULL>"),
derived->get_unit()));
if (derived->merged) if (derived->merged)
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
...@@ -510,7 +513,9 @@ bool mysql_derived_merge(THD *thd, LEX *lex, TABLE_LIST *derived) ...@@ -510,7 +513,9 @@ bool mysql_derived_merge(THD *thd, LEX *lex, TABLE_LIST *derived)
bool mysql_derived_merge_for_insert(THD *thd, LEX *lex, TABLE_LIST *derived) bool mysql_derived_merge_for_insert(THD *thd, LEX *lex, TABLE_LIST *derived)
{ {
DBUG_ENTER("mysql_derived_merge_for_insert"); DBUG_ENTER("mysql_derived_merge_for_insert");
DBUG_PRINT("enter", ("derived: %p", derived)); DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
(derived->alias ? derived->alias : "<NULL>"),
derived->get_unit()));
DBUG_PRINT("info", ("merged_for_insert: %d is_materialized_derived: %d " DBUG_PRINT("info", ("merged_for_insert: %d is_materialized_derived: %d "
"is_multitable: %d single_table_updatable: %d " "is_multitable: %d single_table_updatable: %d "
"merge_underlying_list: %d", "merge_underlying_list: %d",
...@@ -566,7 +571,9 @@ bool mysql_derived_init(THD *thd, LEX *lex, TABLE_LIST *derived) ...@@ -566,7 +571,9 @@ bool mysql_derived_init(THD *thd, LEX *lex, TABLE_LIST *derived)
{ {
SELECT_LEX_UNIT *unit= derived->get_unit(); SELECT_LEX_UNIT *unit= derived->get_unit();
DBUG_ENTER("mysql_derived_init"); DBUG_ENTER("mysql_derived_init");
DBUG_PRINT("enter", ("derived: %p", derived)); DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
(derived->alias ? derived->alias : "<NULL>"),
derived->get_unit()));
// Skip already prepared views/DT // Skip already prepared views/DT
if (!unit || unit->prepared) if (!unit || unit->prepared)
...@@ -637,8 +644,9 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived) ...@@ -637,8 +644,9 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived)
SELECT_LEX_UNIT *unit= derived->get_unit(); SELECT_LEX_UNIT *unit= derived->get_unit();
DBUG_ENTER("mysql_derived_prepare"); DBUG_ENTER("mysql_derived_prepare");
bool res= FALSE; bool res= FALSE;
DBUG_PRINT("enter", ("unit: %p table_list: %p Alias '%s'", DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
unit, derived, derived->alias)); (derived->alias ? derived->alias : "<NULL>"),
unit));
// Skip already prepared views/DT // Skip already prepared views/DT
if (!unit || unit->prepared || if (!unit || unit->prepared ||
...@@ -796,6 +804,9 @@ bool mysql_derived_optimize(THD *thd, LEX *lex, TABLE_LIST *derived) ...@@ -796,6 +804,9 @@ bool mysql_derived_optimize(THD *thd, LEX *lex, TABLE_LIST *derived)
bool res= FALSE; bool res= FALSE;
DBUG_ENTER("mysql_derived_optimize"); DBUG_ENTER("mysql_derived_optimize");
DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
(derived->alias ? derived->alias : "<NULL>"),
derived->get_unit()));
if (unit->optimized) if (unit->optimized)
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
...@@ -861,6 +872,9 @@ bool mysql_derived_optimize(THD *thd, LEX *lex, TABLE_LIST *derived) ...@@ -861,6 +872,9 @@ bool mysql_derived_optimize(THD *thd, LEX *lex, TABLE_LIST *derived)
bool mysql_derived_create(THD *thd, LEX *lex, TABLE_LIST *derived) bool mysql_derived_create(THD *thd, LEX *lex, TABLE_LIST *derived)
{ {
DBUG_ENTER("mysql_derived_create"); DBUG_ENTER("mysql_derived_create");
DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
(derived->alias ? derived->alias : "<NULL>"),
derived->get_unit()));
TABLE *table= derived->table; TABLE *table= derived->table;
SELECT_LEX_UNIT *unit= derived->get_unit(); SELECT_LEX_UNIT *unit= derived->get_unit();
...@@ -910,9 +924,13 @@ bool mysql_derived_create(THD *thd, LEX *lex, TABLE_LIST *derived) ...@@ -910,9 +924,13 @@ bool mysql_derived_create(THD *thd, LEX *lex, TABLE_LIST *derived)
bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived) bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived)
{ {
DBUG_ENTER("mysql_derived_fill"); Field_iterator_table field_iterator;
SELECT_LEX_UNIT *unit= derived->get_unit(); SELECT_LEX_UNIT *unit= derived->get_unit();
bool res= FALSE; bool res= FALSE;
DBUG_ENTER("mysql_derived_fill");
DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
(derived->alias ? derived->alias : "<NULL>"),
derived->get_unit()));
if (unit->executed && !unit->uncacheable && !unit->describe) if (unit->executed && !unit->uncacheable && !unit->describe)
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
...@@ -952,7 +970,27 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived) ...@@ -952,7 +970,27 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived)
if (derived_result->flush()) if (derived_result->flush())
res= TRUE; res= TRUE;
unit->executed= TRUE; unit->executed= TRUE;
if (derived->field_translation)
{
/* reset translation table to materialized table */
field_iterator.set_table(derived->table);
for (uint i= 0;
!field_iterator.end_of_fields();
field_iterator.next(), i= i + 1)
{
Item *item;
if (!(item= field_iterator.create_item(thd)))
{
res= TRUE;
break;
}
thd->change_item_tree(&derived->field_translation[i].item, item);
}
}
} }
if (res || !lex->describe) if (res || !lex->describe)
unit->cleanup(); unit->cleanup();
lex->current_select= save_current_select; lex->current_select= save_current_select;
...@@ -981,6 +1019,9 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived) ...@@ -981,6 +1019,9 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived)
bool mysql_derived_reinit(THD *thd, LEX *lex, TABLE_LIST *derived) bool mysql_derived_reinit(THD *thd, LEX *lex, TABLE_LIST *derived)
{ {
DBUG_ENTER("mysql_derived_reinit"); DBUG_ENTER("mysql_derived_reinit");
DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
(derived->alias ? derived->alias : "<NULL>"),
derived->get_unit()));
st_select_lex_unit *unit= derived->get_unit(); st_select_lex_unit *unit= derived->get_unit();
derived->merged_for_insert= FALSE; derived->merged_for_insert= FALSE;
......
...@@ -4173,6 +4173,9 @@ bool TABLE_LIST::create_field_translation(THD *thd) ...@@ -4173,6 +4173,9 @@ bool TABLE_LIST::create_field_translation(THD *thd)
Query_arena *arena, backup; Query_arena *arena, backup;
bool res= FALSE; bool res= FALSE;
DBUG_ENTER("TABLE_LIST::create_field_translation"); DBUG_ENTER("TABLE_LIST::create_field_translation");
DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
(alias ? alias : "<NULL>"),
get_unit()));
if (thd->stmt_arena->is_conventional() || if (thd->stmt_arena->is_conventional() ||
thd->stmt_arena->is_stmt_prepare_or_first_sp_execute()) thd->stmt_arena->is_stmt_prepare_or_first_sp_execute())
......
...@@ -2206,6 +2206,9 @@ struct TABLE_LIST ...@@ -2206,6 +2206,9 @@ struct TABLE_LIST
inline void set_merged_derived() inline void set_merged_derived()
{ {
DBUG_ENTER("set_merged_derived"); DBUG_ENTER("set_merged_derived");
DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
(alias ? alias : "<NULL>"),
get_unit()));
derived_type= ((derived_type & DTYPE_MASK) | derived_type= ((derived_type & DTYPE_MASK) |
DTYPE_TABLE | DTYPE_MERGE); DTYPE_TABLE | DTYPE_MERGE);
set_check_merged(); set_check_merged();
...@@ -2218,6 +2221,9 @@ struct TABLE_LIST ...@@ -2218,6 +2221,9 @@ struct TABLE_LIST
void set_materialized_derived() void set_materialized_derived()
{ {
DBUG_ENTER("set_materialized_derived"); DBUG_ENTER("set_materialized_derived");
DBUG_PRINT("enter", ("Alias: '%s' Unit: %p",
(alias ? alias : "<NULL>"),
get_unit()));
derived_type= ((derived_type & (derived ? DTYPE_MASK : DTYPE_VIEW)) | derived_type= ((derived_type & (derived ? DTYPE_MASK : DTYPE_VIEW)) |
DTYPE_TABLE | DTYPE_MATERIALIZE); DTYPE_TABLE | DTYPE_MATERIALIZE);
set_check_materialized(); set_check_materialized();
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -196,6 +196,7 @@ trx_undo_rec_get_partial_row( ...@@ -196,6 +196,7 @@ trx_undo_rec_get_partial_row(
used, as we do NOT copy the data in the used, as we do NOT copy the data in the
record! */ record! */
dict_index_t* index, /*!< in: clustered index */ dict_index_t* index, /*!< in: clustered index */
const upd_t* update, /*!< in: updated columns */
dtuple_t** row, /*!< out, own: partial row */ dtuple_t** row, /*!< out, own: partial row */
ibool ignore_prefix, /*!< in: flag to indicate if we ibool ignore_prefix, /*!< in: flag to indicate if we
expect blob prefixes in undo. Used expect blob prefixes in undo. Used
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -823,7 +823,7 @@ row_purge_parse_undo_rec( ...@@ -823,7 +823,7 @@ row_purge_parse_undo_rec(
if (!(node->cmpl_info & UPD_NODE_NO_ORD_CHANGE)) { if (!(node->cmpl_info & UPD_NODE_NO_ORD_CHANGE)) {
ptr = trx_undo_rec_get_partial_row( ptr = trx_undo_rec_get_partial_row(
ptr, clust_index, &node->row, ptr, clust_index, node->update, &node->row,
type == TRX_UNDO_UPD_DEL_REC, type == TRX_UNDO_UPD_DEL_REC,
node->heap); node->heap);
} }
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -1075,6 +1075,7 @@ trx_undo_rec_get_partial_row( ...@@ -1075,6 +1075,7 @@ trx_undo_rec_get_partial_row(
used, as we do NOT copy the data in the used, as we do NOT copy the data in the
record! */ record! */
dict_index_t* index, /*!< in: clustered index */ dict_index_t* index, /*!< in: clustered index */
const upd_t* update, /*!< in: updated columns */
dtuple_t** row, /*!< out, own: partial row */ dtuple_t** row, /*!< out, own: partial row */
ibool ignore_prefix, /*!< in: flag to indicate if we ibool ignore_prefix, /*!< in: flag to indicate if we
expect blob prefixes in undo. Used expect blob prefixes in undo. Used
...@@ -1102,6 +1103,13 @@ trx_undo_rec_get_partial_row( ...@@ -1102,6 +1103,13 @@ trx_undo_rec_get_partial_row(
->mtype = DATA_MISSING; ->mtype = DATA_MISSING;
} }
for (const upd_field_t* uf = update->fields, * const ue
= update->fields + update->n_fields;
uf != ue; uf++) {
ulint c = dict_index_get_nth_col(index, uf->field_no)->ind;
*dtuple_get_nth_field(*row, c) = uf->new_val;
}
end_ptr = ptr + mach_read_from_2(ptr); end_ptr = ptr + mach_read_from_2(ptr);
ptr += 2; ptr += 2;
...@@ -1122,6 +1130,10 @@ trx_undo_rec_get_partial_row( ...@@ -1122,6 +1130,10 @@ trx_undo_rec_get_partial_row(
ptr = trx_undo_rec_get_col_val(ptr, &field, &len, &orig_len); ptr = trx_undo_rec_get_col_val(ptr, &field, &len, &orig_len);
dfield = dtuple_get_nth_field(*row, col_no); dfield = dtuple_get_nth_field(*row, col_no);
ut_ad(dfield->type.mtype == DATA_MISSING
|| dict_col_type_assert_equal(col, &dfield->type));
ut_ad(dfield->type.mtype == DATA_MISSING
|| dfield->len == len);
dict_col_copy_type( dict_col_copy_type(
dict_table_get_nth_col(index->table, col_no), dict_table_get_nth_col(index->table, col_no),
dfield_get_type(dfield)); dfield_get_type(dfield));
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -196,6 +196,7 @@ trx_undo_rec_get_partial_row( ...@@ -196,6 +196,7 @@ trx_undo_rec_get_partial_row(
used, as we do NOT copy the data in the used, as we do NOT copy the data in the
record! */ record! */
dict_index_t* index, /*!< in: clustered index */ dict_index_t* index, /*!< in: clustered index */
const upd_t* update, /*!< in: updated columns */
dtuple_t** row, /*!< out, own: partial row */ dtuple_t** row, /*!< out, own: partial row */
ibool ignore_prefix, /*!< in: flag to indicate if we ibool ignore_prefix, /*!< in: flag to indicate if we
expect blob prefixes in undo. Used expect blob prefixes in undo. Used
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -823,7 +823,7 @@ row_purge_parse_undo_rec( ...@@ -823,7 +823,7 @@ row_purge_parse_undo_rec(
if (!(node->cmpl_info & UPD_NODE_NO_ORD_CHANGE)) { if (!(node->cmpl_info & UPD_NODE_NO_ORD_CHANGE)) {
ptr = trx_undo_rec_get_partial_row( ptr = trx_undo_rec_get_partial_row(
ptr, clust_index, &node->row, ptr, clust_index, node->update, &node->row,
type == TRX_UNDO_UPD_DEL_REC, type == TRX_UNDO_UPD_DEL_REC,
node->heap); node->heap);
} }
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -1076,6 +1076,7 @@ trx_undo_rec_get_partial_row( ...@@ -1076,6 +1076,7 @@ trx_undo_rec_get_partial_row(
used, as we do NOT copy the data in the used, as we do NOT copy the data in the
record! */ record! */
dict_index_t* index, /*!< in: clustered index */ dict_index_t* index, /*!< in: clustered index */
const upd_t* update, /*!< in: updated columns */
dtuple_t** row, /*!< out, own: partial row */ dtuple_t** row, /*!< out, own: partial row */
ibool ignore_prefix, /*!< in: flag to indicate if we ibool ignore_prefix, /*!< in: flag to indicate if we
expect blob prefixes in undo. Used expect blob prefixes in undo. Used
...@@ -1103,6 +1104,13 @@ trx_undo_rec_get_partial_row( ...@@ -1103,6 +1104,13 @@ trx_undo_rec_get_partial_row(
->mtype = DATA_MISSING; ->mtype = DATA_MISSING;
} }
for (const upd_field_t* uf = update->fields, * const ue
= update->fields + update->n_fields;
uf != ue; uf++) {
ulint c = dict_index_get_nth_col(index, uf->field_no)->ind;
*dtuple_get_nth_field(*row, c) = uf->new_val;
}
end_ptr = ptr + mach_read_from_2(ptr); end_ptr = ptr + mach_read_from_2(ptr);
ptr += 2; ptr += 2;
...@@ -1123,6 +1131,10 @@ trx_undo_rec_get_partial_row( ...@@ -1123,6 +1131,10 @@ trx_undo_rec_get_partial_row(
ptr = trx_undo_rec_get_col_val(ptr, &field, &len, &orig_len); ptr = trx_undo_rec_get_col_val(ptr, &field, &len, &orig_len);
dfield = dtuple_get_nth_field(*row, col_no); dfield = dtuple_get_nth_field(*row, col_no);
ut_ad(dfield->type.mtype == DATA_MISSING
|| dict_col_type_assert_equal(col, &dfield->type));
ut_ad(dfield->type.mtype == DATA_MISSING
|| dfield->len == len);
dict_col_copy_type( dict_col_copy_type(
dict_table_get_nth_col(index->table, col_no), dict_table_get_nth_col(index->table, col_no),
dfield_get_type(dfield)); dfield_get_type(dfield));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment