mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge 10.3 into 10.4
This commit is contained in:
@ -30,9 +30,9 @@ lookup("127.0.0.1")
|
|||||||
127.0.0.1
|
127.0.0.1
|
||||||
select lookup(127,0,0,1);
|
select lookup(127,0,0,1);
|
||||||
ERROR HY000: Can't initialize function 'lookup'; Wrong arguments to lookup; Use the source
|
ERROR HY000: Can't initialize function 'lookup'; Wrong arguments to lookup; Use the source
|
||||||
select lookup("localhost");
|
select lookup("localhost") rlike '^127\.\\d+\.\\d+.\\d+$';
|
||||||
lookup("localhost")
|
lookup("localhost") rlike '^127\.\\d+\.\\d+.\\d+$'
|
||||||
127.0.0.1
|
1
|
||||||
select reverse_lookup();
|
select reverse_lookup();
|
||||||
ERROR HY000: Can't initialize function 'reverse_lookup'; Wrong number of arguments to reverse_lookup; Use the source
|
ERROR HY000: Can't initialize function 'reverse_lookup'; Wrong number of arguments to reverse_lookup; Use the source
|
||||||
select reverse_lookup("127.0.0.1");
|
select reverse_lookup("127.0.0.1");
|
||||||
|
@ -47,7 +47,7 @@ select lookup();
|
|||||||
select lookup("127.0.0.1");
|
select lookup("127.0.0.1");
|
||||||
--error ER_CANT_INITIALIZE_UDF
|
--error ER_CANT_INITIALIZE_UDF
|
||||||
select lookup(127,0,0,1);
|
select lookup(127,0,0,1);
|
||||||
select lookup("localhost");
|
select lookup("localhost") rlike '^127\.\\d+\.\\d+.\\d+$';
|
||||||
--error ER_CANT_INITIALIZE_UDF
|
--error ER_CANT_INITIALIZE_UDF
|
||||||
select reverse_lookup();
|
select reverse_lookup();
|
||||||
|
|
||||||
|
@ -427,6 +427,26 @@ aaa
|
|||||||
Warnings:
|
Warnings:
|
||||||
Warning 1918 Encountered illegal value '\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7' when converting to DOUBLE
|
Warning 1918 Encountered illegal value '\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7' when converting to DOUBLE
|
||||||
#
|
#
|
||||||
|
# MDEV-22579 No error when inserting DEFAULT(non_virtual_column) into a virtual column
|
||||||
|
#
|
||||||
|
SET sql_mode=STRICT_ALL_TABLES;
|
||||||
|
CREATE OR REPLACE TABLE t1 (
|
||||||
|
a INT NOT NULL DEFAULT 10,
|
||||||
|
b INT AS (a+1) VIRTUAL
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 (b) VALUES (10);
|
||||||
|
ERROR HY000: The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
INSERT INTO t1 (b) VALUES (DEFAULT(a));
|
||||||
|
ERROR HY000: The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
INSERT INTO t1 (b) VALUES (DEFAULT);
|
||||||
|
INSERT INTO t1 VALUES (10,10);
|
||||||
|
ERROR HY000: The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
INSERT INTO t1 VALUES (10,DEFAULT(a));
|
||||||
|
ERROR HY000: The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
INSERT INTO t1 VALUES (10, DEFAULT);
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET sql_mode=DEFAULT;
|
||||||
|
#
|
||||||
# End of 10.1 tests
|
# End of 10.1 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
@ -481,5 +501,37 @@ Warning 1264 Out of range value for column 'vi' at row 1
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET @sql_mode=@old_sql_mode;
|
SET @sql_mode=@old_sql_mode;
|
||||||
#
|
#
|
||||||
|
# MDEV-22579 No error when inserting DEFAULT(non_virtual_column) into a virtual column
|
||||||
|
# 10.2+ specific part
|
||||||
|
#
|
||||||
|
SET sql_mode=STRICT_ALL_TABLES;
|
||||||
|
CREATE OR REPLACE TABLE t1 (
|
||||||
|
a INT NOT NULL DEFAULT 10,
|
||||||
|
b INT AS (a+1) VIRTUAL
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
EXECUTE IMMEDIATE 'INSERT INTO t1 (b) VALUES(?)' USING DEFAULT;
|
||||||
|
EXECUTE IMMEDIATE 'INSERT INTO t1 (b) VALUES(?)' USING IGNORE;
|
||||||
|
INSERT INTO t1 (b) VALUES (DEFAULT);
|
||||||
|
INSERT INTO t1 (b) VALUES (IGNORE);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a b
|
||||||
|
10 11
|
||||||
|
10 11
|
||||||
|
10 11
|
||||||
|
10 11
|
||||||
|
DELETE FROM t1;
|
||||||
|
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES(10,?)' USING DEFAULT;
|
||||||
|
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES(11,?)' USING IGNORE;
|
||||||
|
INSERT INTO t1 VALUES (12,DEFAULT);
|
||||||
|
INSERT INTO t1 VALUES (13,IGNORE);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a b
|
||||||
|
10 11
|
||||||
|
11 12
|
||||||
|
12 13
|
||||||
|
13 14
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET sql_mode=DEFAULT;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
|
@ -385,6 +385,36 @@ SELECT COLUMN_GET(@aaa, 'price' AS DECIMAL) aaa;
|
|||||||
SELECT COLUMN_GET(@aaa, 'price' AS INT) aaa;
|
SELECT COLUMN_GET(@aaa, 'price' AS INT) aaa;
|
||||||
SELECT COLUMN_GET(@aaa, 'price' AS DOUBLE) aaa;
|
SELECT COLUMN_GET(@aaa, 'price' AS DOUBLE) aaa;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-22579 No error when inserting DEFAULT(non_virtual_column) into a virtual column
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET sql_mode=STRICT_ALL_TABLES;
|
||||||
|
CREATE OR REPLACE TABLE t1 (
|
||||||
|
a INT NOT NULL DEFAULT 10,
|
||||||
|
b INT AS (a+1) VIRTUAL
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
|
||||||
|
# Testing with a column list
|
||||||
|
|
||||||
|
--error ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN
|
||||||
|
INSERT INTO t1 (b) VALUES (10);
|
||||||
|
--error ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN
|
||||||
|
INSERT INTO t1 (b) VALUES (DEFAULT(a));
|
||||||
|
INSERT INTO t1 (b) VALUES (DEFAULT);
|
||||||
|
|
||||||
|
# Testing without a column list
|
||||||
|
--error ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN
|
||||||
|
INSERT INTO t1 VALUES (10,10);
|
||||||
|
--error ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN
|
||||||
|
INSERT INTO t1 VALUES (10,DEFAULT(a));
|
||||||
|
INSERT INTO t1 VALUES (10, DEFAULT);
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET sql_mode=DEFAULT;
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.1 tests
|
--echo # End of 10.1 tests
|
||||||
--echo #
|
--echo #
|
||||||
@ -442,6 +472,37 @@ REPLACE INTO t1 (pk,i) VALUES (1,2);
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET @sql_mode=@old_sql_mode;
|
SET @sql_mode=@old_sql_mode;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-22579 No error when inserting DEFAULT(non_virtual_column) into a virtual column
|
||||||
|
--echo # 10.2+ specific part
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET sql_mode=STRICT_ALL_TABLES;
|
||||||
|
CREATE OR REPLACE TABLE t1 (
|
||||||
|
a INT NOT NULL DEFAULT 10,
|
||||||
|
b INT AS (a+1) VIRTUAL
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
|
||||||
|
# Testing with column list
|
||||||
|
|
||||||
|
EXECUTE IMMEDIATE 'INSERT INTO t1 (b) VALUES(?)' USING DEFAULT;
|
||||||
|
EXECUTE IMMEDIATE 'INSERT INTO t1 (b) VALUES(?)' USING IGNORE;
|
||||||
|
INSERT INTO t1 (b) VALUES (DEFAULT);
|
||||||
|
INSERT INTO t1 (b) VALUES (IGNORE);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
DELETE FROM t1;
|
||||||
|
|
||||||
|
# Testing without column list
|
||||||
|
|
||||||
|
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES(10,?)' USING DEFAULT;
|
||||||
|
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES(11,?)' USING IGNORE;
|
||||||
|
INSERT INTO t1 VALUES (12,DEFAULT);
|
||||||
|
INSERT INTO t1 VALUES (13,IGNORE);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET sql_mode=DEFAULT;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
26
sql/item.h
26
sql/item.h
@ -1576,7 +1576,14 @@ public:
|
|||||||
a constant expression. Used in the optimizer to propagate basic constants.
|
a constant expression. Used in the optimizer to propagate basic constants.
|
||||||
*/
|
*/
|
||||||
virtual bool basic_const_item() const { return 0; }
|
virtual bool basic_const_item() const { return 0; }
|
||||||
/*
|
/**
|
||||||
|
Determines if the expression is allowed as
|
||||||
|
a virtual column assignment source:
|
||||||
|
INSERT INTO t1 (vcol) VALUES (10) -> error
|
||||||
|
INSERT INTO t1 (vcol) VALUES (NULL) -> ok
|
||||||
|
*/
|
||||||
|
virtual bool vcol_assignment_allowed_value() const { return false; }
|
||||||
|
/**
|
||||||
Test if "this" is an ORDER position (rather than an expression).
|
Test if "this" is an ORDER position (rather than an expression).
|
||||||
Notes:
|
Notes:
|
||||||
- can be called before fix_fields().
|
- can be called before fix_fields().
|
||||||
@ -3591,6 +3598,7 @@ public:
|
|||||||
collation.set(cs, DERIVATION_IGNORABLE, MY_REPERTOIRE_ASCII);
|
collation.set(cs, DERIVATION_IGNORABLE, MY_REPERTOIRE_ASCII);
|
||||||
}
|
}
|
||||||
enum Type type() const { return NULL_ITEM; }
|
enum Type type() const { return NULL_ITEM; }
|
||||||
|
bool vcol_assignment_allowed_value() const { return true; }
|
||||||
double val_real();
|
double val_real();
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
String *val_str(String *str);
|
String *val_str(String *str);
|
||||||
@ -3837,6 +3845,21 @@ public:
|
|||||||
const Type_handler *type_handler() const
|
const Type_handler *type_handler() const
|
||||||
{ return Type_handler_hybrid_field_type::type_handler(); }
|
{ return Type_handler_hybrid_field_type::type_handler(); }
|
||||||
|
|
||||||
|
bool vcol_assignment_allowed_value() const
|
||||||
|
{
|
||||||
|
switch (state) {
|
||||||
|
case NULL_VALUE:
|
||||||
|
case DEFAULT_VALUE:
|
||||||
|
case IGNORE_VALUE:
|
||||||
|
return true;
|
||||||
|
case NO_VALUE:
|
||||||
|
case SHORT_DATA_VALUE:
|
||||||
|
case LONG_DATA_VALUE:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Field::geometry_type get_geometry_type() const
|
Field::geometry_type get_geometry_type() const
|
||||||
{ return Type_geometry_attributes::get_geometry_type(); };
|
{ return Type_geometry_attributes::get_geometry_type(); };
|
||||||
|
|
||||||
@ -6273,6 +6296,7 @@ public:
|
|||||||
&null_clex_str),
|
&null_clex_str),
|
||||||
arg(NULL), cached_field(NULL) {}
|
arg(NULL), cached_field(NULL) {}
|
||||||
enum Type type() const { return DEFAULT_VALUE_ITEM; }
|
enum Type type() const { return DEFAULT_VALUE_ITEM; }
|
||||||
|
bool vcol_assignment_allowed_value() const { return arg == NULL; }
|
||||||
bool eq(const Item *item, bool binary_cmp) const;
|
bool eq(const Item *item, bool binary_cmp) const;
|
||||||
bool fix_fields(THD *, Item **);
|
bool fix_fields(THD *, Item **);
|
||||||
void cleanup();
|
void cleanup();
|
||||||
|
@ -8463,11 +8463,9 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &values,
|
|||||||
if (table->next_number_field &&
|
if (table->next_number_field &&
|
||||||
rfield->field_index == table->next_number_field->field_index)
|
rfield->field_index == table->next_number_field->field_index)
|
||||||
table->auto_increment_field_not_null= TRUE;
|
table->auto_increment_field_not_null= TRUE;
|
||||||
Item::Type type= value->type();
|
|
||||||
const bool skip_sys_field= rfield->vers_sys_field(); // TODO: && !thd->vers_modify_history() [MDEV-16546]
|
const bool skip_sys_field= rfield->vers_sys_field(); // TODO: && !thd->vers_modify_history() [MDEV-16546]
|
||||||
if ((rfield->vcol_info || skip_sys_field) &&
|
if ((rfield->vcol_info || skip_sys_field) &&
|
||||||
type != Item::DEFAULT_VALUE_ITEM &&
|
!value->vcol_assignment_allowed_value() &&
|
||||||
type != Item::NULL_ITEM &&
|
|
||||||
table->s->table_category != TABLE_CATEGORY_TEMPORARY)
|
table->s->table_category != TABLE_CATEGORY_TEMPORARY)
|
||||||
{
|
{
|
||||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
||||||
@ -8748,20 +8746,16 @@ fill_record(THD *thd, TABLE *table, Field **ptr, List<Item> &values,
|
|||||||
|
|
||||||
if (field->field_index == autoinc_index)
|
if (field->field_index == autoinc_index)
|
||||||
table->auto_increment_field_not_null= TRUE;
|
table->auto_increment_field_not_null= TRUE;
|
||||||
if (unlikely(field->vcol_info) || (vers_sys_field && !ignore_errors))
|
if ((unlikely(field->vcol_info) || (vers_sys_field && !ignore_errors)) &&
|
||||||
|
!value->vcol_assignment_allowed_value() &&
|
||||||
|
table->s->table_category != TABLE_CATEGORY_TEMPORARY)
|
||||||
{
|
{
|
||||||
Item::Type type= value->type();
|
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
||||||
if (type != Item::DEFAULT_VALUE_ITEM &&
|
ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN,
|
||||||
type != Item::NULL_ITEM &&
|
ER_THD(thd, ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN),
|
||||||
table->s->table_category != TABLE_CATEGORY_TEMPORARY)
|
field->field_name.str, table->s->table_name.str);
|
||||||
{
|
if (vers_sys_field)
|
||||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
continue;
|
||||||
ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN,
|
|
||||||
ER_THD(thd, ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN),
|
|
||||||
field->field_name.str, table->s->table_name.str);
|
|
||||||
if (vers_sys_field)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (use_value)
|
if (use_value)
|
||||||
|
@ -685,7 +685,7 @@ btr_search_update_hash_ref(
|
|||||||
|
|
||||||
dict_index_t* index = block->index;
|
dict_index_t* index = block->index;
|
||||||
|
|
||||||
if (!index) {
|
if (!index || !info->n_hash_potential) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -694,8 +694,9 @@ btr_search_update_hash_ref(
|
|||||||
ut_ad(!dict_index_is_ibuf(index));
|
ut_ad(!dict_index_is_ibuf(index));
|
||||||
rw_lock_t* const latch = btr_get_search_latch(index);
|
rw_lock_t* const latch = btr_get_search_latch(index);
|
||||||
rw_lock_x_lock(latch);
|
rw_lock_x_lock(latch);
|
||||||
|
ut_ad(!block->index || block->index == index);
|
||||||
|
|
||||||
if ((info->n_hash_potential > 0)
|
if (block->index
|
||||||
&& (block->curr_n_fields == info->n_fields)
|
&& (block->curr_n_fields == info->n_fields)
|
||||||
&& (block->curr_n_bytes == info->n_bytes)
|
&& (block->curr_n_bytes == info->n_bytes)
|
||||||
&& (block->curr_left_side == info->left_side)) {
|
&& (block->curr_left_side == info->left_side)) {
|
||||||
|
@ -1528,10 +1528,11 @@ row_fts_build_sel_tree(
|
|||||||
sel_tree[i + start] = int(i);
|
sel_tree[i + start] = int(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = treelevel; --i; ) {
|
i = treelevel;
|
||||||
|
do {
|
||||||
row_fts_build_sel_tree_level(
|
row_fts_build_sel_tree_level(
|
||||||
sel_tree, i, mrec, offsets, index);
|
sel_tree, --i, mrec, offsets, index);
|
||||||
}
|
} while (i > 0);
|
||||||
|
|
||||||
return(treelevel);
|
return(treelevel);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user