private void AnalyzeMergeStatement(MergeStatement mergeStatement, ParserResults results)
        {
            mergeStatement.PrintTSqlStatementBlockToDebugConsole();
            List <TableParsingResult> temp = new List <TableParsingResult>();

            if (mergeStatement.MergeSpecification.Target is NamedTableReference mergeNamedTableReference)
            {
                string tableName = ExtraceTableNameFromNamedTableRefernce(mergeNamedTableReference, out string alias);
                temp.AddIfNotExists(tableName, SqlOperationType.INSERT, alias);
                temp.AddIfNotExists(tableName, SqlOperationType.UPDATE, alias);

                if (mergeStatement.MergeSpecification.TableReference is QueryDerivedTable mergeQueryDerivedTable && mergeQueryDerivedTable.QueryExpression is QuerySpecification querySpecification)
                {
                    var result = ExtractTablesFromQuerySpecification(querySpecification); //ExtractTablesUsedInFromClause(mergeQuerySpecification.FromClause);
                    temp.AddIfNotExists(result);
                }
            }

            mergeStatement.PrintTablesToDebugConsole(temp);
            results.AddIfNotExists(temp);
        }
        private void AnalyzeDeleteStatement(DeleteStatement deleteStatement, ParserResults results)
        {
            deleteStatement.PrintTSqlStatementBlockToDebugConsole();

            if (deleteStatement.DeleteSpecification.Target is NamedTableReference deleteNamedTableReference)
            {
                string tableName = ExtraceTableNameFromNamedTableRefernce(deleteNamedTableReference, out string alias);
                if (deleteStatement.DeleteSpecification.FromClause != null)
                {
                    var items = ExtractTablesUsedInFromClause(deleteStatement.DeleteSpecification.FromClause);
                    var match = items.Find(x => x.Alias == tableName);
                    if (match != null)
                    {
                        match.OperationType = SqlOperationType.DELETE;
                    }
                    results.AddIfNotExists(items);
                }
                else
                {
                    results.AddIfNotExists(tableName, SqlOperationType.DELETE, alias);
                }
            }
        }
 public static void AddIfNotExists(this ParserResults results, string tableName, SqlOperationType sqlOperationType, string alias)
 {
     results.TableParsingResults.AddIfNotExists(tableName, sqlOperationType, alias);
 }
 private void AnalyzeWhileStatement(WhileStatement whileStatement, ParserResults results)
 {
     AnalyzeTsqlStatement(results, whileStatement.Statement);
 }
 private void AnalyzeDeclareVariableStatement(DeclareVariableStatement declareVariableStatement, ParserResults results)
 {
     foreach (DeclareVariableElement element in declareVariableStatement.Declarations)
     {
         if (element.Value is ScalarSubquery scalarSubquery)
         {
             var items = ExtractTablesFromScalarSubQuery(scalarSubquery);
             results.AddIfNotExists(items);
         }
     }
 }
        private void AnalyzeBeginEndBlockStatement(BeginEndBlockStatement beginEndBlockStatement, ParserResults results)
        {
            if (beginEndBlockStatement.StatementList.Statements.Count == 0)
            {
                return;
            }

            AnalyzeTsqlStatementList(beginEndBlockStatement.StatementList, results);
        }
        private void AnalyzeCreateProcedureStatement(CreateProcedureStatement createProcedureStatement, ParserResults results)
        {
            //((BeginEndBlockStatement)((CreateProcedureStatement)statement).StatementList.Statements[0]).StatementList.Statements
            if (createProcedureStatement.StatementList.Statements.Count == 0)
            {
                return;
            }

            AnalyzeTsqlStatementList(createProcedureStatement.StatementList, results);
        }
        private ParserResults AnalyzeTsqlStatement(ParserResults results, TSqlStatement statement)
        {
            if (statement is null)
            {
                return(results);
            }

            if (statement is CreateProcedureStatement createProcedureStatement)
            {
                AnalyzeCreateProcedureStatement(createProcedureStatement, results);
            }
            if (statement is BeginEndBlockStatement beginEndBlockStatement)
            {
                AnalyzeBeginEndBlockStatement(beginEndBlockStatement, results);
            }
            else if (statement is UpdateStatement updateStatement)
            {
                AnalyzeUpdateStatement(updateStatement, results);
            }
            else if (statement is InsertStatement insertStatement)
            {
                AnalyzeInsertStatement(insertStatement, results);
            }
            else if (statement is SelectStatement selectStatement)
            {
                AnalyzeSelectStatement(selectStatement, results);
            }
            else if (statement is MergeStatement mergeStatement)
            {
                AnalyzeMergeStatement(mergeStatement, results);
            }
            else if (statement is DeleteStatement deleteStatement)
            {
                AnalyzeDeleteStatement(deleteStatement, results);
            }
            else if (statement is TryCatchStatement tryCatchStatement)
            {
                AnalyzeTryCatchStatement(tryCatchStatement, results);
            }
            else if (statement is WhileStatement whileStatement)
            {
                AnalyzeWhileStatement(whileStatement, results);
            }
            else if (statement is ExecuteStatement executeStatement)
            {
                AnalyzeExecuteStatement(executeStatement, results);
            }
            else if (statement is IfStatement ifStatement)
            {
                AnalyzeIfStatement(ifStatement, results);
            }
            else if (statement is DeclareVariableStatement declareVariableStatement)
            {
                AnalyzeDeclareVariableStatement(declareVariableStatement, results);
            }
            else
            {
                //TODO
                Debug.WriteLine($"found statement type (not analyzed): {statement.GetType().FullName}");
            }
            return(results);
        }