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