public void RunAnalysisVisitor(CommandResult commandResult)
        {
            var command = PluginContext.ProfilerData.Commands
                          .FirstOrDefault(x => x.CommandId == commandResult.CommandId &&
                                          x.ApplicationIdentity.Equals(commandResult.ApplicationIdentity));

            if (command == null)
            {
                return;
            }

            RunAnalysisVisitorOnCommand(() =>
            {
                var visitor = new UseFirstLevelCacheVisitor
                {
                    Keys = getPrimaryKeys(commandResult)
                };
                var isUsingKeysInQuery = RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(command.Sql, command.SqlHash, visitor);
                if (!isUsingKeysInQuery)
                {
                    return(false);
                }

                return(isUsingFirstOrDefault(command));
            }, command);
        }
        public void TestQueryWithTop1AndCompositeKeyComparision()
        {
            const string sql = @"SELECT TOP (1)
                                    [Extent1].[MyProductId] AS [MyProductId],
                                    [Extent1].[Name] AS [Name],
                                    [Extent1].[Price] AS [Price],
                                    [Extent1].[CategoryId] AS [CategoryId],
                                    [Extent1].[UserId] AS [UserId]
                                    FROM [dbo].[Products] AS [Extent1]
                                    WHERE [Extent1].[MyProductId] = @p__linq__0 and
                                    [Extent1].[UserId] = 1";

            var visitor = new UseFirstLevelCacheVisitor
            {
                Keys = new HashSet <string>
                {
                    "MyProductId",
                    "UserId"
                }
            };

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
        public void CheckJoinsCount()
        {
            const string sql            = @"
                    SELECT *
                    FROM table1 INNER JOIN table2
                    ON table1.column_name = table2.column_name;

                    SELECT
                        [Extent1].[Id] AS [Id],
                        [Extent1].[Name] AS [Name]
                    FROM
                        [dbo].[Items] AS [Extent1]
                        INNER JOIN [dbo].[CountryItem] AS [Extent2]
                                                   ON [Extent1].[Id] = [Extent2].[Items_Id]
                        INNER JOIN (
                            SELECT
                                [UnionAll1].[C1] AS [C1]
                            FROM (
                                SELECT 1 AS [C1] FROM (SELECT 1 AS X) AS [SingleRowTable1]
                                UNION ALL
                                SELECT 2 AS [C1] FROM (SELECT 1 AS X) AS [SingleRowTable2]
                            ) AS [UnionAll1]
                            UNION ALL
                            SELECT 3 AS [C1] FROM (SELECT 1 AS X) AS [SingleRowTable3]
                        ) AS [UnionAll2] ON [Extent2].[Countries_Id] = [UnionAll2].[C1];

                    Select column_name(s)
                    from table1
                    cross join table2;";
            var          counterVisitor = new CounterVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitor(sql, sql.ComputeHash(), counterVisitor);

            Assert.AreEqual(4, counterVisitor.CommandStatistics.JoinsCount);
        }
        public void CheckSelectsCounts()
        {
            const string sql            = @"select * from tbl1; select * from tbl2;";
            var          counterVisitor = new CounterVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitor(sql, sql.ComputeHash(), counterVisitor);

            Assert.AreEqual(2, counterVisitor.CommandStatistics.SelectsCount);
        }
Example #5
0
        public void CheckSelectSumWithParenthesisIsSuspectedToArithmeticOverflow()
        {
            const string sql     = @"select (sum((f1))) from tbl1;";
            var          visitor = new ArithmeticOverflowVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
        public void CheckUnparametrizedLikesWithFunction()
        {
            const string sql = @"select id from Products where Name like upper('P100%')";

            var visitor = new UnparametrizedWhereClausesVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
        public void CheckFunctionInSelectStatementIsNotSuspected()
        {
            const string sql = @"select sum(f1) from tbl1";

            var visitor = new FunctionCallsInWhereClauseVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsFalse(visitor.IsSuspected);
        }
        public void CheckHasUpperFunction()
        {
            const string sql = @"select sum(f1) from tbl1 where upper(f2)='TEST'";

            var visitor = new FunctionCallsInWhereClauseVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
Example #9
0
        public void TestHasSelectStarExpression()
        {
            const string sql = @"SELECT * from tbl1 where f1 = 12";

            var visitor = new SelectStarExpressionVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
Example #10
0
        public void CheckComparisonWithNullLiteralWithExtraParenthesis()
        {
            var sql = @"select * from tbl1 where
                        (((data)=('test')) and ((name)=(null)))";

            var visitor = new NullComparisonVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
Example #11
0
        public void CheckComparisonWithNullLiteral()
        {
            var sql = @"select * from tbl1 where
                        data='test' and name=null";

            var visitor = new NullComparisonVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
        public void CheckFunctionAsValueIsNotSuspected()
        {
            const string sql = @"SELECT [Id] FROM [dbo].[Products] WHERE
                                 @@ROWCOUNT > 0 AND [Id] = scope_identity()";

            var visitor = new FunctionCallsInWhereClauseVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsFalse(visitor.IsSuspected);
        }
        public void CheckQueryHasTopKeyword()
        {
            const string sql = @"SELECT Top 3 BusinessEntityID, FirstName, LastName
                                FROM Testoffset";

            var visitor = new UnboundedResultSetVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsFalse(visitor.IsSuspected);
        }
        public void CheckQueryWithoutWhereClauses()
        {
            const string sql = @"SELECT BusinessEntityID, FirstName, LastName
                                FROM Testoffset";

            var visitor = new UnboundedResultSetVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
Example #15
0
        public void CheckDeletesCount()
        {
            const string sql            = @"
                DELETE [dbo].[Products] WHERE ([Id] = @0);
                SELECT [Id] FROM [dbo].[Categories];
                DELETE [dbo].[Products] WHERE ([Id] = @0);";
            var          counterVisitor = new CounterVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitor(sql, sql.ComputeHash(), counterVisitor);

            Assert.AreEqual(2, counterVisitor.CommandStatistics.DeletesCount);
        }
Example #16
0
        public void CheckSelectCountIsNotSuspectedToArithmeticOverflow()
        {
            const string sql     = @"SELECT [GroupBy1].[A1] AS [C1]
                                 FROM   (SELECT COUNT(1) AS [A1]
                                        FROM   [dbo].[__MigrationHistory] AS [Extent1]
                                        WHERE  [Extent1].[ContextKey] = @p__linq__0) AS [GroupBy1];";
            var          visitor = new ArithmeticOverflowVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsFalse(visitor.IsSuspected);
        }
Example #17
0
        public void CheckUpdatesCount()
        {
            const string sql            = @"
                    UPDATE [Users]  SET [LastVisitDateTime] = @0 WHERE ([Id] = @1);
                    SELECT [Id] FROM [dbo].[Categories];
                    UPDATE [Users]  SET [LastVisitDateTime] = @0 WHERE ([Id] = @1);";
            var          counterVisitor = new CounterVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitor(sql, sql.ComputeHash(), counterVisitor);

            Assert.AreEqual(2, counterVisitor.CommandStatistics.UpdatesCount);
        }
        public void CheckQueryHasOffsetFetch()
        {
            const string sql = @"SELECT BusinessEntityID, FirstName, LastName
                                FROM Testoffset
                                ORDER BY BusinessEntityID
                                OFFSET 3 ROWS
                                FETCH First 3 ROWS only";

            var visitor = new UnboundedResultSetVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsFalse(visitor.IsSuspected);
        }
Example #19
0
        public void CheckSelectSumCastAsBigIntIsNotSuspectedToArithmeticOverflow()
        {
            const string sql     = @"SELECT
                                  [GroupBy1].[A1] AS [C1]
                                     FROM ( SELECT
                                                SUM( CAST( [Extent1].[Amount] AS bigint)) AS [A1]
                                                FROM [dbo].[Transactions] AS [Extent1]
                                           )  AS [GroupBy1]";
            var          visitor = new ArithmeticOverflowVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsFalse(visitor.IsSuspected);
        }
Example #20
0
        public void CheckLikesCount()
        {
            const string sql            = @"
                    SELECT * FROM Person.Contact
                    WHERE LastName LIKE '%mith';
                    SELECT [Id] FROM [dbo].[Categories];
                    SELECT * FROM Person.Contact
                    WHERE LastName LIKE '%' + @blah + '%';";
            var          counterVisitor = new CounterVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitor(sql, sql.ComputeHash(), counterVisitor);

            Assert.AreEqual(2, counterVisitor.CommandStatistics.LikesCount);
        }
        public void CheckComparisonWithIntLiteralWithParenthesis()
        {
            const string sql = @"SELECT TOP (20)
                                        [Extent1].[Id] AS [Id], [Extent1].[FirstName] AS [FirstName]
                                FROM
                                (SELECT [Extent1].[Id] AS [Id], [Extent1].[FirstName] AS [FirstName],
                                    row_number() OVER (ORDER BY [Extent1].[FirstName] ASC) AS [row_number]
                                    FROM [dbo].[Customers] AS [Extent1])  AS [Extent1]
                                WHERE (([Extent1].[row_number]) > (10)) ORDER BY [Extent1].[FirstName] ASC";

            var visitor = new UnparametrizedWhereClausesVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
Example #22
0
        public void CheckInsertsCount()
        {
            const string sql            = @"
              INSERT [dbo].[Categories]([Name], [Title])
              VALUES (@0, @1);
              SELECT [Id] FROM [dbo].[Categories]
              WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity();
              INSERT [dbo].[Categories]([Name], [Title])
              VALUES (@0, @1);
              SELECT [Id] FROM [dbo].[Categories]
              WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity();";
            var          counterVisitor = new CounterVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitor(sql, sql.ComputeHash(), counterVisitor);

            Assert.AreEqual(2, counterVisitor.CommandStatistics.InsertsCount);
        }
Example #23
0
        public void CheckComparisonNullWithNullVariable()
        {
            var sql = @"SELECT [Extent1].[Id] AS [Id],
                               [Extent1].[Name] AS [Name],
                               [Extent1].[Title] AS [Title]
                        FROM   [dbo].[Categories] AS [Extent1]
                        WHERE  ([Extent1].[Title] = @p__linq__0) -- this shouldn't be here
                               OR (([Extent1].[Title] IS NULL)
                                   AND (@p__linq__0 IS NULL));";

            var visitor = new NullComparisonVisitor();

            visitor.NullVariableNames.Add("@p__linq__0");
            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
        public void CheckHasUpperFunctionWithParenthesis()
        {
            const string sql = @"SELECT TOP (1)
                                    [Extent1].[Id] AS [Id],
                                    [Extent1].[Name] AS [Name],
                                    [Extent1].[Price] AS [Price],
                                    [Extent1].[CategoryId] AS [CategoryId]
                                    FROM [dbo].[Products] AS [Extent1]
                                    WHERE ((UPPER([Extent1].[Name])) = (UPPER('Test'))) OR
                                          ((UPPER([Extent1].[Name]) IS NULL) AND
                                          (UPPER('Test') IS NULL))";

            var visitor = new FunctionCallsInWhereClauseVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
        public void CheckQueryHasParametrizedSkipAndTake()
        {
            const string sql = @"SELECT
                                    [Extent1].[MyProductId] AS [MyProductId],
                                    [Extent1].[Name] AS [Name],
                                    [Extent1].[Price] AS [Price],
                                    [Extent1].[CategoryId] AS [CategoryId],
                                    [Extent1].[UserId] AS [UserId]
                                    FROM [dbo].[MyProducts] AS [Extent1]
                                    ORDER BY [Extent1].[MyProductId] ASC
                                    OFFSET @p__linq__0 ROWS FETCH NEXT @p__linq__1 ROWS ONLY";

            var visitor = new UnParametrizedSkipAndTakeVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsFalse(visitor.IsSuspected);
        }
Example #26
0
 private void Commands_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
 {
     switch (e.Action)
     {
     case NotifyCollectionChangedAction.Add:
         foreach (Command command in e.NewItems)
         {
             var localCommand = command;
             _callbacksManager.RunAnalysisVisitorOnCommand(() =>
             {
                 var aliasFinder = new AliasResolutionVisitor();
                 RunTSqlFragmentVisitor.AnalyzeFragmentVisitor(localCommand.Sql, localCommand.SqlHash, aliasFinder);
                 var visitor = new FindEqualityJoinVisitor(aliasFinder.Aliases);
                 return(RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(localCommand.Sql, localCommand.SqlHash, visitor));
             }, command);
         }
         break;
     }
 }
Example #27
0
        public void SameQueriesWithDifferentLiteralValuesShouldHaveTheSameHash()
        {
            var sql1 = @"SELECT TOP (2)
                            [Extent1].[Id] AS [Id],
                            [Extent1].[Name] AS [Name],
                            [Extent1].[Value] AS [Value]
                            FROM [dbo].[SiteOptions] AS [Extent1]
                            WHERE (N'Store1' = [Extent1].[Name])";

            var sql2 = @"SELECT TOP (2)
                            [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name],
                            [Extent1].[Value] AS [Value]
                            FROM [dbo].[SiteOptions] AS [Extent1]
                            WHERE (N'Store2' = [Extent1].[Name])";

            var hash1 = RunTSqlFragmentVisitor.GetNormalizedSqlHash(sql1, sql1.ComputeHash());
            var hash2 = RunTSqlFragmentVisitor.GetNormalizedSqlHash(sql2, sql2.ComputeHash());

            Assert.AreEqual(hash1.NormalizedSqlHash, hash2.NormalizedSqlHash);
        }
        public void CheckComparisonWithStringLiteral()
        {
            const string sql = @"SELECT
                                [GroupBy1].[A1] AS [C1]
                                FROM ( SELECT
                                    COUNT(1) AS [A1]
                                    FROM  [Roles] AS [Extent1]
                                    INNER JOIN  (SELECT [Extent2].[Role_Id] AS [Role_Id], [Extent2].[User_Id] AS [User_Id], [Extent3].[Id] AS [Id], [Extent3].[FriendlyName] AS [FriendlyName], [Extent3].[UserName] AS [UserName], [Extent3].[Password] AS [Password], [Extent3].[EMail] AS [EMail], [Extent3].[IsActive] AS [IsActive], [Extent3].[ReceiveDailyEmails] AS [ReceiveDailyEmails], [Extent3].[EmailIsValidated] AS [EmailIsValidated], [Extent3].[RegistrationCode] AS [RegistrationCode], [Extent3].[NumberOfPosts] AS [NumberOfPosts], [Extent3].[NumberOfComments] AS [NumberOfComments], [Extent3].[NumberOfLinks] AS [NumberOfLinks], [Extent3].[NumberOfProjects] AS [NumberOfProjects], [Extent3].[NumberOfDrafts] AS [NumberOfDrafts], [Extent3].[NumberOfProjectsFeedbacks] AS [NumberOfProjectsFeedbacks], [Extent3].[NumberOfProjectsComments] AS [NumberOfProjectsComments], [Extent3].[NumberOfLinksComments] AS [NumberOfLinksComments], [Extent3].[NumberOfSurveys] AS [NumberOfSurveys], [Extent3].[NumberOfVoteComments] AS [NumberOfVoteComments], [Extent3].[NumberOfAdvertisements] AS [NumberOfAdvertisements], [Extent3].[NumberOfAdvertisementComments] AS [NumberOfAdvertisementComments], [Extent3].[NumberOfCourses] AS [NumberOfCourses], [Extent3].[NumberOfLearningPaths] AS [NumberOfLearningPaths], [Extent3].[LastVisitDateTime] AS [LastVisitDateTime], [Extent3].[IsRestricted] AS [IsRestricted], [Extent3].[HomePageUrl] AS [HomePageUrl], [Extent3].[Photo] AS [Photo], [Extent3].[Description] AS [Description], [Extent3].[DateOfBirth] AS [DateOfBirth], [Extent3].[Location] AS [Location], [Extent3].[IsJobsSeeker] AS [IsJobsSeeker], [Extent3].[IsEmailPublic] AS [IsEmailPublic], [Extent3].[FacebookName] AS [FacebookName], [Extent3].[TwitterName] AS [TwitterName], [Extent3].[LinkedInProfileId] AS [LinkedInProfileId], [Extent3].[GooglePlusProfileId] AS [GooglePlusProfileId], [Extent3].[StackOverflowId] AS [StackOverflowId], [Extent3].[GithubId] AS [GithubId], [Extent3].[NugetId] AS [NugetId], [Extent3].[CodePlexId] AS [CodePlexId], [Extent3].[CodeProjectId] AS [CodeProjectId], [Extent3].[SourceforgeId] AS [SourceforgeId], [Extent3].[Rating_TotalRating] AS [Rating_TotalRating], [Extent3].[Rating_TotalRaters] AS [Rating_TotalRaters], [Extent3].[Rating_AverageRating] AS [Rating_AverageRating], [Extent3].[CreatedOn] AS [CreatedOn], [Extent3].[CreatedOnPersian] AS [CreatedOnPersian], [Extent3].[CreatedBy] AS [CreatedBy], [Extent3].[CreatedByIp] AS [CreatedByIp], [Extent3].[CreatedByBrowserName] AS [CreatedByBrowserName], [Extent3].[ModifiedOn] AS [ModifiedOn], [Extent3].[ModifiedOnPersian] AS [ModifiedOnPersian], [Extent3].[ModifiedBy] AS [ModifiedBy], [Extent3].[ModifiedByIp] AS [ModifiedByIp], [Extent3].[ModifiedByBrowserName] AS [ModifiedByBrowserName]
                                        FROM  [RoleUsers] AS [Extent2]
                                        INNER JOIN [Users] AS [Extent3] ON [Extent3].[Id] = [Extent2].[User_Id] ) AS [Join1] ON [Extent1].[Id] = [Join1].[Role_Id]
                                    WHERE (N'Admin' = [Extent1].[Name]) AND ([Join1].[IsActive] = @p__linq__0)
                                )  AS [GroupBy1]";


            var visitor = new UnparametrizedWhereClausesVisitor();

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }
Example #29
0
        public void SameQueriesWithDifferentParameterNamesShouldHaveTheSameHash()
        {
            var sql1 = @"SELECT
                            [Extent1].[Id] AS [Id],
                            [Extent1].[UserId] AS [UserId],
                            [Extent1].[ClaimType] AS [ClaimType],
                            [Extent1].[ClaimValue] AS [ClaimValue]
                            FROM [dbo].[UserClaims] AS [Extent1]
                            WHERE [Extent1].[UserId] = @p__linq__0";

            var sql2 = @"SELECT
                            [Extent1].[Id] AS [Id],
                            [Extent1].[UserId] AS [UserId],
                            [Extent1].[ClaimType] AS [ClaimType],
                            [Extent1].[ClaimValue] AS [ClaimValue]
                            FROM [dbo].[UserClaims] AS [Extent1]
                            WHERE [Extent1].[UserId] = @EntityKeyValue";

            var hash1 = RunTSqlFragmentVisitor.GetNormalizedSqlHash(sql1, sql1.ComputeHash());
            var hash2 = RunTSqlFragmentVisitor.GetNormalizedSqlHash(sql2, sql2.ComputeHash());

            Assert.AreEqual(hash1.NormalizedSqlHash, hash2.NormalizedSqlHash);
        }
        public void TestQueryWithTop1AndKeyComparisionWithoutAlias()
        {
            const string sql = @"SELECT TOP (1)
                                    [MyProductId],
                                    [Name],
                                    [Price],
                                    [CategoryId],
                                    [UserId]
                                    FROM [Products]
                                    WHERE [MyProductId] = @p__linq__0";

            var visitor = new UseFirstLevelCacheVisitor
            {
                Keys = new HashSet <string>
                {
                    "MyProductId"
                }
            };

            RunTSqlFragmentVisitor.AnalyzeFragmentVisitorBase(sql, sql.ComputeHash(), visitor);

            Assert.IsTrue(visitor.IsSuspected);
        }