Merge branch '10.6' into 10.7

This commit is contained in:
Oleksandr Byelkin 2022-10-16 21:40:33 +02:00
commit ec2b30e736
24 changed files with 233 additions and 28 deletions

@ -1 +1 @@
Subproject commit 57aac1c50b45275c7a99eca32ad985998b292dc8 Subproject commit f1e2165c591f074feb47872a8ff712713ec411e1

View File

@ -31,15 +31,23 @@ ${SSL_INTERNAL_INCLUDE_DIRS}
) )
SET(GEN_SOURCES SET(GEN_SOURCES
${CMAKE_BINARY_DIR}/sql/sql_yacc.hh ${CMAKE_BINARY_DIR}/sql/sql_yacc.hh
${CMAKE_BINARY_DIR}/sql/yy_mariadb.cc ${CMAKE_BINARY_DIR}/sql/yy_mariadb.cc
${CMAKE_BINARY_DIR}/sql/yy_oracle.hh ${CMAKE_BINARY_DIR}/sql/yy_oracle.hh
${CMAKE_BINARY_DIR}/sql/yy_oracle.cc ${CMAKE_BINARY_DIR}/sql/yy_oracle.cc
${CMAKE_BINARY_DIR}/sql/lex_hash.h ${CMAKE_BINARY_DIR}/sql/lex_hash.h
) )
SET_SOURCE_FILES_PROPERTIES(${GEN_SOURCES} PROPERTIES GENERATED TRUE) SET_SOURCE_FILES_PROPERTIES(${GEN_SOURCES} PROPERTIES GENERATED TRUE)
IF(CMAKE_C_COMPILER_ID MATCHES "Clang" AND
NOT CMAKE_C_COMPILER_VERSION VERSION_LESS "13.0.0")
ADD_COMPILE_FLAGS(
${CMAKE_BINARY_DIR}/sql/yy_mariadb.cc
${CMAKE_BINARY_DIR}/sql/yy_oracle.cc
COMPILE_FLAGS "-Wno-unused-but-set-variable")
ENDIF()
SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
libmysql.c ../sql-common/errmsg.c libmysql.c ../sql-common/errmsg.c
../sql-common/client.c ../sql-common/client.c

View File

@ -576,5 +576,8 @@ CREATE TABLE tm (a INT) ENGINE=MERGE UNION(t);
CREATE OR REPLACE TABLE t LIKE tm; CREATE OR REPLACE TABLE t LIKE tm;
ERROR HY000: Table 'tm' is specified twice, both as a target for 'CREATE' and as a separate source for data ERROR HY000: Table 'tm' is specified twice, both as a target for 'CREATE' and as a separate source for data
DROP TABLE IF EXISTS tm, t; DROP TABLE IF EXISTS tm, t;
#
# End of 10.3 tests
#
# End of 10.4 tests # End of 10.4 tests
SET GLOBAL innodb_stats_persistent=@save_persistent; SET GLOBAL innodb_stats_persistent=@save_persistent;

View File

@ -524,6 +524,10 @@ CREATE OR REPLACE TABLE t LIKE tm;
# Cleanup # Cleanup
DROP TABLE IF EXISTS tm, t; DROP TABLE IF EXISTS tm, t;
--echo #
--echo # End of 10.3 tests
--echo #
--echo # End of 10.4 tests --echo # End of 10.4 tests
SET GLOBAL innodb_stats_persistent=@save_persistent; SET GLOBAL innodb_stats_persistent=@save_persistent;

View File

@ -7,6 +7,7 @@
# application. 'mysqltest' does not handle the kill request. # application. 'mysqltest' does not handle the kill request.
# #
-- source include/count_sessions.inc
-- source include/not_embedded.inc -- source include/not_embedded.inc
--disable_service_connection --disable_service_connection

View File

