From 2681ef550211b74c716322faa8449d11dce63020 Mon Sep 17 00:00:00 2001 From: ucorina Date: Mon, 30 Jul 2012 15:24:45 +0000 Subject: [PATCH] Issue 2191: XML query condition 'like' error. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@10956 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../tags/condition/ConditionTag.class.php | 86 +++++++++++-------- .../db/db/xml_query/mysql/MysqlSelectTest.php | 13 +++ .../db/xml_query/mysql/data/likewithdot.xml | 12 +++ 3 files changed, 74 insertions(+), 37 deletions(-) create mode 100644 tests/classes/db/db/xml_query/mysql/data/likewithdot.xml diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php index dbb37c82a..236a6ba3a 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -53,50 +53,62 @@ $this->operation = $condition->attrs->operation; $this->pipe = $condition->attrs->pipe; $dbParser = DB::getParser(); - $this->column_name = $dbParser->parseExpression($condition->attrs->column); + $this->column_name = $dbParser->parseExpression($condition->attrs->column); - // If default value is column name, it should be escaped - if($isColumnName = strpos($condition->attrs->default, '.')){ - $condition->attrs->default = $dbParser->parseColumnName($condition->attrs->default); - } + // If default value is column name, it should be escaped + if($isColumnName = (strpos($condition->attrs->default, '.') !== false + && strpos($condition->attrs->default, '%') === false )) + { + $condition->attrs->default = $dbParser->parseColumnName($condition->attrs->default); + } - if($condition->node_name == 'query'){ - $this->query = new QueryTag($condition, true); - $this->default_column = $this->query->toString(); - } - else if($condition->attrs->var && !strpos($condition->attrs->var, '.')){ + if($condition->node_name == 'query') + { + $this->query = new QueryTag($condition, TRUE); + $this->default_column = $this->query->toString(); + } + else if($condition->attrs->var && !strpos($condition->attrs->var, '.')) + { $this->argument = new QueryArgument($condition); $this->argument_name = $this->argument->getArgumentName(); } - else { - if(isset($condition->attrs->default)){ - $operationList = array('in'=>1, 'between'=>1, 'not in'=>1); - if(isset($operationList[$this->operation])){ - $default_value = $condition->attrs->default; - if(strpos($default_value, "'") !== false) - $default_value = "\"" . $default_value . "\""; - else - $default_value = "'" . $default_value . "'"; - } - else { - $default_value_object = new DefaultValue($this->column_name, $condition->attrs->default); - $default_value = $default_value_object->toString(); + else + { + if(isset($condition->attrs->default)) + { + $operationList = array('in' => 1, 'between' => 1, 'not in' => 1); + if(isset($operationList[$this->operation])) + { + $default_value = $condition->attrs->default; + if(strpos($default_value, "'") !== FALSE) + $default_value = "\"" . $default_value . "\""; + else + { + $default_value = "'" . $default_value . "'"; + } + } + else + { + $default_value_object = new DefaultValue($this->column_name, $condition->attrs->default); + $default_value = $default_value_object->toString(); - if($default_value_object->isStringFromFunction()){ - $default_value = '"\'".' . $default_value . '."\'"'; - } + if($default_value_object->isStringFromFunction()) + { + $default_value = '"\'".' . $default_value . '."\'"'; + } - if($default_value_object->isString() && !$isColumnName && !is_numeric( $condition->attrs->default)){ - if(strpos($default_value, "'") !== false) - $default_value = "\"" . $default_value . "\""; - else - $default_value = "'" . $default_value . "'"; - } - } - $this->default_column = $default_value; - } - else - $this->default_column = "'" . $dbParser->parseColumnName($condition->attrs->var) . "'" ; + if($default_value_object->isString() && !$isColumnName && !is_numeric($condition->attrs->default)) + { + if(strpos($default_value, "'") !== FALSE) + $default_value = "\"" . $default_value . "\""; + else + $default_value = "'" . $default_value . "'"; + } + } + $this->default_column = $default_value; + } + else + $this->default_column = "'" . $dbParser->parseColumnName($condition->attrs->var) . "'"; } } diff --git a/tests/classes/db/db/xml_query/mysql/MysqlSelectTest.php b/tests/classes/db/db/xml_query/mysql/MysqlSelectTest.php index eaee29382..667458ef2 100644 --- a/tests/classes/db/db/xml_query/mysql/MysqlSelectTest.php +++ b/tests/classes/db/db/xml_query/mysql/MysqlSelectTest.php @@ -329,4 +329,17 @@ class MysqlSelectTest extends MysqlTest { '; $this->_test($xml_file, $argsString, $expected); } + + function testLikeWithDot() + { + $xml_file = _TEST_PATH_ . "db/xml_query/mysql/data/likewithdot.xml"; + $argsString = ''; + $expected = 'select * + from `xe_layouts` as `layouts` + where `site_srl` = 0 + and `layout_type` = \'p\' + and `layout` like \'%.%\''; + $this->_test($xml_file, $argsString, $expected); + + } } \ No newline at end of file diff --git a/tests/classes/db/db/xml_query/mysql/data/likewithdot.xml b/tests/classes/db/db/xml_query/mysql/data/likewithdot.xml new file mode 100644 index 000000000..6a40c30a0 --- /dev/null +++ b/tests/classes/db/db/xml_query/mysql/data/likewithdot.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + +