private SelectColumn PrepareColumn(SelectColumn column, IRequest context, IList<SelectColumn> functionColumns,
ref int aggregateCount)
{
if (column.Expression is SqlQueryExpression)
throw new InvalidOperationException("Sub-query expressions are invalid in select columns.");
SelectColumn newColumn;
var exp = column.Expression;
if (exp != null)
exp = exp.Prepare(fromSet.ExpressionPreparer);
if (exp is SqlReferenceExpression) {
var sqlRef = (SqlReferenceExpression) exp;
var colName = sqlRef.ReferenceName;
ObjectName resolvedName = null;
var alias = column.Alias;
if (String.IsNullOrEmpty(alias)) {
resolvedName = colName;
} else {
resolvedName = new ObjectName(alias);
}
newColumn = new SelectColumn(exp, alias) {
InternalName = colName,
ResolvedName = resolvedName
};
} else {
var funcAlias = functionColumns.Count.ToString(CultureInfo.InvariantCulture);
if (column.Expression.HasAggregate(context)) {
aggregateCount++;
funcAlias += "_A";
}
var alias = column.Alias;
if (string.IsNullOrEmpty(alias))
alias = exp.ToString();
newColumn = new SelectColumn(exp, alias) {
InternalName = new ObjectName(FunctionTableName, funcAlias),
ResolvedName = new ObjectName(alias)
};
functionColumns.Add(newColumn);
}
return newColumn;
}