Commit faf6d0ef authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.3 into 10.4

parents 386f168a 5e12aca5
...@@ -30,9 +30,9 @@ lookup("127.0.0.1") ...@@ -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(); ...@@ -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 ...@@ -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 ...@@ -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; ...@@ -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); ...@@ -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 #
...@@ -1576,7 +1576,14 @@ class Item: public Value_source, ...@@ -1576,7 +1576,14 @@ class Item: public Value_source,
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 @@ class Item_null :public Item_basic_constant ...@@ -3591,6 +3598,7 @@ class Item_null :public Item_basic_constant
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 @@ class Item_param :public Item_basic_value, ...@@ -3837,6 +3845,21 @@ class Item_param :public Item_basic_value,
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 @@ class Item_default_value : public Item_field ...@@ -6273,6 +6296,7 @@ class Item_default_value : public Item_field
&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, ...@@ -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, ...@@ -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( ...@@ -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( ...@@ -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( ...@@ -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);
} }
......
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