This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new db7051ca1b8 [fix](jdbc catalog) Disable oracle scan null operator 
pushdown #41563 (#42179)
db7051ca1b8 is described below

commit db7051ca1b80d3aed0382dfb5b9302570d013a3c
Author: Rayner Chen <[email protected]>
AuthorDate: Mon Oct 21 16:38:54 2024 +0800

    [fix](jdbc catalog) Disable oracle scan null operator pushdown #41563 
(#42179)
    
    cherry pick from #41563
    
    Co-authored-by: zy-kkk <[email protected]>
---
 .../doris/datasource/jdbc/source/JdbcScanNode.java | 14 +++++++++
 .../java/org/apache/doris/qe/SessionVariable.java  |  7 +++++
 .../jdbc/test_oracle_jdbc_catalog.out              | 35 ++++++++++++++++++++++
 .../jdbc/test_oracle_jdbc_catalog.groovy           | 26 ++++++++++++++++
 4 files changed, 82 insertions(+)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/source/JdbcScanNode.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/source/JdbcScanNode.java
index 6b63c7c7b6e..ffd56ca4d73 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/source/JdbcScanNode.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/source/JdbcScanNode.java
@@ -24,6 +24,7 @@ import org.apache.doris.analysis.DateLiteral;
 import org.apache.doris.analysis.Expr;
 import org.apache.doris.analysis.ExprSubstitutionMap;
 import org.apache.doris.analysis.FunctionCallExpr;
+import org.apache.doris.analysis.NullLiteral;
 import org.apache.doris.analysis.SlotDescriptor;
 import org.apache.doris.analysis.SlotRef;
 import org.apache.doris.analysis.TupleDescriptor;
@@ -304,6 +305,13 @@ public class JdbcScanNode extends ExternalScanNode {
     }
 
     private static boolean shouldPushDownConjunct(TOdbcTableType tableType, 
Expr expr) {
+        // Prevent pushing down expressions with NullLiteral to Oracle
+        if (ConnectContext.get() != null
+                && 
!ConnectContext.get().getSessionVariable().jdbcOracleNullPredicatePushdown
+                && containsNullLiteral(expr)
+                && tableType.equals(TOdbcTableType.ORACLE)) {
+            return false;
+        }
         if (containsFunctionCallExpr(expr)) {
             if (tableType.equals(TOdbcTableType.MYSQL) || 
tableType.equals(TOdbcTableType.CLICKHOUSE)
                     || tableType.equals(TOdbcTableType.ORACLE)) {
@@ -369,4 +377,10 @@ public class JdbcScanNode extends ExternalScanNode {
         }
         return expr.toExternalSql(TableType.JDBC_EXTERNAL_TABLE, tbl);
     }
+
+    private static boolean containsNullLiteral(Expr expr) {
+        List<NullLiteral> nullExprList = Lists.newArrayList();
+        expr.collect(NullLiteral.class, nullExprList);
+        return !nullExprList.isEmpty();
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 21aab7513e0..4ff283fd577 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -506,6 +506,8 @@ public class SessionVariable implements Serializable, 
Writable {
 
     public static final String JDBC_CLICKHOUSE_QUERY_FINAL = 
"jdbc_clickhouse_query_final";
 
+    public static final String JDBC_ORACLE_NULL_PREDICATE_PUSHDOWN = 
"jdbc_oracle_null_predicate_pushdown";
+
     public static final String ENABLE_MEMTABLE_ON_SINK_NODE =
             "enable_memtable_on_sink_node";
 
@@ -685,6 +687,11 @@ public class SessionVariable implements Serializable, 
Writable {
                     "Whether to add the FINAL keyword to the query SQL when 
querying ClickHouse JDBC external tables."})
     public boolean jdbcClickhouseQueryFinal = false;
 
+    @VariableMgr.VarAttr(name = JDBC_ORACLE_NULL_PREDICATE_PUSHDOWN, 
needForward = true,
+            description = {"是否允许将 NULL 谓词下推到 Oracle JDBC 外部表。",
+                    "Whether to allow NULL predicates to be pushed down to 
Oracle JDBC external tables."})
+    public boolean jdbcOracleNullPredicatePushdown = false;
+
     @VariableMgr.VarAttr(name = ROUND_PRECISE_DECIMALV2_VALUE)
     public boolean roundPreciseDecimalV2Value = false;
 
diff --git 
a/regression-test/data/external_table_p0/jdbc/test_oracle_jdbc_catalog.out 
b/regression-test/data/external_table_p0/jdbc/test_oracle_jdbc_catalog.out
index 82afecb61bd..c32cd8d172a 100644
--- a/regression-test/data/external_table_p0/jdbc/test_oracle_jdbc_catalog.out
+++ b/regression-test/data/external_table_p0/jdbc/test_oracle_jdbc_catalog.out
@@ -269,3 +269,38 @@ doris
 1      111     123     7456123.89      573     34      673.43  34.1264 60.0    
23.231  99      9999    999999999       999999999999999999      999     99999   
9999999999      9999999999999999999     1       china   beijing alice   
abcdefghrjkmnopq        123.45  12300   0.0012345       2022-01-21T05:23:01     
2019-11-12T20:33:57.999 2019-11-12T20:33:57.999998      
2019-11-12T20:33:57.999996      2019-11-12T20:33:57.999997      223-9   12 
10:23:1.123457000
 2      \N      \N      \N      \N      \N      \N      \N      \N      \N      
\N      \N      \N      \N      \N      \N      \N      \N      \N      \N      
\N      \N      \N      \N      \N      \N      \N      \N      \N      \N      
\N      \N      \N
 
+-- !null_operator1 --
+1      alice   20      99.5
+2      bob     21      90.5
+3      jerry   23      88.0
+4      andy    21      93.0
+
+-- !null_operator2 --
+2      bob     21      90.5
+3      jerry   23      88.0
+4      andy    21      93.0
+
+-- !null_operator3 --
+1      alice   20      99.5
+
+-- !null_operator4 --
+
+-- !null_operator5 --
+
+-- !null_operator6 --
+
+-- !null_operator7 --
+3      jerry   23      88.0
+
+-- !null_operator8 --
+1      alice   20      99.5
+4      andy    21      93.0
+
+-- !null_operator9 --
+
+-- !null_operator10 --
+1      alice   20      99.5
+2      bob     21      90.5
+3      jerry   23      88.0
+4      andy    21      93.0
+
diff --git 
a/regression-test/suites/external_table_p0/jdbc/test_oracle_jdbc_catalog.groovy 
b/regression-test/suites/external_table_p0/jdbc/test_oracle_jdbc_catalog.groovy
index 571dda0e5d8..8e498030209 100644
--- 
a/regression-test/suites/external_table_p0/jdbc/test_oracle_jdbc_catalog.groovy
+++ 
b/regression-test/suites/external_table_p0/jdbc/test_oracle_jdbc_catalog.groovy
@@ -297,5 +297,31 @@ suite("test_oracle_jdbc_catalog", 
"p0,external,oracle,external_docker,external_d
         qt_query_ojdbc6_all_types """ select * from 
oracle_ojdbc6.DORIS_TEST.TEST_ALL_TYPES order by 1; """
 
         sql """drop catalog if exists oracle_ojdbc6; """
+
+        // test oracle null operator
+        sql """ drop catalog if exists oracle_null_operator; """
+        sql """ create catalog if not exists oracle_null_operator properties(
+                    "type"="jdbc",
+                    "user"="doris_test",
+                    "password"="123456",
+                    "jdbc_url" = 
"jdbc:oracle:thin:@${externalEnvIp}:${oracle_port}:${SID}",
+                    "driver_url" = "${driver_url}",
+                    "driver_class" = "oracle.jdbc.driver.OracleDriver"
+        );"""
+
+        sql """ use oracle_null_operator.DORIS_TEST; """
+        order_qt_null_operator1 """ SELECT * FROM STUDENT WHERE (id IS NOT 
NULL OR NULL); """
+        order_qt_null_operator2 """ SELECT * FROM STUDENT WHERE (age > 20 OR 
NULL); """
+        order_qt_null_operator3 """ SELECT * FROM STUDENT WHERE (name = 
'alice' AND age = 20); """
+        order_qt_null_operator4 """ SELECT * FROM STUDENT WHERE (LENGTH(name) 
> 3 AND NULL); """
+        order_qt_null_operator5 """ SELECT * FROM STUDENT WHERE (age = NULL); 
"""
+        order_qt_null_operator6 """ SELECT * FROM STUDENT WHERE (score IS 
NULL); """
+        order_qt_null_operator7 """ SELECT * FROM STUDENT WHERE ((age > 20 AND 
score < 90) OR NULL); """
+        order_qt_null_operator8 """ SELECT * FROM STUDENT WHERE (age BETWEEN 
20 AND 25) AND (name LIKE 'a%'); """
+        order_qt_null_operator9 """ SELECT * FROM STUDENT WHERE (id IS NOT 
NULL AND NULL); """
+        order_qt_null_operator10 """ SELECT * FROM STUDENT WHERE (name IS NULL 
OR age IS NOT NULL); """
+
+        sql """ drop catalog if exists oracle_null_operator; """
+
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to