public static void ValidateLateArrivingLookup(AstLateArrivingLookupNode lookup) { if (!lookup.Table.LateArriving) { MessageEngine.Trace(lookup, Severity.Error, "V0128", "Table {0} is not designated for Late Arriving Lookup. Set LateArriving = true.", lookup.Table.Name); } AstTableKeyBaseNode eligibleKey = null; foreach (AstTableKeyBaseNode key in lookup.Table.Keys) { if (key.Columns.Any(keyColumn => !keyColumn.Column.IsComputed)) { eligibleKey = key; break; // Safe to do since we already verified single eligble key in the table processing pass } } if (eligibleKey == null) { MessageEngine.Trace(lookup, Severity.Error, "V0129", "Late Arriving Table {0} must specify an eligible key.", lookup.Table.Name); } // TODO: Finish checking this logic foreach (AstTableKeyColumnNode eligibleKeyColumn in eligibleKey.Columns) { if (!lookup.Inputs.Any(io => io.RemoteColumnName == eligibleKeyColumn.Column.Name)) { MessageEngine.Trace(lookup, Severity.Error, "V0123", "Late Arriving Lookup {0} must specify inputs for every column of constraint: {1}", lookup.Name, eligibleKey.Name); } } }
private static void BindTableReference(AstTableNode tableNode, string refName, AstTableNode refTable, bool nullable, ColumnsTSqlEmitter columnsEmitter) { // TODO: This is wrong in general. We need to ensure that this is always a single column constraint AstTableKeyBaseNode primaryKey = refTable.PreferredKey; if (primaryKey == null) { MessageEngine.Trace(tableNode, Severity.Warning, "V0243", "Table {0} lacks a primary, identity, or unique key", tableNode.Name); return; } // TODO: We currently support only a single primary key column. This should be fixed :) foreach (AstTableKeyColumnNode keyCol in primaryKey.Columns) { string type = TSqlTypeTranslator.Translate( keyCol.Column.ColumnType, keyCol.Column.Length, keyCol.Column.Precision, keyCol.Column.Scale, keyCol.Column.CustomType); columnsEmitter.AddColumn(refName, type, false, 0, 0, nullable, keyCol.Column.Default, false, String.Empty); } }