mirror of
https://github.com/MariaDB/server.git
synced 2025-07-02 14:22:51 +03:00
Bug #16171518 - LOAD XML DOES NOT HANDLE EMPTY ELEMENTS
DESCRIPTION =========== Inability of mysql LOAD XML command to handle empty XML tags i.e. <row><tag/></row>. Also the behaviour is wrong and (different than above) when there is a space in empty tag i.e. <row><tag /></row> ANALYSIS ======== In read_xml() the case where we encounter a close tag ('/') we're decreasing the 'level' blindly which is wrong. Actually when its an without-space-empty-tag (succeeding char is '>'), we need to skip the decrement. In other words whenever we hit a close tag ('/'), decrease the 'level' only when (i) It's not an (without space) empty tag i.e. <tag/> or, (ii) It is of format <row col="val" .../> FIX === The switch case for '/' is modified. We've removed the blind decrement of 'level'. We do it only when its not an without-space-empty-tag. Also we are setting 'in_tag' to false to let program know that we're done reading current tag (required in the case of format <row col="val" .../>)
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
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
|
||||
@ -1987,8 +1987,15 @@ int READ_INFO::read_xml()
|
||||
break;
|
||||
|
||||
case '/': /* close tag */
|
||||
level--;
|
||||
chr= my_tospace(GET);
|
||||
/* Decrease the 'level' only when (i) It's not an */
|
||||
/* (without space) empty tag i.e. <tag/> or, (ii) */
|
||||
/* It is of format <row col="val" .../> */
|
||||
if(chr != '>' || in_tag)
|
||||
{
|
||||
level--;
|
||||
in_tag= false;
|
||||
}
|
||||
if(chr != '>') /* if this is an empty tag <tag /> */
|
||||
tag.length(0); /* we should keep tag value */
|
||||
while(chr != '>' && chr != my_b_EOF)
|
||||
|
Reference in New Issue
Block a user