1
0
mirror of https://github.com/MariaDB/server.git synced 2026-10-23 18:49:29 +03:00

MDEV-39575 Protocol::end_statement(): Assertion `0' failed after insert into xmltype union of valid and invalid xml.

Field_xmltype::store has to do the my_error when it gets invalid XML,
  just the warning with the -1 return results in the DBUG_ASSERT.

Also the UpdateXML function result reverted back to the STRING as
it can legally produce invalid XML, so we can't have columns built
from the UpdateXML to be XMLTYPE.
This commit is contained in:
Alexey Botchkov
2026-05-14 12:32:10 +04:00
parent a3901c0a8d
commit 49b2fd7f9e
8 changed files with 98 additions and 45 deletions

View File

@@ -1343,10 +1343,10 @@ SELECT UpdateXML(1, '/a', '') a
FROM t1
GROUP BY a, name;
a
1
1
1
1
1
DROP TABLE t1;
# End of 12.3 tests

View File

@@ -223,7 +223,7 @@ CREATE TABLE t1 AS SELECT UpdateXML('<a><b>ccc</b><d></d></a>', '/a', '<e>fff</e
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`x` xmltype CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL
`x` longtext CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
DROP TABLE t1;
CREATE TABLE t1(a XMLTYPE);
@@ -234,20 +234,20 @@ ERROR HY000: Cannot cast 'decimal' as 'xmltype' in assignment of `test`.`t1`.`a`
INSERT INTO t1 VALUES(11e-2);
ERROR HY000: Cannot cast 'double' as 'xmltype' in assignment of `test`.`t1`.`a`
INSERT INTO t1 VALUES("one");
ERROR 22007: Incorrect XML value: 'one'
ERROR HY000: Incorrect XMLTYPE value: 'one'
INSERT INTO t1 VALUES("<a><b></b>");
ERROR 22007: Incorrect XML value: '<a><b></b>'
ERROR HY000: Incorrect XMLTYPE value: '<a><b></b>'
INSERT INTO t1 VALUES("<a><b></b></a>");
INSERT INTO t1 VALUES("<to>JOHN</to><from></from>");
ERROR 22007: Incorrect XML value: '<to>JOHN</to><from></from>'
ERROR HY000: Incorrect XMLTYPE value: '<to>JOHN</to><from></from>'
INSERT INTO t1 VALUES('<note><to>JOHN</to><from></from></note>');
INSERT INTO t1 VALUES('<?xml version="1.0" ?> <note><to>JOHN</to><from></from></note>');
INSERT INTO t1 VALUES('<?xml version="1.0" ?> <?xml?> <note><to>JOHN</to><from></from></note>');
ERROR 22007: Incorrect XML value: '<?xml version="1.0" ?> <?xml?> <note><to>JOHN</to><from></from></note>'
ERROR HY000: Incorrect XMLTYPE value: '<?xml version="1.0" ?> <?xml?> <note><to>JOHN</to><from></from></note>'
INSERT INTO t1 VALUES('<note><to>JOHN</to><from></from></note> <?xml version="1.0" ?> ');
ERROR 22007: Incorrect XML value: '<note><to>JOHN</to><from></from></note> <?xml version="1.0" ?> '
ERROR HY000: Incorrect XMLTYPE value: '<note><to>JOHN</to><from></from></note> <?xml version="1.0" ?> '
INSERT INTO t1 VALUES('<?somePI pi content ?> <?xml version="1.0" ?> <note><from>Lisa</from></note>');
ERROR 22007: Incorrect XML value: '<?somePI pi content ?> <?xml version="1.0" ?> <note><from>Lisa</from></note>'
ERROR HY000: Incorrect XMLTYPE value: '<?somePI pi content ?> <?xml version="1.0" ?> <note><from>Lisa</from></note>'
INSERT INTO t1 VALUES('<?somePI pi content ?> <note><from>Lisa</from></note>');
INSERT INTO t1 VALUES('<?xml version="1.0" ?> <note><?somePI pi content ?><from>Lisa</from></note>');
DROP TABLE t1;
@@ -260,4 +260,23 @@ SET @x = CONCAT(REPEAT('<element_with_long_name>', 30), 'leaf',
REPEAT('</element_with_long_name>', 30));
INSERT INTO t1 VALUES(@x);
DROP TABLE t1;
#
# MDEV-39575 Protocol::end_statement(): Assertion `0' failed after insert into xmltype union of valid and invalid xml.
#
CREATE TABLE t1(x XMLTYPE) Engine=MyISAM;
INSERT INTO t1 SELECT '<a/>' UNION SELECT 'a';
ERROR HY000: Incorrect XMLTYPE value: 'a'
SELECT * FROM t1;
x
<a/>
DROP TABLE t1;
#
# MDEV-39577 Protocol::end_statement(): Assertion `0' failed with invalid xmltype + sql_mode=''
#
set sql_mode='';
CREATE TABLE t1(x XMLTYPE);
INSERT INTO t1 SELECT 'a';
ERROR HY000: Incorrect XMLTYPE value: 'a'
DROP TABLE t1;
set sql_mode= DEFAULT;
# End of 12.3 tests

View File

