/** Analyzes a GROUPING SETS item in a GROUP BY clause. */ private static void convertGroupSet( SqlValidatorScope scope, List<SqlNode> groupExprs, Map<Integer, Integer> groupExprProjection, ImmutableList.Builder<ImmutableBitSet> builder, SqlNode groupExpr) { switch (groupExpr.getKind()) { case GROUPING_SETS: final SqlCall call = (SqlCall) groupExpr; for (SqlNode node : call.getOperandList()) { convertGroupSet(scope, groupExprs, groupExprProjection, builder, node); } return; case ROW: final List<ImmutableBitSet> bitSets = analyzeGroupTuple( scope, groupExprs, groupExprProjection, ((SqlCall) groupExpr).getOperandList()); builder.add(ImmutableBitSet.union(bitSets)); return; default: builder.add(analyzeGroupExpr(scope, groupExprs, groupExprProjection, groupExpr)); return; } }
// Override to copy all arguments regardless of whether visitor changes // them. protected SqlNode visitScoped(SqlCall call) { ArgHandler<SqlNode> argHandler = new CallCopyingArgHandler(call, true); call.getOperator().acceptCall(this, call, false, argHandler); return argHandler.result(); }