Пример #1
0
        private BoundRelation BindNamedTableReference(NamedTableReferenceSyntax node)
        {
            var symbols = LookupTable(node.TableName).ToImmutableArray();

            if (symbols.Length == 0)
            {
                Diagnostics.ReportUndeclaredTable(node);

                var errorTable = new ErrorTableSymbol(node.TableName.ValueText);
                var errorAlias = node.Alias == null
                                   ? errorTable.Name
                                   : node.Alias.Identifier.ValueText;
                var errorInstance = new TableInstanceSymbol(errorAlias, errorTable, ValueSlotFactory);
                return(new BoundTableRelation(errorInstance));
            }

            if (symbols.Length > 1)
            {
                Diagnostics.ReportAmbiguousTable(node.TableName, symbols);
            }

            var table           = symbols[0];
            var aliasIdentifier = node.Alias != null
                ? node.Alias.Identifier
                : node.TableName;

            var alias = aliasIdentifier.ValueText;

            var tableInstance = new TableInstanceSymbol(alias, table, ValueSlotFactory);

            QueryState.IntroducedTables.Add(tableInstance, aliasIdentifier);

            return(new BoundTableRelation(tableInstance));
        }
Пример #2
0
        private static string CreateCondition(TableInstanceSymbol left, IReadOnlyList <ColumnSymbol> leftColumns, TableInstanceSymbol right, IReadOnlyList <ColumnSymbol> rightColumns)
        {
            var sb = new StringBuilder();

            for (var i = 0; i < leftColumns.Count; i++)
            {
                if (sb.Length > 0)
                {
                    sb.Append(@" AND ");
                }

                var leftColumn  = leftColumns[i];
                var rightColumn = rightColumns[i];

                sb.Append(SyntaxFacts.GetValidIdentifier(right.Name));
                sb.Append(@".");
                sb.Append(SyntaxFacts.GetValidIdentifier(rightColumn.Name));
                sb.Append(@" = ");
                sb.Append(SyntaxFacts.GetValidIdentifier(left.Name));
                sb.Append(@".");
                sb.Append(SyntaxFacts.GetValidIdentifier(leftColumn.Name));
            }

            return(sb.ToString());
        }
Пример #3
0
        private BoundRelation BindDerivedTableReference(DerivedTableReferenceSyntax node)
        {
            // TODO: Ensure query has no ORDER BY unless TOP is also specified

            var query = BindQuery(node.Query);

            var namedQueryColumns   = query.OutputColumns.Where(c => !string.IsNullOrEmpty(c.Name));
            var columns             = new List <ColumnSymbol>();
            var valueSlotFromColumn = new Dictionary <ColumnSymbol, ValueSlot>();

            foreach (var queryColumn in namedQueryColumns)
            {
                var columnSymbol = new ColumnSymbol(queryColumn.Name, queryColumn.Type);
                columns.Add(columnSymbol);
                valueSlotFromColumn.Add(columnSymbol, queryColumn.ValueSlot);
            }

            var derivedTable         = new DerivedTableSymbol(columns);
            var valueSlotFactory     = new Func <TableInstanceSymbol, ColumnSymbol, ValueSlot>((ti, c) => valueSlotFromColumn[c]);
            var derivedTableInstance = new TableInstanceSymbol(node.Name.ValueText, derivedTable, valueSlotFactory);
            var boundTableReference  = new BoundDerivedTableRelation(derivedTableInstance, query.Relation);

            QueryState.IntroducedTables.Add(derivedTableInstance, node.Name);

            return(boundTableReference);
        }
        public BoundDerivedTableRelation Update(TableInstanceSymbol tableInstance, BoundRelation relation)
        {
            if (tableInstance == TableInstance && Relation == relation)
            {
                return(this);
            }

            return(new BoundDerivedTableRelation(tableInstance, relation));
        }
Пример #5
0
        public BoundTableRelation Update(TableInstanceSymbol tableInstance, ImmutableArray <TableColumnInstanceSymbol> definedValues)
        {
            if (tableInstance == TableInstance && definedValues == DefinedValues)
            {
                return(this);
            }

            return(new BoundTableRelation(tableInstance, definedValues));
        }
