public MemoryDbDataReader.ResultBatch Execute(Dictionary <string, Table> tables, RawData rawData, SqlQuerySpecification sqlQuery, SqlOrderByClause orderByClause = null) { if (sqlQuery.FromClause != null) { rawData.AddTablesFromClause(sqlQuery.FromClause, tables); if (sqlQuery.WhereClause != null) { rawData.ExecuteWhereClause(sqlQuery.WhereClause); } } else { // We do not select data from any table, so we insert an empty row to trigger a result in AddData(). rawData.RawRowList.Add(new RawTableJoinRow()); } var batch = InitializeBatch(rawData, sqlQuery); if (sqlQuery.GroupByClause != null) { rawData.AddGroupByClause(sqlQuery.GroupByClause); } rawData.HavingClause = sqlQuery.HavingClause?.Expression; rawData.SortOrder = GetSortOrder(orderByClause, sqlQuery); new QueryResultBuilder(rawData, sqlQuery.SelectClause.IsDistinct).AddData(batch); if (sqlQuery.IntoClause != null) { InsertIntoTable(sqlQuery.IntoClause, tables, batch); } return(batch); }
private static bool IsMissingTopOffsetOrForXml(SqlQuerySpecification sqlQuery) { var select = sqlQuery.Children.FirstOrDefault(c => c is SqlSelectClause) as SqlSelectClause; if (select == null) { return(true); } return(select.Children.Any(c => c is SqlTopSpecification) == false && select.Children.Any(c => c is SqlForXmlClause) == false && select.Children.Any(c => c is SqlOffsetFetchClause) == false); }
private static SqlOrderByItemCollection GetSortOrder(SqlOrderByClause orderByClause, SqlQuerySpecification sqlQuery) { if (sqlQuery.OrderByClause != null && orderByClause == null) { orderByClause = sqlQuery.OrderByClause; if (IsPartialQuery(sqlQuery.Parent) && IsMissingTopOffsetOrForXml(sqlQuery)) { throw new SqlOrderByException( ); } } return(orderByClause?.Items); }
public override void Visit(SqlQuerySpecification codeObject) { var children = codeObject.Children.ToList(); for (var i = 0; i < children.Count; i++) { if (i > 0) { _stringBuilder.AppendIndentedLine(); } children[i].Accept(this); } }
private MemoryDbDataReader.ResultBatch InitializeBatch(RawData rawData, SqlQuerySpecification sqlQuery) { var batch = new MemoryDbDataReader.ResultBatch( ); var fields = sqlQuery.SelectClause.Children.ToList( ); if (_InsertColumns != null) { var fieldCount = fields.Count; if (_InsertColumns.Count > fieldCount) { throw new SqlInsertTooManyColumnsException( ); } if (_InsertColumns.Count < fieldCount) { throw new SqlInsertTooManyValuesException( ); } } InitializeFields(batch, fields, rawData); return(batch); }
public override void Visit(SqlQuerySpecification codeObject) { Format(codeObject); }