Exemple #1
0
        static void Main(string[] args)
        {
            if (args.Count() < 1)
            {
                Console.WriteLine("No input file specified");
                return;
            }

            FileInfo input = new FileInfo(args[0]);

            bool       initialQuotedIdentifiers = false;
            TSqlParser parser = new TSql110Parser(initialQuotedIdentifiers);

            StreamReader       sr = input.OpenText();
            IList <ParseError> errors;

            TSqlFragment fragment = parser.Parse(sr, out errors);

            sr.Close();

            if (errors.Count > 0)
            {
                Console.WriteLine("Parse {0} errors input stream", errors.Count);
                return;
            }

            TableVisitor tableVisitor = new TableVisitor();

            fragment.Accept(tableVisitor);

            ViewVisitor viewVisitor = new ViewVisitor();

            fragment.Accept(viewVisitor);

            ProcVisitor procVisitor = new ProcVisitor();

            fragment.Accept(procVisitor);

            foreach (var table in tableVisitor.Nodes)
            {
                Console.WriteLine("table {0}.{1}",
                                  table.SchemaObjectName.SchemaIdentifier.Value,
                                  table.SchemaObjectName.BaseIdentifier.Value);
            }

            foreach (var view in viewVisitor.Nodes)
            {
                Console.WriteLine("view {0}.{1}",
                                  view.SchemaObjectName.SchemaIdentifier.Value,
                                  view.SchemaObjectName.BaseIdentifier.Value);
            }

            foreach (var proc in procVisitor.Nodes)
            {
                Console.WriteLine("proc {0}.{1}",
                                  proc.ProcedureReference.Name.SchemaIdentifier.Value,
                                  proc.ProcedureReference.Name.BaseIdentifier.Value);
            }
        }
Exemple #2
0
        protected override IList <SqlRuleProblem> ElicitProblems(TSqlFragment fragment, RuleDescriptor ruleDescriptor, string elementName, TSqlObject modelElement)
        {
            var visitor = new SetOptionsVisitor();

            fragment.Accept(visitor);
            return(this.CreateProblemsAsWarning(ruleDescriptor, elementName, modelElement, visitor.InvalidSetStatements));
        }
        private TableNameDeclareCheckVisitor visitTSql(string tsql)
        {
            TSqlParser parser = new TSql100Parser(false);

            IList <ParseError> errors;
            TextReader         reader = new StringReader(tsql);

            TSqlFragment parsed = parser.Parse(reader, out errors);

            if (errors.Count != 0)
            {
                string errorMessage = "";
                foreach (ParseError error in errors)
                {
                    errorMessage = errorMessage + "\n" + error.Line + " : " + error.Message;
                }
                throw new Exception("パース失敗\n" + errorMessage);
            }

            TableNameDeclareCheckVisitor visitor = new TableNameDeclareCheckVisitor();

            parsed.Accept(visitor);

            return(visitor);
        }
Exemple #4
0
        protected override IList <SqlRuleProblem> ElicitProblems(TSqlFragment fragment, RuleDescriptor ruleDescriptor, string elementName, TSqlObject modelElement)
        {
            var visitor = new AvoidUsingGlobalVariableForIdentityVisitor();

            fragment.Accept(visitor);
            return(this.CreateProblemsAsError(ruleDescriptor, elementName, modelElement, visitor.InvalidVariables));
        }