Пример #6
0
 protected override void VisitTableRelation(BoundTableRelation node)
 {
     if (node.TableInstance.Table == _symbol)
     {
         Debug.Assert(_instance == null);
         _instance = node.TableInstance;
     }
     base.VisitTableRelation(node);
 }
Пример #7
0
        private static CompletionItem GetCompletionItem(TableRelation tableRelation, TableInstanceSymbol leftInstance, TableInstanceSymbol rightInstance)
        {
            var leftColumns = leftInstance.Table == tableRelation.ParentTable
                                  ? tableRelation.ParentColumns
                                  : tableRelation.ChildColumns;

            var rightColumns = leftInstance.Table == tableRelation.ParentTable
                                   ? tableRelation.ChildColumns
                                   : tableRelation.ParentColumns;

            var condition     = CreateCondition(leftInstance, leftColumns, rightInstance, rightColumns);
            var displayText   = condition;
            var insertionText = condition;
            var description   = condition;

            return(new CompletionItem(displayText, insertionText, description, Glyph.Relation));
        }
Пример #8
0
            protected override BoundRelation RewriteTableRelation(BoundTableRelation node)
            {
                if (!node.DefinedValues.Any())
                {
                    return(node);
                }

                var factory          = node.DefinedValues.First().ValueSlot.Factory;
                var original         = node.TableInstance;
                var valueSlotMapping = original.ColumnInstances.ToDictionary(c => c.Column, c => _valueSlotMapping[c.ValueSlot]);
                var instanceName     = factory.CreateNamed(original.Name, typeof(int)).Name;
                var instance         = new TableInstanceSymbol(instanceName, original.Table, (t, c) => valueSlotMapping[c]);
                var columnMapping    = instance.ColumnInstances.ToDictionary(c => c.Column);
                var definedValues    = node.DefinedValues.Select(d => columnMapping[d.Column]).ToImmutableArray();

                return(node.Update(instance, definedValues));
            }
 public BoundWildcardSelectColumn(TableInstanceSymbol table, IEnumerable <TableColumnInstanceSymbol> columns)
 {
     Table         = table;
     _tableColumns = columns.ToImmutableArray();
     QueryColumns  = _tableColumns.Select(c => new QueryColumnInstanceSymbol(c.Name, c.ValueSlot)).ToImmutableArray();
 }
 public BoundDerivedTableRelation(TableInstanceSymbol tableInstance, BoundRelation relation)
 {
     TableInstance = tableInstance;
     Relation      = relation;
 }
Пример #11
0
 public BoundTableRelation(TableInstanceSymbol tableInstance, ImmutableArray <TableColumnInstanceSymbol> definedValues)
 {
     TableInstance = tableInstance;
     DefinedValues = definedValues;
 }
Пример #12
0
 public BoundTableRelation(TableInstanceSymbol tableInstance)
     : this(tableInstance, tableInstance.ColumnInstances)
 {
 }
Пример #13
0
        public static void ReportUndeclaredColumn(this ICollection <Diagnostic> diagnostics, PropertyAccessExpressionSyntax node, TableInstanceSymbol tableInstance)
        {
            var tableName  = tableInstance.Name;
            var columnName = node.Name.ValueText;

            diagnostics.Report(node.Span, DiagnosticId.UndeclaredColumn, tableName, columnName);
        }
Пример #14
0
        private BoundExpression BindColumnInstance(PropertyAccessExpressionSyntax node, TableInstanceSymbol tableInstance)
        {
            var columnName      = node.Name;
            var columnInstances = tableInstance.ColumnInstances.Where(c => columnName.Matches(c.Name)).ToImmutableArray();

            if (columnInstances.Length == 0)
            {
                Diagnostics.ReportUndeclaredColumn(node, tableInstance);
                return(new BoundErrorExpression());
            }

            if (columnInstances.Length > 1)
            {
                Diagnostics.ReportAmbiguousColumnInstance(columnName, columnInstances);
            }

            var columnInstance = columnInstances.First();

            return(new BoundColumnExpression(columnInstance));
        }
Пример #15
0
 public BoundTableExpression(TableInstanceSymbol symbol)
 {
     Symbol = symbol;
 }
 private static IEnumerable <CompletionItem> GetTableCompletions(TableInstanceSymbol tableInstanceSymbol)
 {
     return(CreateSymbolCompletions(tableInstanceSymbol.ColumnInstances));
 }