[ https://issues.apache.org/jira/browse/CALCITE-4721?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17396335#comment-17396335 ]
Enze Liu edited comment on CALCITE-4721 at 8/10/21, 12:46 AM: -------------------------------------------------------------- Actually, we don't have to set hints. when do sqlNode level manipulation, like remove certain function call , this kind of code will panic. {code:java} 1 @Override 2 public SqlNode visit(SqlCall call) { 3 if (call.getKind().equals(SqlKind.OTHER_FUNCTION) && ((SqlCall) call).getOperator().getName().equals("date")) { 4 return ((SqlBasicCall) rand).getOperands()[0]; 5 } 6 7 List<SqlNode> operands = call.getOperandList(); 8 if (operands == null) { 9 return call; 10 } 11 12 List<SqlNode> newOperands = operands.stream().map(rand -> { 13 if (rand == null) { 14 return rand; 15 } 16 return rand.accept(this); 17 }.collect(Collectors.toList()); 18 19 AtomicInteger i = new AtomicInteger(); 20 newOperands.forEach(rand -> { 21 int index = i.getAndIncrement(); 22 call.setOperand(index, rand); 23 }); 24 return call; 25 } ~ {code} surely we can change to this. but I think maybe, this kind of behavior is wrong ? {code:java} @Override public SqlNode visit(SqlCall call) { List<SqlNode> operands = call.getOperandList(); if (operands == null) { return call; } AtomicInteger i = new AtomicInteger(); operands.forEach(rand -> { int index = i.getAndIncrement(); if (rand == null) { return; } if (rand.getKind().equals(SqlKind.OTHER_FUNCTION) && ((SqlCall) rand).getOperator().getName().equals("date")) { call.setOperand(index, ((SqlBasicCall) rand).getOperands()[0]); return; } rand.accept(this); }); return call; } {code} was (Author: enze): Actually, we don't have to set hints. when do sqlNode level manipulation, like remove certain function call , this kind of code will panic. {code:java} 1 @Override 2 public SqlNode visit(SqlCall call) { 3 if (call.getKind().equals(SqlKind.OTHER_FUNCTION) && ((SqlCall) call).getOperator().getName().equals("date")) { 4 return ((SqlBasicCall) rand).getOperands()[0]; 5 } 6 7 List<SqlNode> operands = call.getOperandList(); 8 if (operands == null) { 9 return call; 10 } 11 12 List<SqlNode> newOperands = operands.stream().map(rand -> { 13 if (rand == null) { 14 return rand; 15 } 16 return rand.accept(this); 17 }.collect(Collectors.toList()); 18 19 AtomicInteger i = new AtomicInteger(); 20 newOperands.forEach(rand -> { 21 int index = i.getAndIncrement(); 22 call.setOperand(index, rand); 23 }); 24 return call; 25 } ~ {code} surely we can change to this. but I think maybe, this kind of behavior is wrong ? {code:java} @Override public SqlNode visit(SqlCall call) { List<SqlNode> operands = call.getOperandList(); if (operands == null) { return call; } AtomicInteger i = new AtomicInteger(); operands.forEach(rand -> { int index = i.getAndIncrement(); if (rand == null) { return; } if (rand.getKind().equals(SqlKind.OTHER_FUNCTION) && ((SqlCall) rand).getOperator().getName().equals("date")) { call.setOperand(index, ((SqlBasicCall) rand).getOperands()[0]); return; } rand.accept(this); }); return call; } {code} > SqlSelect's setOperand method cannot set `hints`, failed with AssertionError > ---------------------------------------------------------------------------- > > Key: CALCITE-4721 > URL: https://issues.apache.org/jira/browse/CALCITE-4721 > Project: Calcite > Issue Type: Bug > Components: core > Affects Versions: 1.27.0 > Reporter: Enze Liu > Priority: Minor > Labels: pull-requests-available > Time Spent: 10m > Remaining Estimate: 0h > > in SqlSelect, > getOperandList() returns with > {code:java} > return ImmutableNullableList.of(keywordList, selectList, from, where, > groupBy, having, windowDecls, orderBy, offset, fetch, hints); > {code} > while we trying to setOperand() by the returned list, we have AssertionError. > seems the setOperand only set the first ten operands. > {code:java} > @Override public void setOperand(int i, @Nullable SqlNode operand) { > switch (i) { > case 0: > keywordList = requireNonNull((SqlNodeList) operand); > break; > case 1: > selectList = requireNonNull((SqlNodeList) operand); > break; > case 2: > from = operand; > break; > case 3: > where = operand; > break; > case 4: > groupBy = (SqlNodeList) operand; > break; > case 5: > having = operand; > break; > case 6: > windowDecls = requireNonNull((SqlNodeList) operand); > break; > case 7: > orderBy = (SqlNodeList) operand; > break; > case 8: > offset = operand; > break; > case 9: > fetch = operand; > break; > default: > throw new AssertionError(i); > } > } > {code} > > a minor modification could be: > {code:java} > @Override public void setOperand(int i, @Nullable SqlNode operand) { > switch (i) { > case 0: > keywordList = requireNonNull((SqlNodeList) operand); > break; > case 1: > selectList = requireNonNull((SqlNodeList) operand); > break; > case 2: > from = operand; > break; > case 3: > where = operand; > break; > case 4: > groupBy = (SqlNodeList) operand; > break; > case 5: > having = operand; > break; > case 6: > windowDecls = requireNonNull((SqlNodeList) operand); > break; > case 7: > orderBy = (SqlNodeList) operand; > break; > case 8: > offset = operand; > break; > case 9: > fetch = operand; > break; > case 10: > hints = operand; > break; > default: > throw new AssertionError(i); > } > } > {code} > -- This message was sent by Atlassian Jira (v8.3.4#803005)