Exemple #5
0
        public static void ParseSQL()
        {
            var sql = @"select AreaId = A.mcw_areaId,  SurrogateKey = A.AreaKey,  Code = S.statecode, Name = S.statename From CRM.dim_Area as A inner join CRM.dim_AreaState as S ON A.statecode = S.statecode  ; DELET  blogs SET url = 'aaa' where url='dasfds'";


            //@"select p.firstname, p.lastname, p.custid FROM persons as p ;
            //SELECT id, name FROM companies;
            //select s.test from (select 'hello' as test) as s; ";

            TSqlParser         parser = new TSql120Parser(true);
            IList <ParseError> parseErrors;
            var          tReader     = new StringReader(sql);
            TSqlFragment sqlFragment = parser.Parse(tReader, out parseErrors);
            var          queryTokens = parser.GetTokenStream(tReader, out parseErrors);

            if (parseErrors.Count > 0)
            {
                Console.WriteLine("Errors:");
            }
            parseErrors.Select(e => e.Message.Indent(2)).ToList().ForEach(Console.WriteLine);

            OwnVisitor visitor = new OwnVisitor();

            sqlFragment.Accept(visitor);
            // sqlFragment.AcceptChildren(visitor);

            Console.WriteLine("Done.");
            Console.ReadKey();
        }
        protected override IList <SqlRuleProblem> ElicitProblems(TSqlFragment fragment, RuleDescriptor ruleDescriptor, string elementName, TSqlObject modelElement)
        {
            var problems = new List <SqlRuleProblem>();
            var visitor  = new InvalidTypesVisitor();

            fragment.Accept(visitor);

            foreach (var item in visitor.ColumnDefinitions)
            {
                var description = string.Format(CultureInfo.CurrentCulture, ruleDescriptor.DisplayDescription);
                var problem     = new SqlRuleProblem(description, modelElement, item)
                {
                    Severity = SqlRuleProblemSeverity.Warning
                };

                problems.Add(problem);
            }

            foreach (var item in visitor.ProcedureParameters)
            {
                var description = string.Format(CultureInfo.CurrentCulture, ruleDescriptor.DisplayDescription);
                var problem     = new SqlRuleProblem(description, modelElement, item)
                {
                    Severity = SqlRuleProblemSeverity.Warning
                };

                problems.Add(problem);
            }

            return(problems);
        }
        public static CodeExpression BuildFromCheckConstraintDefinition(string schemaName, DataTable table, string check_name, string check_definition, out bool hasError, out string errorText)
        {
            string       select_statement = "SELECT colx = IIF((" + check_definition + "), 1, 0) FROM " + schemaName + ".[" + table.TableName + "] WHERE " + check_definition;
            TSqlFragment sqlF             = ScriptDomFacade.Parse(select_statement);
            IIFVisitor   iif_visitor      = new IIFVisitor();

            sqlF.Accept(iif_visitor);
            if (iif_visitor.result == null)
            {
                throw new NotSupportedException("Expression 'IIF' could not be found:" + sqlF.AsText());
            }

            BooleanExpression iif_predicate = iif_visitor.result.Predicate;

            //if (iif_visitor != null)
            //{
            //    //return null; // comment out if it needed
            //}

            //Console.WriteLine("");
            //Console.WriteLine("==== " + check_name + " ============");
            //Console.WriteLine(ScriptDomFacade.GenerateScript(iif_predicate));
            //Console.WriteLine("-------------------------------------------");
            //Console.WriteLine("");

            var databaseMetadata = new DatabaseMetadataOnTable(table);

            hasError  = false;
            errorText = null;
            return(BooleanExpressionGeneratorVisitor.TryBuildFromFragment(databaseMetadata, iif_predicate, ref hasError, ref errorText));
        }
Exemple #8
0
        public string PrepareScript(string script, Dictionary <string, object> parameters, out IList <ParseError> errors)
        {
            if (MetadataService.CurrentDatabase == null)
            {
                throw new InvalidOperationException("Current database is not defined!");
            }

            TSqlFragment fragment = Parser.Parse(new StringReader(script), out errors);

            if (errors.Count > 0)
            {
                return(script);
            }

            DeclareVariableStatementVisitor parametersVisitor = new DeclareVariableStatementVisitor(parameters);

            fragment.Accept(parametersVisitor);

            ScriptNode result = new ScriptNode()
            {
                Database = MetadataService.CurrentDatabase
            };
            SyntaxTreeVisitor visitor = new SyntaxTreeVisitor(MetadataService);

            visitor.Visit(fragment, result);

            Generator.GenerateScript(fragment, out string sql);
            return(sql);
        }
            public static IList <SelectStatement> VisitSelectStatements(TSqlFragment fragment)
            {
                TSqlSelectVisitor visitor = new TSqlSelectVisitor();

                fragment.Accept(visitor);
                return(visitor.SelectStatements);
            }
            public static IList <ProcedureParameter> VisitProcedureParameters(TSqlFragment fragment)
            {
                TSqlSelectVisitor visitor = new TSqlSelectVisitor();

                fragment.Accept(visitor);
                return(visitor.ProcedureParameters);
            }