@ -1,3 +1,4 @@
SET default_storage_engine= innodb;
SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
# #
@ -248,12 +249,15 @@ ENGINE=InnoDB;
INSERT IGNORE INTO t1 (a,b) VALUES(1,20190132); INSERT IGNORE INTO t1 (a,b) VALUES(1,20190132);
Warnings: Warnings:
Warning 1265 Data truncated for column 'vb' at row 1 Warning 1265 Data truncated for column 'vb' at row 1
SELECT * FROM t1;
a b vb
1 20190132 0000-00-00
BEGIN; BEGIN;
DELETE FROM t1; DELETE FROM t1;
INSERT INTO t1 (a,b) VALUES(1,20190123); INSERT INTO t1 (a,b) VALUES(1,20190123);
ERROR 22007: Incorrect date value: '20190132' for column `test`.`t1`.`vb` at row 1
SELECT * FROM t1; SELECT * FROM t1;
a b vb a b vb
1 20190123 2019-01-23
ROLLBACK; ROLLBACK;
SELECT * FROM t1; SELECT * FROM t1;
a b vb a b vb
@ -310,3 +314,62 @@ ALTER TABLE t1 ADD KEY (b), ALGORITHM=INPLACE;
# Cleanup # Cleanup
DROP TABLE t1; DROP TABLE t1;
# End of 10.2 tests # End of 10.2 tests
#
# MDEV-29299 SELECT from table with vcol index reports warning
#
CREATE TABLE t(fld1 INT NOT NULL,
fld2 INT AS (100/fld1) VIRTUAL,
KEY(fld1), KEY(fld2));
CREATE TABLE t_odd(id int);
INSERT INTO t(fld1) VALUES(1), (2);
connect stop_purge,localhost,root;
START TRANSACTION WITH CONSISTENT SNAPSHOT;
INSERT INTO t_odd VALUES(10000);
connection default;
UPDATE IGNORE t SET fld1= 3 WHERE fld1= 2;
UPDATE IGNORE t SET fld1= 4 WHERE fld1= 3;
UPDATE IGNORE t SET fld1= 0 WHERE fld1= 4;
Warnings:
Warning 1365 Division by 0
SELECT fld2 FROM t FORCE INDEX(fld2);
fld2
NULL
100
SELECT fld2 FROM t FORCE INDEX(fld1);
fld2
100
NULL
Warnings:
Warning 1365 Division by 0
disconnect stop_purge;
DROP TABLE t, t_odd;
#
# MDEV-29753 An error is wrongly reported during INSERT with vcol index
# See also Bug #22990029
#
CREATE TABLE t(pk INT PRIMARY KEY,
fld1 INT NOT NULL,
fld2 INT AS (100/fld1) VIRTUAL,
KEY(fld1), KEY(fld2));
INSERT IGNORE t(pk, fld1) VALUES(1, 0);
Warnings:
Warning 1365 Division by 0
SELECT * FROM t;
pk fld1 fld2
1 0 NULL
Warnings:
Warning 1365 Division by 0
BEGIN;
DELETE FROM t;
Warnings:
Warning 1365 Division by 0
Warning 1365 Division by 0
Warning 1365 Division by 0
INSERT INTO t (pk, fld1) VALUES(1,1);
SELECT * FROM t;
pk fld1 fld2
1 1 100
# Cleanup
ROLLBACK;
DROP TABLE t;
# End of 10.3 tests

View File

@ -1,6 +1,8 @@
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/have_sequence.inc --source include/have_sequence.inc
SET default_storage_engine= innodb;
# Ensure that the history list length will actually be decremented by purge. # Ensure that the history list length will actually be decremented by purge.
SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency; SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
@ -280,9 +282,9 @@ DROP TABLE t1;
CREATE TABLE t1(a INT PRIMARY KEY, b INT, vb DATE AS(b) VIRTUAL, KEY(vb)) CREATE TABLE t1(a INT PRIMARY KEY, b INT, vb DATE AS(b) VIRTUAL, KEY(vb))
ENGINE=InnoDB; ENGINE=InnoDB;
INSERT IGNORE INTO t1 (a,b) VALUES(1,20190132); INSERT IGNORE INTO t1 (a,b) VALUES(1,20190132);
SELECT * FROM t1;
BEGIN; BEGIN;
DELETE FROM t1; DELETE FROM t1;
--error ER_TRUNCATED_WRONG_VALUE
INSERT INTO t1 (a,b) VALUES(1,20190123); INSERT INTO t1 (a,b) VALUES(1,20190123);
SELECT * FROM t1; SELECT * FROM t1;
ROLLBACK; ROLLBACK;
@ -341,3 +343,49 @@ DROP TABLE t1;
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo #
--echo # MDEV-29299 SELECT from table with vcol index reports warning
--echo #
CREATE TABLE t(fld1 INT NOT NULL,
fld2 INT AS (100/fld1) VIRTUAL,
KEY(fld1), KEY(fld2));
CREATE TABLE t_odd(id int);
INSERT INTO t(fld1) VALUES(1), (2);
--connect stop_purge,localhost,root
# This prevents purge for records in t
START TRANSACTION WITH CONSISTENT SNAPSHOT;
INSERT INTO t_odd VALUES(10000);
--connection default
UPDATE IGNORE t SET fld1= 3 WHERE fld1= 2;
UPDATE IGNORE t SET fld1= 4 WHERE fld1= 3;
UPDATE IGNORE t SET fld1= 0 WHERE fld1= 4;
SELECT fld2 FROM t FORCE INDEX(fld2);
SELECT fld2 FROM t FORCE INDEX(fld1);
--disconnect stop_purge
DROP TABLE t, t_odd;
--echo #
--echo # MDEV-29753 An error is wrongly reported during INSERT with vcol index
--echo # See also Bug #22990029
--echo #
CREATE TABLE t(pk INT PRIMARY KEY,
fld1 INT NOT NULL,
fld2 INT AS (100/fld1) VIRTUAL,
KEY(fld1), KEY(fld2));
INSERT IGNORE t(pk, fld1) VALUES(1, 0);
SELECT * FROM t;
BEGIN;
DELETE FROM t;
INSERT INTO t (pk, fld1) VALUES(1,1);
SELECT * FROM t;
--echo # Cleanup
ROLLBACK;
DROP TABLE t;
--echo # End of 10.3 tests

