zabetak commented on code in PR #5494:
URL: https://github.com/apache/hive/pull/5494#discussion_r1804315548


##########
ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/jdbc/JDBCExpandExpressionsRule.java:
##########
@@ -178,6 +177,9 @@ protected static class RexTransformIntoOrAndClause extends 
RexShuttle {
     @Override
     public RexNode visitCall(RexCall inputCall) {
       RexNode node = super.visitCall(inputCall);
+      if (!RexUtil.isFlat(node)) {
+        node = RexUtil.flatten(rexBuilder, node);
+      }

Review Comment:
   In fact, I was thinking that it may be better to flatten after the 
transformation but if you are saying that it's not necessary that's fine with 
me.
   ```java
   public RexNode visitCall(RexCall inputCall) {
         RexNode node = super.visitCall(inputCall);
         if (node instanceof RexCall) {
           RexCall call = (RexCall) node;
           switch (call.getKind()) {
             case IN:
               node = transformIntoOrAndClause(rexBuilder, call);
             default:
               break;
           }
         }
         return RexUtil.isFlat(node) ? node : RexUtil.flatten(rexBuilder, node);
       }
   ```



##########
ql/src/test/results/clientpositive/llap/jdbc_filter_expand_row_operator.q.out:
##########
@@ -0,0 +1,41 @@
+PREHOOK: query: CREATE EXTERNAL TABLE book (id int, title varchar(100), author 
int)
+STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler'
+TBLPROPERTIES (
+    "hive.sql.database.type" = "POSTGRES",
+    "hive.sql.jdbc.driver" = "org.postgresql.Driver",
+    "hive.sql.jdbc.url" = "jdbc:postgresql://localhost:5432/qtestDB",
+    "hive.sql.dbcp.username" = "qtestuser",
+    "hive.sql.dbcp.password" = "qtestpassword",
+    "hive.sql.table" = "book")
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@book
+POSTHOOK: query: CREATE EXTERNAL TABLE book (id int, title varchar(100), 
author int)
+STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler'
+TBLPROPERTIES (
+    "hive.sql.database.type" = "POSTGRES",
+    "hive.sql.jdbc.driver" = "org.postgresql.Driver",
+    "hive.sql.jdbc.url" = "jdbc:postgresql://localhost:5432/qtestDB",
+    "hive.sql.dbcp.username" = "qtestuser",
+    "hive.sql.dbcp.password" = "qtestpassword",
+    "hive.sql.table" = "book")
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@book
+PREHOOK: query: explain cbo
+select * from book 
+where id = 0 or (id = 1 and author = 11) or (id = 2 and author = 22)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@book
+#### A masked pattern was here ####
+POSTHOOK: query: explain cbo
+select * from book 
+where id = 0 or (id = 1 and author = 11) or (id = 2 and author = 22)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@book
+#### A masked pattern was here ####
+CBO PLAN:
+HiveJdbcConverter(convention=[JDBC.POSTGRES])
+  JdbcFilter(condition=[AND(OR(=($0, 0), AND(=($0, 1), =($2, 11)), AND(=($0, 
2), =($2, 22))), IN($0, 0, 1, 2))])

Review Comment:
   True it's probably out of the scope of this PR so let's create a separate 
ticket to track it further.
   
   I am suspecting that `IN(ROW($6, $8), ROW(1999, 12), ROW(2001, 1))` cannot 
be easily pushed in some JDBC databases cause they may not support the ROW 
operator. Nevertheless, I don't see why we should have both
   `OR(=($0, 0), AND(=($0, 1), =($2, 11)), AND(=($0, 2), =($2, 22)))` and  
`IN($0, 0, 1, 2)` especially for the JDBC storage handler where the underlying 
DB is gonna apply its own optimizations.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: gitbox-unsubscr...@hive.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: gitbox-unsubscr...@hive.apache.org
For additional commands, e-mail: gitbox-h...@hive.apache.org

Reply via email to