private IASTNode CreateProjection(SqlServerCommandParser.ProjectionContext context, AliasSegment alias) { IASTNode projection = Visit(context.expr()); if (projection is AggregationProjectionSegment aggregationProjectionSegment) { aggregationProjectionSegment.SetAlias(alias); return(projection); } if (projection is ExpressionProjectionSegment expressionProjectionSegment) { expressionProjectionSegment.SetAlias(alias); return(projection); } if (projection is CommonExpressionSegment commonExpressionSegment) { ExpressionProjectionSegment commonResult = new ExpressionProjectionSegment(commonExpressionSegment.GetStartIndex(), commonExpressionSegment.GetStopIndex(), commonExpressionSegment.GetText()); commonResult.SetAlias(alias); return(commonResult); } // FIXME :For DISTINCT() if (projection is ColumnSegment columnSegment) { ExpressionProjectionSegment columnResult = new ExpressionProjectionSegment(context.Start.StartIndex, context.Stop.StopIndex, context.GetText()); columnResult.SetAlias(alias); return(columnResult); } if (projection is SubQueryExpressionSegment subQueryExpressionSegment) { SubQueryProjectionSegment subQueryResult = new SubQueryProjectionSegment(subQueryExpressionSegment.SubQuery); subQueryResult.SetAlias(alias); return(subQueryResult); } LiteralExpressionSegment column = (LiteralExpressionSegment)projection; ExpressionProjectionSegment result = null == alias ? new ExpressionProjectionSegment(column.GetStartIndex(), column.GetStopIndex(), column.GetLiterals()?.ToString()) : new ExpressionProjectionSegment(column.GetStartIndex(), context.alias().Stop.StopIndex, column.GetLiterals()?.ToString()); result.SetAlias(alias); return(result); }
public override IASTNode VisitProjection(SqlServerCommandParser.ProjectionContext context) { // FIXME :The stop index of project is the stop index of projection, instead of alias. if (null != context.qualifiedShorthand()) { var shorthand = context.qualifiedShorthand(); var result = new ShorthandProjectionSegment(shorthand.Start.StartIndex, shorthand.Stop.StopIndex); IdentifierValue identifier = new IdentifierValue(shorthand.identifier().GetText()); result.SetOwner(new OwnerSegment(shorthand.identifier().Start.StartIndex, shorthand.identifier().Stop.StopIndex, identifier)); return(result); } AliasSegment alias = null == context.alias() ? null : (AliasSegment)Visit(context.alias()); if (null != context.columnName()) { ColumnSegment column = (ColumnSegment)Visit(context.columnName()); ColumnProjectionSegment result = new ColumnProjectionSegment(column); result.SetAlias(alias); return(result); } return(CreateProjection(context, alias)); }