View File

@ -1005,5 +1005,11 @@ name VARCHAR(10) CHARACTER SET latin1 COLLATE DEFAULT PATH '$.name'
name name
Jeans Jeans
# #
# MDEV-28480: Assertion `0' failed in Item_row::illegal_method_call
# on SELECT FROM JSON_TABLE
#
SELECT 1 FROM JSON_TABLE (row(1,2), '$' COLUMNS (o FOR ORDINALITY)) AS j;
ERROR 21000: Operand should contain 1 column(s)
#
# End of 10.6 tests # End of 10.6 tests
# #

View File

@ -863,6 +863,14 @@ SELECT * FROM json_table('[{"name":"Jeans"}]', '$[*]'
) AS jt; ) AS jt;
--echo #
--echo # MDEV-28480: Assertion `0' failed in Item_row::illegal_method_call
--echo # on SELECT FROM JSON_TABLE
--echo #
--error ER_OPERAND_COLUMNS
SELECT 1 FROM JSON_TABLE (row(1,2), '$' COLUMNS (o FOR ORDINALITY)) AS j;
--echo # --echo #
--echo # End of 10.6 tests --echo # End of 10.6 tests
--echo # --echo #

View File

@ -1143,6 +1143,11 @@ public:
{ {
return fixed() ? false : fix_fields(thd, ref); return fixed() ? false : fix_fields(thd, ref);
} }
/*
fix_fields_if_needed_for_scalar() is used where we need to filter items
that can't be scalars and want to return error for it.
*/
bool fix_fields_if_needed_for_scalar(THD *thd, Item **ref) bool fix_fields_if_needed_for_scalar(THD *thd, Item **ref)
{ {
return fix_fields_if_needed(thd, ref) || check_cols(1); return fix_fields_if_needed(thd, ref) || check_cols(1);

View File

@ -1170,7 +1170,7 @@ bool Table_function_json_table::setup(THD *thd, TABLE_LIST *sql_table,
// fields in non_agg_field_used: // fields in non_agg_field_used:
const bool saved_non_agg_field_used= s_lex->non_agg_field_used(); const bool saved_non_agg_field_used= s_lex->non_agg_field_used();
bool res= m_json->fix_fields_if_needed(thd, &m_json); bool res= m_json->fix_fields_if_needed_for_scalar(thd, &m_json);
s_lex->is_item_list_lookup= save_is_item_list_lookup; s_lex->is_item_list_lookup= save_is_item_list_lookup;
s_lex->set_non_agg_field_used(saved_non_agg_field_used); s_lex->set_non_agg_field_used(saved_non_agg_field_used);

View File

@ -3899,14 +3899,24 @@ static int init_common_variables()
if (ignore_db_dirs_init()) if (ignore_db_dirs_init())
exit(1); exit(1);
#ifdef _WIN32
get_win_tzname(system_time_zone, sizeof(system_time_zone));
#elif defined(HAVE_TZNAME)
struct tm tm_tmp; struct tm tm_tmp;
localtime_r(&server_start_time,&tm_tmp); localtime_r(&server_start_time, &tm_tmp);
const char *tz_name= tzname[tm_tmp.tm_isdst != 0 ? 1 : 0];
strmake_buf(system_time_zone, tz_name); #ifdef HAVE_TZNAME
#endif /* HAVE_TZNAME */ #ifdef _WIN32
/*
If env.variable TZ is set, derive timezone name from it.
Otherwise, use IANA tz name from get_win_tzname.
*/
if (!getenv("TZ"))
get_win_tzname(system_time_zone, sizeof(system_time_zone));
else
#endif
{
const char *tz_name= tzname[tm_tmp.tm_isdst != 0 ? 1 : 0];
strmake_buf(system_time_zone, tz_name);
}
#endif
/* /*
We set SYSTEM time zone as reasonable default and We set SYSTEM time zone as reasonable default and

View File

@ -2061,6 +2061,21 @@ public:
}; };
struct Suppress_warnings_error_handler : public Internal_error_handler
{
bool handle_condition(THD *thd,
uint sql_errno,
const char *sqlstate,
Sql_condition::enum_warning_level *level,
const char *msg,
Sql_condition **cond_hdl)
{
return *level == Sql_condition::WARN_LEVEL_WARN;
}
};
/** /**
Tables that were locked with LOCK TABLES statement. Tables that were locked with LOCK TABLES statement.

View File

@ -8874,12 +8874,28 @@ int TABLE::update_virtual_fields(handler *h, enum_vcol_update_mode update_mode)
DBUG_RETURN(in_use->is_error()); DBUG_RETURN(in_use->is_error());
} }
int TABLE::update_virtual_field(Field *vf) /*
Calculate the virtual field value for a specified field.
@param vf A field to calculate
@param ignore_warnings Ignore the warnings and also make the
calculations permissive. This usually means
that a calculation is internal and is not
expected to fail.
*/
int TABLE::update_virtual_field(Field *vf, bool ignore_warnings)
{ {
DBUG_ENTER("TABLE::update_virtual_field"); DBUG_ENTER("TABLE::update_virtual_field");
Query_arena backup_arena; Query_arena backup_arena;
Counting_error_handler count_errors; Counting_error_handler count_errors;
Suppress_warnings_error_handler warning_handler;
in_use->push_internal_handler(&count_errors); in_use->push_internal_handler(&count_errors);
bool abort_on_warning;
if (ignore_warnings)
{
abort_on_warning= in_use->abort_on_warning;
in_use->abort_on_warning= false;
in_use->push_internal_handler(&warning_handler);
}
/* /*
TODO: this may impose memory leak until table flush. TODO: this may impose memory leak until table flush.
See comment in See comment in
@ -8893,6 +8909,13 @@ int TABLE::update_virtual_field(Field *vf)
DBUG_RESTORE_WRITE_SET(vf); DBUG_RESTORE_WRITE_SET(vf);
in_use->restore_active_arena(expr_arena, &backup_arena); in_use->restore_active_arena(expr_arena, &backup_arena);
in_use->pop_internal_handler(); in_use->pop_internal_handler();
if (ignore_warnings)
{
in_use->abort_on_warning= abort_on_warning;
in_use->pop_internal_handler();
// This is an internal calculation, we expect it to always succeed
DBUG_ASSERT(count_errors.errors == 0);
}
DBUG_RETURN(count_errors.errors); DBUG_RETURN(count_errors.errors);
} }

View File

@ -1687,7 +1687,7 @@ public:
uint actual_n_key_parts(KEY *keyinfo); uint actual_n_key_parts(KEY *keyinfo);
ulong actual_key_flags(KEY *keyinfo); ulong actual_key_flags(KEY *keyinfo);
int update_virtual_field(Field *vf); int update_virtual_field(Field *vf, bool ignore_warnings);
int update_virtual_fields(handler *h, enum_vcol_update_mode update_mode); int update_virtual_fields(handler *h, enum_vcol_update_mode update_mode);
int update_default_fields(bool ignore_errors); int update_default_fields(bool ignore_errors);
void evaluate_update_default_function(); void evaluate_update_default_function();

View File

@ -20260,7 +20260,8 @@ innobase_get_computed_value(
TABLE* mysql_table, TABLE* mysql_table,
byte* mysql_rec, byte* mysql_rec,
const dict_table_t* old_table, const dict_table_t* old_table,
const upd_t* update) const upd_t* update,
bool ignore_warnings)
{ {
byte rec_buf2[REC_VERSION_56_MAX_INDEX_COL_LEN]; byte rec_buf2[REC_VERSION_56_MAX_INDEX_COL_LEN];
byte* buf; byte* buf;
@ -20367,7 +20368,9 @@ innobase_get_computed_value(
MY_BITMAP *old_write_set = dbug_tmp_use_all_columns(mysql_table, &mysql_table->write_set); MY_BITMAP *old_write_set = dbug_tmp_use_all_columns(mysql_table, &mysql_table->write_set);
MY_BITMAP *old_read_set = dbug_tmp_use_all_columns(mysql_table, &mysql_table->read_set); MY_BITMAP *old_read_set = dbug_tmp_use_all_columns(mysql_table, &mysql_table->read_set);
ret = mysql_table->update_virtual_field(mysql_table->field[col->m_col.ind]); ret = mysql_table->update_virtual_field(
mysql_table->field[col->m_col.ind],
ignore_warnings);
dbug_tmp_restore_column_map(&mysql_table->read_set, old_read_set); dbug_tmp_restore_column_map(&mysql_table->read_set, old_read_set);
dbug_tmp_restore_column_map(&mysql_table->write_set, old_write_set); dbug_tmp_restore_column_map(&mysql_table->write_set, old_write_set);

View File

@ -810,7 +810,9 @@ void innobase_report_computed_value_failed(dtuple_t *row);
@param[in] old_table during ALTER TABLE, this is the old table @param[in] old_table during ALTER TABLE, this is the old table
or NULL. or NULL.
@param[in] update update vector for the parent row @param[in] update update vector for the parent row
@param[in] foreign foreign key information @param[in] ignore_warnings ignore warnings during calculation. Usually
means that a calculation is internal and
should have no side effects.
@return the field filled with computed value */ @return the field filled with computed value */
dfield_t* dfield_t*
innobase_get_computed_value( innobase_get_computed_value(
@ -823,8 +825,9 @@ innobase_get_computed_value(
THD* thd, THD* thd,
TABLE* mysql_table, TABLE* mysql_table,
byte* mysql_rec, byte* mysql_rec,
const dict_table_t* old_table, const dict_table_t* old_table=NULL,
const upd_t* update); const upd_t* update=NULL,
bool ignore_warnings=false);
/** Get the computed value by supplying the base column values. /** Get the computed value by supplying the base column values.
@param[in,out] table the table whose virtual column @param[in,out] table the table whose virtual column

View File

@ -150,6 +150,8 @@ the equal ordering fields. NOTE: we compare the fields as binary strings!
@param[in] offsets rec_get_offsets(rec,index), or NULL @param[in] offsets rec_get_offsets(rec,index), or NULL
@param[in] no_sys skip the system columns @param[in] no_sys skip the system columns
DB_TRX_ID and DB_ROLL_PTR DB_TRX_ID and DB_ROLL_PTR
@param[in] ignore_warnings ignore warnings during vcol calculation, which
means that this calculation is internal only
@param[in] trx transaction (for diagnostics), @param[in] trx transaction (for diagnostics),
or NULL or NULL
@param[in] heap memory heap from which allocated @param[in] heap memory heap from which allocated
@ -165,11 +167,12 @@ row_upd_build_difference_binary(
const rec_t* rec, const rec_t* rec,
const rec_offs* offsets, const rec_offs* offsets,
bool no_sys, bool no_sys,
bool ignore_warnings,
trx_t* trx, trx_t* trx,
mem_heap_t* heap, mem_heap_t* heap,
TABLE* mysql_table, TABLE* mysql_table,
dberr_t* error) dberr_t* error)
MY_ATTRIBUTE((nonnull(1,2,3,7,9), warn_unused_result)); MY_ATTRIBUTE((nonnull(1,2,3,8,10), warn_unused_result));
/** Apply an update vector to an index entry. /** Apply an update vector to an index entry.
@param[in,out] entry index entry to be updated; the clustered index record @param[in,out] entry index entry to be updated; the clustered index record
must be covered by a lock or a page latch to prevent must be covered by a lock or a page latch to prevent

View File

@ -307,7 +307,7 @@ row_ins_clust_index_entry_by_modify(
} }
update = row_upd_build_difference_binary( update = row_upd_build_difference_binary(
cursor->index, entry, rec, NULL, true, cursor->index, entry, rec, NULL, true, true,
thr_get_trx(thr), heap, mysql_table, &err); thr_get_trx(thr), heap, mysql_table, &err);
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
return(err); return(err);

View File

@ -1979,7 +1979,7 @@ func_exit_committed:
row, NULL, index, heap, ROW_BUILD_NORMAL); row, NULL, index, heap, ROW_BUILD_NORMAL);
upd_t* update = row_upd_build_difference_binary( upd_t* update = row_upd_build_difference_binary(
index, entry, btr_pcur_get_rec(&pcur), cur_offsets, index, entry, btr_pcur_get_rec(&pcur), cur_offsets,
false, NULL, heap, dup->table, &error); false, false, NULL, heap, dup->table, &error);
if (error != DB_SUCCESS || !update->n_fields) { if (error != DB_SUCCESS || !update->n_fields) {
goto func_exit; goto func_exit;
} }

View File

@ -332,7 +332,8 @@ row_sel_sec_rec_is_for_clust_rec(
&heap, NULL, NULL, &heap, NULL, NULL,
thr_get_trx(thr)->mysql_thd, thr_get_trx(thr)->mysql_thd,
thr->prebuilt->m_mysql_table, thr->prebuilt->m_mysql_table,
record, NULL, NULL); record, NULL, NULL,
true);
if (vfield == NULL) { if (vfield == NULL) {
innobase_report_computed_value_failed(row); innobase_report_computed_value_failed(row);

View File

@ -601,6 +601,7 @@ row_upd_build_difference_binary(
const rec_t* rec, const rec_t* rec,
const rec_offs* offsets, const rec_offs* offsets,
bool no_sys, bool no_sys,
bool ignore_warnings,
trx_t* trx, trx_t* trx,
mem_heap_t* heap, mem_heap_t* heap,
TABLE* mysql_table, TABLE* mysql_table,
@ -699,7 +700,7 @@ row_upd_build_difference_binary(
dfield_t* vfield = innobase_get_computed_value( dfield_t* vfield = innobase_get_computed_value(
update->old_vrow, col, index, update->old_vrow, col, index,
&vc.heap, heap, NULL, thd, mysql_table, record, &vc.heap, heap, NULL, thd, mysql_table, record,
NULL, NULL); NULL, NULL, ignore_warnings);
if (vfield == NULL) { if (vfield == NULL) {
*error = DB_COMPUTE_VALUE_FAILED; *error = DB_COMPUTE_VALUE_FAILED;
return(NULL); return(NULL);

View File

@ -412,7 +412,7 @@
#ifdef MRN_MARIADB_P #ifdef MRN_MARIADB_P
# if (MYSQL_VERSION_ID >= 100203) # if (MYSQL_VERSION_ID >= 100203)
# define MRN_GENERATED_COLUMNS_UPDATE_VIRTUAL_FIELD(table, field) \ # define MRN_GENERATED_COLUMNS_UPDATE_VIRTUAL_FIELD(table, field) \
(table->update_virtual_field(field)) (table->update_virtual_field(field,false))
# else # else
# define MRN_GENERATED_COLUMNS_UPDATE_VIRTUAL_FIELD(table, field) \ # define MRN_GENERATED_COLUMNS_UPDATE_VIRTUAL_FIELD(table, field) \
(field->vcol_info->expr_item->save_in_field(field, 0)) (field->vcol_info->expr_item->save_in_field(field, 0))

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2000, 2018, Oracle and/or its affiliates. Copyright (c) 2000, 2018, Oracle and/or its affiliates.
Copyright (c) 2009, 2017, MariaDB Corporation. Copyright (c) 2009, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -730,7 +730,7 @@ static int compute_vcols(MI_INFO *info, uchar *record, int keynum)
{ {
Field *f= table->field[kp->fieldnr - 1]; Field *f= table->field[kp->fieldnr - 1];
if (f->vcol_info && !f->vcol_info->stored_in_db) if (f->vcol_info && !f->vcol_info->stored_in_db)
table->update_virtual_field(f); table->update_virtual_field(f, false);
} }
mysql_mutex_unlock(&info->s->intern_lock); mysql_mutex_unlock(&info->s->intern_lock);
return 0; return 0;