allow comparing clob using expressionbuilder->eq if you explicitly say you're comparing strings

This commit is contained in:
Robin Appelman 2016-01-18 16:03:41 +01:00
parent 15451b29da
commit 58afddfaa5
5 changed files with 50 additions and 6 deletions

View file

@ -284,7 +284,9 @@ class Connection extends \Doctrine\DBAL\Connection implements IDBConnection {
$whereValues = array_merge($keys, $updatePreconditionValues);
foreach ($whereValues as $name => $value) {
$where->add($updateQb->expr()->eq(
$name, $updateQb->createNamedParameter($value, $this->getType($value))
$name,
$updateQb->createNamedParameter($value, $this->getType($value)),
$this->getType($value)
));
}
$updateQb->where($where);

View file

@ -27,10 +27,10 @@ use OCP\IDBConnection;
class ExpressionBuilder implements IExpressionBuilder {
/** @var \Doctrine\DBAL\Query\Expression\ExpressionBuilder */
private $expressionBuilder;
protected $expressionBuilder;
/** @var QuoteHelper */
private $helper;
protected $helper;
/**
* Initializes a new <tt>ExpressionBuilder</tt>.
@ -109,10 +109,12 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @param mixed $x The left expression.
* @param mixed $y The right expression.
* @param int|null $type one of the \PDO::PARAM_* constants
* required when comparing text fields for oci compatibility
*
* @return string
*/
public function eq($x, $y) {
public function eq($x, $y, $type = null) {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->eq($x, $y);

View file

@ -0,0 +1,33 @@
<?php
/**
* @author Joas Schilling <nickvergessen@owncloud.com>
*
* @copyright Copyright (c) 2016, ownCloud, Inc.
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace OC\DB\QueryBuilder;
class OCIExpressionBuilder extends ExpressionBuilder {
public function eq($x, $y, $type = null) {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
if ($type === \PDO::PARAM_STR) {
$x = new QueryFunction('to_char(' . $x . ')');
}
return $this->expressionBuilder->eq($x, $y);
}
}

View file

@ -21,6 +21,7 @@
namespace OC\DB\QueryBuilder;
use OC\DB\OracleConnection;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\DB\QueryBuilder\IQueryFunction;
use OCP\DB\QueryBuilder\IParameter;
@ -82,7 +83,11 @@ class QueryBuilder implements IQueryBuilder {
* @return \OCP\DB\QueryBuilder\IExpressionBuilder
*/
public function expr() {
return new ExpressionBuilder($this->connection);
if ($this->connection instanceof OracleConnection) {
return new OCIExpressionBuilder($this->connection);
} else {
return new ExpressionBuilder($this->connection);
}
}
/**

View file

@ -84,11 +84,13 @@ interface IExpressionBuilder {
*
* @param mixed $x The left expression.
* @param mixed $y The right expression.
* @param int|null $type @since 9.0.0 one of the \PDO::PARAM_* constants
* required when comparing text fields for oci compatibility.
*
* @return string
* @since 8.2.0
*/
public function eq($x, $y);
public function eq($x, $y, $type = null);
/**
* Creates a non equality comparison expression with the given arguments.