Exemple #11
0
        private void button1_Click(object sender, EventArgs e)
        {
            TextReader rdr = new StringReader(textBox1.Text);

            IList <ParseError> errors = null;
            TSql110Parser      parser = new TSql110Parser(true);
            TSqlFragment       tree   = parser.Parse(rdr, out errors);

            foreach (ParseError err in errors)
            {
                Console.WriteLine(err.Message);
            }

            MyVisitor checker = new MyVisitor();

            tree.Accept(checker);
            if (false == checker.containsOnlySelects)
            {
                MessageBox.Show("The code contains something other than SELECT statements!");
            }
            else
            {
                MessageBox.Show("Looks ok!");
            }

            rdr.Dispose();
        }
        protected override IList <SqlRuleProblem> ElicitProblems(TSqlFragment fragment, RuleDescriptor ruleDescriptor, string elementName, TSqlObject modelElement)
        {
            var visitor = new UsingFullTextIndexVisitor();

            fragment.Accept(visitor);
            return(this.CreateProblemsAsWarning(ruleDescriptor, elementName, modelElement, visitor.FullTextIndexes));
        }
        private void ParseDelete(string query)
        {
            TSqlFragment tree = InitiateTSql110Parser(query);

            if (SyntaxError)
            {
                return;
            }

            if (tree is TSqlScript)
            {
                TSqlScript tSqlScript = tree as TSqlScript;
                foreach (TSqlBatch sqlBatch in tSqlScript.Batches)
                {
                    foreach (TSqlStatement sqlStatement in sqlBatch.Statements)
                    {
                        ParseSqlDeleteStatement(sqlStatement);
                    }
                }
            }
            RbacTSqlFragmentVisitor rbacTSqlFragmentVisitor = new RbacTSqlFragmentVisitor();

            tree.Accept(rbacTSqlFragmentVisitor);
            this.Warnings.AddRange(rbacTSqlFragmentVisitor.Warnings);

            TablesReferred = new List <RbacTable>(TablesReferred.DistinctBy(t => t.Name));
            IsParsed       = true;
        }
Exemple #14
0
        protected override IList <SqlRuleProblem> ElicitProblems(TSqlFragment fragment, RuleDescriptor ruleDescriptor, string elementName, TSqlObject modelElement)
        {
            var visitor = new ColumnNameVisitor();

            fragment.Accept(visitor);
            return(this.CreateProblemsAsError(ruleDescriptor, elementName, modelElement, visitor.InvalidInsertStatementsWithoutColumnNames));
        }
 public static void Accept(this TSqlFragment fragment, params TSqlFragmentVisitor[] visitors)
 {
     foreach (var visitor in visitors)
     {
         fragment.Accept(visitor);
     }
 }
