aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulius Härtl <jus@bitgrid.net>2021-07-13 08:48:49 +0200
committerGitHub <noreply@github.com>2021-07-13 08:48:49 +0200
commit0031152de1c416932759d7ad6af445b895358734 (patch)
tree1dd2a53d08ec6941101992ef197e9693747c9f95
parent49554c657da7da495209a260008da84b8b94ee1e (diff)
parentaae16c21e66847cd12cbf3084a102b923a7717ce (diff)
downloadnextcloud-server-0031152de1c416932759d7ad6af445b895358734.tar.gz
nextcloud-server-0031152de1c416932759d7ad6af445b895358734.zip
Merge pull request #27852 from nextcloud/bugfix/noid/allow-casting-query-functions
-rw-r--r--lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php4
-rw-r--r--lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php4
-rw-r--r--lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php2
-rw-r--r--lib/public/DB/QueryBuilder/IExpressionBuilder.php4
-rw-r--r--tests/lib/DB/QueryBuilder/ExpressionBuilderDBTest.php34
5 files changed, 41 insertions, 7 deletions
diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php
index a837c1ad752..c35afd0870b 100644
--- a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php
+++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php
@@ -425,11 +425,11 @@ class ExpressionBuilder implements IExpressionBuilder {
/**
* Returns a IQueryFunction that casts the column to the given type
*
- * @param string $column
+ * @param string|IQueryFunction $column
* @param mixed $type One of IQueryBuilder::PARAM_*
* @return IQueryFunction
*/
- public function castColumn(string $column, $type): IQueryFunction {
+ public function castColumn($column, $type): IQueryFunction {
return new QueryFunction(
$this->helper->quoteColumnName($column)
);
diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php
index 2a13562d00a..4cea234779e 100644
--- a/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php
+++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php
@@ -161,11 +161,11 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* Returns a IQueryFunction that casts the column to the given type
*
- * @param string $column
+ * @param string|IQueryFunction $column
* @param mixed $type One of IQueryBuilder::PARAM_*
* @return IQueryFunction
*/
- public function castColumn(string $column, $type): IQueryFunction {
+ public function castColumn($column, $type): IQueryFunction {
if ($type === IQueryBuilder::PARAM_STR) {
$column = $this->helper->quoteColumnName($column);
return new QueryFunction('to_char(' . $column . ')');
diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php
index 5df2f407411..4e0de5ef42b 100644
--- a/lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php
+++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php
@@ -33,7 +33,7 @@ class PgSqlExpressionBuilder extends ExpressionBuilder {
/**
* Returns a IQueryFunction that casts the column to the given type
*
- * @param string $column
+ * @param string|IQueryFunction $column
* @param mixed $type One of IQueryBuilder::PARAM_*
* @return IQueryFunction
*/
diff --git a/lib/public/DB/QueryBuilder/IExpressionBuilder.php b/lib/public/DB/QueryBuilder/IExpressionBuilder.php
index b3dbf564e35..77701240d51 100644
--- a/lib/public/DB/QueryBuilder/IExpressionBuilder.php
+++ b/lib/public/DB/QueryBuilder/IExpressionBuilder.php
@@ -431,7 +431,7 @@ interface IExpressionBuilder {
/**
* Returns a IQueryFunction that casts the column to the given type
*
- * @param string $column
+ * @param string|IQueryFunction $column
* @param mixed $type One of IQueryBuilder::PARAM_*
* @return IQueryFunction
* @since 9.0.0
@@ -439,5 +439,5 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $column
* @psalm-taint-sink sql $type
*/
- public function castColumn(string $column, $type): IQueryFunction;
+ public function castColumn($column, $type): IQueryFunction;
}
diff --git a/tests/lib/DB/QueryBuilder/ExpressionBuilderDBTest.php b/tests/lib/DB/QueryBuilder/ExpressionBuilderDBTest.php
index d7f6b4ac115..6a568d7e01b 100644
--- a/tests/lib/DB/QueryBuilder/ExpressionBuilderDBTest.php
+++ b/tests/lib/DB/QueryBuilder/ExpressionBuilderDBTest.php
@@ -22,6 +22,7 @@
namespace Test\DB\QueryBuilder;
use OC\DB\QueryBuilder\Literal;
+use OCP\DB\QueryBuilder\IQueryBuilder;
use Test\TestCase;
/**
@@ -109,4 +110,37 @@ class ExpressionBuilderDBTest extends TestCase {
$result->closeCursor();
$this->assertEquals($match, $column);
}
+
+ public function testCastColumn(): void {
+ $appId = $this->getUniqueID('testing');
+ $this->createConfig($appId, '1', '4');
+
+ $query = $this->connection->getQueryBuilder();
+ $query->update('appconfig')
+ ->set('configvalue',
+ $query->expr()->castColumn(
+ $query->createFunction(
+ '(' . $query->expr()->castColumn('configvalue', IQueryBuilder::PARAM_INT)
+ . ' + 1)'
+ )
+ , IQueryBuilder::PARAM_STR
+ )
+ )
+ ->where($query->expr()->eq('appid', $query->createNamedParameter($appId)))
+ ->andWhere($query->expr()->eq('configkey', $query->createNamedParameter('1')));
+
+ $result = $query->executeStatement();
+ $this->assertEquals(1, $result);
+ }
+
+ protected function createConfig($appId, $key, $value) {
+ $query = $this->connection->getQueryBuilder();
+ $query->insert('appconfig')
+ ->values([
+ 'appid' => $query->createNamedParameter($appId),
+ 'configkey' => $query->createNamedParameter((string) $key),
+ 'configvalue' => $query->createNamedParameter((string) $value),
+ ])
+ ->execute();
+ }
}