Issue 1677: XML Query - If default value is column name, value should not be wrapped in quotes.

git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@10439 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
ucorina 2012-03-15 12:41:20 +00:00
parent ae99536662
commit d116d633c8
3 changed files with 189 additions and 186 deletions

View file

@ -1,209 +1,209 @@
<?php <?php
class Argument { class Argument {
var $value;
var $name;
var $type;
var $isValid; var $value;
var $errorMessage; var $name;
var $type;
var $isValid;
var $errorMessage;
var $column_operation;
var $uses_default_value; // Check if arg value is user submnitted or default
var $_value; // Caches escaped and toString value so that the parsing won't happen multiple times;
var $column_operation; function Argument($name, $value) {
$this->value = $value;
$this->name = $name;
$this->isValid = true;
}
var $_value; // Caches escaped and toString value so that the parsing won't happen multiple times; function getType() {
if (isset($this->type))
return $this->type;
if (is_string($this->value))
return 'column_name';
return 'number';
}
function Argument($name, $value){ function setColumnType($value) {
$this->value = $value; $this->type = $value;
$this->name = $name; }
$this->isValid = true;
}
function getType(){ function setColumnOperation($operation) {
if(isset($this->type)) return $this->type; $this->column_operation = $operation;
if(is_string($this->value)) return 'column_name'; }
return 'number';
}
function setColumnType($value){ function getName() {
$this->type = $value; return $this->name;
} }
function setColumnOperation($operation){ function getValue() {
$this->column_operation = $operation; if (!isset($this->_value)) {
}
function getName(){
return $this->name;
}
function getValue(){
if(!isset($this->_value)){
$value = $this->getEscapedValue(); $value = $this->getEscapedValue();
$this->_value = $this->toString($value); $this->_value = $this->toString($value);
}
return $this->_value;
} }
return $this->_value;
}
function getColumnOperation(){ function getColumnOperation() {
return $this->column_operation; return $this->column_operation;
} }
function getEscapedValue(){ function getEscapedValue() {
return $this->escapeValue($this->value); return $this->escapeValue($this->value);
} }
function getUnescapedValue(){ function getUnescapedValue() {
return $this->value; return $this->value;
}
function toString($value) {
if (is_array($value)) {
if (count($value) === 0)
return '';
if (count($value) === 1 && $value[0] === '')
return '';
return '(' . implode(',', $value) . ')';
} }
return $value;
}
function toString($value){ function escapeValue($value) {
if(is_array($value)){ $column_type = $this->getType();
if(count($value) === 0) return ''; if ($column_type == 'column_name') {
if(count($value) === 1 && $value[0] === '') return ''; $dbParser = DB::getParser();
return '('.implode(',', $value).')'; return $dbParser->parseExpression($value);
}
return $value;
} }
if (!isset($value))
return null;
function escapeValue($value){ if (in_array($column_type, array('date', 'varchar', 'char', 'text', 'bigtext'))) {
$column_type = $this->getType(); if (!is_array($value))
if($column_type == 'column_name'){ $value = $this->_escapeStringValue($value);
$dbParser = DB::getParser(); else {
return $dbParser->parseExpression($value); $total = count($value);
for ($i = 0; $i < $total; $i++)
$value[$i] = $this->_escapeStringValue($value[$i]);
//$value[$i] = '\''.$value[$i].'\'';
} }
if(!isset($value)) return null; }
if($this->uses_default_value) return $value;
if(in_array($column_type, array('date', 'varchar', 'char','text', 'bigtext'))){ if ($column_type == 'number') {
if(!is_array($value)) if (is_array($value)) {
$value = $this->_escapeStringValue ($value); foreach ($value AS $key => $val) {
else { if (isset($val)) {
$total = count($value); $value[$key] = (int) $val;
for($i = 0; $i < $total; $i++)
$value[$i] = $this->_escapeStringValue($value[$i]);
//$value[$i] = '\''.$value[$i].'\'';
}
}
if($column_type == 'number')
{
if(is_array($value))
{
foreach($value AS $key=>$val)
{
if(isset($val))
{
$value[$key] = (int)$val;
}
} }
} }
else } else {
{ $value = (int) $value;
if(isset($val)) }
{ }
$value = (int)$value;
return $value;
}
function _escapeStringValue($value) {
$db = &DB::getInstance();
$value = $db->addQuotes($value);
return '\'' . $value . '\'';
}
function isValid() {
return $this->isValid;
}
function getErrorMessage() {
return $this->errorMessage;
}
function ensureDefaultValue($default_value) {
if (!isset($this->value) || $this->value == '')
{
$this->value = $default_value;
$this->uses_default_value = true;
}
}
function checkFilter($filter_type) {
if (isset($this->value) && $this->value != '') {
global $lang;
$val = $this->value;
$key = $this->name;
switch ($filter_type) {
case 'email' :
case 'email_address' :
if (!preg_match('/^[_0-9a-z-]+(\.[_0-9a-z-]+)*@[0-9a-z-]+(\.[0-9a-z-]+)*$/is', $val)) {
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_email, $lang->{$key} ? $lang->{$key} : $key));
} }
} break;
} case 'homepage' :
if (!preg_match('/^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$/is', $val)) {
return $value; $this->isValid = false;
} $this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_homepage, $lang->{$key} ? $lang->{$key} : $key));
}
function _escapeStringValue($value){ break;
$db = &DB::getInstance(); case 'userid' :
$value = $db->addQuotes($value); case 'user_id' :
return '\''.$value.'\''; if (!preg_match('/^[a-zA-Z]+([_0-9a-zA-Z]+)*$/is', $val)) {
$this->isValid = false;
} $this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_userid, $lang->{$key} ? $lang->{$key} : $key));
}
function isValid(){ break;
return $this->isValid; case 'number' :
} case 'numbers' :
if (is_array($val))
function getErrorMessage(){ $val = join(',', $val);
return $this->errorMessage; if (!preg_match('/^(-?)[0-9]+(,\-?[0-9]+)*$/is', $val)) {
} $this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key} ? $lang->{$key} : $key));
function ensureDefaultValue($default_value){ }
if(!isset($this->value) || $this->value == '') break;
$this->value = $default_value; case 'alpha' :
} if (!preg_match('/^[a-z]+$/is', $val)) {
$this->isValid = false;
function checkFilter($filter_type){ $this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key} ? $lang->{$key} : $key));
if(isset($this->value) && $this->value != ''){ }
global $lang; break;
$val = $this->value; case 'alpha_number' :
$key = $this->name; if (!preg_match('/^[0-9a-z]+$/is', $val)) {
switch($filter_type) { $this->isValid = false;
case 'email' : $this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key} ? $lang->{$key} : $key));
case 'email_address' : }
if(!preg_match('/^[_0-9a-z-]+(\.[_0-9a-z-]+)*@[0-9a-z-]+(\.[0-9a-z-]+)*$/is', $val)) { break;
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_email, $lang->{$key} ? $lang->{$key} : $key));
}
break;
case 'homepage' :
if(!preg_match('/^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$/is', $val)) {
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_homepage, $lang->{$key} ? $lang->{$key} : $key));
}
break;
case 'userid' :
case 'user_id' :
if(!preg_match('/^[a-zA-Z]+([_0-9a-zA-Z]+)*$/is', $val)) {
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_userid, $lang->{$key} ? $lang->{$key} : $key));
}
break;
case 'number' :
case 'numbers' :
if(is_array($val)) $val = join(',', $val);
if(!preg_match('/^(-?)[0-9]+(,\-?[0-9]+)*$/is', $val)){
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key} ? $lang->{$key} : $key));
}
break;
case 'alpha' :
if(!preg_match('/^[a-z]+$/is', $val)) {
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key} ? $lang->{$key} : $key));
}
break;
case 'alpha_number' :
if(!preg_match('/^[0-9a-z]+$/is', $val)) {
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key} ? $lang->{$key} : $key));
}
break;
}
}
}
function checkMaxLength($length){
if($this->value && (strlen($this->value) > $length)){
global $lang;
$this->isValid = false;
$key = $this->name;
$this->errorMessage = new Object(-1, sprintf($lang->filter->outofrange, $lang->{$key} ? $lang->{$key} : $key));
}
}
function checkMinLength($length){
if($this->value && (strlen($this->value) < $length)){
global $lang;
$this->isValid = false;
$key = $this->name;
$this->errorMessage = new Object(-1, sprintf($lang->filter->outofrange, $lang->{$key} ? $lang->{$key} : $key));
}
}
function checkNotNull(){
if(!isset($this->value)){
global $lang;
$this->isValid = false;
$key = $this->name;
$this->errorMessage = new Object(-1, sprintf($lang->filter->isnull, $lang->{$key} ? $lang->{$key} : $key));
} }
} }
} }
function checkMaxLength($length) {
if ($this->value && (strlen($this->value) > $length)) {
global $lang;
$this->isValid = false;
$key = $this->name;
$this->errorMessage = new Object(-1, sprintf($lang->filter->outofrange, $lang->{$key} ? $lang->{$key} : $key));
}
}
function checkMinLength($length) {
if ($this->value && (strlen($this->value) < $length)) {
global $lang;
$this->isValid = false;
$key = $this->name;
$this->errorMessage = new Object(-1, sprintf($lang->filter->outofrange, $lang->{$key} ? $lang->{$key} : $key));
}
}
function checkNotNull() {
if (!isset($this->value)) {
global $lang;
$this->isValid = false;
$key = $this->name;
$this->errorMessage = new Object(-1, sprintf($lang->filter->isnull, $lang->{$key} ? $lang->{$key} : $key));
}
}
}
?> ?>

