diff options
author | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2021-01-08 12:46:10 +0100 |
---|---|---|
committer | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2021-01-11 13:43:34 +0100 |
commit | f9484d15cbf9e41212cedd42a39385b8fc81f11b (patch) | |
tree | 54bf33387338e32bb076b48bb3b14731d481ca51 /lib | |
parent | 45e3261ad5961e78ab919f14ff9234da0ba740b5 (diff) | |
download | nextcloud-server-f9484d15cbf9e41212cedd42a39385b8fc81f11b.tar.gz nextcloud-server-f9484d15cbf9e41212cedd42a39385b8fc81f11b.zip |
DB: warn on parameter number constraints
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/DB/QueryBuilder/QueryBuilder.php | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php index 657e52e54bc..fb28fa28649 100644 --- a/lib/private/DB/QueryBuilder/QueryBuilder.php +++ b/lib/private/DB/QueryBuilder/QueryBuilder.php @@ -253,6 +253,36 @@ class QueryBuilder implements IQueryBuilder { } } + $numberOfParameters = 0; + $hasTooLargeArrayParameter = false; + foreach ($this->getParameters() as $parameter) { + if (is_array($parameter)) { + $count = count($parameter); + $numberOfParameters += $count; + $hasTooLargeArrayParameter = $hasTooLargeArrayParameter || ($count > 1000); + } + } + + if ($hasTooLargeArrayParameter) { + $exception = new QueryException('More than 1000 expressions in a list are not allowed on Oracle.'); + $this->logger->logException($exception, [ + 'message' => 'More than 1000 expressions in a list are not allowed on Oracle.', + 'query' => $this->getSQL(), + 'level' => ILogger::ERROR, + 'app' => 'core', + ]); + } + + if ($numberOfParameters > 65535) { + $exception = new QueryException('The number of parameters must not exceed 65535. Restriction by PostgreSQL.'); + $this->logger->logException($exception, [ + 'message' => 'The number of parameters must not exceed 65535. Restriction by PostgreSQL.', + 'query' => $this->getSQL(), + 'level' => ILogger::ERROR, + 'app' => 'core', + ]); + } + $result = $this->queryBuilder->execute(); if (is_int($result)) { return $result; |