@@ -75,4 +75,79 @@ CREATE VIEW dbo.VTest AS
7575 var inliner = new DatabaseViewInliner ( connection , viewSql , InlinerOptions . Recommended ( ) ) ;
7676 inliner . Errors . ShouldBeEmpty ( ) ;
7777 }
78+
79+ [ Test ]
80+ public void StripUnusedJoin_TableWithExplicitAlias ( )
81+ {
82+ var connection = new DatabaseConnection ( ) ;
83+ connection . AddViewDefinition ( DatabaseConnection . ToObjectName ( "dbo" , "VItems" ) ,
84+ "CREATE VIEW dbo.VItems AS SELECT a.Id, a.Name FROM dbo.A a INNER JOIN dbo.B b ON a.BId = b.Id" ) ;
85+
86+ const string viewSql = "CREATE VIEW dbo.VTest AS SELECT v.Id, v.Name FROM dbo.VItems v" ;
87+
88+ var inliner = new DatabaseViewInliner ( connection , viewSql , InlinerOptions . Recommended ( ) ) ;
89+ inliner . Errors . ShouldBeEmpty ( ) ;
90+ inliner . Result . ShouldNotBeNull ( ) ;
91+ // B is unused (only referenced in its own join condition) and should be stripped
92+ inliner . Result ! . ConvertedSql . ShouldNotContain ( "dbo.B" ) ;
93+ inliner . Result . ConvertedSql . ShouldContain ( "dbo.A" ) ;
94+ }
95+
96+ [ Test ]
97+ public void StripUnusedJoin_TableWithImplicitAlias ( )
98+ {
99+ var connection = new DatabaseConnection ( ) ;
100+ // View uses dbo.B without explicit alias — implicit alias "B" should still allow stripping
101+ connection . AddViewDefinition ( DatabaseConnection . ToObjectName ( "dbo" , "VItems" ) ,
102+ "CREATE VIEW dbo.VItems AS SELECT A.Id, A.Name FROM dbo.A INNER JOIN dbo.B ON A.BId = B.Id" ) ;
103+
104+ const string viewSql = "CREATE VIEW dbo.VTest AS SELECT v.Id, v.Name FROM dbo.VItems v" ;
105+
106+ var inliner = new DatabaseViewInliner ( connection , viewSql , InlinerOptions . Recommended ( ) ) ;
107+ inliner . Errors . ShouldBeEmpty ( ) ;
108+ inliner . Result . ShouldNotBeNull ( ) ;
109+ inliner . Result ! . ConvertedSql . ShouldNotContain ( "dbo.B" ) ;
110+ inliner . Result . ConvertedSql . ShouldContain ( "dbo.A" ) ;
111+ }
112+
113+ [ Test ]
114+ public void StripUnusedJoin_SameTableInMainAndSubquery_ExplicitAlias ( )
115+ {
116+ var connection = new DatabaseConnection ( ) ;
117+ // Inner view: main query joins B (unused in SELECT), subquery also references B
118+ connection . AddViewDefinition ( DatabaseConnection . ToObjectName ( "dbo" , "VItems" ) ,
119+ @"CREATE VIEW dbo.VItems AS
120+ SELECT a.Id, a.Name,
121+ (SELECT TOP 1 b2.Code FROM dbo.B b2 WHERE b2.Id = a.BId) AS BCode
122+ FROM dbo.A a INNER JOIN dbo.B b ON a.BId = b.Id" ) ;
123+
124+ const string viewSql = "CREATE VIEW dbo.VTest AS SELECT v.Id, v.BCode FROM dbo.VItems v" ;
125+
126+ var inliner = new DatabaseViewInliner ( connection , viewSql , InlinerOptions . Recommended ( ) ) ;
127+ inliner . Errors . ShouldBeEmpty ( ) ;
128+ inliner . Result . ShouldNotBeNull ( ) ;
129+ // The main-query B join is unused in SELECT, but the subquery's B keeps a reference
130+ // alive via the flat column list. Conservative behavior: B may or may not be stripped,
131+ // but the inliner must not error out.
132+ inliner . Result ! . ConvertedSql . ShouldContain ( "dbo.A" ) ;
133+ }
134+
135+ [ Test ]
136+ public void StripUnusedJoin_SameTableInMainAndSubquery_ImplicitAlias ( )
137+ {
138+ var connection = new DatabaseConnection ( ) ;
139+ // Same scenario but without explicit aliases on B
140+ connection . AddViewDefinition ( DatabaseConnection . ToObjectName ( "dbo" , "VItems" ) ,
141+ @"CREATE VIEW dbo.VItems AS
142+ SELECT A.Id, A.Name,
143+ (SELECT TOP 1 B.Code FROM dbo.B WHERE B.Id = A.BId) AS BCode
144+ FROM dbo.A INNER JOIN dbo.B ON A.BId = B.Id" ) ;
145+
146+ const string viewSql = "CREATE VIEW dbo.VTest AS SELECT v.Id, v.BCode FROM dbo.VItems v" ;
147+
148+ var inliner = new DatabaseViewInliner ( connection , viewSql , InlinerOptions . Recommended ( ) ) ;
149+ inliner . Errors . ShouldBeEmpty ( ) ;
150+ inliner . Result . ShouldNotBeNull ( ) ;
151+ inliner . Result ! . ConvertedSql . ShouldContain ( "dbo.A" ) ;
152+ }
78153}
0 commit comments