Exemple #16
0
        protected override IList <SqlRuleProblem> ElicitProblems(TSqlFragment fragment, RuleDescriptor ruleDescriptor, string elementName, TSqlObject modelElement)
        {
            var problems = new List <SqlRuleProblem>();
            var visitor  = new DataTypesVisitor();

            fragment.Accept(visitor);

            foreach (var columnDef in visitor.ColumnDefinitions)
            {
                var description = string.Format(CultureInfo.CurrentCulture, ruleDescriptor.DisplayDescription);
                var problem     = new SqlRuleProblem(description, modelElement)
                {
                    Severity = SqlRuleProblemSeverity.Error
                };

                problem.SetSourceInformation(new SourceInformation(problem.SourceName, columnDef.StartLine, columnDef.StartColumn));
                problems.Add(problem);
            }


            foreach (var parameter in visitor.ProcedureParameters)
            {
                var description = string.Format(CultureInfo.CurrentCulture, ruleDescriptor.DisplayDescription);
                var problem     = new SqlRuleProblem(description, modelElement)
                {
                    Severity = SqlRuleProblemSeverity.Error
                };

                problem.SetSourceInformation(new SourceInformation(problem.SourceName, parameter.StartLine, parameter.StartColumn));
                problems.Add(problem);
            }

            return(problems);
        }
Exemple #17
0
        public override IList <SqlRuleProblem> Analyze(SqlRuleExecutionContext ruleExecutionContext)
        {
            IList <SqlRuleProblem> problems = new List <SqlRuleProblem>();

            TSqlObject modelElement = ruleExecutionContext.ModelElement;

            if (IsInlineTableValuedFunction(modelElement))
            {
                return(problems);
            }

            string elementName = GetElementName(ruleExecutionContext, modelElement);

            TSqlFragment        fragment       = ruleExecutionContext.ScriptFragment;
            RuleDescriptor      ruleDescriptor = ruleExecutionContext.RuleDescriptor;
            WaitForDelayVisitor visitor        = new WaitForDelayVisitor();

            fragment.Accept(visitor);

            IList <WaitForStatement> waitForDelayStatements = visitor.WaitForDelayStatements;

            foreach (WaitForStatement waitForStatement in waitForDelayStatements)
            {
                var problem = new SqlRuleProblem(string.Format(CultureInfo.CurrentCulture, ruleDescriptor.DisplayDescription, elementName), modelElement, waitForStatement);
                problems.Add(problem);
            }

            return(problems);
        }
        private void AnalyzeQueries(IList <SqlRuleProblem> problems, TSqlFragment fragment,
                                    SqlRuleExecutionContext ruleExecutionContext)
        {
            // Find all queries in current checking fragment.
            var visitor = new GetQuerySpecificationsVisitor();

            fragment.Accept(visitor);
            foreach (var querySpecification in visitor.Queries)
            {
                // Get the specified tables in the query.
                var unspecifiedPartitions = CollectFromClause(ruleExecutionContext, querySpecification);

                // If the query isn't querying a partition table, we don't need to check it.
                if (unspecifiedPartitions.Count > 0)
                {
                    // Get all constraints in the query.
                    if (querySpecification.WhereClause != null)
                    {
                        SearchConstraints(querySpecification.WhereClause, unspecifiedPartitions);
                    }
                }

                // If there are any unspecified partitions left, these are considered problems.
                foreach (var unspecifiedPartition in unspecifiedPartitions)
                {
                    SqlRuleProblem problem = CreateProblem(ruleExecutionContext, unspecifiedPartition);
                    problems.Add(problem);
                }

                AnalyzeJoins(problems, ruleExecutionContext, querySpecification);
            }
        }
        private void ChangeNewDatabaseLocation(DeploymentPlanContributorContext context, string databasePath,
                                               string logPath)
        {
            DeploymentStep nextStep = context.PlanHandle.Head;

            // Loop through all steps in the deployment plan
            bool finished = false;

            while (nextStep != null && !finished)
            {
                // Increment the step pointer, saving both the current and next steps
                DeploymentStep currentStep = nextStep;

                // Only interrogate up to BeginPreDeploymentScriptStep - setvars must be done before that
                if (currentStep is BeginPreDeploymentScriptStep)
                {
                    finished = true;
                    break;
                }

                SqlCreateDatabaseStep createDbStep = currentStep as SqlCreateDatabaseStep;
                if (createDbStep != null)
                {
                    TSqlFragment fragment = createDbStep.Script;

                    CreateDatabaseStatementVisitor visitor = new CreateDatabaseStatementVisitor(databasePath, logPath);
                    fragment.Accept(visitor);

                    finished = true;
                }

                nextStep = currentStep.Next;
            }
        }
            public static IList <AlterTableAddTableElementStatement> VisitAlterTableAddTableElementStatements(TSqlFragment fragment)
            {
                TSqlSelectVisitor visitor = new TSqlSelectVisitor();

                fragment.Accept(visitor);
                return(visitor.AlterTableAddTableElementStatements);
            }
        protected override IList <SqlRuleProblem> ElicitProblems(TSqlFragment fragment, RuleDescriptor ruleDescriptor, string elementName, TSqlObject modelElement)
        {
            var visitor = new HintsVisitor();

            fragment.Accept(visitor);
            return(this.CreateProblemsAsError(ruleDescriptor, elementName, modelElement, visitor.Hints));
        }
            public static IList <CreateProcedureStatement> VisitCreateProcedureStatements(TSqlFragment fragment)
            {
                TSqlSelectVisitor visitor = new TSqlSelectVisitor();

                fragment.Accept(visitor);
                return(visitor.CreateProcedureStatements);
            }
