protected Expression CreateChildExpression(ParameterExpression param, int index)
        {
            LiteralNode constant = FindChild <LiteralNode>(index);

            if (constant != null)
            {
                return(constant.CreateExpression());
            }

            Expression expression = CreateDereferenceExpression(param, index);

            if (expression != null)
            {
                return(expression);
            }

            PredicateNode predicate = FindChild <PredicateNode>(index);

            if (predicate != null)
            {
                return(predicate.CreateExpression(param));
            }

            FunctionNode function = FindChild <FunctionNode>(index);

            if (function != null)
            {
                return(function.CreateExpression(param));
            }

            // by not passing an index we pick up 'WHERE TRUE' etc
            LiteralNode literal = FindChild <LiteralNode>();

            if (literal != null)
            {
                return(literal.CreateExpression());
            }

            return(null);
        }