weidong3630 commented on a change in pull request #1338: [CALCITE-3210] Fix the 
bug that RelToSqlConverter converts "cast(null as $type)" just as null
URL: https://github.com/apache/calcite/pull/1338#discussion_r308151946
 
 

 ##########
 File path: 
core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
 ##########
 @@ -195,15 +198,54 @@ public Result visit(Project e) {
     final Builder builder =
         x.builder(e, Clause.SELECT);
     final List<SqlNode> selectList = new ArrayList<>();
+
+    boolean checkNull = isCastNullNeeded(stack);
     for (RexNode ref : e.getChildExps()) {
       SqlNode sqlExpr = builder.context.toSql(null, ref);
+      if (checkNull && SqlUtil.isNullLiteral(sqlExpr, false)) {
+        sqlExpr = castNullType(sqlExpr, 
e.getRowType().getFieldList().get(selectList.size()));
+      }
       addSelect(selectList, sqlExpr, e.getRowType());
     }
 
     builder.setSelect(new SqlNodeList(selectList, POS));
     return builder.result();
   }
 
+  /**
+   * Check whether null item in select need to be casted
+   * @param stack stack of visit
+   * @return If null need to be casted then return true, otherwise return 
false.
+   */
+  private static boolean isCastNullNeeded(Deque<Frame> stack) {
+    final int stackSize = stack.size();
+    for (int i = 1; i < stackSize; i++) {
+      RelNode currentNode = Iterables.get(stack, i).r;
+      if (!(currentNode instanceof SingleRel)) {
 
 Review comment:
   I don't think it's ok to do this. The "!(currentNode instanceof SingleRel)" 
condition means that if currentNode which is not  instance of  SingleRel like 
Join was found before breaking or returning, null casting is needed, while the 
"currentNode instanceof Project" means that if project including the "null" 
literal is under another project, null casting is need. So from meaning, the 
two conditions cannot be merged regardless of java grammer.

----------------------------------------------------------------
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.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to