View file

@ -68,8 +68,9 @@ class QueryTag {
foreach ($table_tags as $table_tag) { foreach ($table_tags as $table_tag) {
if (is_a($table_tag, 'TableTag')) { if (is_a($table_tag, 'TableTag')) {
$table_name = $table_tag->getTableName(); $table_name = $table_tag->getTableName();
$table_alias = $table_tag->getTableAlias();
$tag_column_type = QueryParser::getTableInfo($query_id, $table_name); $tag_column_type = QueryParser::getTableInfo($query_id, $table_name);
$column_type[$table_name] = $tag_column_type; $column_type[$table_alias] = $tag_column_type;
} }
} }
$this->column_type[$query_id] = $column_type; $this->column_type[$query_id] = $column_type;
@ -100,10 +101,10 @@ class QueryTag {
unset($column_type); unset($column_type);
$prebuff .= $argument->toString(); $prebuff .= $argument->toString();
$table_name = $argument->getTableName(); $table_alias = $argument->getTableName();
if(isset($table_name)) if(isset($table_alias))
{ {
$column_type = $this->column_type[$this->getQueryId()][$table_name][$argument->getColumnName()]; $column_type = $this->column_type[$this->getQueryId()][$table_alias][$argument->getColumnName()];
} }
else else
{ {

View file

@ -200,11 +200,13 @@ class MysqlSelectTest extends MysqlTest {
from `xe_modules` as `modules` from `xe_modules` as `modules`
, `xe_documents` as `documents` , `xe_documents` as `documents`
where ( where (
`documents`.`module_srl` in (566036,3777868) `documents`.`module_srl` not in (0)
and `documents`.`module_srl` in (566036,3777868)
and `modules`.`module_srl` = `documents`.`module_srl`) and `modules`.`module_srl` = `documents`.`module_srl`)
and `documents`.`list_order` <= 2100000000 and `documents`.`list_order` <= 2100000000
order by `documents`.`list_order` asc order by `documents`.`list_order` asc
limit 20'; limit 20';
$this->_test($xml_file, $argsString, $expected); $this->_test($xml_file, $argsString, $expected);
} }
@ -253,7 +255,7 @@ class MysqlSelectTest extends MysqlTest {
and `documents`.`document_srl` = `comments`.`document_srl` and `documents`.`document_srl` = `comments`.`document_srl`
and `documents`.`status` in (\'public\',\'secret\') and `documents`.`status` in (\'public\',\'secret\')
and `comments`.`content` like \'%dfsds%\') and `comments`.`content` like \'%dfsds%\')
and comments.list_order <= 2100000000 and `comments`.`list_order` <= 2100000000
group by `documents`.`document_srl` group by `documents`.`document_srl`
order by `comments`.`list_order` asc order by `comments`.`list_order` asc
limit 0, 20'; limit 0, 20';