aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/DB
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2024-07-18 15:04:58 +0200
committerJoas Schilling <coding@schilljs.com>2024-07-19 11:21:16 +0200
commite1e4ee4d677ac8a491c6afb150b9f7b46473d196 (patch)
treeb92df48ad8ebc63fb827baede5d734d677ceddd9 /lib/private/DB
parenteeb6ddb176adc7488b74d004dceafee960603ebc (diff)
downloadnextcloud-server-e1e4ee4d677ac8a491c6afb150b9f7b46473d196.tar.gz
nextcloud-server-e1e4ee4d677ac8a491c6afb150b9f7b46473d196.zip
fix(db): Manually track if `where()` is called when not empty to avoid recursion
Signed-off-by: Joas Schilling <coding@schilljs.com>
Diffstat (limited to 'lib/private/DB')
-rw-r--r--lib/private/DB/QueryBuilder/QueryBuilder.php43
1 files changed, 24 insertions, 19 deletions
diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php
index cb9356c5d06..0ea223cd89c 100644
--- a/lib/private/DB/QueryBuilder/QueryBuilder.php
+++ b/lib/private/DB/QueryBuilder/QueryBuilder.php
@@ -45,6 +45,7 @@ class QueryBuilder implements IQueryBuilder {
/** @var bool */
private $automaticTablePrefix = true;
+ private bool $nonEmptyWhere = false;
/** @var string */
protected $lastInsertedTable;
@@ -185,24 +186,24 @@ class QueryBuilder implements IQueryBuilder {
}
}
- if (!empty($this->getQueryPart('select'))) {
- $select = $this->getQueryPart('select');
- $hasSelectAll = array_filter($select, static function ($s) {
- return $s === '*';
- });
- $hasSelectSpecific = array_filter($select, static function ($s) {
- return $s !== '*';
- });
-
- if (empty($hasSelectAll) === empty($hasSelectSpecific)) {
- $exception = new QueryException('Query is selecting * and specific values in the same query. This is not supported in Oracle.');
- $this->logger->error($exception->getMessage(), [
- 'query' => $this->getSQL(),
- 'app' => 'core',
- 'exception' => $exception,
- ]);
- }
- }
+ // if (!empty($this->getQueryPart('select'))) {
+ // $select = $this->getQueryPart('select');
+ // $hasSelectAll = array_filter($select, static function ($s) {
+ // return $s === '*';
+ // });
+ // $hasSelectSpecific = array_filter($select, static function ($s) {
+ // return $s !== '*';
+ // });
+
+ // if (empty($hasSelectAll) === empty($hasSelectSpecific)) {
+ // $exception = new QueryException('Query is selecting * and specific values in the same query. This is not supported in Oracle.');
+ // $this->logger->error($exception->getMessage(), [
+ // 'query' => $this->getSQL(),
+ // 'app' => 'core',
+ // 'exception' => $exception,
+ // ]);
+ // }
+ // }
$numberOfParameters = 0;
$hasTooLargeArrayParameter = false;
@@ -830,12 +831,14 @@ class QueryBuilder implements IQueryBuilder {
* @return $this This QueryBuilder instance.
*/
public function where(...$predicates) {
- if ($this->getQueryPart('where') !== null && $this->systemConfig->getValue('debug', false)) {
+ if ($this->nonEmptyWhere && $this->systemConfig->getValue('debug', false)) {
// Only logging a warning, not throwing for now.
$e = new QueryException('Using where() on non-empty WHERE part, please verify it is intentional to not call andWhere() or orWhere() instead. Otherwise consider creating a new query builder object or call resetQueryPart(\'where\') first.');
$this->logger->warning($e->getMessage(), ['exception' => $e]);
}
+ $this->nonEmptyWhere = true;
+
call_user_func_array(
[$this->queryBuilder, 'where'],
$predicates
@@ -863,6 +866,7 @@ class QueryBuilder implements IQueryBuilder {
* @see where()
*/
public function andWhere(...$where) {
+ $this->nonEmptyWhere = true;
call_user_func_array(
[$this->queryBuilder, 'andWhere'],
$where
@@ -890,6 +894,7 @@ class QueryBuilder implements IQueryBuilder {
* @see where()
*/
public function orWhere(...$where) {
+ $this->nonEmptyWhere = true;
call_user_func_array(
[$this->queryBuilder, 'orWhere'],
$where