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

MDEV-39573 Server crashes in Item_char_typecast::fix_length_and_dec_internal after select xmltype.

Charset specified for XMLTYPE constructor.
Error returned if XML is in UTF16/UTF32 as we can't parse it yet.
XML check added so only well-formed allowed.
This commit is contained in:
Alexey Botchkov
2026-05-14 00:17:24 +04:00
parent 49b2fd7f9e
commit 2c7c7e1216
4 changed files with 62 additions and 1 deletions

View File

@@ -279,4 +279,23 @@ INSERT INTO t1 SELECT 'a';
ERROR HY000: Incorrect XMLTYPE value: 'a'
DROP TABLE t1;
set sql_mode= DEFAULT;
#
# MDEV-39573 Server crashes in Item_char_typecast::fix_length_and_dec_internal after select xmltype
#
SELECT XMLTYPE(1);
XMLTYPE(1)
NULL
SELECT XMLTYPE("<a></a>");
XMLTYPE("<a></a>")
<a></a>
SELECT CAST(1 AS XMLTYPE);
CAST(1 AS XMLTYPE)
NULL
SELECT CAST("<a></a>" AS XMLTYPE);
CAST("<a></a>" AS XMLTYPE)
<a></a>
SELECT CAST(1 AS XMLTYPE CHARSET utf32);
ERROR 42000: This version of MariaDB doesn't yet support 'CAST(AS XMLTYPE CHARACTER SET ucs2/utf16/utf32)'
SELECT CAST("<a></a>" AS XMLTYPE CHARSET utf32);
ERROR 42000: This version of MariaDB doesn't yet support 'CAST(AS XMLTYPE CHARACTER SET ucs2/utf16/utf32)'
# End of 12.3 tests

View File

@@ -220,4 +220,19 @@ INSERT INTO t1 SELECT 'a';
DROP TABLE t1;
set sql_mode= DEFAULT;
--echo #
--echo # MDEV-39573 Server crashes in Item_char_typecast::fix_length_and_dec_internal after select xmltype
--echo #
SELECT XMLTYPE(1);
SELECT XMLTYPE("<a></a>");
SELECT CAST(1 AS XMLTYPE);
SELECT CAST("<a></a>" AS XMLTYPE);
--error ER_NOT_SUPPORTED_YET
SELECT CAST(1 AS XMLTYPE CHARSET utf32);
--error ER_NOT_SUPPORTED_YET
SELECT CAST("<a></a>" AS XMLTYPE CHARSET utf32);
--echo # End of 12.3 tests

View File

@@ -145,7 +145,8 @@ Type_handler_xmltype::make_constructor_item(THD *thd, List<Item> *args) const
return NULL;
Item_args tmp(thd, *args);
return new (thd->mem_root)
Item_xmltype_typecast(thd, tmp.arguments()[0], NULL);
Item_xmltype_typecast(thd, tmp.arguments()[0],
thd->variables.collation_connection);
}
@@ -281,9 +282,34 @@ bool Item_xmltype_typecast::fix_length_and_dec(THD *thd)
{
Item_char_typecast::fix_length_and_dec_str();
set_func_handler(&item_xmltype_typecast_func_handler);
if (cast_charset()->mbminlen > 1)
{
my_error(ER_NOT_SUPPORTED_YET, MYF(0),
"CAST(AS XMLTYPE CHARACTER SET ucs2/utf16/utf32)");
return true;
}
return false;
}
String *Item_xmltype_typecast::val_str(String *to)
{
String *res= Item_char_typecast::val_str(to);
if (!res)
return NULL;
if (check_parse_xml(res->ptr(), res->length(), res->charset()) != MY_XML_OK)
{
null_value= TRUE;
return NULL;
}
return res;
}
void Item_xmltype_typecast::print(String *str, enum_query_type query_type)
{
str->append(STRING_WITH_LEN("cast("));

View File

@@ -140,6 +140,7 @@ public:
return name;
}
bool fix_length_and_dec(THD *thd) override;
String *val_str(String *to) override;
Item *shallow_copy(THD *thd) const override
{ return get_item_copy<Item_xmltype_typecast>(thd, this); }