public void SelectContextTest() { var sql = @"select 1 + 3 count , tr.minor_rev from innovator.[transaction_request] tr inner join innovator.[Part_bom] pb on pb.source_id = tr.part inner join ( select id, stuff, another from innovar.part ) d on d.id = pb.relate_id group by id, config_id, major_rev"; var parsed = new SqlTokenizer(sql).Parse(); var context = new SqlContext(parsed); Assert.AreEqual(3, context.Tables.Count()); }
public void SelectColumnNamesSubSelectTest() { var sql = @"select * from ( select count, non_null_id, b.* from a inner join ( select first, second, third from another ) b on a.thing = b.stuff ) d group by id, config_id, major_rev"; var parsed = new SqlTokenizer(sql).Parse(); var correct = new string[] { "count", "non_null_id", "first", "second", "third" }; var ctx = new SqlContext(parsed); var names = ctx.Tables.Single().Columns.ToArray(); CollectionAssert.AreEqual(correct, names); }
public void SelectColumnNamesSubSelectNoNameTest() { var sql = @"select *, 1 + 2 count from ( select * from ( select *, 3 + 4 thing from another ) b ) d group by id, config_id, major_rev"; var parsed = new SqlTokenizer(sql).Parse(); var ctx = new SqlContext(parsed); var names = ctx.Tables.Single().Columns.ToArray(); //CollectionAssert.AreEqual(correct, names); }
private void ProcessGroup(SqlTableInfo info, SqlGroup group) { if (group == null) return; var cols = group.GetColumnNames().ToList(); var toRemove = cols.Where(c => c.EndsWith("*")).ToArray(); if (toRemove.Any(c => c == "*")) { var ctx = new SqlContext(group); cols.AddRange(ctx.Tables.Where(t => t.Columns != null).SelectMany(t => t.Columns)); info.AdditionalColumns = ctx.Tables.Where(t => t.Columns == null && t.Name != null) .Concat(ctx.Tables.Where(t => t.AdditionalColumns != null).SelectMany(t => t.AdditionalColumns)).ToArray(); } else if (cols.Any(c => c.EndsWith("*"))) { var ctx = new SqlContext(group); var additional = new List<SqlTableInfo>(); SqlTableInfo colInfo; foreach (var col in toRemove.Select(c => c.TrimEnd('.', '*'))) { if (ctx.TryByName(col, out colInfo)) { if (colInfo.Columns == null) { additional.Add(colInfo); } else { cols.AddRange(colInfo.Columns); } } } info.AdditionalColumns = additional; } foreach (var item in toRemove) { cols.Remove(item); } if (cols.Any()) info.Columns = cols; return; }