Exemple #23
0
        static void Main(string[] args)
        {
            TextReader txtRdr = new StringReader(@"select AreaId = A.mcw_areaId,  SurrogateKey = A.AreaKey,  Code = S.statecode, Name = S.statename From CRM.dim_Area as A inner join CRM.dim_AreaState as S ON A.statecode = S.statecode  ; DELET FROM blogs  where url='dasfds'");

            //TextReader txtRdr = new StreamReader("myscriptfile.sql");

            TSql120Parser parser = new TSql120Parser(true);

            IList <ParseError> errors;

            TSqlFragment sqlFragment = parser.Parse(txtRdr, out errors);

            foreach (var err in errors)
            {
                Console.WriteLine(err.Message);
            }

            SQLVisitor myVisitor = new SQLVisitor();

            sqlFragment.Accept(myVisitor);

            myVisitor.DumpStatistics();

            ParseSQL();

            Console.ReadKey();
        }
Exemple #24
0
        public static SqlServerRawTree CreateRawTree(TSqlFragment fragment)
        {
            var visitor = new SqlServerRawTreeVisitor();

            fragment.Accept(visitor);

            return(visitor.Root ?? throw new InvalidOperationException());
        }
Exemple #25
0
 private void GetDatabasesUpdated(TSqlFragment node)
 {
     if (IsWithinTransaction(node))
     {
         node.Accept(childDatabaseNameVisitor);
         DatabasesUpdated.UnionWith(childDatabaseNameVisitor.DatabasesUpdated);
     }
 }
