]> source.dussan.org Git - nextcloud-server.git/commitdiff
Make sure Oracle always casts everything in the best way
authorJoas Schilling <coding@schilljs.com>
Fri, 6 Nov 2020 07:52:09 +0000 (08:52 +0100)
committerJoas Schilling <coding@schilljs.com>
Fri, 6 Nov 2020 11:13:22 +0000 (12:13 +0100)
Signed-off-by: Joas Schilling <coding@schilljs.com>
lib/private/DB/QueryBuilder/FunctionBuilder/OCIFunctionBuilder.php

index f9347210c133178c1d0466b848773fd19b0bb30f..556ef22144b70e1cba61752e11ca485bbad759f9 100644 (file)
 namespace OC\DB\QueryBuilder\FunctionBuilder;
 
 use OC\DB\QueryBuilder\QueryFunction;
+use OCP\DB\QueryBuilder\ILiteral;
+use OCP\DB\QueryBuilder\IParameter;
+use OCP\DB\QueryBuilder\IQueryFunction;
 
 class OCIFunctionBuilder extends FunctionBuilder {
        public function md5($input) {
                return new QueryFunction('LOWER(DBMS_OBFUSCATION_TOOLKIT.md5 (input => UTL_RAW.cast_to_raw(' . $this->helper->quoteColumnName($input) .')))');
        }
+
+       /**
+        * As per https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions060.htm
+        * Oracle uses the first value to cast the rest or the values. So when the
+        * first value is a literal, plain value or column, instead of doing the
+        * math, it will cast the expression to int and continue with a "0". So when
+        * the second parameter is a function or column, we have to put that as
+        * first parameter.
+        *
+        * @param string|ILiteral|IParameter|IQueryFunction $x
+        * @param string|ILiteral|IParameter|IQueryFunction $y
+        * @return QueryFunction
+        */
+       public function greatest($x, $y) {
+               if (is_string($y) || $y instanceof IQueryFunction) {
+                       return parent::greatest($y, $x);
+               }
+
+               return parent::greatest($x, $y);
+       }
+
+       /**
+        * As per https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions060.htm
+        * Oracle uses the first value to cast the rest or the values. So when the
+        * first value is a literal, plain value or column, instead of doing the
+        * math, it will cast the expression to int and continue with a "0". So when
+        * the second parameter is a function or column, we have to put that as
+        * first parameter.
+        *
+        * @param string|ILiteral|IParameter|IQueryFunction $x
+        * @param string|ILiteral|IParameter|IQueryFunction $y
+        * @return QueryFunction
+        */
+       public function least($x, $y) {
+               if (is_string($y) || $y instanceof IQueryFunction) {
+                       return parent::least($y, $x);
+               }
+
+               return parent::least($x, $y);
+       }
 }