From d10e96a387c3cf35ccecce304a3dddae365bddab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E9=87=91=E5=8B=87?= Date: Sun, 28 Dec 2025 21:23:01 +0800 Subject: [PATCH] * [pgsql] Use "IF" insteal of IF. --- db/dm_function.sql | 22 ++++++++++++++++ db/pgsql_function.sql | 60 ++++++++++++++++++++++++++++++++++++++----- lib/dbh/dbh.class.php | 24 ++--------------- 3 files changed, 78 insertions(+), 28 deletions(-) diff --git a/db/dm_function.sql b/db/dm_function.sql index 31b13380a8..3eaf655a0c 100644 --- a/db/dm_function.sql +++ b/db/dm_function.sql @@ -45,3 +45,25 @@ BEGIN -- 返回res RETURN res; END FIND_IN_SET; +/ + +CREATE OR REPLACE FUNCTION "IF"( + p_condition BOOLEAN, -- 判断条件 + p_true_val ANYTYPE, -- true分支返回值(任意类型) + p_false_val ANYTYPE -- false分支返回值(任意类型) +) RETURNS ANYTYPE +AS +BEGIN + -- 仅校验条件非空,不校验类型 + IF p_condition IS NULL THEN + RAISE_APPLICATION_ERROR(-20001, '判断条件不能为NULL'); + END IF; + + -- 核心逻辑:直接返回不同类型值 + IF p_condition THEN + RETURN p_true_val; -- 如:字符串 + ELSE + RETURN p_false_val; -- 如:数值 + END IF; +END; +/ diff --git a/db/pgsql_function.sql b/db/pgsql_function.sql index 459d1f8de5..1fec8ffa20 100644 --- a/db/pgsql_function.sql +++ b/db/pgsql_function.sql @@ -256,7 +256,7 @@ END; $$ LANGUAGE plpgsql; -- -CREATE OR REPLACE FUNCTION IF( +CREATE OR REPLACE FUNCTION "IF"( condition BOOLEAN, true_val BOOLEAN, false_val BOOLEAN @@ -272,7 +272,7 @@ $$ LANGUAGE plpgsql; -- -CREATE OR REPLACE FUNCTION IF( +CREATE OR REPLACE FUNCTION "IF"( condition BOOLEAN, true_val DOUBLE PRECISION, false_val INTEGER @@ -288,7 +288,55 @@ $$ LANGUAGE plpgsql; -- -CREATE OR REPLACE FUNCTION IF( +CREATE OR REPLACE FUNCTION "IF"( + condition BOOLEAN, + true_val DOUBLE PRECISION, + false_val DOUBLE PRECISION +) RETURNS DOUBLE PRECISION AS $$ +BEGIN + IF condition THEN + RETURN true_val; + ELSE + RETURN false_val; + END IF; +END; +$$ LANGUAGE plpgsql; + +-- + +CREATE OR REPLACE FUNCTION "IF"( + condition BOOLEAN, + true_val TEXT, + false_val TEXT +) RETURNS TEXT AS $$ +BEGIN + IF condition THEN + RETURN true_val; + ELSE + RETURN false_val; + END IF; +END; +$$ LANGUAGE plpgsql; + +-- + +CREATE OR REPLACE FUNCTION "IF"( + condition BOOLEAN, + true_val INTEGER, + false_val INTEGER +) RETURNS INTEGER AS $$ +BEGIN + IF condition THEN + RETURN true_val; + ELSE + RETURN false_val; + END IF; +END; +$$ LANGUAGE plpgsql; + +-- + +CREATE OR REPLACE FUNCTION "IF"( condition BOOLEAN, true_val TEXT, false_val DATE @@ -304,7 +352,7 @@ $$ LANGUAGE plpgsql; -- -CREATE OR REPLACE FUNCTION IF( +CREATE OR REPLACE FUNCTION "IF"( condition BOOLEAN, true_val DATE, false_val DATE @@ -320,7 +368,7 @@ $$ LANGUAGE plpgsql; -- -CREATE OR REPLACE FUNCTION IF( +CREATE OR REPLACE FUNCTION "IF"( condition BOOLEAN, true_val timestamp without time zone, false_val DATE @@ -336,7 +384,7 @@ $$ LANGUAGE plpgsql; -- -CREATE OR REPLACE FUNCTION IF( +CREATE OR REPLACE FUNCTION "IF"( condition BOOLEAN, true_val timestamp without time zone, false_val timestamp without time zone diff --git a/lib/dbh/dbh.class.php b/lib/dbh/dbh.class.php index 00f5602603..89aa19f1b2 100644 --- a/lib/dbh/dbh.class.php +++ b/lib/dbh/dbh.class.php @@ -606,28 +606,7 @@ class dbh if(stripos($sql, 'CREATE OR REPLACE VIEW ') === 0) { - // Modify if function. - $fieldsBegin = stripos($sql, 'select'); - $fieldsEnd = stripos($sql, 'from'); - $fields = substr($sql, $fieldsBegin+6, $fieldsEnd-$fieldsBegin-6); - $fieldList = preg_split("/,(?![^(]+\))/", $fields); - foreach($fieldList as $key => $field) - { - $aliasPos = stripos($field, ' AS '); - $subField = substr($field, 0, $aliasPos); - if(stripos($field, 'SUM(') === 0) $subField = substr($subField, 4, -1); - - $fieldParts = preg_split("/\+(?![^(]+\))/", $subField); - foreach($fieldParts as $pkey => $fieldPart) - { - $originField = trim($fieldPart); - if(stripos($originField, 'if(') === false) continue; - $fieldParts[$pkey] = $this->formatDmIfFunction($originField); - } - $fieldList[$key] = str_replace($subField, implode(' + ', $fieldParts), $field); - } - $fields = implode(',', $fieldList); - $sql = substr($sql, 0, $fieldsBegin+6) . $fields . substr($sql, $fieldsEnd); + $sql = $this->formatField($sql); return str_replace('CREATE OR REPLACE VIEW ', 'CREATE VIEW ', $sql); } elseif(stripos($sql, 'CREATE UNIQUE INDEX') === 0 || stripos($sql, 'CREATE INDEX') === 0) @@ -833,6 +812,7 @@ class dbh if($this->dbConfig->driver == 'dm' || in_array($this->dbConfig->driver, $this->config->pgsqlDriverList)) { $sql = str_replace('`', '"', $sql); + $sql = preg_replace('/(?