@@ -164,22 +164,22 @@ INSERT INTO t1 VALUES(11.2);
--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
INSERT INTO t1 VALUES(11e-2);
--error ER_TRUNCATED_WRONG_VALUE
--error ER_WRONG_VALUE
INSERT INTO t1 VALUES("one");
--error ER_TRUNCATED_WRONG_VALUE
--error ER_WRONG_VALUE
INSERT INTO t1 VALUES("<a><b></b>");
INSERT INTO t1 VALUES("<a><b></b></a>");
--error ER_TRUNCATED_WRONG_VALUE
--error ER_WRONG_VALUE
INSERT INTO t1 VALUES("<to>JOHN</to><from></from>");
INSERT INTO t1 VALUES('<note><to>JOHN</to><from></from></note>');
INSERT INTO t1 VALUES('<?xml version="1.0" ?> <note><to>JOHN</to><from></from></note>');
--error ER_TRUNCATED_WRONG_VALUE
--error ER_WRONG_VALUE
INSERT INTO t1 VALUES('<?xml version="1.0" ?> <?xml?> <note><to>JOHN</to><from></from></note>');
--error ER_TRUNCATED_WRONG_VALUE
--error ER_WRONG_VALUE
INSERT INTO t1 VALUES('<note><to>JOHN</to><from></from></note> <?xml version="1.0" ?> ');
--error ER_TRUNCATED_WRONG_VALUE
--error ER_WRONG_VALUE
INSERT INTO t1 VALUES('<?somePI pi content ?> <?xml version="1.0" ?> <note><from>Lisa</from></note>');
INSERT INTO t1 VALUES('<?somePI pi content ?> <note><from>Lisa</from></note>');
INSERT INTO t1 VALUES('<?xml version="1.0" ?> <note><?somePI pi content ?><from>Lisa</from></note>');
@@ -200,4 +200,24 @@ INSERT INTO t1 VALUES(@x);
DROP TABLE t1;
--echo #
--echo # MDEV-39575 Protocol::end_statement(): Assertion `0' failed after insert into xmltype union of valid and invalid xml.
--echo #
CREATE TABLE t1(x XMLTYPE) Engine=MyISAM;
--error ER_WRONG_VALUE
INSERT INTO t1 SELECT '<a/>' UNION SELECT 'a';
SELECT * FROM t1;
DROP TABLE t1;
--echo #
--echo # MDEV-39577 Protocol::end_statement(): Assertion `0' failed with invalid xmltype + sql_mode=''
--echo #
set sql_mode='';
CREATE TABLE t1(x XMLTYPE);
--error ER_WRONG_VALUE
INSERT INTO t1 SELECT 'a';
DROP TABLE t1;
set sql_mode= DEFAULT;
--echo # End of 12.3 tests

View File

@@ -0,0 +1,18 @@
#
# MDEV-39575 Protocol::end_statement(): Assertion `0' failed after insert into xmltype union of valid and invalid xml.
#
CREATE TABLE t1(x XMLTYPE) Engine=InnoDB;
INSERT INTO t1 SELECT '<a/>' UNION SELECT 'a';
ERROR HY000: Incorrect XMLTYPE value: 'a'
SELECT * FROM t1;
x
DROP TABLE t1;
SET sql_mode='';
CREATE TABLE t1(x XMLTYPE) Engine=InnoDB;
INSERT INTO t1 SELECT '<a/>' UNION SELECT 'a';
ERROR HY000: Incorrect XMLTYPE value: 'a'
SELECT * FROM t1;
x
DROP TABLE t1;
set sql_mode=default;
# End of 12.3 tests

View File

@@ -0,0 +1,21 @@
source include/have_innodb.inc;
--echo #
--echo # MDEV-39575 Protocol::end_statement(): Assertion `0' failed after insert into xmltype union of valid and invalid xml.
--echo #
CREATE TABLE t1(x XMLTYPE) Engine=InnoDB;
--error ER_WRONG_VALUE
INSERT INTO t1 SELECT '<a/>' UNION SELECT 'a';
SELECT * FROM t1;
DROP TABLE t1;
SET sql_mode='';
CREATE TABLE t1(x XMLTYPE) Engine=InnoDB;
--error ER_WRONG_VALUE
INSERT INTO t1 SELECT '<a/>' UNION SELECT 'a';
SELECT * FROM t1;
DROP TABLE t1;
set sql_mode=default;
--echo # End of 12.3 tests

View File

@@ -215,9 +215,8 @@ int Field_xmltype::store(const char *from, size_t length, CHARSET_INFO *cs)
return Field_blob::store(from, length, cs);
err:
get_thd()->push_warning_wrong_value(
Sql_condition::WARN_LEVEL_WARN, "XML",
ErrConvString(from, length, cs).ptr());
my_error(ER_WRONG_VALUE, MYF(0),
"XMLTYPE", ErrConvString(from, length, cs).ptr());
return -1;
}

View File

@@ -3089,26 +3089,6 @@ String *Item_func_xml_extractvalue::val_str(String *str)
}
const Type_handler *Item_func_xml_update::xml_handler= NULL;
bool Item_func_xml_update::fix_length_and_dec(THD *thd)
{
static LEX_CSTRING name= {STRING_WITH_LEN("XMLTYPE")};
if (!xml_handler)
xml_handler= Type_handler::handler_by_name(thd, name);
return Item_xml_str_func::fix_length_and_dec(thd);
}
const Type_handler *Item_func_xml_update::type_handler() const
{
return xml_handler ? xml_handler : Item_xml_str_func::type_handler();
}
bool Item_func_xml_update::collect_result(String *str,
const MY_XML_NODE *cut,
const String *replace)

View File

@@ -159,10 +159,6 @@ public:
static LEX_CSTRING name= {STRING_WITH_LEN("updatexml") };
return name;
}
static const Type_handler *xml_handler;
const Type_handler *type_handler() const override;
bool fix_length_and_dec(THD *thd) override;
String *val_str(String *) override;
protected: