class InnerValidator extends SymbolVisitor<Boolean, Void> {

        @Override
        public Void visitFunction(Function function, Boolean insideScalar) {<FILL_FUNCTION_BODY>}

        @Override
        public Void visitWindowFunction(WindowFunction symbol, Boolean insideScalar) {
            throw new IllegalArgumentException("Window functions are not allowed in GROUP BY");
        }

        @Override
        public Void visitMatchPredicate(MatchPredicate matchPredicate, Boolean insideScalar) {
            throw new UnsupportedOperationException(String.format(Locale.ENGLISH,
                "%s predicate cannot be used in a GROUP BY clause", io.crate.expression.predicate.MatchPredicate.NAME));
        }

        @Override
        protected Void visitSymbol(Symbol symbol, Boolean insideScalar) {
            return null;
        }

        @Override
        public Void visitAlias(AliasSymbol aliasSymbol, Boolean insideScalar) {
            return aliasSymbol.symbol().accept(this, insideScalar);
        }
    }

            switch (function.signature().getKind()) {
                case SCALAR:
                    for (Symbol argument : function.arguments()) {
                        argument.accept(this, true);
                    }
                    break;
                case AGGREGATE:
                    throw new IllegalArgumentException("Aggregate functions are not allowed in GROUP BY");
                case TABLE:
                    if (insideScalar == false) {
                        throw new IllegalArgumentException("Table functions are not allowed in GROUP BY");
                    }
                    break;
                default:
                    throw new UnsupportedOperationException(
                        String.format(Locale.ENGLISH, "FunctionInfo.Type %s not handled", function.signature().getKind()));
            }
            return null;
        
<no_super_class>