Exemple #26
0
        private void ChangeCreateIndexOperationalProps(DeploymentPlanContributorContext context,
                                                       IList <IndexOption> options)
        {
            DeploymentStep nextStep = context.PlanHandle.Head;

            // Loop through all steps in the deployment plan
            bool foundMainSection = false;

            while (nextStep != null)
            {
                DeploymentStep currentStep = nextStep;
                nextStep = currentStep.Next;

                // We only want to analyze the main part of the deployment script - we'll skip
                // any steps until we pass the end of the predeployment section, and stop once
                // we hit the start of the postdeployment section
                if (currentStep is EndPreDeploymentScriptStep)
                {
                    foundMainSection = true;
                    continue;
                }

                if (!foundMainSection)
                {
                    // Haven't gotten past predeployment yet
                    continue;
                }

                if (currentStep is BeginPostDeploymentScriptStep)
                {
                    break;
                }

                // We need to care about CreateElementSteps and AlterElementSteps for Indexes.
                DeploymentScriptDomStep domStep = currentStep as DeploymentScriptDomStep;
                TSqlObject elementObject        = null;

                if (domStep is CreateElementStep)
                {
                    elementObject = ((CreateElementStep)domStep).SourceElement;
                }
                else if (domStep is AlterElementStep)
                {
                    elementObject = ((AlterElementStep)domStep).SourceElement;
                }

                if (elementObject != null)
                {
                    if (Index.TypeClass.Equals(elementObject.ObjectType) && !(View.TypeClass.Equals(elementObject.GetParent().ObjectType)))
                    {
                        TSqlFragment fragment = domStep.Script;

                        IndexStatementVisitor visitor = new IndexStatementVisitor(options);
                        fragment.Accept(visitor);
                    }
                }
            }
        }
        private void FindAndRenameUnnamedDefaultConstraints(DeploymentPlanContributorContext context)
        {
            DeploymentStep nextStep = context.PlanHandle.Head;

            // Loop through all steps in the deployment plan
            bool foundMainSection = false;

            while (nextStep != null)
            {
                DeploymentStep currentStep = nextStep;
                nextStep = currentStep.Next;

                // We only want to analyze the main part of the deployment script - we'll skip
                // any steps until we pass the end of the predeployment section, and stop once
                // we hit the start of the postdeployment section
                if (currentStep is EndPreDeploymentScriptStep)
                {
                    foundMainSection = true;
                    continue;
                }

                if (!foundMainSection)
                {
                    // Haven't gotten past predeployment yet
                    continue;
                }

                if (currentStep is BeginPostDeploymentScriptStep)
                {
                    break;
                }

                // We need to care about CreateElementSteps and AlterElementSteps for default constraints.
                DeploymentScriptDomStep domStep = currentStep as DeploymentScriptDomStep;
                TSqlObject elementObject        = null;

                // most of the default constraints in the deployment plan seem to be deployed as Alter Table statements, but
                // just in case the default constraint was deployed as part of a Create Table (don't see how it is possible, but just being safe)
                if (domStep is CreateElementStep)
                {
                    elementObject = ((CreateElementStep)domStep).SourceElement;
                }
                else if (domStep is AlterElementStep)
                {
                    elementObject = ((AlterElementStep)domStep).SourceElement;
                }

                if (elementObject != null)
                {
                    TSqlFragment fragment = domStep.Script;

                    // call the visitor, which in turn will auto-name these constraints
                    var visitor = new DefaultConstraintDefinitionVisitor();
                    fragment.Accept(visitor);
                }
            }
        }
Exemple #28
0
        public static ObjectIdentifier GetIdentifierFromSqlProcedure(TSqlFragment fragment)
        {
            var identifier    = new ObjectIdentifier();
            var symbolVisitor = new ProcedureObjectNameVisitor(identifier);

            fragment.Accept(symbolVisitor);

            return(identifier);
        }
        protected override IList <SqlRuleProblem> ElicitProblems(TSqlFragment fragment, RuleDescriptor ruleDescriptor, string elementName, TSqlObject modelElement)
        {
            var visitor = new UsingIndexedViewsVisitor();

            fragment.Accept(visitor);
            var problems = (List <SqlRuleProblem>) this.CreateProblemsAsWarning(ruleDescriptor, elementName, modelElement, visitor.WithBindings);

            problems.AddRange(this.CreateProblemsAsWarning(ruleDescriptor, elementName, modelElement, visitor.IndexedViews));
            return(problems);
        }
Exemple #30
0
            public static string ResolveAlias(TSqlFragment fragment, string alias)
            {
                var visitor = new AliasVisitor();

                fragment.Accept(visitor);

                return(visitor.Aliases.ContainsKey(alias)
                    ? visitor.Aliases[alias]
                    : alias);
            }
            public static string ResolveAlias(TSqlFragment fragment, string alias)
            {
                var visitor = new AliasVisitor();
                fragment.Accept(visitor);

                return visitor.Aliases.ContainsKey(alias)
                    ? visitor.Aliases[alias]
                    : alias;
            }