This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new 7d63a396cff [fix](jdbc catalog) fix JdbcScanNode `NOT`
CompoundPredicate filter expr handling errors (#28497) (#28524)
7d63a396cff is described below
commit 7d63a396cff83e99173c4cee55ecd6326735068a
Author: zy-kkk <[email protected]>
AuthorDate: Sun Dec 17 20:55:29 2023 +0800
[fix](jdbc catalog) fix JdbcScanNode `NOT` CompoundPredicate filter expr
handling errors (#28497) (#28524)
---
.../doris/planner/external/jdbc/JdbcScanNode.java | 27 +++++++++--
.../jdbc/test_clickhouse_jdbc_catalog.out | Bin 4966 -> 5002 bytes
.../jdbc/test_mysql_jdbc_catalog.out | 18 ++++++++
.../jdbc/test_oracle_jdbc_catalog.out | 50 +++++++++++++++++++++
.../jdbc/test_pg_jdbc_catalog.out | 6 +++
.../jdbc/test_sqlserver_jdbc_catalog.out | 8 ++++
.../jdbc/test_clickhouse_jdbc_catalog.groovy | 2 +
.../jdbc/test_mysql_jdbc_catalog.groovy | 2 +
.../jdbc/test_oracle_jdbc_catalog.groovy | 14 ++++++
.../jdbc/test_pg_jdbc_catalog.groovy | 2 +
.../jdbc/test_sqlserver_jdbc_catalog.groovy | 2 +
11 files changed, 127 insertions(+), 4 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/jdbc/JdbcScanNode.java
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/jdbc/JdbcScanNode.java
index 23a44ed6432..6dcbfcab00c 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/planner/external/jdbc/JdbcScanNode.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/planner/external/jdbc/JdbcScanNode.java
@@ -21,6 +21,7 @@ import org.apache.doris.analysis.Analyzer;
import org.apache.doris.analysis.BinaryPredicate;
import org.apache.doris.analysis.BoolLiteral;
import org.apache.doris.analysis.CompoundPredicate;
+import org.apache.doris.analysis.CompoundPredicate.Operator;
import org.apache.doris.analysis.DateLiteral;
import org.apache.doris.analysis.Expr;
import org.apache.doris.analysis.ExprSubstitutionMap;
@@ -328,13 +329,31 @@ public class JdbcScanNode extends ExternalScanNode {
if (expr instanceof CompoundPredicate) {
StringBuilder result = new StringBuilder();
CompoundPredicate compoundPredicate = (CompoundPredicate) expr;
+
+ // If the operator is 'NOT', prepend 'NOT' to the start of the
string
+ if (compoundPredicate.getOp() == Operator.NOT) {
+ result.append("NOT ");
+ }
+
+ // Iterate through all children of the CompoundPredicate
for (Expr child : compoundPredicate.getChildren()) {
+ // Recursively call conjunctExprToString for each child and
append to the result
result.append(conjunctExprToString(tableType, child));
- result.append("
").append(compoundPredicate.getOp().toString()).append(" ");
+
+ // If the operator is not 'NOT', append the operator after
each child expression
+ if (!(compoundPredicate.getOp() == Operator.NOT)) {
+ result.append("
").append(compoundPredicate.getOp().toString()).append(" ");
+ }
+ }
+
+ // For operators other than 'NOT', remove the extra appended
operator at the end
+ // This is necessary for operators like 'AND' or 'OR' that appear
between child expressions
+ if (!(compoundPredicate.getOp() == Operator.NOT)) {
+ result.setLength(result.length() -
compoundPredicate.getOp().toString().length() - 2);
}
- // Remove the last operator
- result.setLength(result.length() -
compoundPredicate.getOp().toString().length() - 2);
- return result.toString();
+
+ // Return the processed string trimmed of any extra spaces
+ return result.toString().trim();
}
if (expr.contains(DateLiteral.class) && expr instanceof
BinaryPredicate) {
diff --git
a/regression-test/data/external_table_p0/jdbc/test_clickhouse_jdbc_catalog.out
b/regression-test/data/external_table_p0/jdbc/test_clickhouse_jdbc_catalog.out
index 354cc2491a1..32c74765aab 100644
Binary files
a/regression-test/data/external_table_p0/jdbc/test_clickhouse_jdbc_catalog.out
and
b/regression-test/data/external_table_p0/jdbc/test_clickhouse_jdbc_catalog.out
differ
diff --git
a/regression-test/data/external_table_p0/jdbc/test_mysql_jdbc_catalog.out
b/regression-test/data/external_table_p0/jdbc/test_mysql_jdbc_catalog.out
index ab9a45e02fc..c81d86828c6 100644
--- a/regression-test/data/external_table_p0/jdbc/test_mysql_jdbc_catalog.out
+++ b/regression-test/data/external_table_p0/jdbc/test_mysql_jdbc_catalog.out
@@ -245,6 +245,24 @@ VIEWS
1 \N
2 2022-01-01
+-- !test_filter_not --
+张三1 11 12345678 123 321312 1999-02-13T00:00 中国
男 0
+张三2 11 12345671 123 321312 1999-02-13T00:00 中国
男 0
+张三3 11 12345673 123 321312 1999-02-13T00:00 中国
男 0
+张三4 11 123456711 123 321312 1999-02-13T00:00 中国
男 0
+张三5 11 1232134567 123 321312 1999-02-13T00:00 中国
男 0
+张三6 11 124314567 123 321312 1999-02-13T00:00 中国
男 0
+张三7 11 123445167 123 321312 1998-02-13T00:00 中国
男 0
+
+-- !test_filter_not_old_plan --
+张三1 11 12345678 123 321312 1999-02-13T00:00 中国
男 0
+张三2 11 12345671 123 321312 1999-02-13T00:00 中国
男 0
+张三3 11 12345673 123 321312 1999-02-13T00:00 中国
男 0
+张三4 11 123456711 123 321312 1999-02-13T00:00 中国
男 0
+张三5 11 1232134567 123 321312 1999-02-13T00:00 中国
男 0
+张三6 11 124314567 123 321312 1999-02-13T00:00 中国
男 0
+张三7 11 123445167 123 321312 1998-02-13T00:00 中国
男 0
+
-- !test_insert1 --
doris1 18
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 519c7ab131c..ac1a6907f45 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
@@ -78,6 +78,31 @@
-- !filter3 --
1 1 china beijing alice abcdefghrjkmnopq
+-- !filter4 --
+1 alice 20 99.5
+3 jerry 23 88.0
+4 andy 21 93.0
+
+-- !filter5 --
+1 alice 20 99.5
+2 bob 21 90.5
+3 jerry 23 88.0
+4 andy 21 93.0
+
+-- !filter6 --
+1 alice 20 99.5
+4 andy 21 93.0
+
+-- !filter7 --
+3 jerry 23 88.0
+
+-- !filter8 --
+4 andy 21 93.0
+
+-- !filter9 --
+3 jerry 23 88.0
+4 andy 21 93.0
+
-- !date1 --
1 2022-01-21T05:23:01 \N \N
2 2022-11-12T20:32:56 \N \N
@@ -102,6 +127,31 @@
-- !date7 --
3 \N 2019-11-12T20:33:57.999 \N \N \N \N \N
+-- !filter4_old_plan --
+1 alice 20 99.5
+3 jerry 23 88.0
+4 andy 21 93.0
+
+-- !filter5_old_plan --
+1 alice 20 99.5
+2 bob 21 90.5
+3 jerry 23 88.0
+4 andy 21 93.0
+
+-- !filter6_old_plan --
+1 alice 20 99.5
+4 andy 21 93.0
+
+-- !filter7_old_plan --
+3 jerry 23 88.0
+
+-- !filter8_old_plan --
+4 andy 21 93.0
+
+-- !filter9_old_plan --
+3 jerry 23 88.0
+4 andy 21 93.0
+
-- !test_insert1 --
doris1 18
diff --git
a/regression-test/data/external_table_p0/jdbc/test_pg_jdbc_catalog.out
b/regression-test/data/external_table_p0/jdbc/test_pg_jdbc_catalog.out
index 5d1a91b9ce3..3920c1d7f90 100644
--- a/regression-test/data/external_table_p0/jdbc/test_pg_jdbc_catalog.out
+++ b/regression-test/data/external_table_p0/jdbc/test_pg_jdbc_catalog.out
@@ -2119,6 +2119,12 @@ true abc def 2022-10-11 1.234 1
2 99 2022-10-22T10:59:59 34.123
-32768 -2147483648 true testtsetab -9223372036854775808
32767 2147483647 false testtsetab 9223372036854775807
+-- !filter4 --
+234 bcd
+
+-- !filter4_old --
+234 bcd
+
-- !test12 --
1 false 12.123456 10.16.10.14/32 10.16.10.14
ff:ff:ff:ff:ff:aa 1010101010 01010 1 {"id":1}
2 false 12.123456 10.16.10.14/32 10.16.10.14
ff:ff:ff:ff:ff:ff 0000001010 0000001010 2 {"id":1}
diff --git
a/regression-test/data/external_table_p0/jdbc/test_sqlserver_jdbc_catalog.out
b/regression-test/data/external_table_p0/jdbc/test_sqlserver_jdbc_catalog.out
index 9906bb10f55..7624abc4589 100644
---
a/regression-test/data/external_table_p0/jdbc/test_sqlserver_jdbc_catalog.out
+++
b/regression-test/data/external_table_p0/jdbc/test_sqlserver_jdbc_catalog.out
@@ -53,6 +53,14 @@
-- !filter3 --
1 Make Doris Great! Make Doris Great! Make Doris Great!
Make Doris Great! Make Doris Great! Make Doris Great!
+-- !filter4 --
+2 alice 19
+3 bob 20
+
+-- !filter4_old --
+2 alice 19
+3 bob 20
+
-- !id --
2
diff --git
a/regression-test/suites/external_table_p0/jdbc/test_clickhouse_jdbc_catalog.groovy
b/regression-test/suites/external_table_p0/jdbc/test_clickhouse_jdbc_catalog.groovy
index 274bf7a7016..3870469ef53 100644
---
a/regression-test/suites/external_table_p0/jdbc/test_clickhouse_jdbc_catalog.groovy
+++
b/regression-test/suites/external_table_p0/jdbc/test_clickhouse_jdbc_catalog.groovy
@@ -78,6 +78,8 @@ suite("test_clickhouse_jdbc_catalog",
"p0,external,clickhouse,external_docker,ex
order_qt_filter """ select k1,k2 from type where 1 = 1 order by 1
; """
order_qt_filter2 """ select k1,k2 from type where 1 = 1 and k1 =
true order by 1 ; """
order_qt_filter3 """ select k1,k2 from type where k1 = true order
by 1 ; """
+ order_qt_filter4 """ select k28 from type where k28 not like
'%String%' order by 1 ; """
+ order_qt_filter4_old """ select /*+
SET_VAR(enable_nereids_planner=false) */ k28 from type where k28 not like
'%String%' order by 1 ; """
sql "set jdbc_clickhouse_query_final = true;"
order_qt_final1 """select * from final_test"""
sql "set jdbc_clickhouse_query_final = false;"
diff --git
a/regression-test/suites/external_table_p0/jdbc/test_mysql_jdbc_catalog.groovy
b/regression-test/suites/external_table_p0/jdbc/test_mysql_jdbc_catalog.groovy
index 7517f52fa3c..af297da4869 100644
---
a/regression-test/suites/external_table_p0/jdbc/test_mysql_jdbc_catalog.groovy
+++
b/regression-test/suites/external_table_p0/jdbc/test_mysql_jdbc_catalog.groovy
@@ -172,6 +172,8 @@ suite("test_mysql_jdbc_catalog",
"p0,external,mysql,external_docker,external_doc
order_qt_dt """select * from ${dt}; """
order_qt_dt_null """select * from ${dt_null} order by 1; """
order_qt_test_dz """select * from ${test_zd} order by 1; """
+ order_qt_test_filter_not """select * from ${ex_tb13} where name
not like '%张三0%' order by 1; """
+ order_qt_test_filter_not_old_plan """select /*+
SET_VAR(enable_nereids_planner=false) */ * from ${ex_tb13} where name not like
'%张三0%' order by 1; """
// test insert
String uuid1 = UUID.randomUUID().toString();
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 f18ae1b4bb2..97a57f8c9c6 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
@@ -120,6 +120,12 @@ suite("test_oracle_jdbc_catalog",
"p0,external,oracle,external_docker,external_d
order_qt_filter1 """ select * from TEST_CHAR where ID = 1 order by
ID; """
order_qt_filter2 """ select * from TEST_CHAR where 1 = 1 order by ID;
"""
order_qt_filter3 """ select * from TEST_CHAR where ID = 1 and 1 = 1
order by ID; """
+ order_qt_filter4 """ select * from STUDENT where NAME NOT like
'%bob%' order by ID; """
+ order_qt_filter5 """ select * from STUDENT where NAME NOT like
'%bob%' or NAME NOT LIKE '%jerry%' order by ID; """
+ order_qt_filter6 """ select * from STUDENT where NAME NOT like
'%bob%' and NAME NOT LIKE '%jerry%' order by ID; """
+ order_qt_filter7 """ select * from STUDENT where NAME NOT like
'%bob%' and NAME LIKE '%jerry%' order by ID; """
+ order_qt_filter8 """ select * from STUDENT where NAME NOT like
'%bob%' and ID = 4 order by ID; """
+ order_qt_filter9 """ SELECT * FROM STUDENT WHERE (NAME NOT LIKE
'%bob%' AND AGE > 20) OR (SCORE < 90 AND NOT (NAME = 'alice' OR AGE <= 18))
order by ID; """
order_qt_date1 """ select * from TEST_DATE where T1 > '2022-01-21
00:00:00' or T1 < '2022-01-22 00:00:00'; """
order_qt_date2 """ select * from TEST_DATE where T1 > '2022-01-21
00:00:00' and T1 < '2022-01-22 00:00:00'; """
order_qt_date3 """ select * from TEST_DATE where (T1 > '2022-01-21
00:00:00' and T1 < '2022-01-22 00:00:00') or T1 > '2022-01-20 00:00:00'; """
@@ -128,6 +134,14 @@ suite("test_oracle_jdbc_catalog",
"p0,external,oracle,external_docker,external_d
order_qt_date6 """ select * from TEST_DATE where (T1 < '2022-01-22
00:00:00' or T1 > '2022-01-20 00:00:00') and (T1 < '2022-01-23 00:00:00' or T1
> '2022-01-19 00:00:00'); """
order_qt_date7 """select * from TEST_TIMESTAMP where T2 <
str_to_date('2020-12-21 12:34:56', '%Y-%m-%d %H:%i:%s');"""
+ // for old planner
+ order_qt_filter4_old_plan """ select /*+
SET_VAR(enable_nereids_planner=false) */ * from STUDENT where NAME NOT like
'%bob%' order by ID; """
+ order_qt_filter5_old_plan """ select /*+
SET_VAR(enable_nereids_planner=false) */ * from STUDENT where NAME NOT like
'%bob%' or NAME NOT LIKE '%jerry%' order by ID; """
+ order_qt_filter6_old_plan """ select /*+
SET_VAR(enable_nereids_planner=false) */ * from STUDENT where NAME NOT like
'%bob%' and NAME NOT LIKE '%jerry%' order by ID; """
+ order_qt_filter7_old_plan """ select /*+
SET_VAR(enable_nereids_planner=false) */ * from STUDENT where NAME NOT like
'%bob%' and NAME LIKE '%jerry%' order by ID; """
+ order_qt_filter8_old_plan """ select /*+
SET_VAR(enable_nereids_planner=false) */ * from STUDENT where NAME NOT like
'%bob%' and ID = 4 order by ID; """
+ order_qt_filter9_old_plan """ SELECT /*+
SET_VAR(enable_nereids_planner=false) */ * FROM STUDENT WHERE (NAME NOT LIKE
'%bob%' AND AGE > 20) OR (SCORE < 90 AND NOT (NAME = 'alice' OR AGE <= 18))
order by ID; """
+
// The result of TEST_RAW will change
// So instead of qt, we're using sql here.
sql """ select * from TEST_RAW order by ID; """
diff --git
a/regression-test/suites/external_table_p0/jdbc/test_pg_jdbc_catalog.groovy
b/regression-test/suites/external_table_p0/jdbc/test_pg_jdbc_catalog.groovy
index d44c24a4792..dad935acdc2 100644
--- a/regression-test/suites/external_table_p0/jdbc/test_pg_jdbc_catalog.groovy
+++ b/regression-test/suites/external_table_p0/jdbc/test_pg_jdbc_catalog.groovy
@@ -105,6 +105,8 @@ suite("test_pg_jdbc_catalog",
"p0,external,pg,external_docker,external_docker_pg
order_qt_test9 """ select * from test7 order by id; """
order_qt_test10 """ select * from test8 order by id; """
order_qt_test11 """ select * from test9 order by id1; """
+ order_qt_filter4 """ select * from test3 where name not like '%abc%'
order by id; """
+ order_qt_filter4_old """ select /*+
SET_VAR(enable_nereids_planner=false) */ * from test3 where name not like
'%abc%' order by id; """
sql """ use ${ex_schema_name2}"""
order_qt_test12 """ select * from test10 order by id; """
diff --git
a/regression-test/suites/external_table_p0/jdbc/test_sqlserver_jdbc_catalog.groovy
b/regression-test/suites/external_table_p0/jdbc/test_sqlserver_jdbc_catalog.groovy
index fde19f7a606..068f781fad6 100644
---
a/regression-test/suites/external_table_p0/jdbc/test_sqlserver_jdbc_catalog.groovy
+++
b/regression-test/suites/external_table_p0/jdbc/test_sqlserver_jdbc_catalog.groovy
@@ -76,6 +76,8 @@ suite("test_sqlserver_jdbc_catalog",
"p0,external,sqlserver,external_docker,exte
order_qt_filter1 """ select * from test_char where 1 = 1 order by
id; """
order_qt_filter2 """ select * from test_char where 1 = 1 and id =
1 order by id; """
order_qt_filter3 """ select * from test_char where id = 1 order
by id; """
+ order_qt_filter4 """ select * from student where name not like
'%doris%' order by id; """
+ order_qt_filter4_old """ select /*+
SET_VAR(enable_nereids_planner=false) */ * from student where name not like
'%doris%' order by id; """
order_qt_id """ select count(*) from (select * from t_id) as a; """
order_qt_all_type """ select * from all_type order by id; """
sql """ drop table if exists
internal.${internal_db_name}.all_type; """
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]