]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fix updates of NULL appconfig values 23641/head
authorRoeland Jago Douma <roeland@famdouma.nl>
Wed, 21 Oct 2020 08:04:06 +0000 (10:04 +0200)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Fri, 23 Oct 2020 08:45:29 +0000 (08:45 +0000)
The comparisson of NULL is a bit special.
So we need to handle this a tad beter else it might not replace NULL
values. or allow you to set NULL values on updates.

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
lib/private/AppConfig.php

index d3b644498796b8b24a8ae7a5e39f5e60c2e18594..9e36ad0cd57e6aba2dd0b338698407c7ebeba752 100644 (file)
@@ -202,12 +202,9 @@ class AppConfig implements IAppConfig {
 
                $sql = $this->conn->getQueryBuilder();
                $sql->update('appconfig')
-                       ->set('configvalue', $sql->createParameter('configvalue'))
-                       ->where($sql->expr()->eq('appid', $sql->createParameter('app')))
-                       ->andWhere($sql->expr()->eq('configkey', $sql->createParameter('configkey')))
-                       ->setParameter('configvalue', $value)
-                       ->setParameter('app', $app)
-                       ->setParameter('configkey', $key);
+                       ->set('configvalue', $sql->createNamedParameter($value))
+                       ->where($sql->expr()->eq('appid', $sql->createNamedParameter($app)))
+                       ->andWhere($sql->expr()->eq('configkey', $sql->createNamedParameter($key)));
 
                /*
                 * Only limit to the existing value for non-Oracle DBs:
@@ -215,9 +212,25 @@ class AppConfig implements IAppConfig {
                 * > Large objects (LOBs) are not supported in comparison conditions.
                 */
                if (!($this->conn instanceof OracleConnection)) {
-                       // Only update the value when it is not the same
-                       $sql->andWhere($sql->expr()->neq('configvalue', $sql->createParameter('configvalue')))
-                               ->setParameter('configvalue', $value);
+
+                       /*
+                        * Only update the value when it is not the same
+                        * Note that NULL requires some special handling. Since comparing
+                        * against null can have special results.
+                        */
+
+                       if ($value === null) {
+                               $sql->andWhere(
+                                       $sql->expr()->isNotNull('configvalue')
+                               );
+                       } else {
+                               $sql->andWhere(
+                                       $sql->expr()->orX(
+                                               $sql->expr()->isNull('configvalue'),
+                                               $sql->expr()->neq('configvalue', $sql->createNamedParameter($value))
+                                       )
+                               );
+                       }
                }
 
                $changedRow = (bool) $sql->execute();